commit ff63704790d3e726ea235007ad50468617480367
parent 0f879b9b0245e0b23a11ac65943846d312b3786f
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Tue, 18 Aug 2015 17:08:43 -0400
start summing up the abi
Diffstat:
| A | lisc/ABI | | | 46 | ++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 46 insertions(+), 0 deletions(-)
diff --git a/lisc/ABI 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.