SPARC NCG: Keep track of destinations when doing a tabled jump

parent abaa832f
......@@ -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
......
......@@ -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
......
......@@ -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 ]
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment