X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FnativeGen%2FPPC%2FRegInfo.hs;h=ea882a0d23c7b25347d978e37ba5b3c555efcd55;hb=79607e5359a381ee5f40a5dcec313f1c94105c7b;hp=5efda843c2aaaaa4ba7299d73149f97b336f087d;hpb=67136d3a04b96b043328df9d4716d3da7a24a517;p=ghc-hetmet.git diff --git a/compiler/nativeGen/PPC/RegInfo.hs b/compiler/nativeGen/PPC/RegInfo.hs index 5efda84..ea882a0 100644 --- a/compiler/nativeGen/PPC/RegInfo.hs +++ b/compiler/nativeGen/PPC/RegInfo.hs @@ -16,7 +16,7 @@ module PPC.RegInfo ( patchJump, isRegRegMove, - JumpDest, + JumpDest(..), canShortcut, shortcutJump, @@ -36,8 +36,6 @@ where #include "HsVersions.h" import BlockId -import Cmm -import CLabel import RegsBase import PPC.Regs import PPC.Instr @@ -52,28 +50,28 @@ noUsage = RU [] [] regUsage :: Instr -> RegUsage regUsage instr = case instr of - SPILL reg slot -> usage ([reg], []) - RELOAD slot reg -> usage ([], [reg]) - - LD sz reg addr -> usage (regAddr addr, [reg]) - LA sz reg addr -> usage (regAddr addr, [reg]) - ST sz reg addr -> usage (reg : regAddr addr, []) - STU sz reg addr -> usage (reg : regAddr addr, []) - LIS reg imm -> usage ([], [reg]) - LI reg imm -> usage ([], [reg]) + SPILL reg _ -> usage ([reg], []) + RELOAD _ reg -> usage ([], [reg]) + + LD _ reg addr -> usage (regAddr addr, [reg]) + LA _ reg addr -> usage (regAddr addr, [reg]) + ST _ reg addr -> usage (reg : regAddr addr, []) + STU _ reg addr -> usage (reg : regAddr addr, []) + LIS reg _ -> usage ([], [reg]) + LI reg _ -> usage ([], [reg]) MR reg1 reg2 -> usage ([reg2], [reg1]) - CMP sz reg ri -> usage (reg : regRI ri,[]) - CMPL sz reg ri -> usage (reg : regRI ri,[]) - BCC cond lbl -> noUsage - BCCFAR cond lbl -> noUsage + CMP _ reg ri -> usage (reg : regRI ri,[]) + CMPL _ reg ri -> usage (reg : regRI ri,[]) + BCC _ _ -> noUsage + BCCFAR _ _ -> noUsage MTCTR reg -> usage ([reg],[]) - BCTR targets -> noUsage - BL imm params -> usage (params, callClobberedRegs) + BCTR _ -> noUsage + BL _ params -> usage (params, callClobberedRegs) BCTRL params -> usage (params, callClobberedRegs) ADD reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) ADDC reg1 reg2 reg3-> usage ([reg2,reg3], [reg1]) ADDE reg1 reg2 reg3-> usage ([reg2,reg3], [reg1]) - ADDIS reg1 reg2 imm -> usage ([reg2], [reg1]) + ADDIS reg1 reg2 _ -> usage ([reg2], [reg1]) SUBF reg1 reg2 reg3-> usage ([reg2,reg3], [reg1]) MULLW reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) DIVW reg1 reg2 reg3-> usage ([reg2,reg3], [reg1]) @@ -83,19 +81,19 @@ regUsage instr = case instr of AND reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) OR reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) XOR reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) - XORIS reg1 reg2 imm -> usage ([reg2], [reg1]) - EXTS siz reg1 reg2 -> usage ([reg2], [reg1]) + XORIS reg1 reg2 _ -> usage ([reg2], [reg1]) + EXTS _ reg1 reg2 -> usage ([reg2], [reg1]) NEG reg1 reg2 -> usage ([reg2], [reg1]) NOT reg1 reg2 -> usage ([reg2], [reg1]) SLW reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) SRW reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) SRAW reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) - RLWINM reg1 reg2 sh mb me + RLWINM reg1 reg2 _ _ _ -> usage ([reg2], [reg1]) - FADD sz r1 r2 r3 -> usage ([r2,r3], [r1]) - FSUB sz r1 r2 r3 -> usage ([r2,r3], [r1]) - FMUL sz r1 r2 r3 -> usage ([r2,r3], [r1]) - FDIV sz r1 r2 r3 -> usage ([r2,r3], [r1]) + FADD _ r1 r2 r3 -> usage ([r2,r3], [r1]) + FSUB _ r1 r2 r3 -> usage ([r2,r3], [r1]) + FMUL _ r1 r2 r3 -> usage ([r2,r3], [r1]) + FDIV _ r1 r2 r3 -> usage ([r2,r3], [r1]) FNEG r1 r2 -> usage ([r2], [r1]) FCMP r1 r2 -> usage ([r1,r2], []) FCTIWZ r1 r2 -> usage ([r2], [r1]) @@ -208,8 +206,11 @@ isJumpish instr = case instr of BCC{} -> True BCCFAR{} -> True + BCTR{} -> True + BCTRL{} -> True + BL{} -> True JMP{} -> True - + _ -> False -- | Change the destination of this jump instruction -- Used in joinToTargets in the linear allocator, when emitting fixup code @@ -223,7 +224,7 @@ patchJump insn old new BCCFAR cc id | id == old -> BCCFAR cc new - BCTR targets -> error "Cannot patch BCTR" + BCTR _ -> error "Cannot patch BCTR" _ -> insn @@ -239,7 +240,7 @@ canShortcut :: Instr -> Maybe JumpDest canShortcut _ = Nothing shortcutJump :: (BlockId -> Maybe JumpDest) -> Instr -> Instr -shortcutJump fn other = other +shortcutJump _ other = other @@ -258,6 +259,7 @@ mkSpillInstr reg delta slot let sz = case regClass reg of RcInteger -> II32 RcDouble -> FF64 + RcFloat -> panic "PPC.RegInfo.mkSpillInstr: no match" in ST sz reg (AddrRegImm sp (ImmInt (off-delta))) @@ -272,6 +274,7 @@ mkLoadInstr reg delta slot let sz = case regClass reg of RcInteger -> II32 RcDouble -> FF64 + RcFloat -> panic "PPC.RegInfo.mkSpillInstr: no match" in LD sz reg (AddrRegImm sp (ImmInt (off-delta)))