
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" ProfInc scratch
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

