MSP430RegisterInfo.cpp revision 875e1eb8ab7c6210f3d6d55d358e2c6a751f2cbb
1f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===- MSP430RegisterInfo.cpp - MSP430 Register Information ---------------===//
2f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
3f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
5f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// License. See LICENSE.TXT for details.
7f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
8f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
9f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
10f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file contains the MSP430 implementation of the TargetRegisterInfo class.
11f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
12f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
13f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
14f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#define DEBUG_TYPE "msp430-reg-info"
15f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
16f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "MSP430.h"
17f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "MSP430RegisterInfo.h"
18b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov#include "MSP430TargetMachine.h"
193a4fbcfd330de43011550079f811d92f741a08a1Anton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h"
202dd6cdc9204eaca42923509d227ef67974784aaeAnton Korobeynikov#include "llvm/CodeGen/MachineFunction.h"
21b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov#include "llvm/CodeGen/MachineInstrBuilder.h"
222dd6cdc9204eaca42923509d227ef67974784aaeAnton Korobeynikov#include "llvm/Target/TargetMachine.h"
233a4fbcfd330de43011550079f811d92f741a08a1Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
24f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "llvm/ADT/BitVector.h"
25f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
26f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovusing namespace llvm;
27f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
28f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// FIXME: Provide proper call frame setup / destroy opcodes.
29b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton KorobeynikovMSP430RegisterInfo::MSP430RegisterInfo(MSP430TargetMachine &tm,
30b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov                                       const TargetInstrInfo &tii)
31b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  : MSP430GenRegisterInfo(MSP430::ADJCALLSTACKDOWN, MSP430::ADJCALLSTACKUP),
32b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    TM(tm), TII(tii) {
33b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  StackAlign = TM.getFrameInfo()->getStackAlignment();
34b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov}
35f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
36f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovconst unsigned*
37f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton KorobeynikovMSP430RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
38fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  static const unsigned CalleeSavedRegs[] = {
39cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov    MSP430::FPW, MSP430::R5W, MSP430::R6W, MSP430::R7W,
40cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov    MSP430::R8W, MSP430::R9W, MSP430::R10W, MSP430::R11W,
41fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov    0
42fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  };
43fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov
44fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  return CalleeSavedRegs;
45f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
46f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
47f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovconst TargetRegisterClass* const*
48f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton KorobeynikovMSP430RegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
49fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  static const TargetRegisterClass * const CalleeSavedRegClasses[] = {
501df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov    &MSP430::GR16RegClass, &MSP430::GR16RegClass,
511df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov    &MSP430::GR16RegClass, &MSP430::GR16RegClass,
521df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov    &MSP430::GR16RegClass, &MSP430::GR16RegClass,
531df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov    &MSP430::GR16RegClass, &MSP430::GR16RegClass,
54fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov    0
55fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  };
56fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov
57fbf165a74b33e2a3b36cf45f22f1bae89558373bAnton Korobeynikov  return CalleeSavedRegClasses;
58f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
59f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
60f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton KorobeynikovBitVector
61f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton KorobeynikovMSP430RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
62dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov  BitVector Reserved(getNumRegs());
63dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov
64dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov  // Mark 4 special registers as reserved.
65cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov  Reserved.set(MSP430::PCW);
66cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov  Reserved.set(MSP430::SPW);
67cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov  Reserved.set(MSP430::SRW);
68cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov  Reserved.set(MSP430::CGW);
69dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov
70dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov  // Mark frame pointer as reserved if needed.
71dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov  if (hasFP(MF))
72cf9adf2cbb8298e83b53d7bee2ddab4c875cb3c5Anton Korobeynikov    Reserved.set(MSP430::FPW);
73dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov
74dcb802cf7be8e540e487c699f25d89c4821536abAnton Korobeynikov  return Reserved;
75f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
76f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
77aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikovconst TargetRegisterClass* MSP430RegisterInfo::getPointerRegClass() const {
78aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  return &MSP430::GR16RegClass;
79aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov}
80aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
81aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
82f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovbool MSP430RegisterInfo::hasFP(const MachineFunction &MF) const {
833a4fbcfd330de43011550079f811d92f741a08a1Anton Korobeynikov  return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects();
84f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
85f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
86b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikovbool MSP430RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
87b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  return !MF.getFrameInfo()->hasVarSizedObjects();
88b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov}
89b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
90b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikovvoid MSP430RegisterInfo::
91b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton KorobeynikoveliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
92b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov                              MachineBasicBlock::iterator I) const {
93b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  if (!hasReservedCallFrame(MF)) {
94b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // If the stack pointer can be changed after prologue, turn the
95b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // adjcallstackup instruction into a 'sub SPW, <amt>' and the
96b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // adjcallstackdown instruction into 'add SPW, <amt>'
97b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // TODO: consider using push / pop instead of sub + store / add
98b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    MachineInstr *Old = I;
99b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    uint64_t Amount = Old->getOperand(0).getImm();
100b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    if (Amount != 0) {
101b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      // We need to keep the stack aligned properly.  To do this, we round the
102b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      // amount of space needed for the outgoing arguments up to the next
103b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      // alignment boundary.
104b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      Amount = (Amount+StackAlign-1)/StackAlign*StackAlign;
105b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
106b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      MachineInstr *New = 0;
107b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      if (Old->getOpcode() == getCallFrameSetupOpcode()) {
108b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        New = BuildMI(MF, Old->getDebugLoc(),
109b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov                      TII.get(MSP430::SUB16ri), MSP430::SPW)
110b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov          .addReg(MSP430::SPW).addImm(Amount);
111b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      } else {
112b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        assert(Old->getOpcode() == getCallFrameDestroyOpcode());
113b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        // factor out the amount the callee already popped.
114b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        uint64_t CalleeAmt = Old->getOperand(1).getImm();
115b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        Amount -= CalleeAmt;
116b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        if (Amount)
117b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov          New = BuildMI(MF, Old->getDebugLoc(),
118b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov                        TII.get(MSP430::ADD16ri), MSP430::SPW)
119b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov            .addReg(MSP430::SPW).addImm(Amount);
120b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      }
121b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
122b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      if (New) {
123b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        // The SRW implicit def is dead.
124b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        New->getOperand(3).setIsDead();
125b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
126b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        // Replace the pseudo instruction with a new instruction...
127b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        MBB.insert(I, New);
128b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      }
129b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    }
130b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  } else if (I->getOpcode() == getCallFrameDestroyOpcode()) {
131b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // If we are performing frame pointer elimination and if the callee pops
132b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    // something off the stack pointer, add it back.
133b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
134b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      MachineInstr *Old = I;
135b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      MachineInstr *New =
136b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov        BuildMI(MF, Old->getDebugLoc(), TII.get(MSP430::SUB16ri),
137b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov                MSP430::SPW).addReg(MSP430::SPW).addImm(CalleeAmt);
138b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      // The SRW implicit def is dead.
139b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      New->getOperand(3).setIsDead();
140b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
141b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov      MBB.insert(I, New);
142b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov    }
143b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  }
144b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
145b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov  MBB.erase(I);
146b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov}
147b561264d2b2e33e1e6322a99d600b5daece5bbdeAnton Korobeynikov
148f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovvoid
149f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton KorobeynikovMSP430RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
150f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov                                        int SPAdj, RegScavenger *RS) const {
151aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  assert(SPAdj == 0 && "Unexpected");
152aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
153aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  unsigned i = 0;
154aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  MachineInstr &MI = *II;
15540477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  MachineBasicBlock &MBB = *MI.getParent();
15640477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  MachineFunction &MF = *MBB.getParent();
15740477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  DebugLoc dl = MI.getDebugLoc();
158aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  while (!MI.getOperand(i).isFI()) {
159aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov    ++i;
160aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov    assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
161aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  }
162aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
163aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  int FrameIndex = MI.getOperand(i).getIndex();
164aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
165aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  unsigned BasePtr = (hasFP(MF) ? MSP430::FPW : MSP430::SPW);
166aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex);
167aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
168aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  if (!hasFP(MF))
169aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov    Offset += MF.getFrameInfo()->getStackSize();
170aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
171aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  // Skip the saved PC
172aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  Offset += 2;
173aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov
174aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  // Fold imm into offset
175aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  Offset += MI.getOperand(i+1).getImm();
17640477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
17740477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  if (MI.getOpcode() == MSP430::ADD16ri) {
17840477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    // This is actually "load effective address" of the stack slot
17940477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    // instruction. We have only two-address instructions, thus we need to
18040477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    // expand it into mov + add
18140477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
18240477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    MI.setDesc(TII.get(MSP430::MOV16rr));
18340477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    MI.getOperand(i).ChangeToRegister(BasePtr, false);
18440477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
18540477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    if (Offset == 0)
18640477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov      return;
18740477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
18840477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    // We need to materialize the offset via add instruction.
18940477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    unsigned DstReg = MI.getOperand(0).getReg();
19040477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    if (Offset < 0)
19140477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov      BuildMI(MBB, next(II), dl, TII.get(MSP430::SUB16ri), DstReg)
19240477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov        .addReg(DstReg).addImm(-Offset);
19340477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    else
19440477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov      BuildMI(MBB, next(II), dl, TII.get(MSP430::ADD16ri), DstReg)
19540477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov        .addReg(DstReg).addImm(Offset);
19640477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
19740477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov    return;
19840477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  }
19940477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov
20040477317f39dccfd5c9c139feabda1becc6bd49cAnton Korobeynikov  MI.getOperand(i).ChangeToRegister(BasePtr, false);
201aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  MI.getOperand(i+1).ChangeToImmediate(Offset);
202f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
203f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
204f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovvoid MSP430RegisterInfo::emitPrologue(MachineFunction &MF) const {
205e37db97928a63008a096e6151f7a68fe2de35694Anton Korobeynikov  // Nothing here yet
206f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
207f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
208f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovvoid MSP430RegisterInfo::emitEpilogue(MachineFunction &MF,
209f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov                                      MachineBasicBlock &MBB) const {
210e37db97928a63008a096e6151f7a68fe2de35694Anton Korobeynikov  // Nothing here yet
211f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
212f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
213f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovunsigned MSP430RegisterInfo::getRARegister() const {
214875e1eb8ab7c6210f3d6d55d358e2c6a751f2cbbAnton Korobeynikov  return MSP430::PCW;
215f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
216f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
217f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovunsigned MSP430RegisterInfo::getFrameRegister(MachineFunction &MF) const {
218875e1eb8ab7c6210f3d6d55d358e2c6a751f2cbbAnton Korobeynikov  return hasFP(MF) ? MSP430::FPW : MSP430::SPW;
219f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
220f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
221f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovint MSP430RegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
222f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  assert(0 && "Not implemented yet!");
223f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
224f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
225f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "MSP430GenRegisterInfo.inc"
226