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