#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"
R1 (Node), R2 ... R8 must be saved if in a caller-save reg *and*
FltReg1 .. n its value survives over the ccall [rare] (the
DblReg1 .. n code-generator knows this...)
+LngReg1 .. n
BaseReg, better choices for caller-saves regs than the
StkStub,... other system regs, since they only need to be
# define REG_R6 6
# define REG_R7 7
# define REG_R8 8
-
+
# define REG_Flt1 f2
# define REG_Flt2 f3
# define REG_Flt3 f4
#define CALLEE_SAVES_FltReg4
#define CALLEE_SAVES_DblReg1
#define CALLEE_SAVES_DblReg2
+/* ToDo: improve? */
+#if HAVE_LONG_LONG && SIZEOF_LONG < 8
+#define CALLEE_SAVES_LngReg1
+#define CALLEE_SAVES_LngReg2
+#endif
#define CALLEE_SAVES_SpA
#define CALLEE_SAVES_SuA
#define CALLEE_SAVES_SpB
# define CALLEE_SAVES_FltReg4
# define CALLEE_SAVES_DblReg2
#endif
+#if HAVE_LONG_LONG && SIZEOF_LONG < 8
+#define CALLEE_SAVES_LngReg1
+#define CALLEE_SAVES_LngReg2
+#endif
#define CALLEE_SAVES_Base
#define CALLEE_SAVES_SpB
#define CALLEE_SAVES_SpA
#define CALLEE_SAVES_FltReg4
#define CALLEE_SAVES_DblReg1
#define CALLEE_SAVES_DblReg2
+#if HAVE_LONG_LONG && SIZEOF_LONG < 8
+#define CALLEE_SAVES_LngReg1
+#define CALLEE_SAVES_LngReg2
+#endif
#define CALLEE_SAVES_SpA
#define CALLEE_SAVES_SuA
#define CALLEE_SAVES_SpB
%* *
%************************************************************************
-\tr{r14}--\tr{r31} are wonderful callee-save registers.
-\tr{r0}--\tr{r13} 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)
+
+\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.
I think we can do the Whole Business with callee-save registers only!
\begin{code}
-#if powerpc_TARGET_ARCH
+#if powerpc_TARGET_ARCH || rs6000_TARGET_ARCH
#define REG(x) __asm__(#x)
#if defined(MARK_REG_MAP)
-#define REG_Mark r14
-#define REG_MStack r15
-#define REG_MRoot r16
-#define REG_BitArray r17
-#define REG_HeapBase r18
-#define REG_HeapLim r19
+#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 r14
-#define REG_New r15
-#define REG_LinkLim r16
+#define REG_Scan r22
+#define REG_New r23
+#define REG_LinkLim r24
#else
#if defined(SCAV_REG_MAP)
-#define REG_Scav r14
-#define REG_ToHp r15
+#define REG_Scav r22
+#define REG_ToHp r23
#if defined(GCap) || defined(GCgn)
-#define REG_OldGen r16
+#define REG_OldGen r24
#endif /* GCap || GCgn */
#else /* default: MAIN_REG_MAP */
#define CALLEE_SAVES_FltReg4
#define CALLEE_SAVES_DblReg1
#define CALLEE_SAVES_DblReg2
+#if HAVE_LONG_LONG && SIZEOF_LONG < 8
+#define CALLEE_SAVES_LngReg1
+#define CALLEE_SAVES_LngReg2
+#endif
#define CALLEE_SAVES_SpA
#define CALLEE_SAVES_SuA
#define CALLEE_SAVES_SpB
#define CALLER_SAVES_FltReg4
#define CALLER_SAVES_DblReg1
#define CALLER_SAVES_DblReg2
+#if HAVE_LONG_LONG && SIZEOF_LONG < 8
+#define CALLER_SAVES_LngReg1
+#define CALLER_SAVES_LngReg2
+#endif
#define REG_R1 l1
#define REG_R2 l2
Concluding multi-slurp protection:
\begin{code}
-#endif /* __STG_GCC_REGS__ || COMPILING_GHC */
+#endif /* __STG_GCC_REGS__ || COMPILING_NCG */
#endif /* MACHREGS_H */
\end{code}