summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/nativeGen/X86/Regs.hs18
1 files changed, 10 insertions, 8 deletions
diff --git a/compiler/nativeGen/X86/Regs.hs b/compiler/nativeGen/X86/Regs.hs
index b2b6a3413a..ea0fd61a97 100644
--- a/compiler/nativeGen/X86/Regs.hs
+++ b/compiler/nativeGen/X86/Regs.hs
@@ -404,7 +404,7 @@ xmm n = regSingle (firstxmm+n)
-- horror show -----------------------------------------------------------------
-freeReg :: RegNo -> FastBool
+freeReg, freeRegBase :: RegNo -> FastBool
globalRegMaybe :: GlobalReg -> Maybe RealReg
allArgRegs :: [(Reg, Reg)]
allIntArgRegs :: [Reg]
@@ -480,26 +480,28 @@ freeReg edi = fastBool False
freeReg rsp = fastBool False -- %rsp is the C stack pointer
#endif
+-- split patterns in two functions to prevent overlaps
+freeReg r = freeRegBase r
+
#ifdef REG_Base
-freeReg REG_Base = fastBool False
+freeRegBase REG_Base = fastBool False
#endif
#ifdef REG_Sp
-freeReg REG_Sp = fastBool False
+freeRegBase REG_Sp = fastBool False
#endif
#ifdef REG_SpLim
-freeReg REG_SpLim = fastBool False
+freeRegBase REG_SpLim = fastBool False
#endif
#ifdef REG_Hp
-freeReg REG_Hp = fastBool False
+freeRegBase REG_Hp = fastBool False
#endif
#ifdef REG_HpLim
-freeReg REG_HpLim = fastBool False
+freeRegBase REG_HpLim = fastBool False
#endif
-- All other regs are considered to be "free", because we can track
-- their liveness accurately.
-freeReg _ = fastBool True
-
+freeRegBase _ = fastBool True
-- | Returns 'Nothing' if this global register is not stored
-- in a real machine register, otherwise returns @'Just' reg@, where