start summing up the abi
This commit is contained in:
parent
0f879b9b02
commit
ff63704790
1 changed files with 46 additions and 0 deletions
46
lisc/ABI
Normal file
46
lisc/ABI
Normal file
|
@ -0,0 +1,46 @@
|
|||
Summary of ABI for calls on x64
|
||||
===============================
|
||||
|
||||
Data classes of interest as defined by the ABI:
|
||||
- INTEGER
|
||||
- SSE
|
||||
- MEMORY
|
||||
|
||||
Unions are treated like structures with the alignment
|
||||
of their most demanding member, and the size of their
|
||||
largest member.
|
||||
|
||||
Classification:
|
||||
1. The size of each argument gets rounded up to eightbytes.
|
||||
(It keeps the stack always 8 bytes aligned.)
|
||||
2. _Bool, char, short, int, long, long long and pointers
|
||||
are in the INTEGER class
|
||||
3. float and double are in the SSE class
|
||||
4. If the size of an object is larger than two eightbytes
|
||||
or if contains unaligned fields, it has class MEMORY.
|
||||
5. Otherwise, pack all fields into two eighbytes and
|
||||
recursively classify them. If any of them is MEMORY
|
||||
the result is MEMORY, if any is INTEGER the result
|
||||
is INTEGER, otherwise the result is SSE.
|
||||
|
||||
Passing:
|
||||
- Classify arguments in order.
|
||||
- INTEGER arguments use in order %rdi %rsi %rdx %rcx
|
||||
%r8 %r9
|
||||
- SSE arguments use in order %xmm0 - %xmm7
|
||||
- MEMORY gets passed on the stack
|
||||
- When we run out of registers for an aggregate, revert
|
||||
the assignment for the first eightbytes and pass it
|
||||
on the stack.
|
||||
- When all registers are taken, write arguments on the
|
||||
stack from right to left.
|
||||
|
||||
Returning.
|
||||
- Classify the return type.
|
||||
- Use %rax and %rdx in order for INTEGER return values
|
||||
- Use %xmm0 and %xmm1 in order for SSE return values
|
||||
- I the return value's class is MEMORY, the first
|
||||
argument of the function %rdi was a pointer to an
|
||||
area big enough to fit the return value. The function
|
||||
writes the return value there and returns the address
|
||||
(that was in %rdi) in %rax.
|
Loading…
Add table
Reference in a new issue