X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FnativeGen%2FMachRegs.lhs;fp=ghc%2Fcompiler%2FnativeGen%2FMachRegs.lhs;h=b1a5de9dbc039f08405df86fb78f374deb552518;hb=e087ed666e165fea0741936e94ce9df6d0446bf1;hp=6a53ebec97f116204e1bc1ee8c4eeecb1a454a4c;hpb=c6c1a5a7afe7436f8ce7b005c0293067d6d8d8f3;p=ghc-hetmet.git diff --git a/ghc/compiler/nativeGen/MachRegs.lhs b/ghc/compiler/nativeGen/MachRegs.lhs index 6a53ebe..b1a5de9 100644 --- a/ghc/compiler/nativeGen/MachRegs.lhs +++ b/ghc/compiler/nativeGen/MachRegs.lhs @@ -33,7 +33,7 @@ module MachRegs ( -- * Global registers get_GlobalReg_reg_or_addr, - callerSaves, + callerSaves, callerSaveVolatileRegs, -- * Machine-dependent register-related stuff allocatableRegs, argRegs, allArgRegs, callClobberedRegs, @@ -342,6 +342,39 @@ get_Regtable_addr_from_offset rep offset Nothing -> regTableOffset offset Just _ -> CmmRegOff (CmmGlobal BaseReg) offset +-- ----------------------------------------------------------------------------- +-- caller-save registers + +-- Here we generate the sequence of saves/restores required around a +-- foreign call instruction. + +callerSaveVolatileRegs :: Maybe [GlobalReg] -> ([CmmStmt], [CmmStmt]) +callerSaveVolatileRegs vols = (caller_save, caller_load) + where + caller_save = foldr ($!) [] (map callerSaveGlobalReg regs_to_save) + caller_load = foldr ($!) [] (map callerRestoreGlobalReg regs_to_save) + + system_regs = [Sp,SpLim,Hp,HpLim,CurrentTSO,CurrentNursery, + {-SparkHd,SparkTl,SparkBase,SparkLim,-}BaseReg ] + + regs_to_save = system_regs ++ vol_list + + vol_list = case vols of Nothing -> []; Just regs -> regs + + callerSaveGlobalReg reg next + | callerSaves reg = + CmmStore (get_GlobalReg_addr reg) + (CmmReg (CmmGlobal reg)) : next + | otherwise = next + + callerRestoreGlobalReg reg next + | callerSaves reg = + CmmAssign (CmmGlobal reg) + (CmmLoad (get_GlobalReg_addr reg) (globalRegRep reg)) + : next + | otherwise = next + + -- --------------------------------------------------------------------------- -- Registers