[fpc-devel]I suggest a new FPC feature
Jonas Maebe
jonas at zeus.rug.ac.be
Fri Oct 12 13:56:20 CEST 2001
On vrijdag, oktober 12, 2001, at 10:30 , Pavel V. Ozerski wrote:
> TestProc: pushl %ebp
> movl %esp,%ebp
> nop
> popl %ebp
> ret $0x0008
>
> I see no saving ebx,esi,edi here. Btw, this obj file could be linked
> not only to Delphi or CPPBuilder projects.
That's because you didn't modify any either. Delphi expects you to save
the necessary registers yourself when you use assembler.
> But if I restore 'stdcall' keywords and compile unit with FPC 1.1,
> saving registers will be added:
> _DTEST2$$_TESTPROC$LONGINT$LONGINT:
> pushl %ebp
> movl %esp,%ebp
> pushl %edi
> pushl %esi
> pushl %ebx
> nop
> popl %ebx
> popl %esi
> popl %edi
> leave
> ret $8
FPC OTOH, expects that all registers are modified in an assembler
statement, unless you specify the list of modified registers using the
['reg1','reg2'] notation at the end of the assembler procedure.
> My yesterday's tests demonstrated that also for export procedures
> Delphi 3.0 does not include saving registers into code.
> Additionally, these tests demonstrate that default conventions which
> uses FPC are not the same as wich uses FPC for
> procedures wich have 'stdcall' keyword.
This has nothing to do with differences in calling conventions, but with
differences in assuming which registers are destroyed in an assembler
block. Just include some real code which uses a lot of registers in your
test procedure, and Delphi should save those registers too.
>> Actually, stdcall is *the* standard calling convention for the 80x86
[cut]
> Then why Delphi does not save registers in stdcall procedures?
See above, it assumes that you do that yourself when using assembler
blocks.
> I'm sure, it is not optimization issue : I added built-in-assember
> instruction mov edi,eax into body
> of stdcall procedure but Delphi 3 also did not save edi!
Same reason as above.
> Also if stdcall must save these registers then default calling
> conventions in fpc are not true stdcall
> and they should have a name.
Default FPC calling conventions = "fpc calling conventions". They don't
need a name currently, because we don't have a global switch to change
the default calling convention. Is there a directive to select "default
Delphi calling conventions" in Delphi?
Jonas
More information about the fpc-devel
mailing list