131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- XCoreRegisterInfo.cpp - XCore Register Information ----------------===//
2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//                     The LLVM Compiler Infrastructure
4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file is distributed under the University of Illinois Open Source
6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// License. See LICENSE.TXT for details.
7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file contains the XCore implementation of the MRegisterInfo class.
11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCoreRegisterInfo.h"
15b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCore.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "XCoreMachineFunctionInfo.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/BitVector.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h"
19b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineFrameInfo.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h"
22b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineModuleInfo.h"
23b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/MachineRegisterInfo.h"
24b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/CodeGen/RegisterScavenging.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
27b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/Support/Debug.h"
28804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include "llvm/Support/ErrorHandling.h"
29804e0fea4033e3b91dbc8198cef30de30f141bb5Torok Edwin#include "llvm/Support/raw_ostream.h"
30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetFrameLowering.h"
31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h"
3473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
3573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_TARGET_DESC
36a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#include "XCoreGenRegisterInfo.inc"
3773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
38b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborneusing namespace llvm;
39b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
40b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneXCoreRegisterInfo::XCoreRegisterInfo(const TargetInstrInfo &tii)
410e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  : XCoreGenRegisterInfo(XCore::LR), TII(tii) {
42b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
43b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
44b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// helper functions
45b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmUs(unsigned val) {
46b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  return val <= 11;
47b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
48b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
49b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmU6(unsigned val) {
50b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  return val < (1 << 6);
51b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
52b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
53b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornestatic inline bool isImmU16(unsigned val) {
54b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  return val < (1 << 16);
55b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
56b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
57a267b0076e7887f5566e635ba35790f24d4524d9Chris Lattnerbool XCoreRegisterInfo::needsFrameMoves(const MachineFunction &MF) {
58fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola  return MF.getMMI().hasDebugInfo() ||
59fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola    MF.getFunction()->needsUnwindTableEntry();
60b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
61b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
62015f228861ef9b337366f92f637d4e8d624bb006Craig Topperconst uint16_t* XCoreRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF)
63b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne                                                                         const {
64015f228861ef9b337366f92f637d4e8d624bb006Craig Topper  static const uint16_t CalleeSavedRegs[] = {
65b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    XCore::R4, XCore::R5, XCore::R6, XCore::R7,
66b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    XCore::R8, XCore::R9, XCore::R10, XCore::LR,
67b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    0
68b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  };
69b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  return CalleeSavedRegs;
70b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
71b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
72b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneBitVector XCoreRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
73b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  BitVector Reserved(getNumRegs());
7416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
75d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
76b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Reserved.set(XCore::CP);
77b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Reserved.set(XCore::DP);
78b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Reserved.set(XCore::SP);
79b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Reserved.set(XCore::LR);
80d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  if (TFI->hasFP(MF)) {
81b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    Reserved.set(XCore::R10);
82b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  }
83b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  return Reserved;
84b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
85b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
86b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornebool
87b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneXCoreRegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
8816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
89b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
90d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  // TODO can we estimate stack size?
91d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  return TFI->hasFP(MF);
92b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
93b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
948ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osbornebool
956a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston GurdXCoreRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
966a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd  return requiresRegisterScavenging(MF);
976a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd}
986a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd
996a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurdbool
1008ae8cf4559fc2e22fc0366f38533204718a9a32dRichard OsborneXCoreRegisterInfo::useFPForScavengingIndex(const MachineFunction &MF) const {
1018ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne  return false;
1028ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne}
1038ae8cf4559fc2e22fc0366f38533204718a9a32dRichard Osborne
104fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbachvoid
105b58f498f7502e7e1833decbbbb4df771367c7341Jim GrosbachXCoreRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
106108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                                       int SPAdj, unsigned FIOperandNum,
107108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                                       RegScavenger *RS) const {
108b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  assert(SPAdj == 0 && "Unexpected");
109b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  MachineInstr &MI = *II;
110bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen  DebugLoc dl = MI.getDebugLoc();
111108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier  MachineOperand &FrameOp = MI.getOperand(FIOperandNum);
112b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  int FrameIndex = FrameOp.getIndex();
113b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
114b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  MachineFunction &MF = *MI.getParent()->getParent();
11516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
116b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
117b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  int StackSize = MF.getFrameInfo()->getStackSize();
118b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
119b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  #ifndef NDEBUG
120ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar  DEBUG(errs() << "\nFunction         : "
12196601ca332ab388754ca4673be8973396fea2dddCraig Topper        << MF.getName() << "\n");
122705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner  DEBUG(errs() << "<--------->\n");
123705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner  DEBUG(MI.print(errs()));
124705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner  DEBUG(errs() << "FrameIndex         : " << FrameIndex << "\n");
125705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner  DEBUG(errs() << "FrameOffset        : " << Offset << "\n");
126705e07f578e2b3af47ddab610feb4e7f2d3063a5Chris Lattner  DEBUG(errs() << "StackSize          : " << StackSize << "\n");
127b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  #endif
128b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
129b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Offset += StackSize;
130c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne
131c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne  unsigned FrameReg = getFrameRegister(MF);
132c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne
133c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne  // Special handling of DBG_VALUE instructions.
134c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne  if (MI.isDebugValue()) {
135108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier    MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, false /*isDef*/);
136108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
137c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne    return;
138c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne  }
139c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne
140b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  // fold constant into offset.
141108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier  Offset += MI.getOperand(FIOperandNum + 1).getImm();
142108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier  MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
143b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
144b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  assert(Offset%4 == 0 && "Misaligned stack offset");
145b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
146893e1c90a03a53cf13f73849324e83612688428aChris Lattner  DEBUG(errs() << "Offset             : " << Offset << "\n" << "<--------->\n");
147b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
148b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  Offset/=4;
149b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
150d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool FP = TFI->hasFP(MF);
151c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne
15229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne  unsigned Reg = MI.getOperand(0).getReg();
15329cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne  bool isKill = MI.getOpcode() == XCore::STWFI && MI.getOperand(0).isKill();
15429cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne
155420761a0f193e87d08ee1c51b26bba23ab4bac7fCraig Topper  assert(XCore::GRRegsRegClass.contains(Reg) && "Unexpected register operand");
15629cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne
15729cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne  MachineBasicBlock &MBB = *MI.getParent();
15829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne
159b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  if (FP) {
160b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    bool isUs = isImmUs(Offset);
161b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
162b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    if (!isUs) {
1631bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer      if (!RS)
1641bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer        report_fatal_error("eliminateFrameIndex Frame size too big: " +
1651bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer                           Twine(Offset));
166420761a0f193e87d08ee1c51b26bba23ab4bac7fCraig Topper      unsigned ScratchReg = RS->scavengeRegister(&XCore::GRRegsRegClass, II,
167b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne                                                 SPAdj);
168bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen      loadConstant(MBB, II, ScratchReg, Offset, dl);
169b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      switch (MI.getOpcode()) {
17029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::LDWFI:
171c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands        BuildMI(MBB, II, dl, TII.get(XCore::LDW_3r), Reg)
172c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
173587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling              .addReg(ScratchReg, RegState::Kill);
174b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
17529cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::STWFI:
1761f375e5bc78647f9b29564eafdc907250ccd91edRichard Osborne        BuildMI(MBB, II, dl, TII.get(XCore::STW_l3r))
177587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling              .addReg(Reg, getKillRegState(isKill))
178c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
179587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling              .addReg(ScratchReg, RegState::Kill);
180b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
18129cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::LDAWFI:
182c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands        BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l3r), Reg)
183c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
184587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling              .addReg(ScratchReg, RegState::Kill);
185b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
186b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      default:
187c23197a26f34f559ea9797de51e187087c039c42Torok Edwin        llvm_unreachable("Unexpected Opcode");
188b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      }
189b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    } else {
190b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      switch (MI.getOpcode()) {
19129cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::LDWFI:
192c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands        BuildMI(MBB, II, dl, TII.get(XCore::LDW_2rus), Reg)
193c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
194b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne              .addImm(Offset);
195b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
19629cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::STWFI:
197c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands        BuildMI(MBB, II, dl, TII.get(XCore::STW_2rus))
198587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling              .addReg(Reg, getKillRegState(isKill))
199c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
200b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne              .addImm(Offset);
201b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
20229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne      case XCore::LDAWFI:
203c2d98bc0d682419f09659d94afefd6a6266dd6eeDuncan Sands        BuildMI(MBB, II, dl, TII.get(XCore::LDAWF_l2rus), Reg)
204c7e33965f0690d407d2ec2dc8036a58af94c0542Richard Osborne              .addReg(FrameReg)
205b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne              .addImm(Offset);
206b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne        break;
207b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      default:
208c23197a26f34f559ea9797de51e187087c039c42Torok Edwin        llvm_unreachable("Unexpected Opcode");
209b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      }
210b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    }
211b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  } else {
212b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    bool isU6 = isImmU6(Offset);
2131bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer    if (!isU6 && !isImmU16(Offset))
2141bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer      report_fatal_error("eliminateFrameIndex Frame size too big: " +
2151bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer                         Twine(Offset));
216b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
21729cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne    switch (MI.getOpcode()) {
21829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne    int NewOpcode;
21929cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne    case XCore::LDWFI:
220b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      NewOpcode = (isU6) ? XCore::LDWSP_ru6 : XCore::LDWSP_lru6;
221bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen      BuildMI(MBB, II, dl, TII.get(NewOpcode), Reg)
22229cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne            .addImm(Offset);
223b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      break;
22429cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne    case XCore::STWFI:
225b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      NewOpcode = (isU6) ? XCore::STWSP_ru6 : XCore::STWSP_lru6;
226bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen      BuildMI(MBB, II, dl, TII.get(NewOpcode))
227587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling            .addReg(Reg, getKillRegState(isKill))
22829cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne            .addImm(Offset);
229b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      break;
23029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne    case XCore::LDAWFI:
231b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      NewOpcode = (isU6) ? XCore::LDAWSP_ru6 : XCore::LDAWSP_lru6;
232bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen      BuildMI(MBB, II, dl, TII.get(NewOpcode), Reg)
23329cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne            .addImm(Offset);
234b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      break;
235b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    default:
236c23197a26f34f559ea9797de51e187087c039c42Torok Edwin      llvm_unreachable("Unexpected Opcode");
237b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    }
238b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  }
23929cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne  // Erase old instruction.
24029cab5f0ee477f86d305ed080d61c17ff64b602fRichard Osborne  MBB.erase(II);
241b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
242b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
243b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornevoid XCoreRegisterInfo::
244b25baef26f03b9909b65dd5f762b38f93000445dRichard OsborneloadConstant(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
245bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen            unsigned DstReg, int64_t Value, DebugLoc dl) const {
246b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  // TODO use mkmsk if possible.
247b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  if (!isImmU16(Value)) {
248b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    // TODO use constant pool.
2491bd7335a17010bd4d8f86736cf73cac9f3fb80a5Benjamin Kramer    report_fatal_error("loadConstant value too big " + Twine(Value));
250b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  }
251b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  int Opcode = isImmU6(Value) ? XCore::LDC_ru6 : XCore::LDC_lru6;
252bd9ef18f74a361e0ed630d373677c6fc0ce3cad9Dale Johannesen  BuildMI(MBB, I, dl, TII.get(Opcode), DstReg).addImm(Value);
253b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
254b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
2553f2bf85d14759cc4b28a86805f566ac805a54d00David Greeneunsigned XCoreRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
25616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
25733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
258d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  return TFI->hasFP(MF) ? XCore::R10 : XCore::SP;
259b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
260