diff options
| author | Jim Grosbach <grosbach@apple.com> | 2010-11-29 19:32:47 +0000 | 
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2010-11-29 19:32:47 +0000 | 
| commit | 58bc36a3a9d806ff2519f1f958f050969ff27d3e (patch) | |
| tree | 5040380be772a1c72bbc264a28d8fd7daeb9fb99 /llvm/lib | |
| parent | e9608b3f01bd1d5730c77511e6e629306098da89 (diff) | |
| download | bcm5719-llvm-58bc36a3a9d806ff2519f1f958f050969ff27d3e.tar.gz bcm5719-llvm-58bc36a3a9d806ff2519f1f958f050969ff27d3e.zip | |
ARM Pseudo-ize tBR_JTr.
llvm-svn: 120310
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrFormats.td | 10 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb.td | 13 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h | 1 | 
5 files changed, 19 insertions, 28 deletions
| diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 84ddab99aaa..da1c087c7fe 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -936,23 +936,13 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {      EmitJump2Table(MI);      return;    } -  case ARM::tBR_JTr: { -    // Lower and emit the instruction itself, then the jump table following it. -    MCInst TmpInst; -    // FIXME: The branch instruction is really a pseudo. We should xform it -    // explicitly. -    LowerARMMachineInstrToMCInst(MI, TmpInst, *this); -    OutStreamer.EmitInstruction(TmpInst); - -    // Output the data for the jump table itself -    EmitJumpTable(MI); -    return; -  } +  case ARM::tBR_JTr:    case ARM::BR_JTr: {      // Lower and emit the instruction itself, then the jump table following it.      // mov pc, target      MCInst TmpInst; -    TmpInst.setOpcode(ARM::MOVr); +    unsigned Opc = MI->getOpcode() == ARM::BR_JTr ? ARM::MOVr : ARM::tMOVr; +    TmpInst.setOpcode(Opc);      TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));      TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));      // Add predicate operands. @@ -960,6 +950,10 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {      TmpInst.addOperand(MCOperand::CreateReg(0));      OutStreamer.EmitInstruction(TmpInst); +    // Make sure the Thumb jump table is 4-byte aligned. +    if (Opc == ARM::tMOVr) +      EmitAlignment(2); +      // Output the data for the jump table itself      EmitJumpTable(MI);      return; diff --git a/llvm/lib/Target/ARM/ARMInstrFormats.td b/llvm/lib/Target/ARM/ARMInstrFormats.td index a5f89d6e49f..04c9b0e52af 100644 --- a/llvm/lib/Target/ARM/ARMInstrFormats.td +++ b/llvm/lib/Target/ARM/ARMInstrFormats.td @@ -255,6 +255,13 @@ class ARMPseudoInst<dag oops, dag iops, InstrItinClass itin,    list<Predicate> Predicates = [IsARM];  } +// PseudoInst that's Thumb-mode only. +class tPseudoInst<dag oops, dag iops, SizeFlagVal sz, InstrItinClass itin, +                    list<dag> pattern> +  : PseudoInst<oops, iops, itin, pattern> { +  let SZ = sz; +  list<Predicate> Predicates = [IsThumb]; +}  // Almost all ARM instructions are predicable.  class I<dag oops, dag iops, AddrMode am, SizeFlagVal sz, @@ -816,9 +823,6 @@ class T1I<dag oops, dag iops, InstrItinClass itin,  class T1Ix2<dag oops, dag iops, InstrItinClass itin,              string asm, list<dag> pattern>    : Thumb1I<oops, iops, AddrModeNone, Size4Bytes, itin, asm, "", pattern>; -class T1JTI<dag oops, dag iops, InstrItinClass itin, -            string asm, list<dag> pattern> -  : Thumb1I<oops, iops, AddrModeNone, SizeSpecial, itin, asm, "", pattern>;  // Two-address instructions  class T1It<dag oops, dag iops, InstrItinClass itin, diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index e09170f631a..61ab5496e6e 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -333,9 +333,6 @@ def cpinst_operand : Operand<i32> {    let PrintMethod = "printCPInstOperand";  } -def jtblock_operand : Operand<i32> { -  let PrintMethod = "printJTBlockOperand"; -}  def jt2block_operand : Operand<i32> {    let PrintMethod = "printJT2BlockOperand";  } diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td index 3af89341196..568cbc6c6c6 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -439,14 +439,11 @@ let isBranch = 1, isTerminator = 1 in {    def tBfar : TIx2<0b11110, 0b11, 1, (outs), (ins brtarget:$target), IIC_Br,                      "bl\t$target",[]>; -  let isCodeGenOnly = 1 in -  def tBR_JTr : T1JTI<(outs), -                      (ins tGPR:$target, jtblock_operand:$jt, i32imm:$id), -                      IIC_Br, "mov\tpc, $target\n\t.align\t2$jt", -                      [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]>, -                Encoding16 { -    let Inst{15-7} = 0b010001101; -    let Inst{2-0} = 0b111; +  def tBR_JTr : tPseudoInst<(outs), +                      (ins tGPR:$target, i32imm:$jt, i32imm:$id), +                      Size2Bytes, IIC_Br, +                      [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]> { +    list<Predicate> Predicates = [IsThumb, IsThumb1Only];    }    }  } diff --git a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h index e69a0e0d8f7..55605ead067 100644 --- a/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h +++ b/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h @@ -96,7 +96,6 @@ public:    void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O);    // The jump table instructions have custom handling in ARMAsmPrinter    // to output the jump table. Nothing further is necessary here. -  void printJTBlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {}    void printJT2BlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {}    void printTBAddrMode(const MCInst *MI, unsigned OpNum, raw_ostream &O);    void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O); | 

