diff options
| author | Bill Wendling <isanbard@gmail.com> | 2011-10-06 22:53:00 +0000 | 
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2011-10-06 22:53:00 +0000 | 
| commit | 5626c66a8929c547ea1a4162ede08e36db8a97d2 (patch) | |
| tree | 76ec66cccc940737a16fc1904c5c41fd5a9bd955 /llvm | |
| parent | e7e4ac4d8d330931ceb854932cb79cb300323329 (diff) | |
| download | bcm5719-llvm-5626c66a8929c547ea1a4162ede08e36db8a97d2.tar.gz bcm5719-llvm-5626c66a8929c547ea1a4162ede08e36db8a97d2.zip  | |
Generate the dispatch table for ARM mode.
llvm-svn: 141327
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 100 | 
1 files changed, 71 insertions, 29 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 4314765572a..e071c80ae53 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -5685,42 +5685,84 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {    // context.    SetupEntryBlockForSjLj(MI, MBB, DispatchBB, FI); -  // Grab constant pool and fixed stack memory operands.    MachineMemOperand *FIMMOLd =      MF->getMachineMemOperand(MachinePointerInfo::getFixedStack(FI),                               MachineMemOperand::MOLoad, 4, 4); -  unsigned NewVReg1 = MRI->createVirtualRegister(TRC); -  AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2LDRi12), NewVReg1) -                 .addFrameIndex(FI) -                 .addImm(4) -                 .addMemOperand(FIMMOLd)); -  AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2CMPri)) -                 .addReg(NewVReg1) -                 .addImm(LPadList.size())); -  BuildMI(DispatchBB, dl, TII->get(ARM::t2Bcc)) -    .addMBB(TrapBB) -    .addImm(ARMCC::HI) -    .addReg(ARM::CPSR); - -  unsigned NewVReg2 = MRI->createVirtualRegister(TRC); -  AddDefaultPred(BuildMI(DispContBB, dl, TII->get(ARM::t2LEApcrelJT), NewVReg2) -                 .addJumpTableIndex(MJTI) -                 .addImm(UId)); - -  unsigned NewVReg3 = MRI->createVirtualRegister(TRC); -  AddDefaultCC( +  if (Subtarget->isThumb2()) { +    unsigned NewVReg1 = MRI->createVirtualRegister(TRC); +    AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2LDRi12), NewVReg1) +                   .addFrameIndex(FI) +                   .addImm(4) +                   .addMemOperand(FIMMOLd)); +    AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2CMPri)) +                   .addReg(NewVReg1) +                   .addImm(LPadList.size())); +    BuildMI(DispatchBB, dl, TII->get(ARM::t2Bcc)) +      .addMBB(TrapBB) +      .addImm(ARMCC::HI) +      .addReg(ARM::CPSR); + +    unsigned NewVReg2 = MRI->createVirtualRegister(TRC); +    AddDefaultPred(BuildMI(DispContBB, dl, TII->get(ARM::t2LEApcrelJT),NewVReg2) +                   .addJumpTableIndex(MJTI) +                   .addImm(UId)); + +    unsigned NewVReg3 = MRI->createVirtualRegister(TRC); +    AddDefaultCC( +      AddDefaultPred( +        BuildMI(DispContBB, dl, TII->get(ARM::t2ADDrs), NewVReg3) +        .addReg(NewVReg2, RegState::Kill) +        .addReg(NewVReg1) +        .addImm(ARM_AM::getSORegOpc(ARM_AM::lsl, 2)))); + +    BuildMI(DispContBB, dl, TII->get(ARM::t2BR_JT)) +      .addReg(NewVReg3, RegState::Kill) +      .addReg(NewVReg1) +      .addJumpTableIndex(MJTI) +      .addImm(UId); +  } else if (Subtarget->isThumb()) { +  } else { +    unsigned NewVReg1 = MRI->createVirtualRegister(TRC); +    AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::LDRi12), NewVReg1) +                   .addFrameIndex(FI) +                   .addImm(4) +                   .addMemOperand(FIMMOLd)); +    AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::CMPri)) +                   .addReg(NewVReg1) +                   .addImm(LPadList.size())); +    BuildMI(DispatchBB, dl, TII->get(ARM::Bcc)) +      .addMBB(TrapBB) +      .addImm(ARMCC::HI) +      .addReg(ARM::CPSR); + +    unsigned NewVReg2 = MRI->createVirtualRegister(TRC); +    AddDefaultCC( +      AddDefaultPred(BuildMI(DispContBB, dl, TII->get(ARM::MOVsi), NewVReg2) +                     .addReg(NewVReg1) +                     .addImm(ARM_AM::getSORegOpc(ARM_AM::lsl, 2)))); +    unsigned NewVReg3 = MRI->createVirtualRegister(TRC); +    AddDefaultPred(BuildMI(DispContBB, dl, TII->get(ARM::LEApcrelJT), NewVReg3) +                   .addJumpTableIndex(MJTI) +                   .addImm(UId)); + +    MachineMemOperand *JTMMOLd = +      MF->getMachineMemOperand(MachinePointerInfo::getJumpTable(), +                               MachineMemOperand::MOLoad, 4, 4); +    unsigned NewVReg4 = MRI->createVirtualRegister(TRC);      AddDefaultPred( -      BuildMI(DispContBB, dl, TII->get(ARM::t2ADDrs), NewVReg3) +      BuildMI(DispContBB, dl, TII->get(ARM::LDRrs), NewVReg4)        .addReg(NewVReg2, RegState::Kill) -      .addReg(NewVReg1) -      .addImm(ARM_AM::getSORegOpc(ARM_AM::lsl, 2)))); +      .addReg(NewVReg3) +      .addImm(0) +      .addMemOperand(JTMMOLd)); -  BuildMI(DispContBB, dl, TII->get(ARM::t2BR_JT)) -    .addReg(NewVReg3, RegState::Kill) -    .addReg(NewVReg1) -    .addJumpTableIndex(MJTI) -    .addImm(UId); +    BuildMI(DispContBB, dl, TII->get(ARM::BR_JTadd)) +      .addReg(NewVReg4, RegState::Kill) +      .addReg(NewVReg3) +      .addJumpTableIndex(MJTI) +      .addImm(UId); +  }    // Add the jump table entries as successors to the MBB.    for (std::vector<MachineBasicBlock*>::iterator  | 

