diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.cpp | 44 | ||||
| -rw-r--r-- | llvm/test/MC/Mips/mips64shift.ll | 5 | 
2 files changed, 28 insertions, 21 deletions
diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp index 00ff7545c14..3b1509d46bb 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp @@ -58,33 +58,37 @@ void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) {      return;    } -  // Direct object specific instruction lowering -  if (!OutStreamer.hasRawTextSupport()) -    switch (MI->getOpcode()) { -    case Mips::DSLL: -    case Mips::DSRL: -    case Mips::DSRA: -      assert(MI->getNumOperands() == 3 && -             "Invalid no. of machine operands for shift!"); -      assert(MI->getOperand(2).isImm()); -      int64_t Shift = MI->getOperand(2).getImm(); -      if (Shift > 31) { -        MCInst TmpInst0; -        MCInstLowering.LowerLargeShift(MI, TmpInst0, Shift - 32); -        OutStreamer.EmitInstruction(TmpInst0); -        return; -      } -      break; -    } -    MachineBasicBlock::const_instr_iterator I = MI;    MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end();    do {      MCInst TmpInst0; + +    // Direct object specific instruction lowering +    if (!OutStreamer.hasRawTextSupport()) +      switch (I->getOpcode()) { +      // If shift amount is >= 32 it the inst needs to be lowered further +      case Mips::DSLL: +      case Mips::DSRL: +      case Mips::DSRA: +      { +        assert(I->getNumOperands() == 3 && +            "Invalid no. of machine operands for shift!"); +        assert(I->getOperand(2).isImm()); +        int64_t Shift = I->getOperand(2).getImm(); +        if (Shift > 31) { +          MCInst TmpInst0; +          MCInstLowering.LowerLargeShift(I, TmpInst0, Shift - 32); +          OutStreamer.EmitInstruction(TmpInst0); +          return; +        } +      } +      } +      MCInstLowering.Lower(I++, TmpInst0);      OutStreamer.EmitInstruction(TmpInst0); -  } while ((I != E) && I->isInsideBundle()); + +  } while ((I != E) && I->isInsideBundle()); // Delay slot check  }  //===----------------------------------------------------------------------===// diff --git a/llvm/test/MC/Mips/mips64shift.ll b/llvm/test/MC/Mips/mips64shift.ll index e1c18576de0..99cac7b591f 100644 --- a/llvm/test/MC/Mips/mips64shift.ll +++ b/llvm/test/MC/Mips/mips64shift.ll @@ -1,5 +1,8 @@ -; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 -disable-mips-delay-filler %s -o - | llvm-objdump -disassemble -triple mips64el - | FileCheck %s +; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 -disable-mips-delay-filler %s -o - \ +; RUN: | llvm-objdump -disassemble -triple mips64el - | FileCheck %s  +; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 %s -o - \ +; RUN: | llvm-objdump -disassemble -triple mips64el - | FileCheck %s   define i64 @f3(i64 %a0) nounwind readnone {  entry:  | 

