which registers must be preserved for the caller
Andrew Makhorin
mao@gnu.org
Tue Aug 22 13:35:00 GMT 2017
On Mon, 2017-08-21 at 15:39 +0200, Mason wrote:
> On 19/08/2017 09:10, Andrew Makhorin wrote:
>
> > The document "System V ABI: Intel386 Architecture Processor Supplement"
> > says that contents of %ebx, %esi, and %edi must be preserved for the
> > caller. Does GCC for 32-bit GNU/Linux and for 32-bit Cygwin conform to
> > this ABI? If not, how to determine which registers are expected to be
> > saved by calling C functions?
Thank you for your answer.
>
> (NB: GCC supports dozens of platforms)
>
> You seem to be interested in the x86 "cdecl" ABI.
>
> https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
The C Standard says nothing about calling conventions, so I meant that
one that is used by default (which is probably cdecl).
>
> I think the SysV and Microsoft ABI are close, but may differ
> over details, e.g. returning structs.
I asked my question, because GCC doesn't seem to follow System V ABI.
In the following example %ebx, %esi, and %edi are not preserved being
clobbered by the generated code.
mao@corvax:~/Desktop/foo$ cat foo.c
int foo(int x[], int y[], int z[], int i, int j, int k)
{
int t;
t = (x[i+j] + y[j+k] + 2) * (z[i+j+k] + 1) * (z[k+1] + 2);
return t;
}
mao@corvax:~/Desktop/foo$ gcc -c -O2 -save-temps foo.c
mao@corvax:~/Desktop/foo$ cat foo.s
.file "foo.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
subl $12, %esp
.cfi_def_cfa_offset 16
movl 32(%esp), %eax
movl 36(%esp), %edx
movl %ebx, (%esp)
.cfi_offset 3, -16
movl 28(%esp), %ebx
movl %esi, 4(%esp)
movl 24(%esp), %ecx
movl %edi, 8(%esp)
.cfi_offset 6, -12
.cfi_offset 7, -8
movl 20(%esp), %edi
leal (%eax,%edx), %esi
addl %eax, %ebx
movl 16(%esp), %eax
movl (%eax,%ebx,4), %eax
addl %edx, %ebx
movl (%ecx,%ebx,4), %ebx
addl (%edi,%esi,4), %eax
movl 4(%ecx,%edx,4), %edx
movl 4(%esp), %esi
addl $1, %ebx
addl $2, %eax
movl 8(%esp), %edi
imull %ebx, %eax
movl (%esp), %ebx
addl $12, %esp
.cfi_restore 7
.cfi_restore 6
.cfi_restore 3
.cfi_def_cfa_offset 4
addl $2, %edx
imull %edx, %eax
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits
mao@corvax:~/Desktop/foo$ gcc --version
gcc (Debian 4.7.2-5) 4.7.2
More information about the Gcc-help
mailing list