1*9880d681SAndroid Build Coastguard Worker //===-- SparcInstrInfo.cpp - Sparc Instruction Information ----------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains the Sparc implementation of the TargetInstrInfo class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "SparcInstrInfo.h"
15*9880d681SAndroid Build Coastguard Worker #include "Sparc.h"
16*9880d681SAndroid Build Coastguard Worker #include "SparcMachineFunctionInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "SparcSubtarget.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallVector.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstrBuilder.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineMemOperand.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker using namespace llvm;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_CTOR_DTOR
30*9880d681SAndroid Build Coastguard Worker #include "SparcGenInstrInfo.inc"
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker // Pin the vtable to this file.
anchor()33*9880d681SAndroid Build Coastguard Worker void SparcInstrInfo::anchor() {}
34*9880d681SAndroid Build Coastguard Worker
SparcInstrInfo(SparcSubtarget & ST)35*9880d681SAndroid Build Coastguard Worker SparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
36*9880d681SAndroid Build Coastguard Worker : SparcGenInstrInfo(SP::ADJCALLSTACKDOWN, SP::ADJCALLSTACKUP), RI(),
37*9880d681SAndroid Build Coastguard Worker Subtarget(ST) {}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker /// isLoadFromStackSlot - If the specified machine instruction is a direct
40*9880d681SAndroid Build Coastguard Worker /// load from a stack slot, return the virtual or physical register number of
41*9880d681SAndroid Build Coastguard Worker /// the destination along with the FrameIndex of the loaded stack slot. If
42*9880d681SAndroid Build Coastguard Worker /// not, return 0. This predicate must return 0 if the instruction has
43*9880d681SAndroid Build Coastguard Worker /// any side effects other than loading from the stack slot.
isLoadFromStackSlot(const MachineInstr & MI,int & FrameIndex) const44*9880d681SAndroid Build Coastguard Worker unsigned SparcInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
45*9880d681SAndroid Build Coastguard Worker int &FrameIndex) const {
46*9880d681SAndroid Build Coastguard Worker if (MI.getOpcode() == SP::LDri || MI.getOpcode() == SP::LDXri ||
47*9880d681SAndroid Build Coastguard Worker MI.getOpcode() == SP::LDFri || MI.getOpcode() == SP::LDDFri ||
48*9880d681SAndroid Build Coastguard Worker MI.getOpcode() == SP::LDQFri) {
49*9880d681SAndroid Build Coastguard Worker if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
50*9880d681SAndroid Build Coastguard Worker MI.getOperand(2).getImm() == 0) {
51*9880d681SAndroid Build Coastguard Worker FrameIndex = MI.getOperand(1).getIndex();
52*9880d681SAndroid Build Coastguard Worker return MI.getOperand(0).getReg();
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker }
55*9880d681SAndroid Build Coastguard Worker return 0;
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker /// isStoreToStackSlot - If the specified machine instruction is a direct
59*9880d681SAndroid Build Coastguard Worker /// store to a stack slot, return the virtual or physical register number of
60*9880d681SAndroid Build Coastguard Worker /// the source reg along with the FrameIndex of the loaded stack slot. If
61*9880d681SAndroid Build Coastguard Worker /// not, return 0. This predicate must return 0 if the instruction has
62*9880d681SAndroid Build Coastguard Worker /// any side effects other than storing to the stack slot.
isStoreToStackSlot(const MachineInstr & MI,int & FrameIndex) const63*9880d681SAndroid Build Coastguard Worker unsigned SparcInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
64*9880d681SAndroid Build Coastguard Worker int &FrameIndex) const {
65*9880d681SAndroid Build Coastguard Worker if (MI.getOpcode() == SP::STri || MI.getOpcode() == SP::STXri ||
66*9880d681SAndroid Build Coastguard Worker MI.getOpcode() == SP::STFri || MI.getOpcode() == SP::STDFri ||
67*9880d681SAndroid Build Coastguard Worker MI.getOpcode() == SP::STQFri) {
68*9880d681SAndroid Build Coastguard Worker if (MI.getOperand(0).isFI() && MI.getOperand(1).isImm() &&
69*9880d681SAndroid Build Coastguard Worker MI.getOperand(1).getImm() == 0) {
70*9880d681SAndroid Build Coastguard Worker FrameIndex = MI.getOperand(0).getIndex();
71*9880d681SAndroid Build Coastguard Worker return MI.getOperand(2).getReg();
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker return 0;
75*9880d681SAndroid Build Coastguard Worker }
76*9880d681SAndroid Build Coastguard Worker
IsIntegerCC(unsigned CC)77*9880d681SAndroid Build Coastguard Worker static bool IsIntegerCC(unsigned CC)
78*9880d681SAndroid Build Coastguard Worker {
79*9880d681SAndroid Build Coastguard Worker return (CC <= SPCC::ICC_VC);
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker
GetOppositeBranchCondition(SPCC::CondCodes CC)82*9880d681SAndroid Build Coastguard Worker static SPCC::CondCodes GetOppositeBranchCondition(SPCC::CondCodes CC)
83*9880d681SAndroid Build Coastguard Worker {
84*9880d681SAndroid Build Coastguard Worker switch(CC) {
85*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_A: return SPCC::ICC_N;
86*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_N: return SPCC::ICC_A;
87*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_NE: return SPCC::ICC_E;
88*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_E: return SPCC::ICC_NE;
89*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_G: return SPCC::ICC_LE;
90*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_LE: return SPCC::ICC_G;
91*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_GE: return SPCC::ICC_L;
92*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_L: return SPCC::ICC_GE;
93*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_GU: return SPCC::ICC_LEU;
94*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_LEU: return SPCC::ICC_GU;
95*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_CC: return SPCC::ICC_CS;
96*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_CS: return SPCC::ICC_CC;
97*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_POS: return SPCC::ICC_NEG;
98*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_NEG: return SPCC::ICC_POS;
99*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_VC: return SPCC::ICC_VS;
100*9880d681SAndroid Build Coastguard Worker case SPCC::ICC_VS: return SPCC::ICC_VC;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_A: return SPCC::FCC_N;
103*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_N: return SPCC::FCC_A;
104*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_U: return SPCC::FCC_O;
105*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_O: return SPCC::FCC_U;
106*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_G: return SPCC::FCC_ULE;
107*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_LE: return SPCC::FCC_UG;
108*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_UG: return SPCC::FCC_LE;
109*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_ULE: return SPCC::FCC_G;
110*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_L: return SPCC::FCC_UGE;
111*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_GE: return SPCC::FCC_UL;
112*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_UL: return SPCC::FCC_GE;
113*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_UGE: return SPCC::FCC_L;
114*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_LG: return SPCC::FCC_UE;
115*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_UE: return SPCC::FCC_LG;
116*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_NE: return SPCC::FCC_E;
117*9880d681SAndroid Build Coastguard Worker case SPCC::FCC_E: return SPCC::FCC_NE;
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_A: return SPCC::CPCC_N;
120*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_N: return SPCC::CPCC_A;
121*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_3: // Fall through
122*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_2: // Fall through
123*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_23: // Fall through
124*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_1: // Fall through
125*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_13: // Fall through
126*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_12: // Fall through
127*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_123: // Fall through
128*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_0: // Fall through
129*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_03: // Fall through
130*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_02: // Fall through
131*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_023: // Fall through
132*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_01: // Fall through
133*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_013: // Fall through
134*9880d681SAndroid Build Coastguard Worker case SPCC::CPCC_012:
135*9880d681SAndroid Build Coastguard Worker // "Opposite" code is not meaningful, as we don't know
136*9880d681SAndroid Build Coastguard Worker // what the CoProc condition means here. The cond-code will
137*9880d681SAndroid Build Coastguard Worker // only be used in inline assembler, so this code should
138*9880d681SAndroid Build Coastguard Worker // not be reached in a normal compilation pass.
139*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Meaningless inversion of co-processor cond code");
140*9880d681SAndroid Build Coastguard Worker }
141*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid cond code");
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker
isUncondBranchOpcode(int Opc)144*9880d681SAndroid Build Coastguard Worker static bool isUncondBranchOpcode(int Opc) { return Opc == SP::BA; }
145*9880d681SAndroid Build Coastguard Worker
isCondBranchOpcode(int Opc)146*9880d681SAndroid Build Coastguard Worker static bool isCondBranchOpcode(int Opc) {
147*9880d681SAndroid Build Coastguard Worker return Opc == SP::FBCOND || Opc == SP::BCOND;
148*9880d681SAndroid Build Coastguard Worker }
149*9880d681SAndroid Build Coastguard Worker
isIndirectBranchOpcode(int Opc)150*9880d681SAndroid Build Coastguard Worker static bool isIndirectBranchOpcode(int Opc) {
151*9880d681SAndroid Build Coastguard Worker return Opc == SP::BINDrr || Opc == SP::BINDri;
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker
parseCondBranch(MachineInstr * LastInst,MachineBasicBlock * & Target,SmallVectorImpl<MachineOperand> & Cond)154*9880d681SAndroid Build Coastguard Worker static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target,
155*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<MachineOperand> &Cond) {
156*9880d681SAndroid Build Coastguard Worker Cond.push_back(MachineOperand::CreateImm(LastInst->getOperand(1).getImm()));
157*9880d681SAndroid Build Coastguard Worker Target = LastInst->getOperand(0).getMBB();
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker
analyzeBranch(MachineBasicBlock & MBB,MachineBasicBlock * & TBB,MachineBasicBlock * & FBB,SmallVectorImpl<MachineOperand> & Cond,bool AllowModify) const160*9880d681SAndroid Build Coastguard Worker bool SparcInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
161*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *&TBB,
162*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *&FBB,
163*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<MachineOperand> &Cond,
164*9880d681SAndroid Build Coastguard Worker bool AllowModify) const {
165*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
166*9880d681SAndroid Build Coastguard Worker if (I == MBB.end())
167*9880d681SAndroid Build Coastguard Worker return false;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker if (!isUnpredicatedTerminator(*I))
170*9880d681SAndroid Build Coastguard Worker return false;
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker // Get the last instruction in the block.
173*9880d681SAndroid Build Coastguard Worker MachineInstr *LastInst = &*I;
174*9880d681SAndroid Build Coastguard Worker unsigned LastOpc = LastInst->getOpcode();
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker // If there is only one terminator instruction, process it.
177*9880d681SAndroid Build Coastguard Worker if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
178*9880d681SAndroid Build Coastguard Worker if (isUncondBranchOpcode(LastOpc)) {
179*9880d681SAndroid Build Coastguard Worker TBB = LastInst->getOperand(0).getMBB();
180*9880d681SAndroid Build Coastguard Worker return false;
181*9880d681SAndroid Build Coastguard Worker }
182*9880d681SAndroid Build Coastguard Worker if (isCondBranchOpcode(LastOpc)) {
183*9880d681SAndroid Build Coastguard Worker // Block ends with fall-through condbranch.
184*9880d681SAndroid Build Coastguard Worker parseCondBranch(LastInst, TBB, Cond);
185*9880d681SAndroid Build Coastguard Worker return false;
186*9880d681SAndroid Build Coastguard Worker }
187*9880d681SAndroid Build Coastguard Worker return true; // Can't handle indirect branch.
188*9880d681SAndroid Build Coastguard Worker }
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker // Get the instruction before it if it is a terminator.
191*9880d681SAndroid Build Coastguard Worker MachineInstr *SecondLastInst = &*I;
192*9880d681SAndroid Build Coastguard Worker unsigned SecondLastOpc = SecondLastInst->getOpcode();
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker // If AllowModify is true and the block ends with two or more unconditional
195*9880d681SAndroid Build Coastguard Worker // branches, delete all but the first unconditional branch.
196*9880d681SAndroid Build Coastguard Worker if (AllowModify && isUncondBranchOpcode(LastOpc)) {
197*9880d681SAndroid Build Coastguard Worker while (isUncondBranchOpcode(SecondLastOpc)) {
198*9880d681SAndroid Build Coastguard Worker LastInst->eraseFromParent();
199*9880d681SAndroid Build Coastguard Worker LastInst = SecondLastInst;
200*9880d681SAndroid Build Coastguard Worker LastOpc = LastInst->getOpcode();
201*9880d681SAndroid Build Coastguard Worker if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
202*9880d681SAndroid Build Coastguard Worker // Return now the only terminator is an unconditional branch.
203*9880d681SAndroid Build Coastguard Worker TBB = LastInst->getOperand(0).getMBB();
204*9880d681SAndroid Build Coastguard Worker return false;
205*9880d681SAndroid Build Coastguard Worker } else {
206*9880d681SAndroid Build Coastguard Worker SecondLastInst = &*I;
207*9880d681SAndroid Build Coastguard Worker SecondLastOpc = SecondLastInst->getOpcode();
208*9880d681SAndroid Build Coastguard Worker }
209*9880d681SAndroid Build Coastguard Worker }
210*9880d681SAndroid Build Coastguard Worker }
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker // If there are three terminators, we don't know what sort of block this is.
213*9880d681SAndroid Build Coastguard Worker if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(*--I))
214*9880d681SAndroid Build Coastguard Worker return true;
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker // If the block ends with a B and a Bcc, handle it.
217*9880d681SAndroid Build Coastguard Worker if (isCondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
218*9880d681SAndroid Build Coastguard Worker parseCondBranch(SecondLastInst, TBB, Cond);
219*9880d681SAndroid Build Coastguard Worker FBB = LastInst->getOperand(0).getMBB();
220*9880d681SAndroid Build Coastguard Worker return false;
221*9880d681SAndroid Build Coastguard Worker }
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker // If the block ends with two unconditional branches, handle it. The second
224*9880d681SAndroid Build Coastguard Worker // one is not executed.
225*9880d681SAndroid Build Coastguard Worker if (isUncondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
226*9880d681SAndroid Build Coastguard Worker TBB = SecondLastInst->getOperand(0).getMBB();
227*9880d681SAndroid Build Coastguard Worker return false;
228*9880d681SAndroid Build Coastguard Worker }
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker // ...likewise if it ends with an indirect branch followed by an unconditional
231*9880d681SAndroid Build Coastguard Worker // branch.
232*9880d681SAndroid Build Coastguard Worker if (isIndirectBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
233*9880d681SAndroid Build Coastguard Worker I = LastInst;
234*9880d681SAndroid Build Coastguard Worker if (AllowModify)
235*9880d681SAndroid Build Coastguard Worker I->eraseFromParent();
236*9880d681SAndroid Build Coastguard Worker return true;
237*9880d681SAndroid Build Coastguard Worker }
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker // Otherwise, can't handle this.
240*9880d681SAndroid Build Coastguard Worker return true;
241*9880d681SAndroid Build Coastguard Worker }
242*9880d681SAndroid Build Coastguard Worker
InsertBranch(MachineBasicBlock & MBB,MachineBasicBlock * TBB,MachineBasicBlock * FBB,ArrayRef<MachineOperand> Cond,const DebugLoc & DL) const243*9880d681SAndroid Build Coastguard Worker unsigned SparcInstrInfo::InsertBranch(MachineBasicBlock &MBB,
244*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *TBB,
245*9880d681SAndroid Build Coastguard Worker MachineBasicBlock *FBB,
246*9880d681SAndroid Build Coastguard Worker ArrayRef<MachineOperand> Cond,
247*9880d681SAndroid Build Coastguard Worker const DebugLoc &DL) const {
248*9880d681SAndroid Build Coastguard Worker assert(TBB && "InsertBranch must not be told to insert a fallthrough");
249*9880d681SAndroid Build Coastguard Worker assert((Cond.size() == 1 || Cond.size() == 0) &&
250*9880d681SAndroid Build Coastguard Worker "Sparc branch conditions should have one component!");
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker if (Cond.empty()) {
253*9880d681SAndroid Build Coastguard Worker assert(!FBB && "Unconditional branch with multiple successors!");
254*9880d681SAndroid Build Coastguard Worker BuildMI(&MBB, DL, get(SP::BA)).addMBB(TBB);
255*9880d681SAndroid Build Coastguard Worker return 1;
256*9880d681SAndroid Build Coastguard Worker }
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker // Conditional branch
259*9880d681SAndroid Build Coastguard Worker unsigned CC = Cond[0].getImm();
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker if (IsIntegerCC(CC))
262*9880d681SAndroid Build Coastguard Worker BuildMI(&MBB, DL, get(SP::BCOND)).addMBB(TBB).addImm(CC);
263*9880d681SAndroid Build Coastguard Worker else
264*9880d681SAndroid Build Coastguard Worker BuildMI(&MBB, DL, get(SP::FBCOND)).addMBB(TBB).addImm(CC);
265*9880d681SAndroid Build Coastguard Worker if (!FBB)
266*9880d681SAndroid Build Coastguard Worker return 1;
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker BuildMI(&MBB, DL, get(SP::BA)).addMBB(FBB);
269*9880d681SAndroid Build Coastguard Worker return 2;
270*9880d681SAndroid Build Coastguard Worker }
271*9880d681SAndroid Build Coastguard Worker
RemoveBranch(MachineBasicBlock & MBB) const272*9880d681SAndroid Build Coastguard Worker unsigned SparcInstrInfo::RemoveBranch(MachineBasicBlock &MBB) const
273*9880d681SAndroid Build Coastguard Worker {
274*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I = MBB.end();
275*9880d681SAndroid Build Coastguard Worker unsigned Count = 0;
276*9880d681SAndroid Build Coastguard Worker while (I != MBB.begin()) {
277*9880d681SAndroid Build Coastguard Worker --I;
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker if (I->isDebugValue())
280*9880d681SAndroid Build Coastguard Worker continue;
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker if (I->getOpcode() != SP::BA
283*9880d681SAndroid Build Coastguard Worker && I->getOpcode() != SP::BCOND
284*9880d681SAndroid Build Coastguard Worker && I->getOpcode() != SP::FBCOND)
285*9880d681SAndroid Build Coastguard Worker break; // Not a branch
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker I->eraseFromParent();
288*9880d681SAndroid Build Coastguard Worker I = MBB.end();
289*9880d681SAndroid Build Coastguard Worker ++Count;
290*9880d681SAndroid Build Coastguard Worker }
291*9880d681SAndroid Build Coastguard Worker return Count;
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker
ReverseBranchCondition(SmallVectorImpl<MachineOperand> & Cond) const294*9880d681SAndroid Build Coastguard Worker bool SparcInstrInfo::ReverseBranchCondition(
295*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<MachineOperand> &Cond) const {
296*9880d681SAndroid Build Coastguard Worker assert(Cond.size() == 1);
297*9880d681SAndroid Build Coastguard Worker SPCC::CondCodes CC = static_cast<SPCC::CondCodes>(Cond[0].getImm());
298*9880d681SAndroid Build Coastguard Worker Cond[0].setImm(GetOppositeBranchCondition(CC));
299*9880d681SAndroid Build Coastguard Worker return false;
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker
copyPhysReg(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,const DebugLoc & DL,unsigned DestReg,unsigned SrcReg,bool KillSrc) const302*9880d681SAndroid Build Coastguard Worker void SparcInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
303*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I,
304*9880d681SAndroid Build Coastguard Worker const DebugLoc &DL, unsigned DestReg,
305*9880d681SAndroid Build Coastguard Worker unsigned SrcReg, bool KillSrc) const {
306*9880d681SAndroid Build Coastguard Worker unsigned numSubRegs = 0;
307*9880d681SAndroid Build Coastguard Worker unsigned movOpc = 0;
308*9880d681SAndroid Build Coastguard Worker const unsigned *subRegIdx = nullptr;
309*9880d681SAndroid Build Coastguard Worker bool ExtraG0 = false;
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker const unsigned DW_SubRegsIdx[] = { SP::sub_even, SP::sub_odd };
312*9880d681SAndroid Build Coastguard Worker const unsigned DFP_FP_SubRegsIdx[] = { SP::sub_even, SP::sub_odd };
313*9880d681SAndroid Build Coastguard Worker const unsigned QFP_DFP_SubRegsIdx[] = { SP::sub_even64, SP::sub_odd64 };
314*9880d681SAndroid Build Coastguard Worker const unsigned QFP_FP_SubRegsIdx[] = { SP::sub_even, SP::sub_odd,
315*9880d681SAndroid Build Coastguard Worker SP::sub_odd64_then_sub_even,
316*9880d681SAndroid Build Coastguard Worker SP::sub_odd64_then_sub_odd };
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker if (SP::IntRegsRegClass.contains(DestReg, SrcReg))
319*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::ORrr), DestReg).addReg(SP::G0)
320*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
321*9880d681SAndroid Build Coastguard Worker else if (SP::IntPairRegClass.contains(DestReg, SrcReg)) {
322*9880d681SAndroid Build Coastguard Worker subRegIdx = DW_SubRegsIdx;
323*9880d681SAndroid Build Coastguard Worker numSubRegs = 2;
324*9880d681SAndroid Build Coastguard Worker movOpc = SP::ORrr;
325*9880d681SAndroid Build Coastguard Worker ExtraG0 = true;
326*9880d681SAndroid Build Coastguard Worker } else if (SP::FPRegsRegClass.contains(DestReg, SrcReg))
327*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::FMOVS), DestReg)
328*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
329*9880d681SAndroid Build Coastguard Worker else if (SP::DFPRegsRegClass.contains(DestReg, SrcReg)) {
330*9880d681SAndroid Build Coastguard Worker if (Subtarget.isV9()) {
331*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::FMOVD), DestReg)
332*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
333*9880d681SAndroid Build Coastguard Worker } else {
334*9880d681SAndroid Build Coastguard Worker // Use two FMOVS instructions.
335*9880d681SAndroid Build Coastguard Worker subRegIdx = DFP_FP_SubRegsIdx;
336*9880d681SAndroid Build Coastguard Worker numSubRegs = 2;
337*9880d681SAndroid Build Coastguard Worker movOpc = SP::FMOVS;
338*9880d681SAndroid Build Coastguard Worker }
339*9880d681SAndroid Build Coastguard Worker } else if (SP::QFPRegsRegClass.contains(DestReg, SrcReg)) {
340*9880d681SAndroid Build Coastguard Worker if (Subtarget.isV9()) {
341*9880d681SAndroid Build Coastguard Worker if (Subtarget.hasHardQuad()) {
342*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::FMOVQ), DestReg)
343*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
344*9880d681SAndroid Build Coastguard Worker } else {
345*9880d681SAndroid Build Coastguard Worker // Use two FMOVD instructions.
346*9880d681SAndroid Build Coastguard Worker subRegIdx = QFP_DFP_SubRegsIdx;
347*9880d681SAndroid Build Coastguard Worker numSubRegs = 2;
348*9880d681SAndroid Build Coastguard Worker movOpc = SP::FMOVD;
349*9880d681SAndroid Build Coastguard Worker }
350*9880d681SAndroid Build Coastguard Worker } else {
351*9880d681SAndroid Build Coastguard Worker // Use four FMOVS instructions.
352*9880d681SAndroid Build Coastguard Worker subRegIdx = QFP_FP_SubRegsIdx;
353*9880d681SAndroid Build Coastguard Worker numSubRegs = 4;
354*9880d681SAndroid Build Coastguard Worker movOpc = SP::FMOVS;
355*9880d681SAndroid Build Coastguard Worker }
356*9880d681SAndroid Build Coastguard Worker } else if (SP::ASRRegsRegClass.contains(DestReg) &&
357*9880d681SAndroid Build Coastguard Worker SP::IntRegsRegClass.contains(SrcReg)) {
358*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::WRASRrr), DestReg)
359*9880d681SAndroid Build Coastguard Worker .addReg(SP::G0)
360*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
361*9880d681SAndroid Build Coastguard Worker } else if (SP::IntRegsRegClass.contains(DestReg) &&
362*9880d681SAndroid Build Coastguard Worker SP::ASRRegsRegClass.contains(SrcReg)) {
363*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::RDASR), DestReg)
364*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(KillSrc));
365*9880d681SAndroid Build Coastguard Worker } else
366*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Impossible reg-to-reg copy");
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker if (numSubRegs == 0 || subRegIdx == nullptr || movOpc == 0)
369*9880d681SAndroid Build Coastguard Worker return;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI = &getRegisterInfo();
372*9880d681SAndroid Build Coastguard Worker MachineInstr *MovMI = nullptr;
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != numSubRegs; ++i) {
375*9880d681SAndroid Build Coastguard Worker unsigned Dst = TRI->getSubReg(DestReg, subRegIdx[i]);
376*9880d681SAndroid Build Coastguard Worker unsigned Src = TRI->getSubReg(SrcReg, subRegIdx[i]);
377*9880d681SAndroid Build Coastguard Worker assert(Dst && Src && "Bad sub-register");
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(movOpc), Dst);
380*9880d681SAndroid Build Coastguard Worker if (ExtraG0)
381*9880d681SAndroid Build Coastguard Worker MIB.addReg(SP::G0);
382*9880d681SAndroid Build Coastguard Worker MIB.addReg(Src);
383*9880d681SAndroid Build Coastguard Worker MovMI = MIB.getInstr();
384*9880d681SAndroid Build Coastguard Worker }
385*9880d681SAndroid Build Coastguard Worker // Add implicit super-register defs and kills to the last MovMI.
386*9880d681SAndroid Build Coastguard Worker MovMI->addRegisterDefined(DestReg, TRI);
387*9880d681SAndroid Build Coastguard Worker if (KillSrc)
388*9880d681SAndroid Build Coastguard Worker MovMI->addRegisterKilled(SrcReg, TRI);
389*9880d681SAndroid Build Coastguard Worker }
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker void SparcInstrInfo::
storeRegToStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,unsigned SrcReg,bool isKill,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const392*9880d681SAndroid Build Coastguard Worker storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
393*9880d681SAndroid Build Coastguard Worker unsigned SrcReg, bool isKill, int FI,
394*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC,
395*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const {
396*9880d681SAndroid Build Coastguard Worker DebugLoc DL;
397*9880d681SAndroid Build Coastguard Worker if (I != MBB.end()) DL = I->getDebugLoc();
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker MachineFunction *MF = MBB.getParent();
400*9880d681SAndroid Build Coastguard Worker const MachineFrameInfo &MFI = *MF->getFrameInfo();
401*9880d681SAndroid Build Coastguard Worker MachineMemOperand *MMO = MF->getMachineMemOperand(
402*9880d681SAndroid Build Coastguard Worker MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore,
403*9880d681SAndroid Build Coastguard Worker MFI.getObjectSize(FI), MFI.getObjectAlignment(FI));
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker // On the order of operands here: think "[FrameIdx + 0] = SrcReg".
406*9880d681SAndroid Build Coastguard Worker if (RC == &SP::I64RegsRegClass)
407*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STXri)).addFrameIndex(FI).addImm(0)
408*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
409*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::IntRegsRegClass)
410*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STri)).addFrameIndex(FI).addImm(0)
411*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
412*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::IntPairRegClass)
413*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STDri)).addFrameIndex(FI).addImm(0)
414*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
415*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::FPRegsRegClass)
416*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STFri)).addFrameIndex(FI).addImm(0)
417*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
418*9880d681SAndroid Build Coastguard Worker else if (SP::DFPRegsRegClass.hasSubClassEq(RC))
419*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STDFri)).addFrameIndex(FI).addImm(0)
420*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
421*9880d681SAndroid Build Coastguard Worker else if (SP::QFPRegsRegClass.hasSubClassEq(RC))
422*9880d681SAndroid Build Coastguard Worker // Use STQFri irrespective of its legality. If STQ is not legal, it will be
423*9880d681SAndroid Build Coastguard Worker // lowered into two STDs in eliminateFrameIndex.
424*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::STQFri)).addFrameIndex(FI).addImm(0)
425*9880d681SAndroid Build Coastguard Worker .addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO);
426*9880d681SAndroid Build Coastguard Worker else
427*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Can't store this register to stack slot");
428*9880d681SAndroid Build Coastguard Worker }
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker void SparcInstrInfo::
loadRegFromStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,unsigned DestReg,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const431*9880d681SAndroid Build Coastguard Worker loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
432*9880d681SAndroid Build Coastguard Worker unsigned DestReg, int FI,
433*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC,
434*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const {
435*9880d681SAndroid Build Coastguard Worker DebugLoc DL;
436*9880d681SAndroid Build Coastguard Worker if (I != MBB.end()) DL = I->getDebugLoc();
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Worker MachineFunction *MF = MBB.getParent();
439*9880d681SAndroid Build Coastguard Worker const MachineFrameInfo &MFI = *MF->getFrameInfo();
440*9880d681SAndroid Build Coastguard Worker MachineMemOperand *MMO = MF->getMachineMemOperand(
441*9880d681SAndroid Build Coastguard Worker MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad,
442*9880d681SAndroid Build Coastguard Worker MFI.getObjectSize(FI), MFI.getObjectAlignment(FI));
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker if (RC == &SP::I64RegsRegClass)
445*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDXri), DestReg).addFrameIndex(FI).addImm(0)
446*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
447*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::IntRegsRegClass)
448*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDri), DestReg).addFrameIndex(FI).addImm(0)
449*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
450*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::IntPairRegClass)
451*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDDri), DestReg).addFrameIndex(FI).addImm(0)
452*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
453*9880d681SAndroid Build Coastguard Worker else if (RC == &SP::FPRegsRegClass)
454*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDFri), DestReg).addFrameIndex(FI).addImm(0)
455*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
456*9880d681SAndroid Build Coastguard Worker else if (SP::DFPRegsRegClass.hasSubClassEq(RC))
457*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDDFri), DestReg).addFrameIndex(FI).addImm(0)
458*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
459*9880d681SAndroid Build Coastguard Worker else if (SP::QFPRegsRegClass.hasSubClassEq(RC))
460*9880d681SAndroid Build Coastguard Worker // Use LDQFri irrespective of its legality. If LDQ is not legal, it will be
461*9880d681SAndroid Build Coastguard Worker // lowered into two LDDs in eliminateFrameIndex.
462*9880d681SAndroid Build Coastguard Worker BuildMI(MBB, I, DL, get(SP::LDQFri), DestReg).addFrameIndex(FI).addImm(0)
463*9880d681SAndroid Build Coastguard Worker .addMemOperand(MMO);
464*9880d681SAndroid Build Coastguard Worker else
465*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Can't load this register from stack slot");
466*9880d681SAndroid Build Coastguard Worker }
467*9880d681SAndroid Build Coastguard Worker
getGlobalBaseReg(MachineFunction * MF) const468*9880d681SAndroid Build Coastguard Worker unsigned SparcInstrInfo::getGlobalBaseReg(MachineFunction *MF) const
469*9880d681SAndroid Build Coastguard Worker {
470*9880d681SAndroid Build Coastguard Worker SparcMachineFunctionInfo *SparcFI = MF->getInfo<SparcMachineFunctionInfo>();
471*9880d681SAndroid Build Coastguard Worker unsigned GlobalBaseReg = SparcFI->getGlobalBaseReg();
472*9880d681SAndroid Build Coastguard Worker if (GlobalBaseReg != 0)
473*9880d681SAndroid Build Coastguard Worker return GlobalBaseReg;
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker // Insert the set of GlobalBaseReg into the first MBB of the function
476*9880d681SAndroid Build Coastguard Worker MachineBasicBlock &FirstMBB = MF->front();
477*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MBBI = FirstMBB.begin();
478*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo &RegInfo = MF->getRegInfo();
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *PtrRC =
481*9880d681SAndroid Build Coastguard Worker Subtarget.is64Bit() ? &SP::I64RegsRegClass : &SP::IntRegsRegClass;
482*9880d681SAndroid Build Coastguard Worker GlobalBaseReg = RegInfo.createVirtualRegister(PtrRC);
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker DebugLoc dl;
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker BuildMI(FirstMBB, MBBI, dl, get(SP::GETPCX), GlobalBaseReg);
487*9880d681SAndroid Build Coastguard Worker SparcFI->setGlobalBaseReg(GlobalBaseReg);
488*9880d681SAndroid Build Coastguard Worker return GlobalBaseReg;
489*9880d681SAndroid Build Coastguard Worker }
490*9880d681SAndroid Build Coastguard Worker
expandPostRAPseudo(MachineInstr & MI) const491*9880d681SAndroid Build Coastguard Worker bool SparcInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
492*9880d681SAndroid Build Coastguard Worker switch (MI.getOpcode()) {
493*9880d681SAndroid Build Coastguard Worker case TargetOpcode::LOAD_STACK_GUARD: {
494*9880d681SAndroid Build Coastguard Worker assert(Subtarget.isTargetLinux() &&
495*9880d681SAndroid Build Coastguard Worker "Only Linux target is expected to contain LOAD_STACK_GUARD");
496*9880d681SAndroid Build Coastguard Worker // offsetof(tcbhead_t, stack_guard) from sysdeps/sparc/nptl/tls.h in glibc.
497*9880d681SAndroid Build Coastguard Worker const int64_t Offset = Subtarget.is64Bit() ? 0x28 : 0x14;
498*9880d681SAndroid Build Coastguard Worker MI.setDesc(get(Subtarget.is64Bit() ? SP::LDXri : SP::LDri));
499*9880d681SAndroid Build Coastguard Worker MachineInstrBuilder(*MI.getParent()->getParent(), MI)
500*9880d681SAndroid Build Coastguard Worker .addReg(SP::G7)
501*9880d681SAndroid Build Coastguard Worker .addImm(Offset);
502*9880d681SAndroid Build Coastguard Worker return true;
503*9880d681SAndroid Build Coastguard Worker }
504*9880d681SAndroid Build Coastguard Worker }
505*9880d681SAndroid Build Coastguard Worker return false;
506*9880d681SAndroid Build Coastguard Worker }
507