summaryrefslogtreecommitdiff
path: root/compiler/codeGen/CgUtils.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/codeGen/CgUtils.hs')
-rw-r--r--compiler/codeGen/CgUtils.hs30
1 files changed, 15 insertions, 15 deletions
diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs
index 4661450fe5..64e3a2f5e7 100644
--- a/compiler/codeGen/CgUtils.hs
+++ b/compiler/codeGen/CgUtils.hs
@@ -308,14 +308,15 @@ callerSaveVolatileRegs dflags vols = (caller_save, caller_load)
callerSaveGlobalReg reg next
| callerSaves platform reg =
- CmmStore (get_GlobalReg_addr reg)
+ CmmStore (get_GlobalReg_addr platform reg)
(CmmReg (CmmGlobal reg)) : next
| otherwise = next
callerRestoreGlobalReg reg next
| callerSaves platform reg =
CmmAssign (CmmGlobal reg)
- (CmmLoad (get_GlobalReg_addr reg) (globalRegType reg))
+ (CmmLoad (get_GlobalReg_addr platform reg)
+ (globalRegType reg))
: next
| otherwise = next
@@ -810,10 +811,11 @@ srt_escape = -1
-- to real machine registers or stored as offsets from BaseReg. Given
-- a GlobalReg, get_GlobalReg_addr always produces the
-- register table address for it.
-get_GlobalReg_addr :: GlobalReg -> CmmExpr
-get_GlobalReg_addr BaseReg = regTableOffset 0
-get_GlobalReg_addr mid = get_Regtable_addr_from_offset
- (globalRegType mid) (baseRegOffset mid)
+get_GlobalReg_addr :: Platform -> GlobalReg -> CmmExpr
+get_GlobalReg_addr _ BaseReg = regTableOffset 0
+get_GlobalReg_addr platform mid
+ = get_Regtable_addr_from_offset platform
+ (globalRegType mid) (baseRegOffset mid)
-- Calculate a literal representing an offset into the register table.
-- Used when we don't have an actual BaseReg to offset from.
@@ -821,13 +823,11 @@ regTableOffset :: Int -> CmmExpr
regTableOffset n =
CmmLit (CmmLabelOff mkMainCapabilityLabel (oFFSET_Capability_r + n))
-get_Regtable_addr_from_offset :: CmmType -> Int -> CmmExpr
-get_Regtable_addr_from_offset _ offset =
-#ifdef REG_Base
- CmmRegOff (CmmGlobal BaseReg) offset
-#else
- regTableOffset offset
-#endif
+get_Regtable_addr_from_offset :: Platform -> CmmType -> Int -> CmmExpr
+get_Regtable_addr_from_offset platform _ offset =
+ if haveRegBase platform
+ then CmmRegOff (CmmGlobal BaseReg) offset
+ else regTableOffset offset
-- | Fixup global registers so that they assign to locations within the
-- RegTable if they aren't pinned for the current target.
@@ -848,7 +848,7 @@ fixStgRegStmt platform stmt
= case stmt of
CmmAssign (CmmGlobal reg) src ->
let src' = fixStgRegExpr platform src
- baseAddr = get_GlobalReg_addr reg
+ baseAddr = get_GlobalReg_addr platform reg
in case reg `elem` activeStgRegs platform of
True -> CmmAssign (CmmGlobal reg) src'
False -> CmmStore baseAddr src'
@@ -896,7 +896,7 @@ fixStgRegExpr platform expr
case reg `elem` activeStgRegs platform of
True -> expr
False ->
- let baseAddr = get_GlobalReg_addr reg
+ let baseAddr = get_GlobalReg_addr platform reg
in case reg of
BaseReg -> fixStgRegExpr platform baseAddr
_other -> fixStgRegExpr platform