Changes in directory llvm/lib/Target/ARM:
ARMAsmPrinter.cpp updated: 1.50 -> 1.51 ARMConstantIslandPass.cpp updated: 1.10 -> 1.11 ARMInstrThumb.td updated: 1.6 -> 1.7 --- Log message: Thumb jumptable support. --- Diffs of the changes: (+32 -3) ARMAsmPrinter.cpp | 3 ++- ARMConstantIslandPass.cpp | 10 +++++++++- ARMInstrThumb.td | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) Index: llvm/lib/Target/ARM/ARMAsmPrinter.cpp diff -u llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.50 llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.51 --- llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.50 Fri Jan 26 15:22:28 2007 +++ llvm/lib/Target/ARM/ARMAsmPrinter.cpp Fri Jan 26 20:29:44 2007 @@ -647,7 +647,8 @@ << getFunctionNumber() << '_' << JTI << '_' << MO2.getImmedValue(); } else printBasicBlockLabel(MBB, false, false); - O << '\n'; + if (i != e-1) + O << '\n'; } } Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.10 llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.11 --- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.10 Fri Jan 26 14:38:26 2007 +++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp Fri Jan 26 20:29:45 2007 @@ -352,7 +352,8 @@ return MI->getOperand(2).getImm(); case ARM::BR_JTr: case ARM::BR_JTm: - case ARM::BR_JTadd: { + case ARM::BR_JTadd: + case ARM::tBR_JTr: { // These are jumptable branches, i.e. a branch followed by an inlined // jumptable. The size is 4 + 4 * number of entries. unsigned JTI = MI->getOperand(MI->getNumOperands()-2).getJumpTableIndex(); @@ -360,6 +361,13 @@ MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); assert(JTI < JT.size()); + // Thumb instructions are 2 byte aligned, but JT entries are 4 byte + // 4 aligned. The assembler / linker may add 2 byte padding just before + // the JT entries. Use + 4 even for tBR_JTr to purposely over-estimate + // the size the jumptable. + // FIXME: If we know the size of the function is less than (1 << 16) *2 + // bytes, we can use 16-bit entries instead. Then there won't be an + // alignment issue. return getNumJTEntries(JT, JTI) * 4 + 4; } default: Index: llvm/lib/Target/ARM/ARMInstrThumb.td diff -u llvm/lib/Target/ARM/ARMInstrThumb.td:1.6 llvm/lib/Target/ARM/ARMInstrThumb.td:1.7 --- llvm/lib/Target/ARM/ARMInstrThumb.td:1.6 Fri Jan 26 18:07:15 2007 +++ llvm/lib/Target/ARM/ARMInstrThumb.td Fri Jan 26 20:29:45 2007 @@ -56,6 +56,10 @@ class TIx2<dag ops, string asm, list<dag> pattern> : ThumbI<ops, AddrModeNone, Size4Bytes, asm, "", pattern>; +// BR_JT instructions +class TJTI<dag ops, string asm, list<dag> pattern> + : ThumbI<ops, AddrModeNone, SizeSpecial, asm, "", pattern>; + def imm_neg_XFORM : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(-(int)N->getValue(), MVT::i32); }]>; @@ -188,9 +192,14 @@ [(ARMcall_nolink GPR:$dst)]>; } -let isBranch = 1, isTerminator = 1, isBarrier = 1 in +let isBranch = 1, isTerminator = 1, isBarrier = 1 in { def tB : TI<(ops brtarget:$dst), "b $dst", [(br bb:$dst)]>; + def tBR_JTr : TJTI<(ops GPR:$dst, jtblock_operand:$jt, i32imm:$id), + "cpy pc, $dst \n\t.align\t2\n$jt", + [(ARMbrjt GPR:$dst, tjumptable:$jt, imm:$id)]>; +} + let isBranch = 1, isTerminator = 1, noResults = 1, isBarrier = 1 in def tBcc : TI<(ops brtarget:$dst, CCOp:$cc), "b$cc $dst", [(ARMbrcond bb:$dst, imm:$cc)]>; @@ -477,6 +486,13 @@ "add $dst, pc, #PCRELV${:uid}")), []>; +def tLEApcrelJT : TI<(ops GPR:$dst, i32imm:$label, i32imm:$id), + !strconcat(!strconcat(".set PCRELV${:uid}, (${label}_${id:no_hash}-(", + "${:private}PCRELL${:uid}+4))\n"), + !strconcat("${:private}PCRELL${:uid}:\n\t", + "add $dst, pc, #PCRELV${:uid}")), + []>; + //===----------------------------------------------------------------------===// // Non-Instruction Patterns // @@ -489,6 +505,10 @@ def : ThumbPat<(ARMWrapperCall texternalsym:$dst), (tLEApcrelCall texternalsym:$dst)>; +// JumpTable +def : ThumbPat<(ARMWrapperJT tjumptable:$dst, imm:$id), + (tLEApcrelJT tjumptable:$dst, imm:$id)>; + // Direct calls def : ThumbPat<(ARMtcall texternalsym:$func), (tBL texternalsym:$func)>; def : ThumbV5Pat<(ARMcall texternalsym:$func), (tBLXi texternalsym:$func)>; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits