diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-08-18 17:15:47 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-09-15 23:01:31 -0400 |
commit | f8cd43adc4f95cecfaa7346f7fcdad98633f1b07 (patch) | |
tree | 7a589b7bad2b39670bf329a4d3d10e0cd8912319 | |
parent | ff63704790d3e726ea235007ad50468617480367 (diff) | |
download | roux-f8cd43adc4f95cecfaa7346f7fcdad98633f1b07.tar.gz |
clarify the abi
-rw-r--r-- | lisc/ABI | 25 |
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 |