Re: GCC ARM assembly questions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Priya,

Priya Narasimhan wrote:
I am compiling relatively simple C programs using "gcc -S
-fomit-frame-pointer -mcpu=xscale" on a gumstix (ARM Xscale) processor. I
noticed that the generated assembly code has additional stuff in, beyond
what I would typically see in a standard ARM assembly program (e.g., one
that was generated instead through the ARM Development Suite toolchain).
For instance, I see the following comments in the GNU-generated assembly
code. What do these signify?
@ zero_extendqisi2
@ args =0, pretend =0 (what does pretend mean?)
@ frame_needed = 0, uses_anonymous_args = 0 (what does uses_anonymous_args
mean?)

I don't know, and I suspect that the answer is not very interesting. The best way to find answers to these questions is probably to study the gcc source code.

Secondly, I notice that without the "-O" option, saving registers to the
stack happens almost on every alternate line of the generated assembly code.
What is the purpose of doing this?

Without -O, gcc runs faster. It can run faster by not spending time working out what can be stored in registers, and just using the stack for everything.

Is there a way of turning this feature off, without resorting to the "-O" option?

Why do you say "resorting"? If you care about the efficiency of the generated code then you should be using -Os or -O3. The only situation in which you might want to not specify any -O option is if you want to compile quickly, for some reason. (Or possibly to make debugging easier to follow.)

Finally, is there any documentation on what "-O" actually accomplishes for
an ARM/Xscale processor? For instance, does it use the barrel shifter or
conditional execution wherever possible? Does it optimize for space, for
time, or for both?

Have you seen the page about "Options That Control Optimization" in the gcc docs?

To optimise for speed, use -O3.  To optimise for space, use -Os.

gcc will use the barrel shifter (i.e. use instructions that combine a shift and an arithmetic operation), though you might find that the ARM compiler uses more of these. It will also use conditional exection, and there are specific options that enable/disable that; again, the ARM compiler may make more use of this feature. If you find any real examples of code where the ARM compiler does significantly better overall, I would be interested to see them.


Regards,

Phil.





[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux