1 //===-- MipsSEISelDAGToDAG.cpp - A Dag to Dag Inst Selector for MipsSE ----===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Subclass of MipsDAGToDAGISel specialized for mips32/64.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "MipsSEISelDAGToDAG.h"
14 #include "Mips.h"
15 #include "MipsAnalyzeImmediate.h"
16 #include "MipsMachineFunction.h"
17 #include "MipsRegisterInfo.h"
18 #include "llvm/CodeGen/MachineFrameInfo.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/MachineRegisterInfo.h"
22 #include "llvm/CodeGen/SelectionDAGNodes.h"
23 #include "llvm/IR/Dominators.h"
24 #include "llvm/IR/GlobalValue.h"
25 #include "llvm/IR/Instructions.h"
26 #include "llvm/IR/Intrinsics.h"
27 #include "llvm/IR/IntrinsicsMips.h"
28 #include "llvm/IR/Type.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Target/TargetMachine.h"
31 using namespace llvm;
32
33 #define DEBUG_TYPE "mips-isel"
34
runOnMachineFunction(MachineFunction & MF)35 bool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
36 Subtarget = &MF.getSubtarget<MipsSubtarget>();
37 if (Subtarget->inMips16Mode())
38 return false;
39 return MipsDAGToDAGISel::runOnMachineFunction(MF);
40 }
41
getAnalysisUsage(AnalysisUsage & AU) const42 void MipsSEDAGToDAGISelLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
43 AU.addRequired<DominatorTreeWrapperPass>();
44 SelectionDAGISelLegacy::getAnalysisUsage(AU);
45 }
46
addDSPCtrlRegOperands(bool IsDef,MachineInstr & MI,MachineFunction & MF)47 void MipsSEDAGToDAGISel::addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI,
48 MachineFunction &MF) {
49 MachineInstrBuilder MIB(MF, &MI);
50 unsigned Mask = MI.getOperand(1).getImm();
51 unsigned Flag =
52 IsDef ? RegState::ImplicitDefine : RegState::Implicit | RegState::Undef;
53
54 if (Mask & 1)
55 MIB.addReg(Mips::DSPPos, Flag);
56
57 if (Mask & 2)
58 MIB.addReg(Mips::DSPSCount, Flag);
59
60 if (Mask & 4)
61 MIB.addReg(Mips::DSPCarry, Flag);
62
63 if (Mask & 8)
64 MIB.addReg(Mips::DSPOutFlag, Flag);
65
66 if (Mask & 16)
67 MIB.addReg(Mips::DSPCCond, Flag);
68
69 if (Mask & 32)
70 MIB.addReg(Mips::DSPEFI, Flag);
71 }
72
getMSACtrlReg(const SDValue RegIdx) const73 MCRegister MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
74 uint64_t RegNum = RegIdx->getAsZExtVal();
75 return Mips::MSACtrlRegClass.getRegister(RegNum);
76 }
77
replaceUsesWithZeroReg(MachineRegisterInfo * MRI,const MachineInstr & MI)78 bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
79 const MachineInstr& MI) {
80 unsigned DstReg = 0, ZeroReg = 0;
81
82 // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
83 if ((MI.getOpcode() == Mips::ADDiu) &&
84 (MI.getOperand(1).getReg() == Mips::ZERO) &&
85 (MI.getOperand(2).isImm()) &&
86 (MI.getOperand(2).getImm() == 0)) {
87 DstReg = MI.getOperand(0).getReg();
88 ZeroReg = Mips::ZERO;
89 } else if ((MI.getOpcode() == Mips::DADDiu) &&
90 (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
91 (MI.getOperand(2).isImm()) &&
92 (MI.getOperand(2).getImm() == 0)) {
93 DstReg = MI.getOperand(0).getReg();
94 ZeroReg = Mips::ZERO_64;
95 }
96
97 if (!DstReg)
98 return false;
99
100 // Replace uses with ZeroReg.
101 for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
102 E = MRI->use_end(); U != E;) {
103 MachineOperand &MO = *U;
104 unsigned OpNo = U.getOperandNo();
105 MachineInstr *MI = MO.getParent();
106 ++U;
107
108 // Do not replace if it is a phi's operand or is tied to def operand.
109 if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
110 continue;
111
112 // Also, we have to check that the register class of the operand
113 // contains the zero register.
114 if (!MRI->getRegClass(MO.getReg())->contains(ZeroReg))
115 continue;
116
117 MO.setReg(ZeroReg);
118 }
119
120 return true;
121 }
122
emitMCountABI(MachineInstr & MI,MachineBasicBlock & MBB,MachineFunction & MF)123 void MipsSEDAGToDAGISel::emitMCountABI(MachineInstr &MI, MachineBasicBlock &MBB,
124 MachineFunction &MF) {
125 MachineInstrBuilder MIB(MF, &MI);
126 if (!Subtarget->isABI_O32()) { // N32, N64
127 // Save current return address.
128 BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(Mips::OR64))
129 .addDef(Mips::AT_64)
130 .addUse(Mips::RA_64, RegState::Undef)
131 .addUse(Mips::ZERO_64);
132 // Stops instruction above from being removed later on.
133 MIB.addUse(Mips::AT_64, RegState::Implicit);
134 } else { // O32
135 // Save current return address.
136 BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(Mips::OR))
137 .addDef(Mips::AT)
138 .addUse(Mips::RA, RegState::Undef)
139 .addUse(Mips::ZERO);
140 // _mcount pops 2 words from stack.
141 BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(Mips::ADDiu))
142 .addDef(Mips::SP)
143 .addUse(Mips::SP)
144 .addImm(-8);
145 // Stops first instruction above from being removed later on.
146 MIB.addUse(Mips::AT, RegState::Implicit);
147 }
148 }
149
processFunctionAfterISel(MachineFunction & MF)150 void MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
151 MF.getInfo<MipsFunctionInfo>()->initGlobalBaseReg(MF);
152
153 MachineRegisterInfo *MRI = &MF.getRegInfo();
154
155 for (auto &MBB: MF) {
156 for (auto &MI: MBB) {
157 switch (MI.getOpcode()) {
158 case Mips::RDDSP:
159 addDSPCtrlRegOperands(false, MI, MF);
160 break;
161 case Mips::WRDSP:
162 addDSPCtrlRegOperands(true, MI, MF);
163 break;
164 case Mips::BuildPairF64_64:
165 case Mips::ExtractElementF64_64:
166 if (!Subtarget->useOddSPReg()) {
167 MI.addOperand(MachineOperand::CreateReg(Mips::SP, false, true));
168 break;
169 }
170 [[fallthrough]];
171 case Mips::BuildPairF64:
172 case Mips::ExtractElementF64:
173 if (Subtarget->isABI_FPXX() && !Subtarget->hasMTHC1())
174 MI.addOperand(MachineOperand::CreateReg(Mips::SP, false, true));
175 break;
176 case Mips::JAL:
177 case Mips::JAL_MM:
178 if (MI.getOperand(0).isGlobal() &&
179 MI.getOperand(0).getGlobal()->hasExternalLinkage() &&
180 MI.getOperand(0).getGlobal()->getName() == "_mcount")
181 emitMCountABI(MI, MBB, MF);
182 break;
183 case Mips::JALRPseudo:
184 case Mips::JALR64Pseudo:
185 case Mips::JALR16_MM:
186 if (MI.getOperand(2).isMCSymbol() &&
187 MI.getOperand(2).getMCSymbol()->getName() == "_mcount")
188 emitMCountABI(MI, MBB, MF);
189 break;
190 case Mips::JALR:
191 if (MI.getOperand(3).isMCSymbol() &&
192 MI.getOperand(3).getMCSymbol()->getName() == "_mcount")
193 emitMCountABI(MI, MBB, MF);
194 break;
195 default:
196 replaceUsesWithZeroReg(MRI, MI);
197 }
198 }
199 }
200 }
201
selectAddE(SDNode * Node,const SDLoc & DL) const202 void MipsSEDAGToDAGISel::selectAddE(SDNode *Node, const SDLoc &DL) const {
203 SDValue InGlue = Node->getOperand(2);
204 unsigned Opc = InGlue.getOpcode();
205 SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
206 EVT VT = LHS.getValueType();
207
208 // In the base case, we can rely on the carry bit from the addsc
209 // instruction.
210 if (Opc == ISD::ADDC) {
211 SDValue Ops[3] = {LHS, RHS, InGlue};
212 CurDAG->SelectNodeTo(Node, Mips::ADDWC, VT, MVT::Glue, Ops);
213 return;
214 }
215
216 assert(Opc == ISD::ADDE && "ISD::ADDE not in a chain of ADDE nodes!");
217
218 // The more complex case is when there is a chain of ISD::ADDE nodes like:
219 // (adde (adde (adde (addc a b) c) d) e).
220 //
221 // The addwc instruction does not write to the carry bit, instead it writes
222 // to bit 20 of the dsp control register. To match this series of nodes, each
223 // intermediate adde node must be expanded to write the carry bit before the
224 // addition.
225
226 // Start by reading the overflow field for addsc and moving the value to the
227 // carry field. The usage of 1 here with MipsISD::RDDSP / Mips::WRDSP
228 // corresponds to reading/writing the entire control register to/from a GPR.
229
230 SDValue CstOne = CurDAG->getTargetConstant(1, DL, MVT::i32);
231
232 SDValue OuFlag = CurDAG->getTargetConstant(20, DL, MVT::i32);
233
234 SDNode *DSPCtrlField = CurDAG->getMachineNode(Mips::RDDSP, DL, MVT::i32,
235 MVT::Glue, CstOne, InGlue);
236
237 SDNode *Carry = CurDAG->getMachineNode(
238 Mips::EXT, DL, MVT::i32, SDValue(DSPCtrlField, 0), OuFlag, CstOne);
239
240 SDValue Ops[4] = {SDValue(DSPCtrlField, 0),
241 CurDAG->getTargetConstant(6, DL, MVT::i32), CstOne,
242 SDValue(Carry, 0)};
243 SDNode *DSPCFWithCarry = CurDAG->getMachineNode(Mips::INS, DL, MVT::i32, Ops);
244
245 // My reading of the MIPS DSP 3.01 specification isn't as clear as I
246 // would like about whether bit 20 always gets overwritten by addwc.
247 // Hence take an extremely conservative view and presume it's sticky. We
248 // therefore need to clear it.
249
250 SDValue Zero = CurDAG->getRegister(Mips::ZERO, MVT::i32);
251
252 SDValue InsOps[4] = {Zero, OuFlag, CstOne, SDValue(DSPCFWithCarry, 0)};
253 SDNode *DSPCtrlFinal =
254 CurDAG->getMachineNode(Mips::INS, DL, MVT::i32, InsOps);
255
256 SDNode *WrDSP = CurDAG->getMachineNode(Mips::WRDSP, DL, MVT::Glue,
257 SDValue(DSPCtrlFinal, 0), CstOne);
258
259 SDValue Operands[3] = {LHS, RHS, SDValue(WrDSP, 0)};
260 CurDAG->SelectNodeTo(Node, Mips::ADDWC, VT, MVT::Glue, Operands);
261 }
262
263 /// Match frameindex
selectAddrFrameIndex(SDValue Addr,SDValue & Base,SDValue & Offset) const264 bool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
265 SDValue &Offset) const {
266 if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
267 EVT ValTy = Addr.getValueType();
268
269 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
270 Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), ValTy);
271 return true;
272 }
273 return false;
274 }
275
276 /// Match frameindex+offset and frameindex|offset
selectAddrFrameIndexOffset(SDValue Addr,SDValue & Base,SDValue & Offset,unsigned OffsetBits,unsigned ShiftAmount=0) const277 bool MipsSEDAGToDAGISel::selectAddrFrameIndexOffset(
278 SDValue Addr, SDValue &Base, SDValue &Offset, unsigned OffsetBits,
279 unsigned ShiftAmount = 0) const {
280 if (CurDAG->isBaseWithConstantOffset(Addr)) {
281 auto *CN = cast<ConstantSDNode>(Addr.getOperand(1));
282 if (isIntN(OffsetBits + ShiftAmount, CN->getSExtValue())) {
283 EVT ValTy = Addr.getValueType();
284
285 // If the first operand is a FI, get the TargetFI Node
286 if (FrameIndexSDNode *FIN =
287 dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
288 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
289 else {
290 Base = Addr.getOperand(0);
291 // If base is a FI, additional offset calculation is done in
292 // eliminateFrameIndex, otherwise we need to check the alignment
293 const Align Alignment(1ULL << ShiftAmount);
294 if (!isAligned(Alignment, CN->getZExtValue()))
295 return false;
296 }
297
298 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr),
299 ValTy);
300 return true;
301 }
302 }
303 return false;
304 }
305
306 /// ComplexPattern used on MipsInstrInfo
307 /// Used on Mips Load/Store instructions
selectAddrRegImm(SDValue Addr,SDValue & Base,SDValue & Offset) const308 bool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
309 SDValue &Offset) const {
310 // if Address is FI, get the TargetFrameIndex.
311 if (selectAddrFrameIndex(Addr, Base, Offset))
312 return true;
313
314 // on PIC code Load GA
315 if (Addr.getOpcode() == MipsISD::Wrapper) {
316 Base = Addr.getOperand(0);
317 Offset = Addr.getOperand(1);
318 return true;
319 }
320
321 if (!TM.isPositionIndependent()) {
322 if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
323 Addr.getOpcode() == ISD::TargetGlobalAddress))
324 return false;
325 }
326
327 // Addresses of the form FI+const or FI|const
328 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
329 return true;
330
331 // Operand is a result from an ADD.
332 if (Addr.getOpcode() == ISD::ADD) {
333 // When loading from constant pools, load the lower address part in
334 // the instruction itself. Example, instead of:
335 // lui $2, %hi($CPI1_0)
336 // addiu $2, $2, %lo($CPI1_0)
337 // lwc1 $f0, 0($2)
338 // Generate:
339 // lui $2, %hi($CPI1_0)
340 // lwc1 $f0, %lo($CPI1_0)($2)
341 if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
342 Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
343 SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
344 if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
345 isa<JumpTableSDNode>(Opnd0)) {
346 Base = Addr.getOperand(0);
347 Offset = Opnd0;
348 return true;
349 }
350 }
351 }
352
353 return false;
354 }
355
356 /// ComplexPattern used on MipsInstrInfo
357 /// Used on Mips Load/Store instructions
selectAddrDefault(SDValue Addr,SDValue & Base,SDValue & Offset) const358 bool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
359 SDValue &Offset) const {
360 Base = Addr;
361 Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), Addr.getValueType());
362 return true;
363 }
364
selectIntAddr(SDValue Addr,SDValue & Base,SDValue & Offset) const365 bool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
366 SDValue &Offset) const {
367 return selectAddrRegImm(Addr, Base, Offset) ||
368 selectAddrDefault(Addr, Base, Offset);
369 }
370
selectAddrRegImm9(SDValue Addr,SDValue & Base,SDValue & Offset) const371 bool MipsSEDAGToDAGISel::selectAddrRegImm9(SDValue Addr, SDValue &Base,
372 SDValue &Offset) const {
373 if (selectAddrFrameIndex(Addr, Base, Offset))
374 return true;
375
376 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 9))
377 return true;
378
379 return false;
380 }
381
382 /// Used on microMIPS LWC2, LDC2, SWC2 and SDC2 instructions (11-bit offset)
selectAddrRegImm11(SDValue Addr,SDValue & Base,SDValue & Offset) const383 bool MipsSEDAGToDAGISel::selectAddrRegImm11(SDValue Addr, SDValue &Base,
384 SDValue &Offset) const {
385 if (selectAddrFrameIndex(Addr, Base, Offset))
386 return true;
387
388 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 11))
389 return true;
390
391 return false;
392 }
393
394 /// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
selectAddrRegImm12(SDValue Addr,SDValue & Base,SDValue & Offset) const395 bool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
396 SDValue &Offset) const {
397 if (selectAddrFrameIndex(Addr, Base, Offset))
398 return true;
399
400 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 12))
401 return true;
402
403 return false;
404 }
405
selectAddrRegImm16(SDValue Addr,SDValue & Base,SDValue & Offset) const406 bool MipsSEDAGToDAGISel::selectAddrRegImm16(SDValue Addr, SDValue &Base,
407 SDValue &Offset) const {
408 if (selectAddrFrameIndex(Addr, Base, Offset))
409 return true;
410
411 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
412 return true;
413
414 return false;
415 }
416
selectIntAddr11MM(SDValue Addr,SDValue & Base,SDValue & Offset) const417 bool MipsSEDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
418 SDValue &Offset) const {
419 return selectAddrRegImm11(Addr, Base, Offset) ||
420 selectAddrDefault(Addr, Base, Offset);
421 }
422
selectIntAddr12MM(SDValue Addr,SDValue & Base,SDValue & Offset) const423 bool MipsSEDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
424 SDValue &Offset) const {
425 return selectAddrRegImm12(Addr, Base, Offset) ||
426 selectAddrDefault(Addr, Base, Offset);
427 }
428
selectIntAddr16MM(SDValue Addr,SDValue & Base,SDValue & Offset) const429 bool MipsSEDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
430 SDValue &Offset) const {
431 return selectAddrRegImm16(Addr, Base, Offset) ||
432 selectAddrDefault(Addr, Base, Offset);
433 }
434
selectIntAddrLSL2MM(SDValue Addr,SDValue & Base,SDValue & Offset) const435 bool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
436 SDValue &Offset) const {
437 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 7)) {
438 if (isa<FrameIndexSDNode>(Base))
439 return false;
440
441 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Offset)) {
442 unsigned CnstOff = CN->getZExtValue();
443 return (CnstOff == (CnstOff & 0x3c));
444 }
445
446 return false;
447 }
448
449 // For all other cases where "lw" would be selected, don't select "lw16"
450 // because it would result in additional instructions to prepare operands.
451 if (selectAddrRegImm(Addr, Base, Offset))
452 return false;
453
454 return selectAddrDefault(Addr, Base, Offset);
455 }
456
selectIntAddrSImm10(SDValue Addr,SDValue & Base,SDValue & Offset) const457 bool MipsSEDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
458 SDValue &Offset) const {
459
460 if (selectAddrFrameIndex(Addr, Base, Offset))
461 return true;
462
463 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10))
464 return true;
465
466 return selectAddrDefault(Addr, Base, Offset);
467 }
468
selectIntAddrSImm10Lsl1(SDValue Addr,SDValue & Base,SDValue & Offset) const469 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
470 SDValue &Offset) const {
471 if (selectAddrFrameIndex(Addr, Base, Offset))
472 return true;
473
474 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 1))
475 return true;
476
477 return selectAddrDefault(Addr, Base, Offset);
478 }
479
selectIntAddrSImm10Lsl2(SDValue Addr,SDValue & Base,SDValue & Offset) const480 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
481 SDValue &Offset) const {
482 if (selectAddrFrameIndex(Addr, Base, Offset))
483 return true;
484
485 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 2))
486 return true;
487
488 return selectAddrDefault(Addr, Base, Offset);
489 }
490
selectIntAddrSImm10Lsl3(SDValue Addr,SDValue & Base,SDValue & Offset) const491 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
492 SDValue &Offset) const {
493 if (selectAddrFrameIndex(Addr, Base, Offset))
494 return true;
495
496 if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 3))
497 return true;
498
499 return selectAddrDefault(Addr, Base, Offset);
500 }
501
502 // Select constant vector splats.
503 //
504 // Returns true and sets Imm if:
505 // * MSA is enabled
506 // * N is a ISD::BUILD_VECTOR representing a constant splat
selectVSplat(SDNode * N,APInt & Imm,unsigned MinSizeInBits) const507 bool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm,
508 unsigned MinSizeInBits) const {
509 if (!Subtarget->hasMSA())
510 return false;
511
512 BuildVectorSDNode *Node = dyn_cast<BuildVectorSDNode>(N);
513
514 if (!Node)
515 return false;
516
517 APInt SplatValue, SplatUndef;
518 unsigned SplatBitSize;
519 bool HasAnyUndefs;
520
521 if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
522 MinSizeInBits, !Subtarget->isLittle()))
523 return false;
524
525 Imm = SplatValue;
526
527 return true;
528 }
529
530 // Select constant vector splats.
531 //
532 // In addition to the requirements of selectVSplat(), this function returns
533 // true and sets Imm if:
534 // * The splat value is the same width as the elements of the vector
535 // * The splat value fits in an integer with the specified signed-ness and
536 // width.
537 //
538 // This function looks through ISD::BITCAST nodes.
539 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
540 // sometimes a shuffle in big-endian mode.
541 //
542 // It's worth noting that this function is not used as part of the selection
543 // of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
544 // instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
545 // MipsSEDAGToDAGISel::selectNode.
546 bool MipsSEDAGToDAGISel::
selectVSplatCommon(SDValue N,SDValue & Imm,bool Signed,unsigned ImmBitSize) const547 selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
548 unsigned ImmBitSize) const {
549 APInt ImmValue;
550 EVT EltTy = N->getValueType(0).getVectorElementType();
551
552 if (N->getOpcode() == ISD::BITCAST)
553 N = N->getOperand(0);
554
555 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
556 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
557
558 if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
559 (!Signed && ImmValue.isIntN(ImmBitSize))) {
560 Imm = CurDAG->getTargetConstant(ImmValue, SDLoc(N), EltTy);
561 return true;
562 }
563 }
564
565 return false;
566 }
567
568 // Select constant vector splats whose value is a power of 2.
569 //
570 // In addition to the requirements of selectVSplat(), this function returns
571 // true and sets Imm if:
572 // * The splat value is the same width as the elements of the vector
573 // * The splat value is a power of two.
574 //
575 // This function looks through ISD::BITCAST nodes.
576 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
577 // sometimes a shuffle in big-endian mode.
selectVSplatUimmPow2(SDValue N,SDValue & Imm) const578 bool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
579 APInt ImmValue;
580 EVT EltTy = N->getValueType(0).getVectorElementType();
581
582 if (N->getOpcode() == ISD::BITCAST)
583 N = N->getOperand(0);
584
585 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
586 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
587 int32_t Log2 = ImmValue.exactLogBase2();
588
589 if (Log2 != -1) {
590 Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
591 return true;
592 }
593 }
594
595 return false;
596 }
597
598 // Select constant vector splats whose value only has a consecutive sequence
599 // of left-most bits set (e.g. 0b11...1100...00).
600 //
601 // In addition to the requirements of selectVSplat(), this function returns
602 // true and sets Imm if:
603 // * The splat value is the same width as the elements of the vector
604 // * The splat value is a consecutive sequence of left-most bits.
605 //
606 // This function looks through ISD::BITCAST nodes.
607 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
608 // sometimes a shuffle in big-endian mode.
selectVSplatMaskL(SDValue N,SDValue & Imm) const609 bool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
610 APInt ImmValue;
611 EVT EltTy = N->getValueType(0).getVectorElementType();
612
613 if (N->getOpcode() == ISD::BITCAST)
614 N = N->getOperand(0);
615
616 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
617 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
618 // Check if we have a leading one, then check if the whole value is a
619 // shifted mask.
620 if (ImmValue.isNegative() && ImmValue.isShiftedMask()) {
621 Imm = CurDAG->getTargetConstant(ImmValue.popcount() - 1, SDLoc(N), EltTy);
622 return true;
623 }
624 }
625
626 return false;
627 }
628
629 // Select constant vector splats whose value only has a consecutive sequence
630 // of right-most bits set (e.g. 0b00...0011...11).
631 //
632 // In addition to the requirements of selectVSplat(), this function returns
633 // true and sets Imm if:
634 // * The splat value is the same width as the elements of the vector
635 // * The splat value is a consecutive sequence of right-most bits.
636 //
637 // This function looks through ISD::BITCAST nodes.
638 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
639 // sometimes a shuffle in big-endian mode.
selectVSplatMaskR(SDValue N,SDValue & Imm) const640 bool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
641 APInt ImmValue;
642 EVT EltTy = N->getValueType(0).getVectorElementType();
643
644 if (N->getOpcode() == ISD::BITCAST)
645 N = N->getOperand(0);
646
647 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
648 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
649 if (ImmValue.isMask()) {
650 Imm = CurDAG->getTargetConstant(ImmValue.popcount() - 1, SDLoc(N), EltTy);
651 return true;
652 }
653 }
654
655 return false;
656 }
657
selectVSplatUimmInvPow2(SDValue N,SDValue & Imm) const658 bool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
659 SDValue &Imm) const {
660 APInt ImmValue;
661 EVT EltTy = N->getValueType(0).getVectorElementType();
662
663 if (N->getOpcode() == ISD::BITCAST)
664 N = N->getOperand(0);
665
666 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
667 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
668 int32_t Log2 = (~ImmValue).exactLogBase2();
669
670 if (Log2 != -1) {
671 Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
672 return true;
673 }
674 }
675
676 return false;
677 }
678
679 // Select const vector splat of 1.
selectVSplatImmEq1(SDValue N) const680 bool MipsSEDAGToDAGISel::selectVSplatImmEq1(SDValue N) const {
681 APInt ImmValue;
682 EVT EltTy = N->getValueType(0).getVectorElementType();
683
684 if (N->getOpcode() == ISD::BITCAST)
685 N = N->getOperand(0);
686
687 return selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
688 ImmValue.getBitWidth() == EltTy.getSizeInBits() && ImmValue == 1;
689 }
690
trySelect(SDNode * Node)691 bool MipsSEDAGToDAGISel::trySelect(SDNode *Node) {
692 unsigned Opcode = Node->getOpcode();
693 SDLoc DL(Node);
694
695 ///
696 // Instruction Selection not handled by the auto-generated
697 // tablegen selection should be handled here.
698 ///
699 switch(Opcode) {
700 default: break;
701
702 case MipsISD::DOUBLE_SELECT_I:
703 case MipsISD::DOUBLE_SELECT_I64: {
704 MVT VT = Subtarget->isGP64bit() ? MVT::i64 : MVT::i32;
705 SDValue cond = Node->getOperand(0);
706 SDValue Hi1 = Node->getOperand(1);
707 SDValue Lo1 = Node->getOperand(2);
708 SDValue Hi2 = Node->getOperand(3);
709 SDValue Lo2 = Node->getOperand(4);
710
711 SDValue ops[] = {cond, Hi1, Lo1, Hi2, Lo2};
712 EVT NodeTys[] = {VT, VT};
713 ReplaceNode(Node, CurDAG->getMachineNode(Subtarget->isGP64bit()
714 ? Mips::PseudoD_SELECT_I64
715 : Mips::PseudoD_SELECT_I,
716 DL, NodeTys, ops));
717 return true;
718 }
719
720 case ISD::ADDE: {
721 selectAddE(Node, DL);
722 return true;
723 }
724
725 case ISD::ConstantFP: {
726 auto *CN = cast<ConstantFPSDNode>(Node);
727 if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
728 if (Subtarget->isGP64bit()) {
729 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
730 Mips::ZERO_64, MVT::i64);
731 ReplaceNode(Node,
732 CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero));
733 } else if (Subtarget->isFP64bit()) {
734 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
735 Mips::ZERO, MVT::i32);
736 ReplaceNode(Node, CurDAG->getMachineNode(Mips::BuildPairF64_64, DL,
737 MVT::f64, Zero, Zero));
738 } else {
739 SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
740 Mips::ZERO, MVT::i32);
741 ReplaceNode(Node, CurDAG->getMachineNode(Mips::BuildPairF64, DL,
742 MVT::f64, Zero, Zero));
743 }
744 return true;
745 }
746 break;
747 }
748
749 case ISD::Constant: {
750 auto *CN = cast<ConstantSDNode>(Node);
751 int64_t Imm = CN->getSExtValue();
752 unsigned Size = CN->getValueSizeInBits(0);
753
754 if (isInt<32>(Imm))
755 break;
756
757 MipsAnalyzeImmediate AnalyzeImm;
758
759 const MipsAnalyzeImmediate::InstSeq &Seq =
760 AnalyzeImm.Analyze(Imm, Size, false);
761
762 MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
763 SDLoc DL(CN);
764 SDNode *RegOpnd;
765 SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
766 DL, MVT::i64);
767
768 // The first instruction can be a LUi which is different from other
769 // instructions (ADDiu, ORI and SLL) in that it does not have a register
770 // operand.
771 if (Inst->Opc == Mips::LUi64)
772 RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
773 else
774 RegOpnd =
775 CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
776 CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
777 ImmOpnd);
778
779 // The remaining instructions in the sequence are handled here.
780 for (++Inst; Inst != Seq.end(); ++Inst) {
781 ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), DL,
782 MVT::i64);
783 RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
784 SDValue(RegOpnd, 0), ImmOpnd);
785 }
786
787 ReplaceNode(Node, RegOpnd);
788 return true;
789 }
790
791 case ISD::INTRINSIC_W_CHAIN: {
792 const unsigned IntrinsicOpcode = Node->getConstantOperandVal(1);
793 switch (IntrinsicOpcode) {
794 default:
795 break;
796
797 case Intrinsic::mips_cfcmsa: {
798 SDValue ChainIn = Node->getOperand(0);
799 SDValue RegIdx = Node->getOperand(2);
800 SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
801 getMSACtrlReg(RegIdx), MVT::i32);
802 ReplaceNode(Node, Reg.getNode());
803 return true;
804 }
805 case Intrinsic::mips_ldr_d:
806 case Intrinsic::mips_ldr_w: {
807 unsigned Op = (IntrinsicOpcode == Intrinsic::mips_ldr_d) ? Mips::LDR_D
808 : Mips::LDR_W;
809
810 SDLoc DL(Node);
811 assert(Node->getNumOperands() == 4 && "Unexpected number of operands.");
812 const SDValue &Chain = Node->getOperand(0);
813 const SDValue &Intrinsic = Node->getOperand(1);
814 const SDValue &Pointer = Node->getOperand(2);
815 const SDValue &Constant = Node->getOperand(3);
816
817 assert(Chain.getValueType() == MVT::Other);
818 (void)Intrinsic;
819 assert(Intrinsic.getOpcode() == ISD::TargetConstant &&
820 Constant.getOpcode() == ISD::Constant &&
821 "Invalid instruction operand.");
822
823 // Convert Constant to TargetConstant.
824 const ConstantInt *Val =
825 cast<ConstantSDNode>(Constant)->getConstantIntValue();
826 SDValue Imm =
827 CurDAG->getTargetConstant(*Val, DL, Constant.getValueType());
828
829 SmallVector<SDValue, 3> Ops{Pointer, Imm, Chain};
830
831 assert(Node->getNumValues() == 2);
832 assert(Node->getValueType(0).is128BitVector());
833 assert(Node->getValueType(1) == MVT::Other);
834 SmallVector<EVT, 2> ResTys{Node->getValueType(0), Node->getValueType(1)};
835
836 ReplaceNode(Node, CurDAG->getMachineNode(Op, DL, ResTys, Ops));
837
838 return true;
839 }
840 }
841 break;
842 }
843
844 case ISD::INTRINSIC_WO_CHAIN: {
845 switch (Node->getConstantOperandVal(0)) {
846 default:
847 break;
848
849 case Intrinsic::mips_move_v:
850 // Like an assignment but will always produce a move.v even if
851 // unnecessary.
852 ReplaceNode(Node, CurDAG->getMachineNode(Mips::MOVE_V, DL,
853 Node->getValueType(0),
854 Node->getOperand(1)));
855 return true;
856 }
857 break;
858 }
859
860 case ISD::INTRINSIC_VOID: {
861 const unsigned IntrinsicOpcode = Node->getConstantOperandVal(1);
862 switch (IntrinsicOpcode) {
863 default:
864 break;
865
866 case Intrinsic::mips_ctcmsa: {
867 SDValue ChainIn = Node->getOperand(0);
868 SDValue RegIdx = Node->getOperand(2);
869 SDValue Value = Node->getOperand(3);
870 SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
871 getMSACtrlReg(RegIdx), Value);
872 ReplaceNode(Node, ChainOut.getNode());
873 return true;
874 }
875 case Intrinsic::mips_str_d:
876 case Intrinsic::mips_str_w: {
877 unsigned Op = (IntrinsicOpcode == Intrinsic::mips_str_d) ? Mips::STR_D
878 : Mips::STR_W;
879
880 SDLoc DL(Node);
881 assert(Node->getNumOperands() == 5 && "Unexpected number of operands.");
882 const SDValue &Chain = Node->getOperand(0);
883 const SDValue &Intrinsic = Node->getOperand(1);
884 const SDValue &Vec = Node->getOperand(2);
885 const SDValue &Pointer = Node->getOperand(3);
886 const SDValue &Constant = Node->getOperand(4);
887
888 assert(Chain.getValueType() == MVT::Other);
889 (void)Intrinsic;
890 assert(Intrinsic.getOpcode() == ISD::TargetConstant &&
891 Constant.getOpcode() == ISD::Constant &&
892 "Invalid instruction operand.");
893
894 // Convert Constant to TargetConstant.
895 const ConstantInt *Val =
896 cast<ConstantSDNode>(Constant)->getConstantIntValue();
897 SDValue Imm =
898 CurDAG->getTargetConstant(*Val, DL, Constant.getValueType());
899
900 SmallVector<SDValue, 4> Ops{Vec, Pointer, Imm, Chain};
901
902 assert(Node->getNumValues() == 1);
903 assert(Node->getValueType(0) == MVT::Other);
904 SmallVector<EVT, 1> ResTys{Node->getValueType(0)};
905
906 ReplaceNode(Node, CurDAG->getMachineNode(Op, DL, ResTys, Ops));
907 return true;
908 }
909 }
910 break;
911 }
912
913 case MipsISD::FAbs: {
914 MVT ResTy = Node->getSimpleValueType(0);
915 assert((ResTy == MVT::f64 || ResTy == MVT::f32) &&
916 "Unsupported float type!");
917 unsigned Opc = 0;
918 if (ResTy == MVT::f64)
919 Opc = (Subtarget->isFP64bit() ? Mips::FABS_D64 : Mips::FABS_D32);
920 else
921 Opc = Mips::FABS_S;
922
923 if (Subtarget->inMicroMipsMode()) {
924 switch (Opc) {
925 case Mips::FABS_D64:
926 Opc = Mips::FABS_D64_MM;
927 break;
928 case Mips::FABS_D32:
929 Opc = Mips::FABS_D32_MM;
930 break;
931 case Mips::FABS_S:
932 Opc = Mips::FABS_S_MM;
933 break;
934 default:
935 llvm_unreachable("Unknown opcode for MIPS floating point abs!");
936 }
937 }
938
939 ReplaceNode(Node,
940 CurDAG->getMachineNode(Opc, DL, ResTy, Node->getOperand(0)));
941
942 return true;
943 }
944
945 // Manually match MipsISD::Ins nodes to get the correct instruction. It has
946 // to be done in this fashion so that we respect the differences between
947 // dins and dinsm, as the difference is that the size operand has the range
948 // 0 < size <= 32 for dins while dinsm has the range 2 <= size <= 64 which
949 // means SelectionDAGISel would have to test all the operands at once to
950 // match the instruction.
951 case MipsISD::Ins: {
952
953 // Validating the node operands.
954 if (Node->getValueType(0) != MVT::i32 && Node->getValueType(0) != MVT::i64)
955 return false;
956
957 if (Node->getNumOperands() != 4)
958 return false;
959
960 if (Node->getOperand(1)->getOpcode() != ISD::Constant ||
961 Node->getOperand(2)->getOpcode() != ISD::Constant)
962 return false;
963
964 MVT ResTy = Node->getSimpleValueType(0);
965 uint64_t Pos = Node->getConstantOperandVal(1);
966 uint64_t Size = Node->getConstantOperandVal(2);
967
968 // Size has to be >0 for 'ins', 'dins' and 'dinsu'.
969 if (!Size)
970 return false;
971
972 if (Pos + Size > 64)
973 return false;
974
975 if (ResTy != MVT::i32 && ResTy != MVT::i64)
976 return false;
977
978 unsigned Opcode = 0;
979 if (ResTy == MVT::i32) {
980 if (Pos + Size <= 32)
981 Opcode = Mips::INS;
982 } else {
983 if (Pos + Size <= 32)
984 Opcode = Mips::DINS;
985 else if (Pos < 32 && 1 < Size)
986 Opcode = Mips::DINSM;
987 else
988 Opcode = Mips::DINSU;
989 }
990
991 if (Opcode) {
992 SDValue Ops[4] = {
993 Node->getOperand(0), CurDAG->getTargetConstant(Pos, DL, MVT::i32),
994 CurDAG->getTargetConstant(Size, DL, MVT::i32), Node->getOperand(3)};
995
996 ReplaceNode(Node, CurDAG->getMachineNode(Opcode, DL, ResTy, Ops));
997 return true;
998 }
999
1000 return false;
1001 }
1002
1003 case MipsISD::ThreadPointer: {
1004 EVT PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout());
1005 unsigned RdhwrOpc, DestReg;
1006
1007 if (PtrVT == MVT::i32) {
1008 RdhwrOpc = Mips::RDHWR;
1009 DestReg = Mips::V1;
1010 } else {
1011 RdhwrOpc = Mips::RDHWR64;
1012 DestReg = Mips::V1_64;
1013 }
1014
1015 SDNode *Rdhwr =
1016 CurDAG->getMachineNode(RdhwrOpc, DL, Node->getValueType(0), MVT::Glue,
1017 CurDAG->getRegister(Mips::HWR29, MVT::i32),
1018 CurDAG->getTargetConstant(0, DL, MVT::i32));
1019 SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
1020 SDValue(Rdhwr, 0), SDValue(Rdhwr, 1));
1021 SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT,
1022 Chain.getValue(1));
1023 ReplaceNode(Node, ResNode.getNode());
1024 return true;
1025 }
1026
1027 case ISD::BUILD_VECTOR: {
1028 // Select appropriate ldi.[bhwd] instructions for constant splats of
1029 // 128-bit when MSA is enabled. Fixup any register class mismatches that
1030 // occur as a result.
1031 //
1032 // This allows the compiler to use a wider range of immediates than would
1033 // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
1034 // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
1035 // 0x01010101 } without using a constant pool. This would be sub-optimal
1036 // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
1037 // same set/ of registers. Similarly, ldi.h isn't capable of producing {
1038 // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
1039
1040 const MipsABIInfo &ABI =
1041 static_cast<const MipsTargetMachine &>(TM).getABI();
1042
1043 BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
1044 APInt SplatValue, SplatUndef;
1045 unsigned SplatBitSize;
1046 bool HasAnyUndefs;
1047 unsigned LdiOp;
1048 EVT ResVecTy = BVN->getValueType(0);
1049 EVT ViaVecTy;
1050
1051 if (!Subtarget->hasMSA() || !BVN->getValueType(0).is128BitVector())
1052 return false;
1053
1054 if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
1055 HasAnyUndefs, 8,
1056 !Subtarget->isLittle()))
1057 return false;
1058
1059 switch (SplatBitSize) {
1060 default:
1061 return false;
1062 case 8:
1063 LdiOp = Mips::LDI_B;
1064 ViaVecTy = MVT::v16i8;
1065 break;
1066 case 16:
1067 LdiOp = Mips::LDI_H;
1068 ViaVecTy = MVT::v8i16;
1069 break;
1070 case 32:
1071 LdiOp = Mips::LDI_W;
1072 ViaVecTy = MVT::v4i32;
1073 break;
1074 case 64:
1075 LdiOp = Mips::LDI_D;
1076 ViaVecTy = MVT::v2i64;
1077 break;
1078 }
1079
1080 SDNode *Res = nullptr;
1081
1082 // If we have a signed 10 bit integer, we can splat it directly.
1083 //
1084 // If we have something bigger we can synthesize the value into a GPR and
1085 // splat from there.
1086 if (SplatValue.isSignedIntN(10)) {
1087 SDValue Imm = CurDAG->getTargetConstant(SplatValue, DL,
1088 ViaVecTy.getVectorElementType());
1089
1090 Res = CurDAG->getMachineNode(LdiOp, DL, ViaVecTy, Imm);
1091 } else if (SplatValue.isSignedIntN(16) &&
1092 ((ABI.IsO32() && SplatBitSize < 64) ||
1093 (ABI.IsN32() || ABI.IsN64()))) {
1094 // Only handle signed 16 bit values when the element size is GPR width.
1095 // MIPS64 can handle all the cases but MIPS32 would need to handle
1096 // negative cases specifically here. Instead, handle those cases as
1097 // 64bit values.
1098
1099 bool Is32BitSplat = ABI.IsO32() || SplatBitSize < 64;
1100 const unsigned ADDiuOp = Is32BitSplat ? Mips::ADDiu : Mips::DADDiu;
1101 const MVT SplatMVT = Is32BitSplat ? MVT::i32 : MVT::i64;
1102 SDValue ZeroVal = CurDAG->getRegister(
1103 Is32BitSplat ? Mips::ZERO : Mips::ZERO_64, SplatMVT);
1104
1105 const unsigned FILLOp =
1106 SplatBitSize == 16
1107 ? Mips::FILL_H
1108 : (SplatBitSize == 32 ? Mips::FILL_W
1109 : (SplatBitSize == 64 ? Mips::FILL_D : 0));
1110
1111 assert(FILLOp != 0 && "Unknown FILL Op for splat synthesis!");
1112 assert((!ABI.IsO32() || (FILLOp != Mips::FILL_D)) &&
1113 "Attempting to use fill.d on MIPS32!");
1114
1115 const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1116 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, SplatMVT);
1117
1118 Res = CurDAG->getMachineNode(ADDiuOp, DL, SplatMVT, ZeroVal, LoVal);
1119 Res = CurDAG->getMachineNode(FILLOp, DL, ViaVecTy, SDValue(Res, 0));
1120
1121 } else if (SplatValue.isSignedIntN(32) && SplatBitSize == 32) {
1122 // Only handle the cases where the splat size agrees with the size
1123 // of the SplatValue here.
1124 const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1125 const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1126 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1127
1128 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1129 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1130
1131 if (Hi)
1132 Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1133
1134 if (Lo)
1135 Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1136 Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1137
1138 assert((Hi || Lo) && "Zero case reached 32 bit case splat synthesis!");
1139 Res =
1140 CurDAG->getMachineNode(Mips::FILL_W, DL, MVT::v4i32, SDValue(Res, 0));
1141
1142 } else if (SplatValue.isSignedIntN(32) && SplatBitSize == 64 &&
1143 (ABI.IsN32() || ABI.IsN64())) {
1144 // N32 and N64 can perform some tricks that O32 can't for signed 32 bit
1145 // integers due to having 64bit registers. lui will cause the necessary
1146 // zero/sign extension.
1147 const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1148 const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1149 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1150
1151 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1152 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1153
1154 if (Hi)
1155 Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1156
1157 if (Lo)
1158 Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1159 Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1160
1161 Res = CurDAG->getMachineNode(
1162 Mips::SUBREG_TO_REG, DL, MVT::i64,
1163 CurDAG->getTargetConstant(((Hi >> 15) & 0x1), DL, MVT::i64),
1164 SDValue(Res, 0),
1165 CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1166
1167 Res =
1168 CurDAG->getMachineNode(Mips::FILL_D, DL, MVT::v2i64, SDValue(Res, 0));
1169
1170 } else if (SplatValue.isSignedIntN(64)) {
1171 // If we have a 64 bit Splat value, we perform a similar sequence to the
1172 // above:
1173 //
1174 // MIPS32: MIPS64:
1175 // lui $res, %highest(val) lui $res, %highest(val)
1176 // ori $res, $res, %higher(val) ori $res, $res, %higher(val)
1177 // lui $res2, %hi(val) lui $res2, %hi(val)
1178 // ori $res2, %res2, %lo(val) ori $res2, %res2, %lo(val)
1179 // $res3 = fill $res2 dinsu $res, $res2, 0, 32
1180 // $res4 = insert.w $res3[1], $res fill.d $res
1181 // splat.d $res4, 0
1182 //
1183 // The ability to use dinsu is guaranteed as MSA requires MIPSR5.
1184 // This saves having to materialize the value by shifts and ors.
1185 //
1186 // FIXME: Implement the preferred sequence for MIPS64R6:
1187 //
1188 // MIPS64R6:
1189 // ori $res, $zero, %lo(val)
1190 // daui $res, $res, %hi(val)
1191 // dahi $res, $res, %higher(val)
1192 // dati $res, $res, %highest(cal)
1193 // fill.d $res
1194 //
1195
1196 const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1197 const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1198 const unsigned Higher = SplatValue.lshr(32).getLoBits(16).getZExtValue();
1199 const unsigned Highest = SplatValue.lshr(48).getLoBits(16).getZExtValue();
1200
1201 SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1202 SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1203 SDValue HigherVal = CurDAG->getTargetConstant(Higher, DL, MVT::i32);
1204 SDValue HighestVal = CurDAG->getTargetConstant(Highest, DL, MVT::i32);
1205 SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1206
1207 // Independent of whether we're targeting MIPS64 or not, the basic
1208 // operations are the same. Also, directly use the $zero register if
1209 // the 16 bit chunk is zero.
1210 //
1211 // For optimization purposes we always synthesize the splat value as
1212 // an i32 value, then if we're targetting MIPS64, use SUBREG_TO_REG
1213 // just before combining the values with dinsu to produce an i64. This
1214 // enables SelectionDAG to aggressively share components of splat values
1215 // where possible.
1216 //
1217 // FIXME: This is the general constant synthesis problem. This code
1218 // should be factored out into a class shared between all the
1219 // classes that need it. Specifically, for a splat size of 64
1220 // bits that's a negative number we can do better than LUi/ORi
1221 // for the upper 32bits.
1222
1223 if (Hi)
1224 Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1225
1226 if (Lo)
1227 Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1228 Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1229
1230 SDNode *HiRes;
1231 if (Highest)
1232 HiRes = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HighestVal);
1233
1234 if (Higher)
1235 HiRes = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1236 Highest ? SDValue(HiRes, 0) : ZeroVal,
1237 HigherVal);
1238
1239
1240 if (ABI.IsO32()) {
1241 Res = CurDAG->getMachineNode(Mips::FILL_W, DL, MVT::v4i32,
1242 (Hi || Lo) ? SDValue(Res, 0) : ZeroVal);
1243
1244 Res = CurDAG->getMachineNode(
1245 Mips::INSERT_W, DL, MVT::v4i32, SDValue(Res, 0),
1246 (Highest || Higher) ? SDValue(HiRes, 0) : ZeroVal,
1247 CurDAG->getTargetConstant(1, DL, MVT::i32));
1248
1249 const TargetLowering *TLI = getTargetLowering();
1250 const TargetRegisterClass *RC =
1251 TLI->getRegClassFor(ViaVecTy.getSimpleVT());
1252
1253 Res = CurDAG->getMachineNode(
1254 Mips::COPY_TO_REGCLASS, DL, ViaVecTy, SDValue(Res, 0),
1255 CurDAG->getTargetConstant(RC->getID(), DL, MVT::i32));
1256
1257 Res = CurDAG->getMachineNode(
1258 Mips::SPLATI_D, DL, MVT::v2i64, SDValue(Res, 0),
1259 CurDAG->getTargetConstant(0, DL, MVT::i32));
1260 } else if (ABI.IsN64() || ABI.IsN32()) {
1261
1262 SDValue Zero64Val = CurDAG->getRegister(Mips::ZERO_64, MVT::i64);
1263 const bool HiResNonZero = Highest || Higher;
1264 const bool ResNonZero = Hi || Lo;
1265
1266 if (HiResNonZero)
1267 HiRes = CurDAG->getMachineNode(
1268 Mips::SUBREG_TO_REG, DL, MVT::i64,
1269 CurDAG->getTargetConstant(((Highest >> 15) & 0x1), DL, MVT::i64),
1270 SDValue(HiRes, 0),
1271 CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1272
1273 if (ResNonZero)
1274 Res = CurDAG->getMachineNode(
1275 Mips::SUBREG_TO_REG, DL, MVT::i64,
1276 CurDAG->getTargetConstant(((Hi >> 15) & 0x1), DL, MVT::i64),
1277 SDValue(Res, 0),
1278 CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1279
1280 // We have 3 cases:
1281 // The HiRes is nonzero but Res is $zero => dsll32 HiRes, 0
1282 // The Res is nonzero but HiRes is $zero => dinsu Res, $zero, 32, 32
1283 // Both are non zero => dinsu Res, HiRes, 32, 32
1284 //
1285 // The obvious "missing" case is when both are zero, but that case is
1286 // handled by the ldi case.
1287 if (ResNonZero) {
1288 IntegerType *Int32Ty =
1289 IntegerType::get(MF->getFunction().getContext(), 32);
1290 const ConstantInt *Const32 = ConstantInt::get(Int32Ty, 32);
1291 SDValue Ops[4] = {HiResNonZero ? SDValue(HiRes, 0) : Zero64Val,
1292 CurDAG->getConstant(*Const32, DL, MVT::i32),
1293 CurDAG->getConstant(*Const32, DL, MVT::i32),
1294 SDValue(Res, 0)};
1295
1296 Res = CurDAG->getMachineNode(Mips::DINSU, DL, MVT::i64, Ops);
1297 } else if (HiResNonZero) {
1298 Res = CurDAG->getMachineNode(
1299 Mips::DSLL32, DL, MVT::i64, SDValue(HiRes, 0),
1300 CurDAG->getTargetConstant(0, DL, MVT::i32));
1301 } else
1302 llvm_unreachable(
1303 "Zero splat value handled by non-zero 64bit splat synthesis!");
1304
1305 Res = CurDAG->getMachineNode(Mips::FILL_D, DL, MVT::v2i64,
1306 SDValue(Res, 0));
1307 } else
1308 llvm_unreachable("Unknown ABI in MipsISelDAGToDAG!");
1309
1310 } else
1311 return false;
1312
1313 if (ResVecTy != ViaVecTy) {
1314 // If LdiOp is writing to a different register class to ResVecTy, then
1315 // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
1316 // since the source and destination register sets contain the same
1317 // registers.
1318 const TargetLowering *TLI = getTargetLowering();
1319 MVT ResVecTySimple = ResVecTy.getSimpleVT();
1320 const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
1321 Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, DL,
1322 ResVecTy, SDValue(Res, 0),
1323 CurDAG->getTargetConstant(RC->getID(), DL,
1324 MVT::i32));
1325 }
1326
1327 ReplaceNode(Node, Res);
1328 return true;
1329 }
1330
1331 }
1332
1333 return false;
1334 }
1335
SelectInlineAsmMemoryOperand(const SDValue & Op,InlineAsm::ConstraintCode ConstraintID,std::vector<SDValue> & OutOps)1336 bool MipsSEDAGToDAGISel::SelectInlineAsmMemoryOperand(
1337 const SDValue &Op, InlineAsm::ConstraintCode ConstraintID,
1338 std::vector<SDValue> &OutOps) {
1339 SDValue Base, Offset;
1340
1341 switch(ConstraintID) {
1342 default:
1343 llvm_unreachable("Unexpected asm memory constraint");
1344 // All memory constraints can at least accept raw pointers.
1345 case InlineAsm::ConstraintCode::m:
1346 case InlineAsm::ConstraintCode::o:
1347 if (selectAddrRegImm16(Op, Base, Offset)) {
1348 OutOps.push_back(Base);
1349 OutOps.push_back(Offset);
1350 return false;
1351 }
1352 OutOps.push_back(Op);
1353 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1354 return false;
1355 case InlineAsm::ConstraintCode::R:
1356 // The 'R' constraint is supposed to be much more complicated than this.
1357 // However, it's becoming less useful due to architectural changes and
1358 // ought to be replaced by other constraints such as 'ZC'.
1359 // For now, support 9-bit signed offsets which is supportable by all
1360 // subtargets for all instructions.
1361 if (selectAddrRegImm9(Op, Base, Offset)) {
1362 OutOps.push_back(Base);
1363 OutOps.push_back(Offset);
1364 return false;
1365 }
1366 OutOps.push_back(Op);
1367 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1368 return false;
1369 case InlineAsm::ConstraintCode::ZC:
1370 // ZC matches whatever the pref, ll, and sc instructions can handle for the
1371 // given subtarget.
1372 if (Subtarget->inMicroMipsMode()) {
1373 // On microMIPS, they can handle 12-bit offsets.
1374 if (selectAddrRegImm12(Op, Base, Offset)) {
1375 OutOps.push_back(Base);
1376 OutOps.push_back(Offset);
1377 return false;
1378 }
1379 } else if (Subtarget->hasMips32r6()) {
1380 // On MIPS32r6/MIPS64r6, they can only handle 9-bit offsets.
1381 if (selectAddrRegImm9(Op, Base, Offset)) {
1382 OutOps.push_back(Base);
1383 OutOps.push_back(Offset);
1384 return false;
1385 }
1386 } else if (selectAddrRegImm16(Op, Base, Offset)) {
1387 // Prior to MIPS32r6/MIPS64r6, they can handle 16-bit offsets.
1388 OutOps.push_back(Base);
1389 OutOps.push_back(Offset);
1390 return false;
1391 }
1392 // In all cases, 0-bit offsets are acceptable.
1393 OutOps.push_back(Op);
1394 OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1395 return false;
1396 }
1397 return true;
1398 }
1399
MipsSEDAGToDAGISelLegacy(MipsTargetMachine & TM,CodeGenOptLevel OL)1400 MipsSEDAGToDAGISelLegacy::MipsSEDAGToDAGISelLegacy(MipsTargetMachine &TM,
1401 CodeGenOptLevel OL)
1402 : MipsDAGToDAGISelLegacy(std::make_unique<MipsSEDAGToDAGISel>(TM, OL)) {}
1403
createMipsSEISelDag(MipsTargetMachine & TM,CodeGenOptLevel OptLevel)1404 FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM,
1405 CodeGenOptLevel OptLevel) {
1406 return new MipsSEDAGToDAGISelLegacy(TM, OptLevel);
1407 }
1408