[llvm-commits] CVS: llvm/lib/Target/ARM/ARMAsmPrinter.cpp ARMConstantIslandPass.cpp ARMInstrThumb.td

Evan Cheng evan.cheng at apple.com
Fri Jan 26 18:30:00 PST 2007



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)>;






More information about the llvm-commits mailing list