summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-08-18 17:15:47 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-09-15 23:01:31 -0400
commitf8cd43adc4f95cecfaa7346f7fcdad98633f1b07 (patch)
tree7a589b7bad2b39670bf329a4d3d10e0cd8912319
parentff63704790d3e726ea235007ad50468617480367 (diff)
downloadroux-f8cd43adc4f95cecfaa7346f7fcdad98633f1b07.tar.gz
clarify the abi
-rw-r--r--lisc/ABI25
1 files changed, 14 insertions, 11 deletions
diff --git a/lisc/ABI b/lisc/ABI
index f25ae3a..735b631 100644
--- a/lisc/ABI
+++ b/lisc/ABI
@@ -14,31 +14,34 @@ 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
+ 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.
+5. Otherwise, recursively classify fields and determine
+ the class of the two eightbytes using the classes of
+ their components. If any of them is MEMORY the result
+ is MEMORY (but I don't think it can happen), 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
+ %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.
+ - Registers %rbx, %r12 - %r15 are callee-save.
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
+ - 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