131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- SparcRegisterInfo.cpp - SPARC Register Information ----------------===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//                     The LLVM Compiler Infrastructure
4e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
9e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
106f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// This file contains the SPARC implementation of the TargetRegisterInfo class.
11e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
12e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
13e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
147c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcRegisterInfo.h"
1579aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "Sparc.h"
16530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju#include "SparcMachineFunctionInfo.h"
177c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcSubtarget.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/BitVector.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h"
206c5526e56ec558f6308e33437b5f90d1c67768edBrian Gaeke#include "llvm/CodeGen/MachineFrameInfo.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineInstrBuilder.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
2421886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju#include "llvm/Support/CommandLine.h"
25c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng#include "llvm/Target/TargetInstrInfo.h"
2773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm;
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_TARGET_DESC
31a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#include "SparcGenRegisterInfo.inc"
3273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
3321886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindarajustatic cl::opt<bool>
3421886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman GovindarajuReserveAppRegisters("sparc-reserve-app-registers", cl::Hidden, cl::init(false),
3521886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju                    cl::desc("Reserve application registers (%g2-%g4)"));
3621886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju
37c1dcb8d654d4468d63224269ee3c92480bf2385bBill WendlingSparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st)
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  : SparcGenRegisterInfo(SP::O7), Subtarget(st) {
3969d39091fe2af94d1ceebca526eabede98831a65Chris Lattner}
40e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCPhysReg*
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
43d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund Olesen  return CSR_SaveList;
44d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund Olesen}
45d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund Olesen
46d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund Olesenconst uint32_t*
47d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund OlesenSparcRegisterInfo::getCallPreservedMask(CallingConv::ID CC) const {
48d93969c32a6bbae3326a1f485c4c85be1cb39406Jakob Stoklund Olesen  return CSR_RegMask;
490f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng}
500f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
511b41835f02f77c04a93323f722cf158cc566acaeVenkatraman Govindarajuconst uint32_t*
521b41835f02f77c04a93323f722cf158cc566acaeVenkatraman GovindarajuSparcRegisterInfo::getRTCallPreservedMask(CallingConv::ID CC) const {
531b41835f02f77c04a93323f722cf158cc566acaeVenkatraman Govindaraju  return RTCSR_RegMask;
541b41835f02f77c04a93323f722cf158cc566acaeVenkatraman Govindaraju}
551b41835f02f77c04a93323f722cf158cc566acaeVenkatraman Govindaraju
56b371f457b0ea4a652a9f526ba4375c80ae542252Evan ChengBitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
57b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  BitVector Reserved(getNumRegs());
582a9d1ca9c244aeac98044a5fc9a081ff3df7b2ffJakob Stoklund Olesen  // FIXME: G1 reserved for now for large imm generation by frame code.
592a9d1ca9c244aeac98044a5fc9a081ff3df7b2ffJakob Stoklund Olesen  Reserved.set(SP::G1);
6021886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju
611e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju  // G1-G4 can be used in applications.
6221886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju  if (ReserveAppRegisters) {
6321886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju    Reserved.set(SP::G2);
6421886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju    Reserved.set(SP::G3);
6521886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju    Reserved.set(SP::G4);
6621886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju  }
671e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju  // G5 is not reserved in 64 bit mode.
6821886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju  if (!Subtarget.is64Bit())
6921886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju    Reserved.set(SP::G5);
7021886a495a5467aa241f325cdd3dd2532fa7dcdeVenkatraman Govindaraju
71b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::O6);
72b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::I6);
73b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::I7);
74b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::G0);
75b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::G6);
76b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(SP::G7);
775ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju
785ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju  // Unaliased double registers are not available in non-V9 targets.
795ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju  if (!Subtarget.isV9()) {
805ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju    for (unsigned n = 0; n != 16; ++n) {
815ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju      for (MCRegAliasIterator AI(SP::D16 + n, this, true); AI.isValid(); ++AI)
825ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju        Reserved.set(*AI);
835ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju    }
845ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju  }
855ec8afa7cf9ae11def585fff043b0eabd735ac28Venkatraman Govindaraju
86b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  return Reserved;
87b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
88b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
89fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund Olesenconst TargetRegisterClass*
90fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund OlesenSparcRegisterInfo::getPointerRegClass(const MachineFunction &MF,
91fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund Olesen                                      unsigned Kind) const {
92fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund Olesen  return Subtarget.is64Bit() ? &SP::I64RegsRegClass : &SP::IntRegsRegClass;
93fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund Olesen}
94fcb25e60f514e4dbceecef73ac229c61d6202ed2Jakob Stoklund Olesen
956ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindarajustatic void replaceFI(MachineFunction &MF,
966ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju                      MachineBasicBlock::iterator II,
976ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju                      MachineInstr &MI,
986ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju                      DebugLoc dl,
996ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju                      unsigned FIOperandNum, int Offset,
1006ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju                      unsigned FramePtr)
1016ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju{
1026ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju  // Replace frame index with a frame pointer reference.
1036ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju  if (Offset >= -4096 && Offset <= 4095) {
1046ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    // If the offset is small enough to fit in the immediate field, directly
1056ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    // encode it.
1066ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    MI.getOperand(FIOperandNum).ChangeToRegister(FramePtr, false);
1076ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
1083a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    return;
1093a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  }
1103a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1113a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
1123a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1133a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // FIXME: it would be better to scavenge a register here instead of
1143a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // reserving G1 all of the time.
1153a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  if (Offset >= 0) {
1163a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    // Emit nonnegaive immediates with sethi + or.
1173a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    // sethi %hi(Offset), %g1
1183a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    // add %g1, %fp, %g1
1193a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    // Insert G1+%lo(offset) into the user.
1203a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    BuildMI(*MI.getParent(), II, dl, TII.get(SP::SETHIi), SP::G1)
1213a1e76d62706f2773c23a684446b4c549c151669Bill Wendling      .addImm(HI22(Offset));
1223a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1233a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1246ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    // Emit G1 = G1 + I6
1256ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    BuildMI(*MI.getParent(), II, dl, TII.get(SP::ADDrr), SP::G1).addReg(SP::G1)
1266ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      .addReg(FramePtr);
1276ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    // Insert: G1+%lo(offset) into the user.
1286ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    MI.getOperand(FIOperandNum).ChangeToRegister(SP::G1, false);
1293a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(LO10(Offset));
1303a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    return;
1316ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju  }
1323a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1333a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // Emit Negative numbers with sethi + xor
1343a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // sethi %hix(Offset), %g1
1353a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // xor  %g1, %lox(offset), %g1
1363a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // add %g1, %fp, %g1
1373a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // Insert: G1 + 0 into the user.
1383a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  BuildMI(*MI.getParent(), II, dl, TII.get(SP::SETHIi), SP::G1)
1393a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    .addImm(HIX22(Offset));
1403a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  BuildMI(*MI.getParent(), II, dl, TII.get(SP::XORri), SP::G1)
1413a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    .addReg(SP::G1).addImm(LOX10(Offset));
1423a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
1433a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  BuildMI(*MI.getParent(), II, dl, TII.get(SP::ADDrr), SP::G1).addReg(SP::G1)
1443a1e76d62706f2773c23a684446b4c549c151669Bill Wendling    .addReg(FramePtr);
1453a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // Insert: G1+%lo(offset) into the user.
1463a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  MI.getOperand(FIOperandNum).ChangeToRegister(SP::G1, false);
1473a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
1486ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju}
1496ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju
1506ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju
151fcb4a8ead3cd8d9540d5eaa448af5d14a0ee341aJim Grosbachvoid
152b58f498f7502e7e1833decbbbb4df771367c7341Jim GrosbachSparcRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
153108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                                       int SPAdj, unsigned FIOperandNum,
154108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier                                       RegScavenger *RS) const {
15597de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng  assert(SPAdj == 0 && "Unexpected");
15697de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng
1576c5526e56ec558f6308e33437b5f90d1c67768edBrian Gaeke  MachineInstr &MI = *II;
158d552eee4a05789e80ef3298df473edb888471302Dale Johannesen  DebugLoc dl = MI.getDebugLoc();
159108fb3202af6f500073cdbb7be32c25d7a273a2eChad Rosier  int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
1606c5526e56ec558f6308e33437b5f90d1c67768edBrian Gaeke
1613a8ad62d4ffa9de99f8835fe9592d4d6ef0a2730Brian Gaeke  // Addressable stack objects are accessed using neg. offsets from %fp
162b8ce4c4118e07e53c091294001807f9d1d819200Chris Lattner  MachineFunction &MF = *MI.getParent()->getParent();
1632b9355f2d9888d6a011353610b9ca24818de59a2Jakob Stoklund Olesen  int64_t Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) +
1642b9355f2d9888d6a011353610b9ca24818de59a2Jakob Stoklund Olesen                   MI.getOperand(FIOperandNum + 1).getImm() +
1652b9355f2d9888d6a011353610b9ca24818de59a2Jakob Stoklund Olesen                   Subtarget.getStackPointerBias();
166530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju  SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>();
16772ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  unsigned FramePtr = SP::I6;
16872ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  if (FuncInfo->isLeafProc()) {
1691e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju    // Use %sp and adjust offset if needed.
17072ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    FramePtr = SP::O6;
17172ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    int stackSize = MF.getFrameInfo()->getStackSize();
17272ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju    Offset += (stackSize) ? Subtarget.getAdjustedFrameSize(stackSize) : 0 ;
17372ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju  }
17472ad17c48c15562fe31c65f6daa09c83f42860c1Venkatraman Govindaraju
1756ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju  if (!Subtarget.isV9() || !Subtarget.hasHardQuad()) {
1766ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    if (MI.getOpcode() == SP::STQFri) {
1776ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
1786ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned SrcReg = MI.getOperand(2).getReg();
1796ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned SrcEvenReg = getSubReg(SrcReg, SP::sub_even64);
1806ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned SrcOddReg  = getSubReg(SrcReg, SP::sub_odd64);
1816ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MachineInstr *StMI =
1826ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju        BuildMI(*MI.getParent(), II, dl, TII.get(SP::STDFri))
1836ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju        .addReg(FramePtr).addImm(0).addReg(SrcEvenReg);
1846ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      replaceFI(MF, II, *StMI, dl, 0, Offset, FramePtr);
1856ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MI.setDesc(TII.get(SP::STDFri));
1866ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MI.getOperand(2).setReg(SrcOddReg);
1876ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      Offset += 8;
1886ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    } else if (MI.getOpcode() == SP::LDQFri) {
1896ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
1906ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned DestReg     = MI.getOperand(0).getReg();
1916ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned DestEvenReg = getSubReg(DestReg, SP::sub_even64);
1926ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      unsigned DestOddReg  = getSubReg(DestReg, SP::sub_odd64);
1936ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MachineInstr *StMI =
1946ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju        BuildMI(*MI.getParent(), II, dl, TII.get(SP::LDDFri), DestEvenReg)
1956ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju        .addReg(FramePtr).addImm(0);
1966ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      replaceFI(MF, II, *StMI, dl, 1, Offset, FramePtr);
1976ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju
1986ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MI.setDesc(TII.get(SP::LDDFri));
1996ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      MI.getOperand(0).setReg(DestOddReg);
2006ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju      Offset += 8;
2016ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju    }
20285e42b45ac05223882f24c17bff66b89daa0d6fcChris Lattner  }
2036ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju
2046ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju  replaceFI(MF, II, MI, dl, FIOperandNum, Offset, FramePtr);
2056ee0857bd74dd68e46e970a6bcf756ee03ed8e99Venkatraman Govindaraju
206e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke}
207e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
208b9c2fd964ee7dd7823ac71db8443055e4d0f1c15David Greeneunsigned SparcRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
209930e4d96e8718abcb56212676c35e6f7ea0ab605Richard Pennington  return SP::I6;
210f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey}
211f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey
212