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