29 tm.getRelocationModel() == Reloc::
PIC_ ? Mips::B : Mips::J),
30 RI(*tm.getSubtargetImpl()),
47 if ((Opc == Mips::LW) || (Opc ==
Mips::LD) ||
48 (Opc == Mips::LWC1) || (Opc == Mips::LDC1) || (Opc == Mips::LDC164)) {
70 if ((Opc == Mips::SW) || (Opc == Mips::SD) ||
71 (Opc == Mips::SWC1) || (Opc == Mips::SDC1) || (Opc == Mips::SDC164)) {
84 unsigned DestReg,
unsigned SrcReg,
86 unsigned Opc = 0, ZeroReg = 0;
88 if (Mips::GPR32RegClass.contains(DestReg)) {
89 if (Mips::GPR32RegClass.contains(SrcReg))
90 Opc = Mips::ADDu, ZeroReg = Mips::ZERO;
91 else if (Mips::CCRRegClass.contains(SrcReg))
93 else if (Mips::FGR32RegClass.contains(SrcReg))
95 else if (Mips::HI32RegClass.contains(SrcReg))
97 else if (Mips::LO32RegClass.contains(SrcReg))
99 else if (Mips::HI32DSPRegClass.contains(SrcReg))
100 Opc = Mips::MFHI_DSP;
101 else if (Mips::LO32DSPRegClass.contains(SrcReg))
102 Opc = Mips::MFLO_DSP;
103 else if (Mips::DSPCCRegClass.contains(SrcReg)) {
104 BuildMI(MBB, I, DL,
get(Mips::RDDSP), DestReg).
addImm(1 << 4)
108 else if (Mips::MSACtrlRegClass.contains(SrcReg))
111 else if (Mips::GPR32RegClass.contains(SrcReg)) {
112 if (Mips::CCRRegClass.contains(DestReg))
114 else if (Mips::FGR32RegClass.contains(DestReg))
116 else if (Mips::HI32RegClass.contains(DestReg))
117 Opc = Mips::MTHI, DestReg = 0;
118 else if (Mips::LO32RegClass.contains(DestReg))
119 Opc = Mips::MTLO, DestReg = 0;
120 else if (Mips::HI32DSPRegClass.contains(DestReg))
121 Opc = Mips::MTHI_DSP;
122 else if (Mips::LO32DSPRegClass.contains(DestReg))
123 Opc = Mips::MTLO_DSP;
124 else if (Mips::DSPCCRegClass.contains(DestReg)) {
125 BuildMI(MBB, I, DL,
get(Mips::WRDSP))
130 else if (Mips::MSACtrlRegClass.contains(DestReg))
133 else if (Mips::FGR32RegClass.contains(DestReg, SrcReg))
135 else if (Mips::AFGR64RegClass.contains(DestReg, SrcReg))
136 Opc = Mips::FMOV_D32;
137 else if (Mips::FGR64RegClass.contains(DestReg, SrcReg))
138 Opc = Mips::FMOV_D64;
139 else if (Mips::GPR64RegClass.contains(DestReg)) {
140 if (Mips::GPR64RegClass.contains(SrcReg))
141 Opc = Mips::DADDu, ZeroReg = Mips::ZERO_64;
142 else if (Mips::HI64RegClass.contains(SrcReg))
143 Opc = Mips::MFHI64, SrcReg = 0;
144 else if (Mips::LO64RegClass.contains(SrcReg))
145 Opc = Mips::MFLO64, SrcReg = 0;
146 else if (Mips::FGR64RegClass.contains(SrcReg))
149 else if (Mips::GPR64RegClass.contains(SrcReg)) {
150 if (Mips::HI64RegClass.contains(DestReg))
151 Opc = Mips::MTHI64, DestReg = 0;
152 else if (Mips::LO64RegClass.contains(DestReg))
153 Opc = Mips::MTLO64, DestReg = 0;
154 else if (Mips::FGR64RegClass.contains(DestReg))
157 else if (Mips::MSA128BRegClass.contains(DestReg)) {
158 if (Mips::MSA128BRegClass.contains(SrcReg))
162 assert(Opc &&
"Cannot copy registers");
178 unsigned SrcReg,
bool isKill,
int FI,
180 int64_t Offset)
const {
182 if (I != MBB.
end()) DL = I->getDebugLoc();
187 if (Mips::GPR32RegClass.hasSubClassEq(RC))
189 else if (Mips::GPR64RegClass.hasSubClassEq(RC))
191 else if (Mips::ACC64RegClass.hasSubClassEq(RC))
192 Opc = Mips::STORE_ACC64;
193 else if (Mips::ACC64DSPRegClass.hasSubClassEq(RC))
194 Opc = Mips::STORE_ACC64DSP;
195 else if (Mips::ACC128RegClass.hasSubClassEq(RC))
196 Opc = Mips::STORE_ACC128;
197 else if (Mips::DSPCCRegClass.hasSubClassEq(RC))
198 Opc = Mips::STORE_CCOND_DSP;
199 else if (Mips::FGR32RegClass.hasSubClassEq(RC))
201 else if (Mips::AFGR64RegClass.hasSubClassEq(RC))
203 else if (Mips::FGR64RegClass.hasSubClassEq(RC))
214 assert(Opc &&
"Register class not handled!");
224 if (I != MBB.
end()) DL = I->getDebugLoc();
228 if (Mips::GPR32RegClass.hasSubClassEq(RC))
230 else if (Mips::GPR64RegClass.hasSubClassEq(RC))
232 else if (Mips::ACC64RegClass.hasSubClassEq(RC))
233 Opc = Mips::LOAD_ACC64;
234 else if (Mips::ACC64DSPRegClass.hasSubClassEq(RC))
235 Opc = Mips::LOAD_ACC64DSP;
236 else if (Mips::ACC128RegClass.hasSubClassEq(RC))
237 Opc = Mips::LOAD_ACC128;
238 else if (Mips::DSPCCRegClass.hasSubClassEq(RC))
239 Opc = Mips::LOAD_CCOND_DSP;
240 else if (Mips::FGR32RegClass.hasSubClassEq(RC))
242 else if (Mips::AFGR64RegClass.hasSubClassEq(RC))
244 else if (Mips::FGR64RegClass.hasSubClassEq(RC))
255 assert(Opc &&
"Register class not handled!");
263 switch(MI->getDesc().getOpcode()) {
267 expandRetRA(MBB, MI, Mips::RET);
269 case Mips::PseudoMFHI:
272 case Mips::PseudoMFLO:
275 case Mips::PseudoMFHI64:
276 expandPseudoMFHiLo(MBB, MI, Mips::MFHI64);
278 case Mips::PseudoMFLO64:
279 expandPseudoMFHiLo(MBB, MI, Mips::MFLO64);
281 case Mips::PseudoMTLOHI:
282 expandPseudoMTLoHi(MBB, MI, Mips::MTLO, Mips::MTHI,
false);
284 case Mips::PseudoMTLOHI64:
285 expandPseudoMTLoHi(MBB, MI, Mips::MTLO64, Mips::MTHI64,
false);
287 case Mips::PseudoMTLOHI_DSP:
288 expandPseudoMTLoHi(MBB, MI, Mips::MTLO_DSP, Mips::MTHI_DSP,
true);
290 case Mips::PseudoCVT_S_W:
291 expandCvtFPInt(MBB, MI, Mips::CVT_S_W, Mips::MTC1,
false);
293 case Mips::PseudoCVT_D32_W:
294 expandCvtFPInt(MBB, MI, Mips::CVT_D32_W, Mips::MTC1,
false);
296 case Mips::PseudoCVT_S_L:
297 expandCvtFPInt(MBB, MI, Mips::CVT_S_L, Mips::DMTC1,
true);
299 case Mips::PseudoCVT_D64_W:
300 expandCvtFPInt(MBB, MI, Mips::CVT_D64_W, Mips::MTC1,
true);
302 case Mips::PseudoCVT_D64_L:
303 expandCvtFPInt(MBB, MI, Mips::CVT_D64_L, Mips::DMTC1,
true);
306 expandBuildPairF64(MBB, MI,
false);
308 case Mips::BuildPairF64_64:
309 expandBuildPairF64(MBB, MI,
true);
312 expandExtractElementF64(MBB, MI,
false);
314 case Mips::ExtractElementF64_64:
315 expandExtractElementF64(MBB, MI,
true);
317 case Mips::MIPSeh_return32:
318 case Mips::MIPSeh_return64:
319 expandEhReturn(MBB, MI);
332 case Mips::BEQ:
return Mips::BNE;
333 case Mips::BNE:
return Mips::BEQ;
334 case Mips::BGTZ:
return Mips::BLEZ;
335 case Mips::BGEZ:
return Mips::BLTZ;
336 case Mips::BLTZ:
return Mips::BGEZ;
337 case Mips::BLEZ:
return Mips::BGTZ;
338 case Mips::BEQ64:
return Mips::BNE64;
339 case Mips::BNE64:
return Mips::BEQ64;
340 case Mips::BGTZ64:
return Mips::BLEZ64;
341 case Mips::BGEZ64:
return Mips::BLTZ64;
342 case Mips::BLTZ64:
return Mips::BGEZ64;
343 case Mips::BLEZ64:
return Mips::BGTZ64;
344 case Mips::BC1T:
return Mips::BC1F;
345 case Mips::BC1F:
return Mips::BC1T;
355 unsigned ADDu = STI.
isABI_N64() ? Mips::DADDu : Mips::ADDu;
356 unsigned ADDiu = STI.
isABI_N64() ? Mips::DADDiu : Mips::ADDiu;
371 unsigned *NewImm)
const {
375 unsigned Size = STI.
isABI_N64() ? 64 : 32;
376 unsigned LUi = STI.
isABI_N64() ? Mips::LUi64 : Mips::LUi;
377 unsigned ZEROReg = STI.
isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
379 &Mips::GPR64RegClass : &Mips::GPR32RegClass;
380 bool LastInstrIsADDiu = NewImm;
383 AnalyzeImm.
Analyze(Imm, Size, LastInstrIsADDiu);
386 assert(Seq.
size() && (!LastInstrIsADDiu || (Seq.
size() > 1)));
391 unsigned Reg = RegInfo.createVirtualRegister(RC);
393 if (Inst->Opc == LUi)
394 BuildMI(MBB, II, DL,
get(LUi), Reg).
addImm(SignExtend64<16>(Inst->ImmOpnd));
397 .
addImm(SignExtend64<16>(Inst->ImmOpnd));
400 for (++Inst; Inst != Seq.
end() - LastInstrIsADDiu; ++Inst)
402 .
addImm(SignExtend64<16>(Inst->ImmOpnd));
404 if (LastInstrIsADDiu)
405 *NewImm = Inst->ImmOpnd;
410 unsigned MipsSEInstrInfo::getAnalyzableBrOpc(
unsigned Opc)
const {
411 return (Opc == Mips::BEQ || Opc == Mips::BNE || Opc == Mips::BGTZ ||
412 Opc == Mips::BGEZ || Opc == Mips::BLTZ || Opc == Mips::BLEZ ||
413 Opc == Mips::BEQ64 || Opc == Mips::BNE64 || Opc == Mips::BGTZ64 ||
414 Opc == Mips::BGEZ64 || Opc == Mips::BLTZ64 || Opc == Mips::BLEZ64 ||
415 Opc == Mips::BC1T || Opc == Mips::BC1F || Opc == Mips::B ||
422 unsigned Opc)
const {
423 BuildMI(MBB, I, I->getDebugLoc(),
get(Opc)).
addReg(Mips::RA);
426 std::pair<bool, bool>
427 MipsSEInstrInfo::compareOpndSize(
unsigned Opc,
430 assert(Desc.
NumOperands == 2 &&
"Unary instruction expected.");
432 unsigned DstRegSize = getRegClass(Desc, 0, RI, MF)->getSize();
433 unsigned SrcRegSize = getRegClass(Desc, 1, RI, MF)->getSize();
435 return std::make_pair(DstRegSize > SrcRegSize, DstRegSize < SrcRegSize);
440 unsigned NewOpc)
const {
441 BuildMI(MBB, I, I->getDebugLoc(),
get(NewOpc), I->getOperand(0).getReg());
448 bool HasExplicitDef)
const {
456 const MachineOperand &SrcLo = I->getOperand(1), &SrcHi = I->getOperand(2);
464 if (HasExplicitDef) {
475 unsigned CvtOpc,
unsigned MovOpc,
477 const MCInstrDesc &CvtDesc =
get(CvtOpc), &MovDesc =
get(MovOpc);
478 const MachineOperand &Dst = I->getOperand(0), &Src = I->getOperand(1);
479 unsigned DstReg = Dst.
getReg(), SrcReg = Src.getReg(), TmpReg = DstReg;
482 bool DstIsLarger, SrcIsLarger;
484 tie(DstIsLarger, SrcIsLarger) = compareOpndSize(CvtOpc, *MBB.
getParent());
492 BuildMI(MBB, I, DL, MovDesc, TmpReg).
addReg(SrcReg, KillSrc);
499 unsigned DstReg = I->getOperand(0).getReg();
500 unsigned SrcReg = I->getOperand(1).getReg();
501 unsigned N = I->getOperand(2).getImm();
504 assert(N < 2 &&
"Invalid immediate");
505 unsigned SubIdx = N ? Mips::sub_hi : Mips::sub_lo;
508 if (SubIdx == Mips::sub_hi && FP64)
509 BuildMI(MBB, I, dl,
get(Mips::MFHC1), DstReg).
addReg(SubReg);
517 unsigned DstReg = I->getOperand(0).getReg();
518 unsigned LoReg = I->getOperand(1).getReg(), HiReg = I->getOperand(2).getReg();
547 unsigned ADDU = STI.
isABI_N64() ? Mips::DADDu : Mips::ADDu;
548 unsigned JR = STI.
isABI_N64() ? Mips::JR64 : Mips::JR;
549 unsigned SP = STI.
isABI_N64() ? Mips::SP_64 : Mips::SP;
550 unsigned RA = STI.
isABI_N64() ? Mips::RA_64 : Mips::RA;
551 unsigned T9 = STI.
isABI_N64() ? Mips::T9_64 : Mips::T9;
552 unsigned ZERO = STI.
isABI_N64() ? Mips::ZERO_64 : Mips::ZERO;
553 unsigned OffsetReg = I->getOperand(0).getReg();
554 unsigned TargetReg = I->getOperand(1).getReg();
561 .addReg(TargetReg).
addReg(ZERO);
563 .addReg(TargetReg).
addReg(ZERO);
565 .addReg(SP).
addReg(OffsetReg);
virtual const MipsRegisterInfo & getRegisterInfo() const
bool isZeroImm(const MachineOperand &op) const
const MachineFunction * getParent() const
The memory access reads data.
instr_iterator erase(instr_iterator I)
The memory access writes data.
void adjustStackPtr(unsigned SP, int64_t Amount, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const
Adjust SP by Amount bytes.
Reloc::Model getRelocationModel() const
virtual const MipsInstrInfo * getInstrInfo() const
virtual unsigned getOppositeBranchOpc(unsigned Opc) const
const MipsInstrInfo * createMipsSEInstrInfo(MipsTargetMachine &TM)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
const MachineInstrBuilder & addImm(int64_t Val) const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
unsigned getKillRegState(bool B)
unsigned short NumOperands
MipsSEInstrInfo(MipsTargetMachine &TM)
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
unsigned getSubReg(unsigned Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo...
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
const STC & getSubtarget() const
const MachineInstrBuilder & addFrameIndex(int Idx) const
virtual void storeRegToStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, int64_t Offset) const
MachineRegisterInfo & getRegInfo()
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
virtual void loadRegFromStack(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, int64_t Offset) const
virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const
unsigned loadImmediate(int64_t Imm, MachineBasicBlock &MBB, MachineBasicBlock::iterator II, DebugLoc DL, unsigned *NewImm) const
bool hasType(EVT vt) const
bool isInt< 16 >(int64_t x)
unsigned getReg() const
getReg - Returns the register number.
MachineMemOperand * GetMemOperand(MachineBasicBlock &MBB, int FI, unsigned Flag) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
tier< T1, T2 > tie(T1 &f, T2 &s)
virtual unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const