diff options
author | Peter Trommler <ptrommler@acm.org> | 2018-12-17 13:27:49 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-01-16 14:13:14 -0500 |
commit | 3f46cffcc2850e68405a113d4df7210c4748b4c1 (patch) | |
tree | f58041b07da0598a1393a65b913b4d4643805f0a | |
parent | da2d9cf8e028cd4e47285a71a720f33f112db69b (diff) | |
download | haskell-3f46cffcc2850e68405a113d4df7210c4748b4c1.tar.gz |
PPC NCG: Refactor stack allocation code
There is only one place where UPDATE_SP was used. Instead of the
UPDATE_SP pseudo instruction build the list of instructions directly.
-rw-r--r-- | compiler/nativeGen/PPC/Instr.hs | 23 | ||||
-rw-r--r-- | compiler/nativeGen/PPC/Ppr.hs | 18 |
2 files changed, 15 insertions, 26 deletions
diff --git a/compiler/nativeGen/PPC/Instr.hs b/compiler/nativeGen/PPC/Instr.hs index 8f3153ca16..f8dba25a21 100644 --- a/compiler/nativeGen/PPC/Instr.hs +++ b/compiler/nativeGen/PPC/Instr.hs @@ -87,11 +87,21 @@ ppc_mkStackDeallocInstr platform amount ppc_mkStackAllocInstr' :: Platform -> Int -> [Instr] ppc_mkStackAllocInstr' platform amount - = case platformArch platform of - ArchPPC -> [UPDATE_SP II32 (ImmInt amount)] - ArchPPC_64 _ -> [UPDATE_SP II64 (ImmInt amount)] - _ -> panic $ "ppc_mkStackAllocInstr' " - ++ show (platformArch platform) + | fits16Bits amount + = [ LD fmt r0 (AddrRegImm sp zero) + , STU fmt r0 (AddrRegImm sp immAmount) + ] + | otherwise + = [ LD fmt r0 (AddrRegImm sp zero) + , ADDIS tmp sp (HA immAmount) + , ADD tmp tmp (RIImm (LO immAmount)) + , STU fmt r0 (AddrRegReg sp tmp) + ] + where + fmt = intFormat $ widthFromBytes ((platformWordSize platform) `quot` 8) + zero = ImmInt 0 + tmp = tmpReg platform + immAmount = ImmInt amount -- -- See note [extra spill slots] in X86/Instr.hs @@ -289,8 +299,6 @@ data Instr | NOP -- no operation, PowerPC 64 bit -- needs this as place holder to -- reload TOC pointer - | UPDATE_SP Format Imm -- expand/shrink spill area on C stack - -- pseudo-instruction -- | Get the registers that are being used by this instruction. -- regUsage doesn't need to do any trickery for jumps and such. @@ -370,7 +378,6 @@ ppc_regUsageOfInstr platform instr MFCR reg -> usage ([], [reg]) MFLR reg -> usage ([], [reg]) FETCHPC reg -> usage ([], [reg]) - UPDATE_SP _ _ -> usage ([], [sp]) _ -> noUsage where usage (src, dst) = RU (filter (interesting platform) src) diff --git a/compiler/nativeGen/PPC/Ppr.hs b/compiler/nativeGen/PPC/Ppr.hs index 6aafb595c6..47ab07b633 100644 --- a/compiler/nativeGen/PPC/Ppr.hs +++ b/compiler/nativeGen/PPC/Ppr.hs @@ -892,24 +892,6 @@ pprInstr LWSYNC = text "\tlwsync" pprInstr NOP = text "\tnop" -pprInstr (UPDATE_SP fmt amount@(ImmInt offset)) - | fits16Bits offset = vcat [ - pprInstr (LD fmt r0 (AddrRegImm sp (ImmInt 0))), - pprInstr (STU fmt r0 (AddrRegImm sp amount)) - ] - -pprInstr (UPDATE_SP fmt amount) - = sdocWithPlatform $ \platform -> - let tmp = tmpReg platform in - vcat [ - pprInstr (LD fmt r0 (AddrRegImm sp (ImmInt 0))), - pprInstr (ADDIS tmp sp (HA amount)), - pprInstr (ADD tmp tmp (RIImm (LO amount))), - pprInstr (STU fmt r0 (AddrRegReg sp tmp)) - ] - --- pprInstr _ = panic "pprInstr (ppc)" - pprLogic :: PtrString -> Reg -> Reg -> RI -> SDoc pprLogic op reg1 reg2 ri = hcat [ |