diff options
Diffstat (limited to 'lisc/ABI')
-rw-r--r-- | lisc/ABI | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lisc/ABI b/lisc/ABI new file mode 100644 index 0000000..f25ae3a --- /dev/null +++ b/lisc/ABI @@ -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. |