blob: 16bea8b31d3055b16972e78774c0442cf0ff3a35 [file] [log] [blame]
Akira Hatanakab7fa3c92012-07-31 21:49:49 +00001//===-- MipsSEInstrInfo.cpp - Mips32/64 Instruction Information -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the Mips32/64 implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MipsSEInstrInfo.h"
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000015#include "InstPrinter/MipsInstPrinter.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "MipsMachineFunction.h"
17#include "MipsTargetMachine.h"
18#include "llvm/ADT/STLExtras.h"
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000019#include "llvm/CodeGen/MachineInstrBuilder.h"
20#include "llvm/CodeGen/MachineRegisterInfo.h"
Akira Hatanaka9edae022013-05-13 18:23:35 +000021#include "llvm/Support/CommandLine.h"
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000022#include "llvm/Support/ErrorHandling.h"
23#include "llvm/Support/TargetRegistry.h"
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000024
25using namespace llvm;
26
Eric Christopher675cb4d2014-07-18 23:25:00 +000027MipsSEInstrInfo::MipsSEInstrInfo(const MipsSubtarget &STI)
28 : MipsInstrInfo(STI, STI.getRelocationModel() == Reloc::PIC_ ? Mips::B
29 : Mips::J),
30 RI(STI), IsN64(STI.isABI_N64()) {}
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000031
Akira Hatanakacb37e132012-07-31 23:41:32 +000032const MipsRegisterInfo &MipsSEInstrInfo::getRegisterInfo() const {
33 return RI;
34}
35
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000036/// isLoadFromStackSlot - If the specified machine instruction is a direct
37/// load from a stack slot, return the virtual or physical register number of
38/// the destination along with the FrameIndex of the loaded stack slot. If
39/// not, return 0. This predicate must return 0 if the instruction has
40/// any side effects other than loading from the stack slot.
41unsigned MipsSEInstrInfo::
42isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
43{
44 unsigned Opc = MI->getOpcode();
45
Akira Hatanaka6781fc12013-08-20 21:08:22 +000046 if ((Opc == Mips::LW) || (Opc == Mips::LD) ||
47 (Opc == Mips::LWC1) || (Opc == Mips::LDC1) || (Opc == Mips::LDC164)) {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000048 if ((MI->getOperand(1).isFI()) && // is a stack slot
49 (MI->getOperand(2).isImm()) && // the imm is zero
50 (isZeroImm(MI->getOperand(2)))) {
51 FrameIndex = MI->getOperand(1).getIndex();
52 return MI->getOperand(0).getReg();
53 }
54 }
55
56 return 0;
57}
58
59/// isStoreToStackSlot - If the specified machine instruction is a direct
60/// store to a stack slot, return the virtual or physical register number of
61/// the source reg along with the FrameIndex of the loaded stack slot. If
62/// not, return 0. This predicate must return 0 if the instruction has
63/// any side effects other than storing to the stack slot.
64unsigned MipsSEInstrInfo::
65isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
66{
67 unsigned Opc = MI->getOpcode();
68
Akira Hatanaka6781fc12013-08-20 21:08:22 +000069 if ((Opc == Mips::SW) || (Opc == Mips::SD) ||
70 (Opc == Mips::SWC1) || (Opc == Mips::SDC1) || (Opc == Mips::SDC164)) {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000071 if ((MI->getOperand(1).isFI()) && // is a stack slot
72 (MI->getOperand(2).isImm()) && // the imm is zero
73 (isZeroImm(MI->getOperand(2)))) {
74 FrameIndex = MI->getOperand(1).getIndex();
75 return MI->getOperand(0).getReg();
76 }
77 }
78 return 0;
79}
80
81void MipsSEInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
82 MachineBasicBlock::iterator I, DebugLoc DL,
83 unsigned DestReg, unsigned SrcReg,
84 bool KillSrc) const {
85 unsigned Opc = 0, ZeroReg = 0;
Eric Christopher675cb4d2014-07-18 23:25:00 +000086 bool isMicroMips = Subtarget.inMicroMipsMode();
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000087
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +000088 if (Mips::GPR32RegClass.contains(DestReg)) { // Copy to CPU Reg.
Zoran Jovanovic87d13e52014-03-20 10:18:24 +000089 if (Mips::GPR32RegClass.contains(SrcReg)) {
90 if (isMicroMips)
91 Opc = Mips::MOVE16_MM;
92 else
93 Opc = Mips::ADDu, ZeroReg = Mips::ZERO;
94 } else if (Mips::CCRRegClass.contains(SrcReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000095 Opc = Mips::CFC1;
96 else if (Mips::FGR32RegClass.contains(SrcReg))
97 Opc = Mips::MFC1;
Zoran Jovanoviccabf0f42014-04-03 12:47:34 +000098 else if (Mips::HI32RegClass.contains(SrcReg)) {
99 Opc = isMicroMips ? Mips::MFHI16_MM : Mips::MFHI;
100 SrcReg = 0;
101 } else if (Mips::LO32RegClass.contains(SrcReg)) {
102 Opc = isMicroMips ? Mips::MFLO16_MM : Mips::MFLO;
103 SrcReg = 0;
104 } else if (Mips::HI32DSPRegClass.contains(SrcReg))
Akira Hatanaka42543192013-04-30 23:22:09 +0000105 Opc = Mips::MFHI_DSP;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000106 else if (Mips::LO32DSPRegClass.contains(SrcReg))
Akira Hatanaka42543192013-04-30 23:22:09 +0000107 Opc = Mips::MFLO_DSP;
Akira Hatanaka5705f542013-05-02 23:07:05 +0000108 else if (Mips::DSPCCRegClass.contains(SrcReg)) {
109 BuildMI(MBB, I, DL, get(Mips::RDDSP), DestReg).addImm(1 << 4)
110 .addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
111 return;
112 }
Daniel Sandersf9aa1d12013-08-28 10:26:24 +0000113 else if (Mips::MSACtrlRegClass.contains(SrcReg))
114 Opc = Mips::CFCMSA;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000115 }
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000116 else if (Mips::GPR32RegClass.contains(SrcReg)) { // Copy from CPU Reg.
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000117 if (Mips::CCRRegClass.contains(DestReg))
118 Opc = Mips::CTC1;
119 else if (Mips::FGR32RegClass.contains(DestReg))
120 Opc = Mips::MTC1;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000121 else if (Mips::HI32RegClass.contains(DestReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000122 Opc = Mips::MTHI, DestReg = 0;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000123 else if (Mips::LO32RegClass.contains(DestReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000124 Opc = Mips::MTLO, DestReg = 0;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000125 else if (Mips::HI32DSPRegClass.contains(DestReg))
Akira Hatanaka42543192013-04-30 23:22:09 +0000126 Opc = Mips::MTHI_DSP;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000127 else if (Mips::LO32DSPRegClass.contains(DestReg))
Akira Hatanaka42543192013-04-30 23:22:09 +0000128 Opc = Mips::MTLO_DSP;
Akira Hatanaka5705f542013-05-02 23:07:05 +0000129 else if (Mips::DSPCCRegClass.contains(DestReg)) {
130 BuildMI(MBB, I, DL, get(Mips::WRDSP))
131 .addReg(SrcReg, getKillRegState(KillSrc)).addImm(1 << 4)
132 .addReg(DestReg, RegState::ImplicitDefine);
133 return;
134 }
Daniel Sandersf9aa1d12013-08-28 10:26:24 +0000135 else if (Mips::MSACtrlRegClass.contains(DestReg))
136 Opc = Mips::CTCMSA;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000137 }
138 else if (Mips::FGR32RegClass.contains(DestReg, SrcReg))
139 Opc = Mips::FMOV_S;
140 else if (Mips::AFGR64RegClass.contains(DestReg, SrcReg))
141 Opc = Mips::FMOV_D32;
142 else if (Mips::FGR64RegClass.contains(DestReg, SrcReg))
143 Opc = Mips::FMOV_D64;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000144 else if (Mips::GPR64RegClass.contains(DestReg)) { // Copy to CPU64 Reg.
145 if (Mips::GPR64RegClass.contains(SrcReg))
Akira Hatanaka44ff81d2013-07-22 18:52:22 +0000146 Opc = Mips::DADDu, ZeroReg = Mips::ZERO_64;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000147 else if (Mips::HI64RegClass.contains(SrcReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000148 Opc = Mips::MFHI64, SrcReg = 0;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000149 else if (Mips::LO64RegClass.contains(SrcReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000150 Opc = Mips::MFLO64, SrcReg = 0;
151 else if (Mips::FGR64RegClass.contains(SrcReg))
152 Opc = Mips::DMFC1;
153 }
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000154 else if (Mips::GPR64RegClass.contains(SrcReg)) { // Copy from CPU64 Reg.
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000155 if (Mips::HI64RegClass.contains(DestReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000156 Opc = Mips::MTHI64, DestReg = 0;
Akira Hatanaka8002a3f2013-08-14 00:47:08 +0000157 else if (Mips::LO64RegClass.contains(DestReg))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000158 Opc = Mips::MTLO64, DestReg = 0;
159 else if (Mips::FGR64RegClass.contains(DestReg))
160 Opc = Mips::DMTC1;
161 }
Daniel Sanders9ea9ff22013-09-27 12:03:51 +0000162 else if (Mips::MSA128BRegClass.contains(DestReg)) { // Copy to MSA reg
163 if (Mips::MSA128BRegClass.contains(SrcReg))
164 Opc = Mips::MOVE_V;
165 }
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000166
167 assert(Opc && "Cannot copy registers");
168
169 MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(Opc));
170
171 if (DestReg)
172 MIB.addReg(DestReg, RegState::Define);
173
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000174 if (SrcReg)
175 MIB.addReg(SrcReg, getKillRegState(KillSrc));
Akira Hatanakaf42367212012-12-20 04:06:06 +0000176
177 if (ZeroReg)
178 MIB.addReg(ZeroReg);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000179}
180
181void MipsSEInstrInfo::
Akira Hatanaka465facca2013-03-29 02:14:12 +0000182storeRegToStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
183 unsigned SrcReg, bool isKill, int FI,
184 const TargetRegisterClass *RC, const TargetRegisterInfo *TRI,
185 int64_t Offset) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000186 DebugLoc DL;
187 if (I != MBB.end()) DL = I->getDebugLoc();
188 MachineMemOperand *MMO = GetMemOperand(MBB, FI, MachineMemOperand::MOStore);
189
190 unsigned Opc = 0;
191
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000192 if (Mips::GPR32RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000193 Opc = Mips::SW;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000194 else if (Mips::GPR64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000195 Opc = Mips::SD;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000196 else if (Mips::ACC64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000197 Opc = Mips::STORE_ACC64;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000198 else if (Mips::ACC64DSPRegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000199 Opc = Mips::STORE_ACC64DSP;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000200 else if (Mips::ACC128RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000201 Opc = Mips::STORE_ACC128;
Akira Hatanaka5705f542013-05-02 23:07:05 +0000202 else if (Mips::DSPCCRegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000203 Opc = Mips::STORE_CCOND_DSP;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000204 else if (Mips::FGR32RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000205 Opc = Mips::SWC1;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000206 else if (Mips::AFGR64RegClass.hasSubClassEq(RC))
207 Opc = Mips::SDC1;
208 else if (Mips::FGR64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000209 Opc = Mips::SDC164;
Daniel Sandersb8bce4d2013-08-27 10:04:21 +0000210 else if (RC->hasType(MVT::v16i8))
211 Opc = Mips::ST_B;
212 else if (RC->hasType(MVT::v8i16) || RC->hasType(MVT::v8f16))
213 Opc = Mips::ST_H;
214 else if (RC->hasType(MVT::v4i32) || RC->hasType(MVT::v4f32))
215 Opc = Mips::ST_W;
216 else if (RC->hasType(MVT::v2i64) || RC->hasType(MVT::v2f64))
217 Opc = Mips::ST_D;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000218
219 assert(Opc && "Register class not handled!");
220 BuildMI(MBB, I, DL, get(Opc)).addReg(SrcReg, getKillRegState(isKill))
Akira Hatanaka465facca2013-03-29 02:14:12 +0000221 .addFrameIndex(FI).addImm(Offset).addMemOperand(MMO);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000222}
223
224void MipsSEInstrInfo::
Akira Hatanaka465facca2013-03-29 02:14:12 +0000225loadRegFromStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
226 unsigned DestReg, int FI, const TargetRegisterClass *RC,
227 const TargetRegisterInfo *TRI, int64_t Offset) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000228 DebugLoc DL;
229 if (I != MBB.end()) DL = I->getDebugLoc();
230 MachineMemOperand *MMO = GetMemOperand(MBB, FI, MachineMemOperand::MOLoad);
231 unsigned Opc = 0;
232
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000233 if (Mips::GPR32RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000234 Opc = Mips::LW;
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000235 else if (Mips::GPR64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000236 Opc = Mips::LD;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000237 else if (Mips::ACC64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000238 Opc = Mips::LOAD_ACC64;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000239 else if (Mips::ACC64DSPRegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000240 Opc = Mips::LOAD_ACC64DSP;
Akira Hatanaka00fcf2e2013-08-08 21:54:26 +0000241 else if (Mips::ACC128RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000242 Opc = Mips::LOAD_ACC128;
Akira Hatanaka5705f542013-05-02 23:07:05 +0000243 else if (Mips::DSPCCRegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000244 Opc = Mips::LOAD_CCOND_DSP;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000245 else if (Mips::FGR32RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000246 Opc = Mips::LWC1;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000247 else if (Mips::AFGR64RegClass.hasSubClassEq(RC))
248 Opc = Mips::LDC1;
249 else if (Mips::FGR64RegClass.hasSubClassEq(RC))
Akira Hatanaka6781fc12013-08-20 21:08:22 +0000250 Opc = Mips::LDC164;
Daniel Sandersb8bce4d2013-08-27 10:04:21 +0000251 else if (RC->hasType(MVT::v16i8))
252 Opc = Mips::LD_B;
253 else if (RC->hasType(MVT::v8i16) || RC->hasType(MVT::v8f16))
254 Opc = Mips::LD_H;
255 else if (RC->hasType(MVT::v4i32) || RC->hasType(MVT::v4f32))
256 Opc = Mips::LD_W;
257 else if (RC->hasType(MVT::v2i64) || RC->hasType(MVT::v2f64))
258 Opc = Mips::LD_D;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000259
260 assert(Opc && "Register class not handled!");
Akira Hatanaka465facca2013-03-29 02:14:12 +0000261 BuildMI(MBB, I, DL, get(Opc), DestReg).addFrameIndex(FI).addImm(Offset)
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000262 .addMemOperand(MMO);
263}
264
265bool MipsSEInstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) const {
266 MachineBasicBlock &MBB = *MI->getParent();
Eric Christopher675cb4d2014-07-18 23:25:00 +0000267 bool isMicroMips = Subtarget.inMicroMipsMode();
Zoran Jovanoviccabf0f42014-04-03 12:47:34 +0000268 unsigned Opc;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000269
270 switch(MI->getDesc().getOpcode()) {
271 default:
272 return false;
273 case Mips::RetRA:
Daniel Sanders338513b2014-07-09 10:16:07 +0000274 expandRetRA(MBB, MI);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000275 break;
Akira Hatanaka16048332013-10-07 18:49:46 +0000276 case Mips::PseudoMFHI:
Zoran Jovanoviccabf0f42014-04-03 12:47:34 +0000277 Opc = isMicroMips ? Mips::MFHI16_MM : Mips::MFHI;
278 expandPseudoMFHiLo(MBB, MI, Opc);
Akira Hatanaka16048332013-10-07 18:49:46 +0000279 break;
280 case Mips::PseudoMFLO:
Zoran Jovanoviccabf0f42014-04-03 12:47:34 +0000281 Opc = isMicroMips ? Mips::MFLO16_MM : Mips::MFLO;
282 expandPseudoMFHiLo(MBB, MI, Opc);
Akira Hatanaka16048332013-10-07 18:49:46 +0000283 break;
284 case Mips::PseudoMFHI64:
285 expandPseudoMFHiLo(MBB, MI, Mips::MFHI64);
286 break;
287 case Mips::PseudoMFLO64:
288 expandPseudoMFHiLo(MBB, MI, Mips::MFLO64);
289 break;
Akira Hatanaka06aff572013-10-15 01:48:30 +0000290 case Mips::PseudoMTLOHI:
291 expandPseudoMTLoHi(MBB, MI, Mips::MTLO, Mips::MTHI, false);
292 break;
293 case Mips::PseudoMTLOHI64:
294 expandPseudoMTLoHi(MBB, MI, Mips::MTLO64, Mips::MTHI64, false);
295 break;
296 case Mips::PseudoMTLOHI_DSP:
297 expandPseudoMTLoHi(MBB, MI, Mips::MTLO_DSP, Mips::MTHI_DSP, true);
298 break;
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000299 case Mips::PseudoCVT_S_W:
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000300 expandCvtFPInt(MBB, MI, Mips::CVT_S_W, Mips::MTC1, false);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000301 break;
302 case Mips::PseudoCVT_D32_W:
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000303 expandCvtFPInt(MBB, MI, Mips::CVT_D32_W, Mips::MTC1, false);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000304 break;
305 case Mips::PseudoCVT_S_L:
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000306 expandCvtFPInt(MBB, MI, Mips::CVT_S_L, Mips::DMTC1, true);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000307 break;
308 case Mips::PseudoCVT_D64_W:
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000309 expandCvtFPInt(MBB, MI, Mips::CVT_D64_W, Mips::MTC1, true);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000310 break;
311 case Mips::PseudoCVT_D64_L:
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000312 expandCvtFPInt(MBB, MI, Mips::CVT_D64_L, Mips::DMTC1, true);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000313 break;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000314 case Mips::BuildPairF64:
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000315 expandBuildPairF64(MBB, MI, false);
316 break;
317 case Mips::BuildPairF64_64:
318 expandBuildPairF64(MBB, MI, true);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000319 break;
320 case Mips::ExtractElementF64:
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000321 expandExtractElementF64(MBB, MI, false);
322 break;
323 case Mips::ExtractElementF64_64:
324 expandExtractElementF64(MBB, MI, true);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000325 break;
Akira Hatanakac0b02062013-01-30 00:26:49 +0000326 case Mips::MIPSeh_return32:
327 case Mips::MIPSeh_return64:
Akira Hatanaka067d8152013-05-13 17:43:19 +0000328 expandEhReturn(MBB, MI);
Akira Hatanakac0b02062013-01-30 00:26:49 +0000329 break;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000330 }
331
332 MBB.erase(MI);
333 return true;
334}
335
Akira Hatanaka067d8152013-05-13 17:43:19 +0000336/// getOppositeBranchOpc - Return the inverse of the specified
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000337/// opcode, e.g. turning BEQ to BNE.
Akira Hatanaka067d8152013-05-13 17:43:19 +0000338unsigned MipsSEInstrInfo::getOppositeBranchOpc(unsigned Opc) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000339 switch (Opc) {
340 default: llvm_unreachable("Illegal opcode!");
341 case Mips::BEQ: return Mips::BNE;
342 case Mips::BNE: return Mips::BEQ;
343 case Mips::BGTZ: return Mips::BLEZ;
344 case Mips::BGEZ: return Mips::BLTZ;
345 case Mips::BLTZ: return Mips::BGEZ;
346 case Mips::BLEZ: return Mips::BGTZ;
347 case Mips::BEQ64: return Mips::BNE64;
348 case Mips::BNE64: return Mips::BEQ64;
349 case Mips::BGTZ64: return Mips::BLEZ64;
350 case Mips::BGEZ64: return Mips::BLTZ64;
351 case Mips::BLTZ64: return Mips::BGEZ64;
352 case Mips::BLEZ64: return Mips::BGTZ64;
353 case Mips::BC1T: return Mips::BC1F;
354 case Mips::BC1F: return Mips::BC1T;
355 }
356}
357
Akira Hatanaka88d76cf2012-07-31 23:52:55 +0000358/// Adjust SP by Amount bytes.
359void MipsSEInstrInfo::adjustStackPtr(unsigned SP, int64_t Amount,
360 MachineBasicBlock &MBB,
361 MachineBasicBlock::iterator I) const {
Eric Christopher675cb4d2014-07-18 23:25:00 +0000362 const MipsSubtarget &STI = Subtarget;
Akira Hatanaka88d76cf2012-07-31 23:52:55 +0000363 DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
364 unsigned ADDu = STI.isABI_N64() ? Mips::DADDu : Mips::ADDu;
365 unsigned ADDiu = STI.isABI_N64() ? Mips::DADDiu : Mips::ADDiu;
366
367 if (isInt<16>(Amount))// addi sp, sp, amount
368 BuildMI(MBB, I, DL, get(ADDiu), SP).addReg(SP).addImm(Amount);
369 else { // Expand immediate that doesn't fit in 16-bit.
Craig Topper062a2ba2014-04-25 05:30:21 +0000370 unsigned Reg = loadImmediate(Amount, MBB, I, DL, nullptr);
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000371 BuildMI(MBB, I, DL, get(ADDu), SP).addReg(SP).addReg(Reg, RegState::Kill);
Akira Hatanaka88d76cf2012-07-31 23:52:55 +0000372 }
373}
374
Akira Hatanakabf493942012-08-23 00:21:05 +0000375/// This function generates the sequence of instructions needed to get the
376/// result of adding register REG and immediate IMM.
377unsigned
378MipsSEInstrInfo::loadImmediate(int64_t Imm, MachineBasicBlock &MBB,
379 MachineBasicBlock::iterator II, DebugLoc DL,
380 unsigned *NewImm) const {
381 MipsAnalyzeImmediate AnalyzeImm;
Eric Christopher675cb4d2014-07-18 23:25:00 +0000382 const MipsSubtarget &STI = Subtarget;
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000383 MachineRegisterInfo &RegInfo = MBB.getParent()->getRegInfo();
Akira Hatanakabf493942012-08-23 00:21:05 +0000384 unsigned Size = STI.isABI_N64() ? 64 : 32;
385 unsigned LUi = STI.isABI_N64() ? Mips::LUi64 : Mips::LUi;
386 unsigned ZEROReg = STI.isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000387 const TargetRegisterClass *RC = STI.isABI_N64() ?
Akira Hatanaka13e6ccf2013-08-06 23:08:38 +0000388 &Mips::GPR64RegClass : &Mips::GPR32RegClass;
Akira Hatanakabf493942012-08-23 00:21:05 +0000389 bool LastInstrIsADDiu = NewImm;
390
391 const MipsAnalyzeImmediate::InstSeq &Seq =
392 AnalyzeImm.Analyze(Imm, Size, LastInstrIsADDiu);
393 MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
394
395 assert(Seq.size() && (!LastInstrIsADDiu || (Seq.size() > 1)));
396
397 // The first instruction can be a LUi, which is different from other
398 // instructions (ADDiu, ORI and SLL) in that it does not have a register
399 // operand.
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000400 unsigned Reg = RegInfo.createVirtualRegister(RC);
401
Akira Hatanakabf493942012-08-23 00:21:05 +0000402 if (Inst->Opc == LUi)
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000403 BuildMI(MBB, II, DL, get(LUi), Reg).addImm(SignExtend64<16>(Inst->ImmOpnd));
Akira Hatanakabf493942012-08-23 00:21:05 +0000404 else
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000405 BuildMI(MBB, II, DL, get(Inst->Opc), Reg).addReg(ZEROReg)
Akira Hatanakabf493942012-08-23 00:21:05 +0000406 .addImm(SignExtend64<16>(Inst->ImmOpnd));
407
408 // Build the remaining instructions in Seq.
409 for (++Inst; Inst != Seq.end() - LastInstrIsADDiu; ++Inst)
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000410 BuildMI(MBB, II, DL, get(Inst->Opc), Reg).addReg(Reg, RegState::Kill)
Akira Hatanakabf493942012-08-23 00:21:05 +0000411 .addImm(SignExtend64<16>(Inst->ImmOpnd));
412
413 if (LastInstrIsADDiu)
414 *NewImm = Inst->ImmOpnd;
415
Akira Hatanaka5852e3b2012-11-03 00:05:43 +0000416 return Reg;
Akira Hatanakabf493942012-08-23 00:21:05 +0000417}
418
Akira Hatanaka067d8152013-05-13 17:43:19 +0000419unsigned MipsSEInstrInfo::getAnalyzableBrOpc(unsigned Opc) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000420 return (Opc == Mips::BEQ || Opc == Mips::BNE || Opc == Mips::BGTZ ||
421 Opc == Mips::BGEZ || Opc == Mips::BLTZ || Opc == Mips::BLEZ ||
422 Opc == Mips::BEQ64 || Opc == Mips::BNE64 || Opc == Mips::BGTZ64 ||
423 Opc == Mips::BGEZ64 || Opc == Mips::BLTZ64 || Opc == Mips::BLEZ64 ||
424 Opc == Mips::BC1T || Opc == Mips::BC1F || Opc == Mips::B ||
425 Opc == Mips::J) ?
426 Opc : 0;
427}
428
Akira Hatanaka067d8152013-05-13 17:43:19 +0000429void MipsSEInstrInfo::expandRetRA(MachineBasicBlock &MBB,
Daniel Sanders338513b2014-07-09 10:16:07 +0000430 MachineBasicBlock::iterator I) const {
Daniel Sanders338513b2014-07-09 10:16:07 +0000431 if (Subtarget.isGP64bit())
432 BuildMI(MBB, I, I->getDebugLoc(), get(Mips::PseudoReturn64))
433 .addReg(Mips::RA_64);
434 else
435 BuildMI(MBB, I, I->getDebugLoc(), get(Mips::PseudoReturn)).addReg(Mips::RA);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000436}
437
Akira Hatanaka4be04b12013-06-11 18:48:16 +0000438std::pair<bool, bool>
439MipsSEInstrInfo::compareOpndSize(unsigned Opc,
440 const MachineFunction &MF) const {
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000441 const MCInstrDesc &Desc = get(Opc);
442 assert(Desc.NumOperands == 2 && "Unary instruction expected.");
Akira Hatanaka4be04b12013-06-11 18:48:16 +0000443 const MipsRegisterInfo *RI = &getRegisterInfo();
444 unsigned DstRegSize = getRegClass(Desc, 0, RI, MF)->getSize();
445 unsigned SrcRegSize = getRegClass(Desc, 1, RI, MF)->getSize();
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000446
447 return std::make_pair(DstRegSize > SrcRegSize, DstRegSize < SrcRegSize);
448}
449
Akira Hatanaka16048332013-10-07 18:49:46 +0000450void MipsSEInstrInfo::expandPseudoMFHiLo(MachineBasicBlock &MBB,
451 MachineBasicBlock::iterator I,
452 unsigned NewOpc) const {
453 BuildMI(MBB, I, I->getDebugLoc(), get(NewOpc), I->getOperand(0).getReg());
454}
455
Akira Hatanaka06aff572013-10-15 01:48:30 +0000456void MipsSEInstrInfo::expandPseudoMTLoHi(MachineBasicBlock &MBB,
457 MachineBasicBlock::iterator I,
458 unsigned LoOpc,
459 unsigned HiOpc,
460 bool HasExplicitDef) const {
461 // Expand
462 // lo_hi pseudomtlohi $gpr0, $gpr1
463 // to these two instructions:
464 // mtlo $gpr0
465 // mthi $gpr1
466
467 DebugLoc DL = I->getDebugLoc();
468 const MachineOperand &SrcLo = I->getOperand(1), &SrcHi = I->getOperand(2);
469 MachineInstrBuilder LoInst = BuildMI(MBB, I, DL, get(LoOpc));
470 MachineInstrBuilder HiInst = BuildMI(MBB, I, DL, get(HiOpc));
471 LoInst.addReg(SrcLo.getReg(), getKillRegState(SrcLo.isKill()));
472 HiInst.addReg(SrcHi.getReg(), getKillRegState(SrcHi.isKill()));
473
474 // Add lo/hi registers if the mtlo/hi instructions created have explicit
475 // def registers.
476 if (HasExplicitDef) {
477 unsigned DstReg = I->getOperand(0).getReg();
478 unsigned DstLo = getRegisterInfo().getSubReg(DstReg, Mips::sub_lo);
479 unsigned DstHi = getRegisterInfo().getSubReg(DstReg, Mips::sub_hi);
480 LoInst.addReg(DstLo, RegState::Define);
481 HiInst.addReg(DstHi, RegState::Define);
482 }
483}
484
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000485void MipsSEInstrInfo::expandCvtFPInt(MachineBasicBlock &MBB,
486 MachineBasicBlock::iterator I,
487 unsigned CvtOpc, unsigned MovOpc,
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000488 bool IsI64) const {
489 const MCInstrDesc &CvtDesc = get(CvtOpc), &MovDesc = get(MovOpc);
490 const MachineOperand &Dst = I->getOperand(0), &Src = I->getOperand(1);
491 unsigned DstReg = Dst.getReg(), SrcReg = Src.getReg(), TmpReg = DstReg;
492 unsigned KillSrc = getKillRegState(Src.isKill());
493 DebugLoc DL = I->getDebugLoc();
Akira Hatanakaae9d8e22013-06-08 00:14:54 +0000494 bool DstIsLarger, SrcIsLarger;
495
Benjamin Kramerd6f1f842014-03-02 13:30:33 +0000496 std::tie(DstIsLarger, SrcIsLarger) =
497 compareOpndSize(CvtOpc, *MBB.getParent());
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000498
499 if (DstIsLarger)
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000500 TmpReg = getRegisterInfo().getSubReg(DstReg, Mips::sub_lo);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000501
502 if (SrcIsLarger)
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000503 DstReg = getRegisterInfo().getSubReg(DstReg, Mips::sub_lo);
Akira Hatanaka39d40f72013-05-16 19:48:37 +0000504
505 BuildMI(MBB, I, DL, MovDesc, TmpReg).addReg(SrcReg, KillSrc);
506 BuildMI(MBB, I, DL, CvtDesc, DstReg).addReg(TmpReg, RegState::Kill);
507}
508
Akira Hatanaka067d8152013-05-13 17:43:19 +0000509void MipsSEInstrInfo::expandExtractElementF64(MachineBasicBlock &MBB,
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000510 MachineBasicBlock::iterator I,
511 bool FP64) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000512 unsigned DstReg = I->getOperand(0).getReg();
513 unsigned SrcReg = I->getOperand(1).getReg();
514 unsigned N = I->getOperand(2).getImm();
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000515 DebugLoc dl = I->getDebugLoc();
516
517 assert(N < 2 && "Invalid immediate");
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000518 unsigned SubIdx = N ? Mips::sub_hi : Mips::sub_lo;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000519 unsigned SubReg = getRegisterInfo().getSubReg(SrcReg, SubIdx);
520
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000521 // FPXX on MIPS-II or MIPS32r1 should have been handled with a spill/reload
522 // in MipsSEFrameLowering.cpp.
523 assert(!(Subtarget.isABI_FPXX() && !Subtarget.hasMips32r2()));
524
525 // FP64A (FP64 with nooddspreg) should have been handled with a spill/reload
526 // in MipsSEFrameLowering.cpp.
527 assert(!(Subtarget.isFP64bit() && !Subtarget.useOddSPReg()));
528
529 if (SubIdx == Mips::sub_hi && Subtarget.hasMTHC1()) {
Daniel Sanders24e08fd2014-07-14 12:41:31 +0000530 // FIXME: Strictly speaking MFHC1 only reads the top 32-bits however, we
531 // claim to read the whole 64-bits as part of a white lie used to
Daniel Sanders059e4b12014-03-10 15:01:57 +0000532 // temporarily work around a widespread bug in the -mfp64 support.
533 // The problem is that none of the 32-bit fpu ops mention the fact
534 // that they clobber the upper 32-bits of the 64-bit FPR. Fixing that
535 // requires a major overhaul of the FPU implementation which can't
536 // be done right now due to time constraints.
Daniel Sanders61c76cc2014-03-12 13:35:43 +0000537 // MFHC1 is one of two instructions that are affected since they are
538 // the only instructions that don't read the lower 32-bits.
539 // We therefore pretend that it reads the bottom 32-bits to
540 // artificially create a dependency and prevent the scheduler
541 // changing the behaviour of the code.
Daniel Sanders24e08fd2014-07-14 12:41:31 +0000542 BuildMI(MBB, I, dl, get(FP64 ? Mips::MFHC1_D64 : Mips::MFHC1_D32), DstReg)
543 .addReg(SrcReg);
Daniel Sanders059e4b12014-03-10 15:01:57 +0000544 } else
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000545 BuildMI(MBB, I, dl, get(Mips::MFC1), DstReg).addReg(SubReg);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000546}
547
Akira Hatanaka067d8152013-05-13 17:43:19 +0000548void MipsSEInstrInfo::expandBuildPairF64(MachineBasicBlock &MBB,
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000549 MachineBasicBlock::iterator I,
550 bool FP64) const {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000551 unsigned DstReg = I->getOperand(0).getReg();
552 unsigned LoReg = I->getOperand(1).getReg(), HiReg = I->getOperand(2).getReg();
553 const MCInstrDesc& Mtc1Tdd = get(Mips::MTC1);
554 DebugLoc dl = I->getDebugLoc();
555 const TargetRegisterInfo &TRI = getRegisterInfo();
556
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000557 // When mthc1 is available, use:
Daniel Sanders08d3cd12013-11-18 13:12:43 +0000558 // mtc1 Lo, $fp
559 // mthc1 Hi, $fp
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000560 //
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000561 // Otherwise, for O32 FPXX ABI:
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000562 // spill + reload via ldc1
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000563 // This case is handled by the frame lowering code.
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000564 //
565 // Otherwise, for FP32:
566 // mtc1 Lo, $fp
567 // mtc1 Hi, $fp + 1
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000568 //
569 // The case where dmtc1 is available doesn't need to be handled here
570 // because it never creates a BuildPairF64 node.
Daniel Sanders08d3cd12013-11-18 13:12:43 +0000571
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000572 // FPXX on MIPS-II or MIPS32r1 should have been handled with a spill/reload
573 // in MipsSEFrameLowering.cpp.
574 assert(!(Subtarget.isABI_FPXX() && !Subtarget.hasMips32r2()));
575
576 // FP64A (FP64 with nooddspreg) should have been handled with a spill/reload
577 // in MipsSEFrameLowering.cpp.
578 assert(!(Subtarget.isFP64bit() && !Subtarget.useOddSPReg()));
579
Akira Hatanaka14e31a22013-08-20 22:58:56 +0000580 BuildMI(MBB, I, dl, Mtc1Tdd, TRI.getSubReg(DstReg, Mips::sub_lo))
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000581 .addReg(LoReg);
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000582
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000583 if (Subtarget.hasMTHC1()) {
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000584 // FIXME: The .addReg(DstReg) is a white lie used to temporarily work
585 // around a widespread bug in the -mfp64 support.
Daniel Sanders61c76cc2014-03-12 13:35:43 +0000586 // The problem is that none of the 32-bit fpu ops mention the fact
587 // that they clobber the upper 32-bits of the 64-bit FPR. Fixing that
588 // requires a major overhaul of the FPU implementation which can't
589 // be done right now due to time constraints.
590 // MTHC1 is one of two instructions that are affected since they are
591 // the only instructions that don't read the lower 32-bits.
592 // We therefore pretend that it reads the bottom 32-bits to
593 // artificially create a dependency and prevent the scheduler
594 // changing the behaviour of the code.
Daniel Sanders1f6f0f42014-06-12 11:55:58 +0000595 BuildMI(MBB, I, dl, get(FP64 ? Mips::MTHC1_D64 : Mips::MTHC1_D32), DstReg)
596 .addReg(DstReg)
597 .addReg(HiReg);
Daniel Sanders7ddb0ab2014-07-14 13:08:14 +0000598 } else if (Subtarget.isABI_FPXX())
Sasa Stankovicb976fee2014-07-14 09:40:29 +0000599 llvm_unreachable("BuildPairF64 not expanded in frame lowering code!");
600 else
Akira Hatanaka9a1fb6b2013-08-20 23:47:25 +0000601 BuildMI(MBB, I, dl, Mtc1Tdd, TRI.getSubReg(DstReg, Mips::sub_hi))
602 .addReg(HiReg);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000603}
Akira Hatanakafab89292012-08-02 18:21:47 +0000604
Akira Hatanaka067d8152013-05-13 17:43:19 +0000605void MipsSEInstrInfo::expandEhReturn(MachineBasicBlock &MBB,
Akira Hatanakac0b02062013-01-30 00:26:49 +0000606 MachineBasicBlock::iterator I) const {
607 // This pseudo instruction is generated as part of the lowering of
608 // ISD::EH_RETURN. We convert it to a stack increment by OffsetReg, and
609 // indirect jump to TargetReg
Eric Christopher675cb4d2014-07-18 23:25:00 +0000610 unsigned ADDU = Subtarget.isABI_N64() ? Mips::DADDu : Mips::ADDu;
611 unsigned SP = Subtarget.isGP64bit() ? Mips::SP_64 : Mips::SP;
612 unsigned RA = Subtarget.isGP64bit() ? Mips::RA_64 : Mips::RA;
613 unsigned T9 = Subtarget.isGP64bit() ? Mips::T9_64 : Mips::T9;
614 unsigned ZERO = Subtarget.isGP64bit() ? Mips::ZERO_64 : Mips::ZERO;
Akira Hatanakac0b02062013-01-30 00:26:49 +0000615 unsigned OffsetReg = I->getOperand(0).getReg();
616 unsigned TargetReg = I->getOperand(1).getReg();
617
Akira Hatanaka44ff81d2013-07-22 18:52:22 +0000618 // addu $ra, $v0, $zero
Akira Hatanakac0b02062013-01-30 00:26:49 +0000619 // addu $sp, $sp, $v1
Daniel Sanders338513b2014-07-09 10:16:07 +0000620 // jr $ra (via RetRA)
Eric Christopher675cb4d2014-07-18 23:25:00 +0000621 const TargetMachine &TM = MBB.getParent()->getTarget();
Akira Hatanaka023c6782013-04-02 23:02:07 +0000622 if (TM.getRelocationModel() == Reloc::PIC_)
Eric Christopherd9134482014-08-04 21:25:23 +0000623 BuildMI(MBB, I, I->getDebugLoc(),
624 TM.getSubtargetImpl()->getInstrInfo()->get(ADDU), T9)
Eric Christopher675cb4d2014-07-18 23:25:00 +0000625 .addReg(TargetReg)
626 .addReg(ZERO);
Eric Christopherd9134482014-08-04 21:25:23 +0000627 BuildMI(MBB, I, I->getDebugLoc(),
628 TM.getSubtargetImpl()->getInstrInfo()->get(ADDU), RA)
Eric Christopher675cb4d2014-07-18 23:25:00 +0000629 .addReg(TargetReg)
630 .addReg(ZERO);
Eric Christopherd9134482014-08-04 21:25:23 +0000631 BuildMI(MBB, I, I->getDebugLoc(),
632 TM.getSubtargetImpl()->getInstrInfo()->get(ADDU), SP)
Eric Christopher675cb4d2014-07-18 23:25:00 +0000633 .addReg(SP)
634 .addReg(OffsetReg);
Daniel Sanders338513b2014-07-09 10:16:07 +0000635 expandRetRA(MBB, I);
Akira Hatanakac0b02062013-01-30 00:26:49 +0000636}
637
Eric Christopher675cb4d2014-07-18 23:25:00 +0000638const MipsInstrInfo *llvm::createMipsSEInstrInfo(const MipsSubtarget &STI) {
639 return new MipsSEInstrInfo(STI);
Akira Hatanakafab89292012-08-02 18:21:47 +0000640}