For Thumb mode, we need to use a constant pool if the value is too large to be

used with the CMP instruction.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142458 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2011-10-18 23:11:05 +00:00
parent bf79f91941
commit a5871dc104

View File

@ -5809,9 +5809,26 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
.addImm(1) .addImm(1)
.addMemOperand(FIMMOLd)); .addMemOperand(FIMMOLd));
AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::tCMPi8)) if (NumLPads < 256) {
.addReg(NewVReg1) AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::tCMPi8))
.addImm(LPadList.size())); .addReg(NewVReg1)
.addImm(NumLPads));
} else {
MachineConstantPool *ConstantPool = MF->getConstantPool();
const Constant *C =
ConstantInt::get(Type::getInt32Ty(MF->getFunction()->getContext()),
NumLPads);
unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4);
unsigned VReg1 = MRI->createVirtualRegister(TRC);
AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::tLDRpci))
.addReg(VReg1, RegState::Define)
.addConstantPoolIndex(Idx));
AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::tCMPr))
.addReg(NewVReg1)
.addReg(VReg1));
}
BuildMI(DispatchBB, dl, TII->get(ARM::tBcc)) BuildMI(DispatchBB, dl, TII->get(ARM::tBcc))
.addMBB(TrapBB) .addMBB(TrapBB)
.addImm(ARMCC::HI) .addImm(ARMCC::HI)