diff options
author | Ben.Lippmeier@anu.edu.au <unknown> | 2009-01-23 05:22:47 +0000 |
---|---|---|
committer | Ben.Lippmeier@anu.edu.au <unknown> | 2009-01-23 05:22:47 +0000 |
commit | d7d09c18459983be1ef690e0d9136a8736b1976f (patch) | |
tree | 1de74251a202ac8d91e6b71e7f9f8ec5025182fe | |
parent | abaa832f4b580fabaee9c887bb01da379c7e6482 (diff) | |
download | haskell-d7d09c18459983be1ef690e0d9136a8736b1976f.tar.gz |
SPARC NCG: Keep track of destinations when doing a tabled jump
-rw-r--r-- | compiler/nativeGen/MachCodeGen.hs | 4 | ||||
-rw-r--r-- | compiler/nativeGen/MachInstrs.hs | 7 | ||||
-rw-r--r-- | compiler/nativeGen/PprMach.hs | 1 | ||||
-rw-r--r-- | compiler/nativeGen/RegAllocInfo.hs | 10 |
4 files changed, 17 insertions, 5 deletions
diff --git a/compiler/nativeGen/MachCodeGen.hs b/compiler/nativeGen/MachCodeGen.hs index da2b0eab82..cac9f17426 100644 --- a/compiler/nativeGen/MachCodeGen.hs +++ b/compiler/nativeGen/MachCodeGen.hs @@ -4309,8 +4309,8 @@ genSwitch expr ids , SLL e_reg (RIImm $ ImmInt 2) offset_reg -- load and jump to the destination - , LD II32 (AddrRegReg base_reg offset_reg) dst - , JMP (AddrRegImm dst (ImmInt 0)) + , LD II32 (AddrRegReg base_reg offset_reg) dst + , JMP_TBL (AddrRegImm dst (ImmInt 0)) [i | Just i <- ids] , NOP ] #else diff --git a/compiler/nativeGen/MachInstrs.hs b/compiler/nativeGen/MachInstrs.hs index e16dbf3b05..529da0dd83 100644 --- a/compiler/nativeGen/MachInstrs.hs +++ b/compiler/nativeGen/MachInstrs.hs @@ -609,6 +609,13 @@ is_G_instr instr | BF Cond Bool BlockId -- cond, annul?, target | JMP AddrMode -- target + + -- With a tabled jump we know all the possible destinations. Tabled + -- jump includes its list of destinations so we can work out what regs + -- are live across the jump. + -- + | JMP_TBL AddrMode [BlockId] + | CALL (Either Imm Reg) Int Bool -- target, args, terminal riZero :: RI -> Bool diff --git a/compiler/nativeGen/PprMach.hs b/compiler/nativeGen/PprMach.hs index 8fc9e3dc46..9e85198513 100644 --- a/compiler/nativeGen/PprMach.hs +++ b/compiler/nativeGen/PprMach.hs @@ -2110,6 +2110,7 @@ pprInstr (BF cond b (BlockId id)) ] pprInstr (JMP addr) = (<>) (ptext (sLit "\tjmp\t")) (pprAddr addr) +pprInstr (JMP_TBL op ids) = pprInstr (JMP op) pprInstr (CALL (Left imm) n _) = hcat [ ptext (sLit "\tcall\t"), pprImm imm, comma, int n ] diff --git a/compiler/nativeGen/RegAllocInfo.hs b/compiler/nativeGen/RegAllocInfo.hs index deb5f34e21..bab6c2f4fe 100644 --- a/compiler/nativeGen/RegAllocInfo.hs +++ b/compiler/nativeGen/RegAllocInfo.hs @@ -320,8 +320,8 @@ regUsage instr = case instr of FSUB s r1 r2 r3 -> usage ([r1, r2], [r3]) FxTOy s1 s2 r1 r2 -> usage ([r1], [r2]) - -- We assume that all local jumps will be BI/BF. JMP must be out-of-line. - JMP addr -> usage (regAddr addr, []) + JMP addr -> usage (regAddr addr, []) + JMP_TBL addr ids -> usage (regAddr addr, []) CALL (Left imm) n True -> noUsage CALL (Left imm) n False -> usage (argRegs n, callClobberedRegs) @@ -427,6 +427,7 @@ jumpDests insn acc #elif sparc_TARGET_ARCH BI _ _ id -> id : acc BF _ _ id -> id : acc + JMP_TBL _ ids -> ids ++ acc #else #error "RegAllocInfo.jumpDests not finished" #endif @@ -696,7 +697,10 @@ patchRegs instr env = case instr of FSQRT s r1 r2 -> FSQRT s (env r1) (env r2) FSUB s r1 r2 r3 -> FSUB s (env r1) (env r2) (env r3) FxTOy s1 s2 r1 r2 -> FxTOy s1 s2 (env r1) (env r2) - JMP addr -> JMP (fixAddr addr) + + JMP addr -> JMP (fixAddr addr) + JMP_TBL addr ids -> JMP_TBL (fixAddr addr) ids + CALL (Left i) n t -> CALL (Left i) n t CALL (Right r) n t -> CALL (Right (env r)) n t _ -> instr |