X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FMachRegs.h;h=92944e146792b9c9ee4804acab06620414d54978;hb=674689e20127e199e76cd19dd2f81dc5c2346bac;hp=83a633ba4db02f7768b1f0f8808dfea89545312e;hpb=bfd84739bc57ca094cecce331a72fcb0e720304b;p=ghc-hetmet.git diff --git a/ghc/includes/MachRegs.h b/ghc/includes/MachRegs.h index 83a633b..92944e1 100644 --- a/ghc/includes/MachRegs.h +++ b/ghc/includes/MachRegs.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: MachRegs.h,v 1.20 2005/01/19 18:31:07 wolfgang Exp $ * * (c) The GHC Team, 1998-1999 * @@ -27,23 +26,42 @@ */ #ifndef NO_REGS +/* NOTE: when testing the platform in this file we must test either + * *_HOST_ARCH and *_TARGET_ARCH, depending on whether COMPILING_GHC + * is set. This is because when we're compiling the RTS and HC code, + * the platform we're running on is the HOST, but when compiling GHC + * we want to know about the register mapping on the TARGET platform. + */ +#ifdef COMPILING_GHC +#define alpha_REGS alpha_TARGET_ARCH +#define hppa1_1_REGS hppa1_1_TARGET_ARCH +#define i386_REGS i386_TARGET_ARCH +#define x86_64_REGS x86_64_TARGET_ARCH +#define m68k_REGS m68k_TARGET_ARCH +#define mips_REGS (mipsel_TARGET_ARCH || mipseb_TARGET_ARCH) +#define powerpc_REGS (powerpc_TARGET_ARCH || powerpc64_TARGET_ARCH || rs6000_TARGET_ARCH) +#define ia64_REGS ia64_TARGET_ARCH +#define sparc_REGS sparc_TARGET_ARCH +#define darwin_REGS darwin_TARGET_OS +#else +#define alpha_REGS alpha_HOST_ARCH +#define hppa1_1_REGS hppa1_1_HOST_ARCH +#define i386_REGS i386_HOST_ARCH +#define x86_64_REGS x86_64_HOST_ARCH +#define m68k_REGS m68k_HOST_ARCH +#define mips_REGS (mipsel_HOST_ARCH || mipseb_HOST_ARCH) +#define powerpc_REGS (powerpc_HOST_ARCH || powerpc64_HOST_ARCH || rs6000_HOST_ARCH) +#define ia64_REGS ia64_HOST_ARCH +#define sparc_REGS sparc_HOST_ARCH +#define darwin_REGS darwin_HOST_OS +#endif + /* ---------------------------------------------------------------------------- Caller saves and callee-saves regs. Caller-saves regs have to be saved around C-calls made from STG land, so this file defines CALLER_SAVES_ for each 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, 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. -------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- @@ -82,7 +100,7 @@ t12 $27 NCG_reserved -------------------------------------------------------------------------- */ -#if defined(alpha_TARGET_ARCH) +#if alpha_REGS # define REG(x) __asm__("$" #x) # define CALLER_SAVES_R2 @@ -123,7 +141,7 @@ # define NCG_Reserved_F1 f29 # define NCG_Reserved_F2 f30 -#endif /* alpha_TARGET_ARCH */ +#endif /* alpha_REGS */ /* ----------------------------------------------------------------------------- The HP-PA register mapping @@ -146,7 +164,7 @@ \tr{%fr8}--\tr{%fr11} are some available caller-save fl-pt registers. -------------------------------------------------------------------------- */ -#if hppa1_1_TARGET_ARCH +#if hppa1_1_REGS #define REG(x) __asm__("%" #x) @@ -201,7 +219,7 @@ -------------------------------------------------------------------------- */ -#if i386_TARGET_ARCH +#if i386_REGS #define REG(x) __asm__("%" #x) @@ -232,40 +250,71 @@ /* ----------------------------------------------------------------------------- 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_TARGET_ARCH +#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 */ @@ -302,7 +351,7 @@ \end{tabular} -------------------------------------------------------------------------- */ -#if m68k_TARGET_ARCH +#if m68k_REGS #define REG(x) __asm__(#x) @@ -344,7 +393,7 @@ We can steal some, but we might have to save/restore around ccalls. -------------------------------------------------------------------------- */ -#if mipsel_TARGET_ARCH || mipseb_TARGET_ARCH +#if mips_REGS #define REG(x) __asm__("$" #x) @@ -414,7 +463,7 @@ We can do the Whole Business with callee-save registers only! -------------------------------------------------------------------------- */ -#if powerpc_TARGET_ARCH || powerpc64_TARGET_ARCH || rs6000_TARGET_ARCH +#if powerpc_REGS #define REG(x) __asm__(#x) @@ -427,7 +476,7 @@ #define REG_R7 r20 #define REG_R8 r21 -#ifdef darwin_TARGET_OS +#if darwin_REGS #define REG_F1 f14 #define REG_F2 f15 @@ -471,7 +520,7 @@ \tr{f16-f32} are the callee-saved floating point registers. -------------------------------------------------------------------------- */ -#ifdef ia64_TARGET_ARCH +#if ia64_REGS #define REG(x) __asm__(#x) @@ -556,7 +605,7 @@ -------------------------------------------------------------------------- */ -#if sparc_TARGET_ARCH +#if sparc_REGS #define REG(x) __asm__("%" #x) @@ -574,9 +623,7 @@ #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