131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- Thumb2RegisterInfo.cpp - Thumb-2 Register Information -------------===// 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 15c1f6f42049696e7357fb4837e1b25dabbaed3fe6Craig Topper#include "Thumb2RegisterInfo.h" 16a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARM.h" 17a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "ARMSubtarget.h" 18a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineConstantPool.h" 19a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineFunction.h" 20a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov#include "llvm/CodeGen/MachineInstrBuilder.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetInstrInfo.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetMachine.h" 26a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikovusing namespace llvm; 27a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 2857148c166ab232191098492633c924fad9c44ef3Bill WendlingThumb2RegisterInfo::Thumb2RegisterInfo(const ARMSubtarget &sti) 2957148c166ab232191098492633c924fad9c44ef3Bill Wendling : ARMBaseRegisterInfo(sti) { 30a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 31a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 32a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov/// emitLoadConstPool - Emits a load from constpool to materialize the 33a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov/// specified immediate. 343daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikovvoid 353daccd82d3151fa3629de430b55698a81084fc9eAnton KorobeynikovThumb2RegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB, 363daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov MachineBasicBlock::iterator &MBBI, 373daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov DebugLoc dl, 383daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov unsigned DestReg, unsigned SubIdx, 393daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov int Val, 403daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov ARMCC::CondCodes Pred, unsigned PredReg, 413daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov unsigned MIFlags) const { 42a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov MachineFunction &MF = *MBB.getParent(); 4357148c166ab232191098492633c924fad9c44ef3Bill Wendling const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo(); 44a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov MachineConstantPool *ConstantPool = MF.getConstantPool(); 4546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const Constant *C = ConstantInt::get( 461d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Type::getInt32Ty(MBB.getParent()->getFunction()->getContext()), Val); 47a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov unsigned Idx = ConstantPool->getConstantPoolIndex(C, 4); 48a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov 49378445303b10b092a898a75131141a8259cff50bEvan Cheng BuildMI(MBB, MBBI, dl, TII.get(ARM::t2LDRpci)) 50378445303b10b092a898a75131141a8259cff50bEvan Cheng .addReg(DestReg, getDefRegState(true), SubIdx) 513daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov .addConstantPoolIndex(Idx).addImm((int64_t)ARMCC::AL).addReg(0) 523daccd82d3151fa3629de430b55698a81084fc9eAnton Korobeynikov .setMIFlags(MIFlags); 53a98cbc554ca2cd40426e7c3ff8d1467da32e195dAnton Korobeynikov} 54