[fpc-pascal] issue when enabling -O2
Karoly Balogh (Charlie/SGR)
charlie at scenergy.dfmk.hu
Wed Jan 10 17:34:26 CET 2018
On Wed, 10 Jan 2018, Matias Vara wrote:
> Hi Karol and thanks you very much! I got confused with the function
> names, I feel very sorry.As I said in my previous email, I fixed by
> rewriting the assembler function. However, I don't why it worked.
By accident. Simply the register/stack/memory layout being different upon
entry, and it worked by pure luck.
> So I understand you correctly, if I use assembler in my procedures there
> could be a risk that I trash a variable that the compiler is using.
Yes. All operating systems and CPU architectures define a so called ABI or
calling convention, which functions must respect. This details which
registers are the parameters to be passed on, and which registers are free
to destroy in a function and which ones *MUST* be saved/preserved (usually
on the stack). There's no way around this. The compiler will expect that
your assembly subfunctions play by the rules.
See here, for example, for x86:
> Is the compiler warning me about this?
No. Assembly is quite a minefield in this regard. If you use assembler,
the compiler assumes you know what you're doing, and doesn't analyze the
assembler function. You have to respect the ABI of your CPU *AND* target
platform by hand, and save the nonvolatile registers.
(This is BTW, not Free Pascal specific. Delphi does the same, or more or
less any other language which supports inline assembly.)
More information about the fpc-pascal