| |
| This file records register use conventions and info for the 4 |
| supported platforms (since it is ABI dependent). This is so as to |
| avoid having to endlessly re-look up this info in ABI documents. |
| |
| ----------------------- |
| |
| x86-linux |
| ~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| -------------------------------------------------------------- |
| eax n n int[31:0] retreg y |
| ebx y n y |
| ecx n n y |
| edx n n int[63:32] retreg y |
| esi y n y |
| edi y n y |
| ebp y n & guest state |
| esp reserved n/a n/a |
| eflags n n/a y |
| st0 n ? n fp retreg y |
| st1-7 n ? n y |
| xmm0-7 n ? n y |
| gs Thread ptr |
| |
| In the case where arguments are passed in registers, the arg1,2,3 |
| registers are EAX, EDX, and ECX respectively. |
| |
| amd64-linux |
| ~~~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| ------------------------------------------------------------------- |
| rax n n int[63:0] retreg |
| rbx y n y |
| rcx n int#4 |
| rdx n int#3 int[127:64] retreg |
| rsi n int#2 y |
| rdi n int#1 y |
| rbp y n & guest state |
| rsp reserved n/a n/a |
| r8 n int#5 y |
| r9 n int#6 y |
| r10 n ? |
| r11 n jmp temporary |
| r12-15 y y |
| eflags n n/a y |
| st0-7 n n long double retreg y |
| xmm0 n fp#1 fp retreg |
| xmm1 n fp#2 fp-high retreg |
| xmm2-7 n fp#3-8 y (3-7) |
| xmm8-15 n y (8-12) |
| fs thread ptr |
| |
| ppc32-linux |
| ~~~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| ------------------------------------------------------------------- |
| r0 n n sometimes RAZ |
| r1 y n stack pointer |
| r2 n n thread ptr |
| r3 n int#1 int[31:0] retreg y |
| r4 n int#2 also int retreg y |
| r5 n int#3 y |
| r6 n int#4 y |
| r7 n int#5 y |
| r8 n int#6 y |
| r9 n int#7 y |
| r10 n int#8 y |
| r11 n y |
| r12 n y |
| r13 ? |
| r14-28 y y |
| r29 y reserved for dispatcher |
| r30 y altivec spill temporary |
| r31 y & guest state |
| f0 n |
| f1 n fp#1 fp retreg |
| f2-8 n fp#2-8 |
| f9-13 n |
| f14-31 y y (14-21) |
| v0-v19 ? |
| v20-31 y y (20-27,29) |
| cr0-7 |
| lr y return address |
| ctr n |
| xer n |
| fpscr |
| |
| |
| ppc64-linux |
| ~~~~~~~~~~~ |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| ------------------------------------------------------------------- |
| r13 n n thread ptr |
| TBD |
| |
| |
| arm-linux |
| ~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| -------------------------------------------------------------- |
| r0 int#1 int[31:0] retreg? avail |
| r1 int#2 int[63:32] retreg? avail |
| r2 int#3 avail |
| r3 int#4 avail |
| r4 y avail |
| r5 y avail |
| r6 y avail |
| r7 y avail |
| r8 y GSP |
| r9 y (but only on Linux; not in general) avail |
| r10 y avail |
| r11 y avail |
| r12 possibly used by linker? unavail |
| r13(sp) unavail |
| r14(lr) unavail |
| r15(pc) unavail |
| cp15/c3/r2 thread ptr (see libvex_guest_arm.h, guest_TPIDRURO) |
| |
| VFP: d8-d15 are callee-saved |
| r12 (IP) is probably available for use as a caller-saved |
| register; but instead we use it as an intermediate for |
| holding the address for F32/F64 spills, since the VFP load/store |
| insns have reg+offset forms for offsets only up to 1020, which |
| often isn't enough. |
| |
| |
| arm64-linux |
| ~~~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| --------------------------------------------------------------- |
| r0 int#0 ret#0 (??) |
| r1 int#1 ret#1 (??) |
| r2-7 int#2..7 |
| r8 "Indirect res loc reg" |
| r9 "Temporary regs" chaining scratch |
| r10-15 "Temporary regs" avail |
| r16(IP0) |
| r17(IP1) |
| r18 "Platform reg" |
| r19-20 "Temporary regs" |
| r21 y "Callee saved" GSP |
| r22-28 y "Callee saved" |
| r29(FP) y |
| r30(LR) y |
| |
| NZCV "Status register" |
| |
| Is there a TLS register? |
| |
| x21 is the GSP. x9 is a scratch chaining/spill temp. Neither |
| are available to the register allocator. |
| |
| Q registers: |
| It's a little awkward. Basically, D registers are the same as ARM, |
| so d0-d7 and d16-d31 are caller-saved, but d8-d15 are callee-saved. |
| |
| Q registers are the same, except that the upper 64 bits of q8-q15 |
| are caller-saved. |
| |
| The idea is that you only need to preserve D registers, not Q |
| registers. |
| |
| |
| |
| s390x-linux |
| ~~~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| -------------------------------------------------------------- |
| r0 n see below unavail |
| r1 n avail |
| r2 n int#1 return value avail |
| r3 n int#2 avail |
| r4 n int#3 avail |
| r5 n int#4 avail |
| r6 y int#5 avail |
| r7 y avail |
| r8 y avail |
| r9 y avail |
| r10 y see below avail |
| r11 y see below avail |
| r12 y unavail VG_(dispatch_ctr) |
| r13 y unavail gsp |
| r14(lr) n unavail lr |
| r15(sp) y unavail sp |
| |
| f0 n return value avail |
| f1-f7 n avail |
| f8-f11 y avail |
| f12-f15 y see below avail |
| a0 n thread ptr high word |
| a1 n thread ptr low word |
| |
| When r0 is used as a base or index register its contents is |
| ignored and the value 0 is used instead. This is the reason |
| why VEX cannot use it. |
| |
| r10, r11 as well as f12-f15 are used as real regs during insn |
| selection when register pairs are required. |
| |
| ppc32-aix5 |
| ~~~~~~~~~~ |
| |
| Reg Callee Arg |
| Name Saves? Reg? Comment Vex-uses? |
| ------------------------------------------------------------------- |
| r0 n n sometimes RAZ |
| r1 y n stack pointer |
| r2 n n TOC pointer |
| r3 n int#1 int[31:0] retreg y |
| r4 n int#2 also int retreg y |
| r5 n int#3 y |
| r6 n int#4 y |
| r7 n int#5 y |
| r8 n int#6 y |
| r9 n int#7 y |
| r10 n int#8 y |
| r11 n "env pointer?!" y |
| r12 n "exn handling" y |
| r13 ? "reserved in 64-bit env" |
| r14-28 y y |
| r29 y reserved for dispatcher |
| r30 y altivec spill temporary |
| r31 y & guest state |
| f0 n |
| f1 n fp#1 fp retreg |
| f2-13 n fp#2-13 |
| f14-31 y y (14-21) |
| v0-v19 ? |
| v20-31 y y (20-27,29) |
| cr0-7 |
| lr y return address |
| ctr n |
| xer n |
| fpscr |