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