X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FMachRegs.h;h=92944e146792b9c9ee4804acab06620414d54978;hb=0dbbf1932d550293986af6244202cb735b2cd966;hp=61cb768f9bb20e4f4ecf14d9923fba996c33da20;hpb=1215d238750d05f2136502176a781b1e9c8f1983;p=ghc-hetmet.git diff --git a/ghc/includes/MachRegs.h b/ghc/includes/MachRegs.h index 61cb768..92944e1 100644 --- a/ghc/includes/MachRegs.h +++ b/ghc/includes/MachRegs.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: MachRegs.h,v 1.22 2005/02/09 15:59:35 wolfgang Exp $ * * (c) The GHC Team, 1998-1999 * @@ -63,17 +62,6 @@ 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. -------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- @@ -262,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_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 */ @@ -604,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