Change Thumb2 jumptable codegen to one that uses two level jumps:
[oota-llvm.git] / lib / Target / ARM / ARMInstrThumb2.td
index bb36a33e1a10de2db2bf58ddbe592fe4070a51cb..c265d9fb8054ad5301f1b0766783a19500067571 100644 (file)
@@ -1080,24 +1080,12 @@ def t2B   : T2XI<(outs), (ins brtarget:$target),
                  "b $target",
                  [(br bb:$target)]>;
 
-let isNotDuplicable = 1, isIndirectBranch = 1 in {
-def t2BR_JTr : T2JTI<(outs), (ins GPR:$target, jtblock_operand:$jt, i32imm:$id),
-                     "mov pc, $target \n\t.align\t2\n$jt",
-                     [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]>;
-
-def t2BR_JTm : 
-    T2JTI<(outs),
-          (ins t2addrmode_so_reg:$target, jtblock_operand:$jt, i32imm:$id),
-          "ldr pc, $target \n\t.align\t2\n$jt",
-          [(ARMbrjt (i32 (load t2addrmode_so_reg:$target)), tjumptable:$jt,
-             imm:$id)]>;
-
-def t2BR_JTadd : 
+let isNotDuplicable = 1, isIndirectBranch = 1 in
+def t2BR_JT :
     T2JTI<(outs),
-          (ins GPR:$target, GPR:$idx, jtblock_operand:$jt, i32imm:$id),
-          "add pc, $target, $idx \n\t.align\t2\n$jt",
-          [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt, imm:$id)]>;
-} // isNotDuplicate, isIndirectBranch
+          (ins GPR:$base, GPR:$idx, jt2block_operand:$jt, i32imm:$id),
+          "add pc, $base, $idx, lsl #2\n$jt",
+          [(ARMbr2jt GPR:$base, GPR:$idx, tjumptable:$jt, imm:$id)]>;
 } // isBranch, isTerminator, isBarrier
 
 // FIXME: should be able to write a pattern for ARMBrcond, but can't use