[project @ 1998-05-08 10:23:08 by sof]
[ghc-hetmet.git] / ghc / includes / MachRegs.lh
index 91c6353..ccdccd1 100644 (file)
@@ -9,7 +9,7 @@ NB: THIS FILE IS INCLUDED IN HASKELL SOURCE!
 #ifndef MACHREGS_H
 #define MACHREGS_H
 
-#if defined(__STG_GCC_REGS__) || defined(COMPILING_GHC)
+#if defined(__STG_GCC_REGS__) || defined(COMPILING_NCG)
 
 #include "StgMachDeps.h"
 
@@ -377,9 +377,6 @@ stack pointer.  \tr{%eax} and \tr{%edx} are return values from C functions,
 hence they get trashed across ccalls and are caller saves. \tr{%ebx},
 \tr{%esi}, \tr{%edi}, \tr{%ebp} are all callee-saves.
 
-We only steal \tr{%ebx} for base registers.  SIGH.  SimonM also took
-\tr{%esi} for SpA and \tr{%edi} for SpB.  Maybe later.
-
 \begin{code}
 #if i386_TARGET_ARCH
 
@@ -402,7 +399,9 @@ We only steal \tr{%ebx} for base registers.  SIGH.  SimonM also took
 #define REG_Scav       ebx
 #define REG_ToHp       ebp
 #if defined(GCap) || defined(GCgn)
+/* NO: -concurrent croaks on SMevac.lc with this
 #define REG_OldGen     esi
+*/
 #endif /* GCap || GCgn */
 
 #else  /* default: MAIN_REG_MAP */
@@ -424,7 +423,12 @@ We only steal \tr{%ebx} for base registers.  SIGH.  SimonM also took
    - give back ebp
 */
 
-/* SpB and R1 are the two heaviest hitters, followed by SpA */
+/* SpB and R1 are the two heaviest hitters, followed by SpA.
+   Hp comes next, followed closely by R2;
+   then RetReg, then R3 and R4.
+   At least based on some static counts.
+   SIGH.  WDP 95/09
+*/
 #define REG_Base    ebx
 #define REG_SpB            ebp
 #if STOLEN_X86_REGS >= 3
@@ -435,15 +439,16 @@ We only steal \tr{%ebx} for base registers.  SIGH.  SimonM also took
 # define REG_SpA    edi
 # define CALLEE_SAVES_SpA
 #endif
-/* the mangler will put Hp in %esp!!! */
-#if defined(MANGLING_X86_SP) && MANGLING_X86_SP == 0
-Oops! You should not be here if not mangling %esp!
-#endif
 #if STOLEN_X86_REGS >= 5
-# define REG_R2    ecx
-# define CALLER_SAVES_R2
+/*
+# define REG_Hp    ecx
+# define CALLER_SAVES_Hp
+# define CALLER_SAVES_SYSTEM
+*/
+/* because we *might* have Hp in a caller-saves register */
 #endif
 
+
 #endif /* SCAV_REG_MAP */
 #endif /* SCAN_REG_MAP */
 #endif /* MARK_REG_MAP */
@@ -692,36 +697,113 @@ We can steal some, but we might have to save/restore around ccalls.
 
 %************************************************************************
 %*                                                                     *
-\subsubsection[mapping-rs6000]{The IBM RS6000 register mapping}
+\subsubsection[mapping-powerpc]{The PowerPC register mapping}
 %*                                                                     *
 %************************************************************************
 
-\tr{r13}--\tr{r31} are wonderful callee-save registers.
-\tr{r4}--\tr{r8}, \tr{r10}, and \tr{r11} are caller-save registers.
+0      system glue?    (caller-save, volatile)
+1      SP              (callee-save, non-volatile)
+2      RTOC            (callee-save, non-volatile)
+3-10   args/return     (caller-save, volatile)
+11,12  system glue?    (caller-save, volatile)
+13-31                  (callee-save, non-volatile)
 
-\tr{%fr14}--\tr{%fr31} are callee-save floating-point registers.
+f0                     (caller-save, volatile)
+f1-f13 args/return     (caller-save, volatile)
+f14-f31                        (callee-save, non-volatile)
 
-I think we can do the Whole Business with callee-save registers only!
+\tr{13}--\tr{31} are wonderful callee-save registers.
+\tr{0}--\tr{12} are caller-save registers.
+
+\tr{%f14}--\tr{%f31} are callee-save floating-point registers.
 
-UTTERLY UNTESTED
+I think we can do the Whole Business with callee-save registers only!
 
 \begin{code}
-#if rs6000_TARGET_ARCH
-
-#define REG_Base       ????    
-#define REG_R1 
-#define REG_SpA        
-#define REG_SpB        
-#define REG_Hp         
-
-#define REG_Flt1       
-#define REG_Flt2       
-#define REG_Flt3       
-#define REG_Flt4       
-#define REG_Dbl1       
-#define REG_Dbl2       
-
-#endif /* rs6000 */
+#if powerpc_TARGET_ARCH || rs6000_TARGET_ARCH
+
+#define REG(x) __asm__(#x)
+
+#if defined(MARK_REG_MAP)
+#define REG_Mark       r22
+#define REG_MStack     r23
+#define REG_MRoot      r24
+#define REG_BitArray    r25
+#define REG_HeapBase   r26
+#define REG_HeapLim    r27
+#else
+#if defined(SCAN_REG_MAP)
+#define REG_Scan       r22
+#define REG_New        r23
+#define REG_LinkLim    r24
+#else
+#if defined(SCAV_REG_MAP)
+#define REG_Scav       r22
+#define REG_ToHp       r23
+#if defined(GCap) || defined(GCgn)
+#define REG_OldGen     r24
+#endif /* GCap || GCgn */
+#else  /* default: MAIN_REG_MAP */
+
+/* callee saves */
+#define CALLEE_SAVES_FltReg1
+#define CALLEE_SAVES_FltReg2
+#define CALLEE_SAVES_FltReg3
+#define CALLEE_SAVES_FltReg4
+#define CALLEE_SAVES_DblReg1
+#define CALLEE_SAVES_DblReg2
+#define CALLEE_SAVES_SpA
+#define CALLEE_SAVES_SuA
+#define CALLEE_SAVES_SpB
+#define CALLEE_SAVES_SuB
+#define CALLEE_SAVES_Hp
+#define CALLEE_SAVES_HpLim
+
+#define CALLEE_SAVES_Ret
+
+#define CALLEE_SAVES_R1
+#define CALLEE_SAVES_R2
+#define CALLEE_SAVES_R3
+#define CALLEE_SAVES_R4
+#define CALLEE_SAVES_R5
+#define CALLEE_SAVES_R6
+#define CALLEE_SAVES_R7
+#define CALLEE_SAVES_R8
+
+#define REG_R1         r14
+#define REG_R2         r15
+#define REG_R3         r16
+#define REG_R4         r17
+#define REG_R5         r18
+#define REG_R6         r19
+#define REG_R7         r20
+#define REG_R8         r21
+
+#define REG_Flt1       fr14
+#define REG_Flt2       fr15
+#define REG_Flt3       fr16
+#define REG_Flt4       fr17
+
+#define REG_Dbl1       fr18
+#define REG_Dbl2       fr19
+
+#define REG_SpA        r22
+#define REG_SuA        r23
+#define REG_SpB        r24
+#define REG_SuB        r25
+
+#define REG_Hp         r26
+#define REG_HpLim      r27
+
+#define REG_Ret                r28
+
+#define REG_StkStub    r29
+
+#endif /* SCAV_REG_MAP */
+#endif /* SCAN_REG_MAP */
+#endif /* MARK_REG_MAP */
+
+#endif /* powerpc */
 \end{code}
 
 %************************************************************************
@@ -769,19 +851,19 @@ discretion being the better part of valor, we also don't take
 #else
 #if defined(SCAN_REG_MAP)
 #define REG_ScanBase   g4
+/* NB: *not* defining this (so that everything is done w/ global variables)
+   does *not* work; I suspect that the Sca[nv]RegTable is not being
+   initialised somewhere... WDP 95/10
+*/
 #else
 #if defined(SCAV_REG_MAP)
 #define REG_ScavBase   g4
+/* see comment above */
 #else  /* default: MAIN_REG_MAP */
 
 /* callee saves (nothing) */
 
-/* caller saves (fp registers and maybe Activity) */
-
-#if defined(DO_SPAT_PROFILING)
-#define CALLER_SAVES_SYSTEM
-#define CALLER_SAVES_Activity
-#endif
+/* caller saves (fp registers) */
 
 #define CALLER_SAVES_USER
 
@@ -807,10 +889,6 @@ discretion being the better part of valor, we also don't take
 #define REG_Dbl1       f6
 #define REG_Dbl2       f8
 
-#if defined(DO_SPAT_PROFILING)
-#define REG_Activity   g5
-#endif
-
 #define REG_SpA        i0
 #define REG_SuA        i1
 #define REG_SpB        i2
@@ -840,7 +918,7 @@ discretion being the better part of valor, we also don't take
 Concluding multi-slurp protection:
 \begin{code}
 
-#endif /* __STG_GCC_REGS__ || COMPILING_GHC */
+#endif /* __STG_GCC_REGS__ || COMPILING_NCG */
 
 #endif /* MACHREGS_H */
 \end{code}