Thumb2RegisterInfo.cpp revision 378445303b10b092a898a75131141a8259cff50b
1b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin//===- 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// 10b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin// This file contains the Thumb-2 implementation of the TargetRegisterInfo class. 11a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov// 12a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov//===----------------------------------------------------------------------===// 13a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 14a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARM.h" 15a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMAddressingModes.h" 1677521f5232e679aa3de10aaaed2464aa91d7ff55David Goodwin#include "ARMBaseInstrInfo.h" 17a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMMachineFunctionInfo.h" 18a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMSubtarget.h" 19b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin#include "Thumb2InstrInfo.h" 20b50ea5c48f8b1ce259e034ca5c16dc14af1a582cDavid Goodwin#include "Thumb2RegisterInfo.h" 21a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Constants.h" 22a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/DerivedTypes.h" 239adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson#include "llvm/Function.h" 249adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson#include "llvm/LLVMContext.h" 25a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineConstantPool.h" 26a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h" 27a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineFunction.h" 28a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineInstrBuilder.h" 29a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineLocation.h" 30a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineRegisterInfo.h" 31a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Target/TargetFrameInfo.h" 32a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Target/TargetMachine.h" 33a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/ADT/BitVector.h" 34a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/ADT/SmallVector.h" 35a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/Support/CommandLine.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(); 559adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson Constant *C = 569adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson MF.getFunction()->getContext()->getConstantInt(Type::Int32Ty, 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 { 66f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David Goodwin // FIXME 67a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov return false; 68a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 69