Caller-saves regs have to be saved around C-calls made from STG
land, so this file defines CALLER_SAVES_<reg> for each <reg> that
is designated caller-saves in that machine's C calling convention.
-
- Additionally, the following macros should be defined when
-
- CALLER_SAVES_USER one or more of R<n>, F, D
- are caller-saves.
-
- CALLER_SAVES_SYSTEM one or more of Sp, SpLim, Hp, HpLim
- are caller-saves.
-
- This is so that the callWrapper mechanism knows which kind of
- wrapper to generate for certain types of C call.
-------------------------------------------------------------------------- */
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
The x86-64 register mapping
- callee-saves
- %rax
+ %rax caller-saves, don't steal this one
%rbx YES
- %rcx
- %rdx (seem to be used as arg regs on x86-64)
- %rsi (seem to be used as arg regs on x86-64)
- %rdi (seem to be used as arg regs on x86-64)
- %rbp YES
+ %rcx arg reg, caller-saves
+ %rdx arg reg, caller-saves
+ %rsi arg reg, caller-saves
+ %rdi arg reg, caller-saves
+ %rbp YES (our *prime* register)
%rsp (unavailable - stack pointer)
- %r8
- %r9
- %r10
- %r11
+ %r8 arg reg, caller-saves
+ %r9 arg reg, caller-saves
+ %r10 caller-saves
+ %r11 caller-saves
%r12 YES
%r13 YES
%r14 YES
%r15 YES
+
+ %xmm0-7 arg regs, caller-saves
+ %xmm8-15 caller-saves
+
+ Use the caller-saves regs for Rn, because we don't always have to
+ save those (as opposed to Sp/Hp/SpLim etc. which always have to be
+ saved).
+
--------------------------------------------------------------------------- */
#if x86_64_REGS
#define REG(x) __asm__("%" #x)
-#define REG_Base rbx
+#define REG_Base r13
#define REG_Sp rbp
#define REG_Hp r12
-#define REG_R1 r13
+#define REG_R1 rbx
+#define REG_R2 rsi
+#define REG_R3 rdi
+#define REG_R4 r8
+#define REG_R5 r9
#define REG_SpLim r14
#define REG_HpLim r15
-/* ToDo: try R2/R3 instead of SpLim/HpLim? */
-#define MAX_REAL_VANILLA_REG 1
-#define MAX_REAL_FLOAT_REG 0
-#define MAX_REAL_DOUBLE_REG 0
+#define REG_F1 xmm1
+#define REG_F2 xmm2
+#define REG_F3 xmm3
+#define REG_F4 xmm4
+
+#define REG_D1 xmm5
+#define REG_D2 xmm6
+
+#define CALLER_SAVES_R2
+#define CALLER_SAVES_R3
+#define CALLER_SAVES_R4
+#define CALLER_SAVES_R5
+
+#define CALLER_SAVES_F1
+#define CALLER_SAVES_F2
+#define CALLER_SAVES_F3
+#define CALLER_SAVES_F4
+
+#define CALLER_SAVES_D1
+#define CALLER_SAVES_D2
+
+#define MAX_REAL_VANILLA_REG 5
+#define MAX_REAL_FLOAT_REG 4
+#define MAX_REAL_DOUBLE_REG 2
#define MAX_REAL_LONG_REG 0
#endif /* x86_64 */
#define REG_R3 l3
#define REG_R4 l4
#define REG_R5 l5
-#define REG_R6 l6
-#define REG_R7 l7
-#define REG_R8 i5
+#define REG_R6 i5
#define REG_F1 f22
#define REG_F2 f23