1 //===- ARMInstrInfo.cpp - ARM Instruction Information -----------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains the ARM implementation of the TargetInstrInfo class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "ARMInstrInfo.h" 15 #include "ARM.h" 16 #include "ARMAddressingModes.h" 17 #include "ARMGenInstrInfo.inc" 18 #include "ARMMachineFunctionInfo.h" 19 #include "llvm/ADT/STLExtras.h" 20 #include "llvm/CodeGen/LiveVariables.h" 21 #include "llvm/CodeGen/MachineFrameInfo.h" 22 #include "llvm/CodeGen/MachineInstrBuilder.h" 23 #include "llvm/CodeGen/MachineJumpTableInfo.h" 24 #include "llvm/Target/TargetAsmInfo.h" 25 #include "llvm/Support/CommandLine.h" 26 using namespace llvm; 27 28 ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI) 29 : ARMBaseInstrInfo(STI), RI(*this, STI) { 30 } 31 32 unsigned ARMInstrInfo:: 33 getUnindexedOpcode(unsigned Opc) const { 34 switch (Opc) { 35 default: break; 36 case ARM::LDR_PRE: 37 case ARM::LDR_POST: 38 return ARM::LDR; 39 case ARM::LDRH_PRE: 40 case ARM::LDRH_POST: 41 return ARM::LDRH; 42 case ARM::LDRB_PRE: 43 case ARM::LDRB_POST: 44 return ARM::LDRB; 45 case ARM::LDRSH_PRE: 46 case ARM::LDRSH_POST: 47 return ARM::LDRSH; 48 case ARM::LDRSB_PRE: 49 case ARM::LDRSB_POST: 50 return ARM::LDRSB; 51 case ARM::STR_PRE: 52 case ARM::STR_POST: 53 return ARM::STR; 54 case ARM::STRH_PRE: 55 case ARM::STRH_POST: 56 return ARM::STRH; 57 case ARM::STRB_PRE: 58 case ARM::STRB_POST: 59 return ARM::STRB; 60 } 61 62 return 0; 63 } 64 65 unsigned ARMInstrInfo:: 66 getOpcode(ARMII::Op Op) const { 67 switch (Op) { 68 case ARMII::ADDri: return ARM::ADDri; 69 case ARMII::ADDrs: return ARM::ADDrs; 70 case ARMII::ADDrr: return ARM::ADDrr; 71 case ARMII::B: return ARM::B; 72 case ARMII::Bcc: return ARM::Bcc; 73 case ARMII::BR_JTr: return ARM::BR_JTr; 74 case ARMII::BR_JTm: return ARM::BR_JTm; 75 case ARMII::BR_JTadd: return ARM::BR_JTadd; 76 case ARMII::BX_RET: return ARM::BX_RET; 77 case ARMII::FCPYS: return ARM::FCPYS; 78 case ARMII::FCPYD: return ARM::FCPYD; 79 case ARMII::FLDD: return ARM::FLDD; 80 case ARMII::FLDS: return ARM::FLDS; 81 case ARMII::FSTD: return ARM::FSTD; 82 case ARMII::FSTS: return ARM::FSTS; 83 case ARMII::LDR: return ARM::LDR; 84 case ARMII::MOVr: return ARM::MOVr; 85 case ARMII::STR: return ARM::STR; 86 case ARMII::SUBri: return ARM::SUBri; 87 case ARMII::SUBrs: return ARM::SUBrs; 88 case ARMII::SUBrr: return ARM::SUBrr; 89 case ARMII::VMOVD: return ARM::VMOVD; 90 case ARMII::VMOVQ: return ARM::VMOVQ; 91 default: 92 break; 93 } 94 95 return 0; 96 } 97 98 bool ARMInstrInfo:: 99 BlockHasNoFallThrough(const MachineBasicBlock &MBB) const { 100 if (MBB.empty()) return false; 101 102 switch (MBB.back().getOpcode()) { 103 case ARM::BX_RET: // Return. 104 case ARM::LDM_RET: 105 case ARM::B: 106 case ARM::BR_JTr: // Jumptable branch. 107 case ARM::BR_JTm: // Jumptable branch through mem. 108 case ARM::BR_JTadd: // Jumptable branch add to pc. 109 return true; 110 default: 111 break; 112 } 113 114 return false; 115 } 116 117 void ARMInstrInfo:: 118 reMaterialize(MachineBasicBlock &MBB, 119 MachineBasicBlock::iterator I, 120 unsigned DestReg, 121 const MachineInstr *Orig) const { 122 DebugLoc dl = Orig->getDebugLoc(); 123 if (Orig->getOpcode() == ARM::MOVi2pieces) { 124 RI.emitLoadConstPool(MBB, I, dl, 125 DestReg, 126 Orig->getOperand(1).getImm(), 127 (ARMCC::CondCodes)Orig->getOperand(2).getImm(), 128 Orig->getOperand(3).getReg()); 129 return; 130 } 131 132 MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig); 133 MI->getOperand(0).setReg(DestReg); 134 MBB.insert(I, MI); 135 } 136