Thumb2RegisterInfo.cpp revision f639e9f9e6a9f0315f018ee71f1e5ae744b0c519
1f639e9f9e6a9f0315f018ee71f1e5ae744b0c519Jim Grosbach//===- Thumb2RegisterInfo.cpp - Thumb-2 Register Information ----*- C++ -*-===// 2a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 3a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// The LLVM Compiler Infrastructure 4a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 5a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// This file is distributed under the University of Illinois Open Source 6a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// License. See LICENSE.TXT for details. 7a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 8a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov//===----------------------------------------------------------------------===// 9a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 10f639e9f9e6a9f0315f018ee71f1e5ae744b0c519Jim Grosbach// This file contains the Thumb-2 implementation of the TargetRegisterInfo 11f639e9f9e6a9f0315f018ee71f1e5ae744b0c519Jim Grosbach// class. 12a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 13a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov//===----------------------------------------------------------------------===// 14a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 15a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARM.h" 16a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMAddressingModes.h" 1777521f5232e679aa3de10aaaed2464aa91d7ff55David Goodwin#include "ARMBaseInstrInfo.h" 18a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMMachineFunctionInfo.h" 19a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMSubtarget.h" 20b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin#include "Thumb2InstrInfo.h" 21b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin#include "Thumb2RegisterInfo.h" 22a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Constants.h" 23a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/DerivedTypes.h" 249adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson#include "llvm/Function.h" 259adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson#include "llvm/LLVMContext.h" 26a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineConstantPool.h" 27a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h" 28a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineFunction.h" 29a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineInstrBuilder.h" 30a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineLocation.h" 31a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineRegisterInfo.h" 32a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Target/TargetFrameInfo.h" 33a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Target/TargetMachine.h" 34a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/ADT/BitVector.h" 35a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/ADT/SmallVector.h" 36ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h" 37a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikovusing namespace llvm; 38a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 39db5a71a8e01ed9a0d93a19176df6ea0aea510d7bDavid GoodwinThumb2RegisterInfo::Thumb2RegisterInfo(const ARMBaseInstrInfo &tii, 40b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin const ARMSubtarget &sti) 41a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov : ARMBaseRegisterInfo(tii, sti) { 42a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 43a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 44a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov/// emitLoadConstPool - Emits a load from constpool to materialize the 45a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov/// specified immediate. 46b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwinvoid Thumb2RegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB, 47b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin MachineBasicBlock::iterator &MBBI, 4877521f5232e679aa3de10aaaed2464aa91d7ff55David Goodwin DebugLoc dl, 49378445303b10b092a898a75131141a8259cff50bEvan Cheng unsigned DestReg, unsigned SubIdx, 50378445303b10b092a898a75131141a8259cff50bEvan Cheng int Val, 51db5a71a8e01ed9a0d93a19176df6ea0aea510d7bDavid Goodwin ARMCC::CondCodes Pred, 52db5a71a8e01ed9a0d93a19176df6ea0aea510d7bDavid Goodwin unsigned PredReg) const { 53a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov MachineFunction &MF = *MBB.getParent(); 54a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov MachineConstantPool *ConstantPool = MF.getConstantPool(); 551d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Constant *C = ConstantInt::get( 561d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Type::getInt32Ty(MBB.getParent()->getFunction()->getContext()), Val); 57a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); 58a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 59378445303b10b092a898a75131141a8259cff50bEvan Cheng BuildMI(MBB, MBBI, dl, TII.get(ARM::t2LDRpci)) 60378445303b10b092a898a75131141a8259cff50bEvan Cheng .addReg(DestReg, getDefRegState(true), SubIdx) 61f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David Goodwin .addConstantPoolIndex(Idx).addImm((int64_t)ARMCC::AL).addReg(0); 62a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 63a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 64f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David Goodwinbool Thumb2RegisterInfo:: 65f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David GoodwinrequiresRegisterScavenging(const MachineFunction &MF) const { 66865763bf80625aa3f06116335b067bf7ad76061cEvan Cheng return true; 67a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 68