ARMInstrInfo.cpp revision d57cdd5683ea926e489067364fb7ffe5fd5d35ee
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/MC/MCAsmInfo.h" 25using namespace llvm; 26 27ARMInstrInfo::ARMInstrInfo(const ARMSubtarget &STI) 28 : ARMBaseInstrInfo(STI), RI(*this, STI) { 29} 30 31unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const { 32 switch (Opc) { 33 default: break; 34 case ARM::LDR_PRE: 35 case ARM::LDR_POST: 36 return ARM::LDR; 37 case ARM::LDRH_PRE: 38 case ARM::LDRH_POST: 39 return ARM::LDRH; 40 case ARM::LDRB_PRE: 41 case ARM::LDRB_POST: 42 return ARM::LDRB; 43 case ARM::LDRSH_PRE: 44 case ARM::LDRSH_POST: 45 return ARM::LDRSH; 46 case ARM::LDRSB_PRE: 47 case ARM::LDRSB_POST: 48 return ARM::LDRSB; 49 case ARM::STR_PRE: 50 case ARM::STR_POST: 51 return ARM::STR; 52 case ARM::STRH_PRE: 53 case ARM::STRH_POST: 54 return ARM::STRH; 55 case ARM::STRB_PRE: 56 case ARM::STRB_POST: 57 return ARM::STRB; 58 } 59 60 return 0; 61} 62 63bool ARMInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const { 64 if (MBB.empty()) return false; 65 66 switch (MBB.back().getOpcode()) { 67 case ARM::BX_RET: // Return. 68 case ARM::LDM_RET: 69 case ARM::B: 70 case ARM::BRIND: 71 case ARM::BR_JTr: // Jumptable branch. 72 case ARM::BR_JTm: // Jumptable branch through mem. 73 case ARM::BR_JTadd: // Jumptable branch add to pc. 74 return true; 75 default: 76 break; 77 } 78 79 return false; 80} 81 82void ARMInstrInfo:: 83reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 84 unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, 85 const TargetRegisterInfo *TRI) const { 86 DebugLoc dl = Orig->getDebugLoc(); 87 unsigned Opcode = Orig->getOpcode(); 88 switch (Opcode) { 89 default: 90 break; 91 case ARM::MOVi2pieces: { 92 RI.emitLoadConstPool(MBB, I, dl, 93 DestReg, SubIdx, 94 Orig->getOperand(1).getImm(), 95 (ARMCC::CondCodes)Orig->getOperand(2).getImm(), 96 Orig->getOperand(3).getReg()); 97 MachineInstr *NewMI = prior(I); 98 NewMI->getOperand(0).setSubReg(SubIdx); 99 return; 100 } 101 } 102 103 return ARMBaseInstrInfo::reMaterialize(MBB, I, DestReg, SubIdx, Orig, TRI); 104} 105 106