LLVM  8.0.1
MipsSEISelDAGToDAG.cpp
Go to the documentation of this file.
1 //===-- MipsSEISelDAGToDAG.cpp - A Dag to Dag Inst Selector for MipsSE ----===//
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 // Subclass of MipsDAGToDAGISel specialized for mips32/64.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "MipsSEISelDAGToDAG.h"
16 #include "Mips.h"
17 #include "MipsAnalyzeImmediate.h"
18 #include "MipsMachineFunction.h"
19 #include "MipsRegisterInfo.h"
26 #include "llvm/IR/CFG.h"
27 #include "llvm/IR/Dominators.h"
28 #include "llvm/IR/GlobalValue.h"
29 #include "llvm/IR/Instructions.h"
30 #include "llvm/IR/Intrinsics.h"
31 #include "llvm/IR/Type.h"
32 #include "llvm/Support/Debug.h"
36 using namespace llvm;
37 
38 #define DEBUG_TYPE "mips-isel"
39 
40 bool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
41  Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
42  if (Subtarget->inMips16Mode())
43  return false;
45 }
46 
47 void MipsSEDAGToDAGISel::getAnalysisUsage(AnalysisUsage &AU) const {
50 }
51 
52 void MipsSEDAGToDAGISel::addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI,
54  MachineInstrBuilder MIB(MF, &MI);
55  unsigned Mask = MI.getOperand(1).getImm();
56  unsigned Flag =
58 
59  if (Mask & 1)
60  MIB.addReg(Mips::DSPPos, Flag);
61 
62  if (Mask & 2)
63  MIB.addReg(Mips::DSPSCount, Flag);
64 
65  if (Mask & 4)
66  MIB.addReg(Mips::DSPCarry, Flag);
67 
68  if (Mask & 8)
69  MIB.addReg(Mips::DSPOutFlag, Flag);
70 
71  if (Mask & 16)
72  MIB.addReg(Mips::DSPCCond, Flag);
73 
74  if (Mask & 32)
75  MIB.addReg(Mips::DSPEFI, Flag);
76 }
77 
78 unsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
79  switch (cast<ConstantSDNode>(RegIdx)->getZExtValue()) {
80  default:
81  llvm_unreachable("Could not map int to register");
82  case 0: return Mips::MSAIR;
83  case 1: return Mips::MSACSR;
84  case 2: return Mips::MSAAccess;
85  case 3: return Mips::MSASave;
86  case 4: return Mips::MSAModify;
87  case 5: return Mips::MSARequest;
88  case 6: return Mips::MSAMap;
89  case 7: return Mips::MSAUnmap;
90  }
91 }
92 
93 bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
94  const MachineInstr& MI) {
95  unsigned DstReg = 0, ZeroReg = 0;
96 
97  // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
98  if ((MI.getOpcode() == Mips::ADDiu) &&
99  (MI.getOperand(1).getReg() == Mips::ZERO) &&
100  (MI.getOperand(2).isImm()) &&
101  (MI.getOperand(2).getImm() == 0)) {
102  DstReg = MI.getOperand(0).getReg();
103  ZeroReg = Mips::ZERO;
104  } else if ((MI.getOpcode() == Mips::DADDiu) &&
105  (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
106  (MI.getOperand(2).isImm()) &&
107  (MI.getOperand(2).getImm() == 0)) {
108  DstReg = MI.getOperand(0).getReg();
109  ZeroReg = Mips::ZERO_64;
110  }
111 
112  if (!DstReg)
113  return false;
114 
115  // Replace uses with ZeroReg.
116  for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
117  E = MRI->use_end(); U != E;) {
118  MachineOperand &MO = *U;
119  unsigned OpNo = U.getOperandNo();
120  MachineInstr *MI = MO.getParent();
121  ++U;
122 
123  // Do not replace if it is a phi's operand or is tied to def operand.
124  if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
125  continue;
126 
127  // Also, we have to check that the register class of the operand
128  // contains the zero register.
129  if (!MRI->getRegClass(MO.getReg())->contains(ZeroReg))
130  continue;
131 
132  MO.setReg(ZeroReg);
133  }
134 
135  return true;
136 }
137 
138 void MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
139  MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
140 
141  if (!MipsFI->globalBaseRegSet())
142  return;
143 
144  MachineBasicBlock &MBB = MF.front();
148  DebugLoc DL;
149  unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
150  const TargetRegisterClass *RC;
151  const MipsABIInfo &ABI = static_cast<const MipsTargetMachine &>(TM).getABI();
152  RC = (ABI.IsN64()) ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
153 
154  V0 = RegInfo.createVirtualRegister(RC);
155  V1 = RegInfo.createVirtualRegister(RC);
156 
157  if (ABI.IsN64()) {
158  MF.getRegInfo().addLiveIn(Mips::T9_64);
159  MBB.addLiveIn(Mips::T9_64);
160 
161  // lui $v0, %hi(%neg(%gp_rel(fname)))
162  // daddu $v1, $v0, $t9
163  // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
164  const GlobalValue *FName = &MF.getFunction();
165  BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0)
166  .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
167  BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0)
168  .addReg(Mips::T9_64);
169  BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
171  return;
172  }
173 
174  if (!MF.getTarget().isPositionIndependent()) {
175  // Set global register to __gnu_local_gp.
176  //
177  // lui $v0, %hi(__gnu_local_gp)
178  // addiu $globalbasereg, $v0, %lo(__gnu_local_gp)
179  BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
180  .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI);
181  BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0)
182  .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO);
183  return;
184  }
185 
186  MF.getRegInfo().addLiveIn(Mips::T9);
187  MBB.addLiveIn(Mips::T9);
188 
189  if (ABI.IsN32()) {
190  // lui $v0, %hi(%neg(%gp_rel(fname)))
191  // addu $v1, $v0, $t9
192  // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
193  const GlobalValue *FName = &MF.getFunction();
194  BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
195  .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
196  BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
197  BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
199  return;
200  }
201 
202  assert(ABI.IsO32());
203 
204  // For O32 ABI, the following instruction sequence is emitted to initialize
205  // the global base register:
206  //
207  // 0. lui $2, %hi(_gp_disp)
208  // 1. addiu $2, $2, %lo(_gp_disp)
209  // 2. addu $globalbasereg, $2, $t9
210  //
211  // We emit only the last instruction here.
212  //
213  // GNU linker requires that the first two instructions appear at the beginning
214  // of a function and no instructions be inserted before or between them.
215  // The two instructions are emitted during lowering to MC layer in order to
216  // avoid any reordering.
217  //
218  // Register $2 (Mips::V0) is added to the list of live-in registers to ensure
219  // the value instruction 1 (addiu) defines is valid when instruction 2 (addu)
220  // reads it.
221  MF.getRegInfo().addLiveIn(Mips::V0);
222  MBB.addLiveIn(Mips::V0);
223  BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
224  .addReg(Mips::V0).addReg(Mips::T9);
225 }
226 
227 void MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
228  initGlobalBaseReg(MF);
229 
230  MachineRegisterInfo *MRI = &MF.getRegInfo();
231 
232  for (auto &MBB: MF) {
233  for (auto &MI: MBB) {
234  switch (MI.getOpcode()) {
235  case Mips::RDDSP:
236  addDSPCtrlRegOperands(false, MI, MF);
237  break;
238  case Mips::WRDSP:
239  addDSPCtrlRegOperands(true, MI, MF);
240  break;
241  case Mips::BuildPairF64_64:
242  case Mips::ExtractElementF64_64:
243  if (!Subtarget->useOddSPReg()) {
244  MI.addOperand(MachineOperand::CreateReg(Mips::SP, false, true));
245  break;
246  }
248  case Mips::BuildPairF64:
250  if (Subtarget->isABI_FPXX() && !Subtarget->hasMTHC1())
251  MI.addOperand(MachineOperand::CreateReg(Mips::SP, false, true));
252  break;
253  default:
254  replaceUsesWithZeroReg(MRI, MI);
255  }
256  }
257  }
258 }
259 
260 void MipsSEDAGToDAGISel::selectAddE(SDNode *Node, const SDLoc &DL) const {
261  SDValue InFlag = Node->getOperand(2);
262  unsigned Opc = InFlag.getOpcode();
263  SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
264  EVT VT = LHS.getValueType();
265 
266  // In the base case, we can rely on the carry bit from the addsc
267  // instruction.
268  if (Opc == ISD::ADDC) {
269  SDValue Ops[3] = {LHS, RHS, InFlag};
270  CurDAG->SelectNodeTo(Node, Mips::ADDWC, VT, MVT::Glue, Ops);
271  return;
272  }
273 
274  assert(Opc == ISD::ADDE && "ISD::ADDE not in a chain of ADDE nodes!");
275 
276  // The more complex case is when there is a chain of ISD::ADDE nodes like:
277  // (adde (adde (adde (addc a b) c) d) e).
278  //
279  // The addwc instruction does not write to the carry bit, instead it writes
280  // to bit 20 of the dsp control register. To match this series of nodes, each
281  // intermediate adde node must be expanded to write the carry bit before the
282  // addition.
283 
284  // Start by reading the overflow field for addsc and moving the value to the
285  // carry field. The usage of 1 here with MipsISD::RDDSP / Mips::WRDSP
286  // corresponds to reading/writing the entire control register to/from a GPR.
287 
288  SDValue CstOne = CurDAG->getTargetConstant(1, DL, MVT::i32);
289 
290  SDValue OuFlag = CurDAG->getTargetConstant(20, DL, MVT::i32);
291 
292  SDNode *DSPCtrlField =
293  CurDAG->getMachineNode(Mips::RDDSP, DL, MVT::i32, MVT::Glue, CstOne, InFlag);
294 
295  SDNode *Carry = CurDAG->getMachineNode(
296  Mips::EXT, DL, MVT::i32, SDValue(DSPCtrlField, 0), OuFlag, CstOne);
297 
298  SDValue Ops[4] = {SDValue(DSPCtrlField, 0),
299  CurDAG->getTargetConstant(6, DL, MVT::i32), CstOne,
300  SDValue(Carry, 0)};
301  SDNode *DSPCFWithCarry = CurDAG->getMachineNode(Mips::INS, DL, MVT::i32, Ops);
302 
303  // My reading of the MIPS DSP 3.01 specification isn't as clear as I
304  // would like about whether bit 20 always gets overwritten by addwc.
305  // Hence take an extremely conservative view and presume it's sticky. We
306  // therefore need to clear it.
307 
308  SDValue Zero = CurDAG->getRegister(Mips::ZERO, MVT::i32);
309 
310  SDValue InsOps[4] = {Zero, OuFlag, CstOne, SDValue(DSPCFWithCarry, 0)};
311  SDNode *DSPCtrlFinal = CurDAG->getMachineNode(Mips::INS, DL, MVT::i32, InsOps);
312 
313  SDNode *WrDSP = CurDAG->getMachineNode(Mips::WRDSP, DL, MVT::Glue,
314  SDValue(DSPCtrlFinal, 0), CstOne);
315 
316  SDValue Operands[3] = {LHS, RHS, SDValue(WrDSP, 0)};
317  CurDAG->SelectNodeTo(Node, Mips::ADDWC, VT, MVT::Glue, Operands);
318 }
319 
320 /// Match frameindex
321 bool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
322  SDValue &Offset) const {
323  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
324  EVT ValTy = Addr.getValueType();
325 
326  Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
327  Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), ValTy);
328  return true;
329  }
330  return false;
331 }
332 
333 /// Match frameindex+offset and frameindex|offset
334 bool MipsSEDAGToDAGISel::selectAddrFrameIndexOffset(
335  SDValue Addr, SDValue &Base, SDValue &Offset, unsigned OffsetBits,
336  unsigned ShiftAmount = 0) const {
337  if (CurDAG->isBaseWithConstantOffset(Addr)) {
339  if (isIntN(OffsetBits + ShiftAmount, CN->getSExtValue())) {
340  EVT ValTy = Addr.getValueType();
341 
342  // If the first operand is a FI, get the TargetFI Node
343  if (FrameIndexSDNode *FIN =
344  dyn_cast<FrameIndexSDNode>(Addr.getOperand(0)))
345  Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
346  else {
347  Base = Addr.getOperand(0);
348  // If base is a FI, additional offset calculation is done in
349  // eliminateFrameIndex, otherwise we need to check the alignment
350  if (OffsetToAlignment(CN->getZExtValue(), 1ull << ShiftAmount) != 0)
351  return false;
352  }
353 
354  Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr),
355  ValTy);
356  return true;
357  }
358  }
359  return false;
360 }
361 
362 /// ComplexPattern used on MipsInstrInfo
363 /// Used on Mips Load/Store instructions
364 bool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
365  SDValue &Offset) const {
366  // if Address is FI, get the TargetFrameIndex.
367  if (selectAddrFrameIndex(Addr, Base, Offset))
368  return true;
369 
370  // on PIC code Load GA
371  if (Addr.getOpcode() == MipsISD::Wrapper) {
372  Base = Addr.getOperand(0);
373  Offset = Addr.getOperand(1);
374  return true;
375  }
376 
377  if (!TM.isPositionIndependent()) {
378  if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
380  return false;
381  }
382 
383  // Addresses of the form FI+const or FI|const
384  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
385  return true;
386 
387  // Operand is a result from an ADD.
388  if (Addr.getOpcode() == ISD::ADD) {
389  // When loading from constant pools, load the lower address part in
390  // the instruction itself. Example, instead of:
391  // lui $2, %hi($CPI1_0)
392  // addiu $2, $2, %lo($CPI1_0)
393  // lwc1 $f0, 0($2)
394  // Generate:
395  // lui $2, %hi($CPI1_0)
396  // lwc1 $f0, %lo($CPI1_0)($2)
397  if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
398  Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
399  SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
400  if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
401  isa<JumpTableSDNode>(Opnd0)) {
402  Base = Addr.getOperand(0);
403  Offset = Opnd0;
404  return true;
405  }
406  }
407  }
408 
409  return false;
410 }
411 
412 /// ComplexPattern used on MipsInstrInfo
413 /// Used on Mips Load/Store instructions
414 bool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
415  SDValue &Offset) const {
416  Base = Addr;
417  Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), Addr.getValueType());
418  return true;
419 }
420 
421 bool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
422  SDValue &Offset) const {
423  return selectAddrRegImm(Addr, Base, Offset) ||
424  selectAddrDefault(Addr, Base, Offset);
425 }
426 
427 bool MipsSEDAGToDAGISel::selectAddrRegImm9(SDValue Addr, SDValue &Base,
428  SDValue &Offset) const {
429  if (selectAddrFrameIndex(Addr, Base, Offset))
430  return true;
431 
432  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 9))
433  return true;
434 
435  return false;
436 }
437 
438 /// Used on microMIPS LWC2, LDC2, SWC2 and SDC2 instructions (11-bit offset)
439 bool MipsSEDAGToDAGISel::selectAddrRegImm11(SDValue Addr, SDValue &Base,
440  SDValue &Offset) const {
441  if (selectAddrFrameIndex(Addr, Base, Offset))
442  return true;
443 
444  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 11))
445  return true;
446 
447  return false;
448 }
449 
450 /// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
451 bool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
452  SDValue &Offset) const {
453  if (selectAddrFrameIndex(Addr, Base, Offset))
454  return true;
455 
456  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 12))
457  return true;
458 
459  return false;
460 }
461 
462 bool MipsSEDAGToDAGISel::selectAddrRegImm16(SDValue Addr, SDValue &Base,
463  SDValue &Offset) const {
464  if (selectAddrFrameIndex(Addr, Base, Offset))
465  return true;
466 
467  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
468  return true;
469 
470  return false;
471 }
472 
473 bool MipsSEDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
474  SDValue &Offset) const {
475  return selectAddrRegImm11(Addr, Base, Offset) ||
476  selectAddrDefault(Addr, Base, Offset);
477 }
478 
479 bool MipsSEDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
480  SDValue &Offset) const {
481  return selectAddrRegImm12(Addr, Base, Offset) ||
482  selectAddrDefault(Addr, Base, Offset);
483 }
484 
485 bool MipsSEDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
486  SDValue &Offset) const {
487  return selectAddrRegImm16(Addr, Base, Offset) ||
488  selectAddrDefault(Addr, Base, Offset);
489 }
490 
491 bool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
492  SDValue &Offset) const {
493  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 7)) {
494  if (isa<FrameIndexSDNode>(Base))
495  return false;
496 
497  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Offset)) {
498  unsigned CnstOff = CN->getZExtValue();
499  return (CnstOff == (CnstOff & 0x3c));
500  }
501 
502  return false;
503  }
504 
505  // For all other cases where "lw" would be selected, don't select "lw16"
506  // because it would result in additional instructions to prepare operands.
507  if (selectAddrRegImm(Addr, Base, Offset))
508  return false;
509 
510  return selectAddrDefault(Addr, Base, Offset);
511 }
512 
513 bool MipsSEDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
514  SDValue &Offset) const {
515 
516  if (selectAddrFrameIndex(Addr, Base, Offset))
517  return true;
518 
519  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10))
520  return true;
521 
522  return selectAddrDefault(Addr, Base, Offset);
523 }
524 
525 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
526  SDValue &Offset) const {
527  if (selectAddrFrameIndex(Addr, Base, Offset))
528  return true;
529 
530  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 1))
531  return true;
532 
533  return selectAddrDefault(Addr, Base, Offset);
534 }
535 
536 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
537  SDValue &Offset) const {
538  if (selectAddrFrameIndex(Addr, Base, Offset))
539  return true;
540 
541  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 2))
542  return true;
543 
544  return selectAddrDefault(Addr, Base, Offset);
545 }
546 
547 bool MipsSEDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
548  SDValue &Offset) const {
549  if (selectAddrFrameIndex(Addr, Base, Offset))
550  return true;
551 
552  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10, 3))
553  return true;
554 
555  return selectAddrDefault(Addr, Base, Offset);
556 }
557 
558 // Select constant vector splats.
559 //
560 // Returns true and sets Imm if:
561 // * MSA is enabled
562 // * N is a ISD::BUILD_VECTOR representing a constant splat
563 bool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm,
564  unsigned MinSizeInBits) const {
565  if (!Subtarget->hasMSA())
566  return false;
567 
569 
570  if (!Node)
571  return false;
572 
573  APInt SplatValue, SplatUndef;
574  unsigned SplatBitSize;
575  bool HasAnyUndefs;
576 
577  if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
578  MinSizeInBits, !Subtarget->isLittle()))
579  return false;
580 
581  Imm = SplatValue;
582 
583  return true;
584 }
585 
586 // Select constant vector splats.
587 //
588 // In addition to the requirements of selectVSplat(), this function returns
589 // true and sets Imm if:
590 // * The splat value is the same width as the elements of the vector
591 // * The splat value fits in an integer with the specified signed-ness and
592 // width.
593 //
594 // This function looks through ISD::BITCAST nodes.
595 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
596 // sometimes a shuffle in big-endian mode.
597 //
598 // It's worth noting that this function is not used as part of the selection
599 // of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
600 // instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
601 // MipsSEDAGToDAGISel::selectNode.
602 bool MipsSEDAGToDAGISel::
603 selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
604  unsigned ImmBitSize) const {
605  APInt ImmValue;
606  EVT EltTy = N->getValueType(0).getVectorElementType();
607 
608  if (N->getOpcode() == ISD::BITCAST)
609  N = N->getOperand(0);
610 
611  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
612  ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
613 
614  if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
615  (!Signed && ImmValue.isIntN(ImmBitSize))) {
616  Imm = CurDAG->getTargetConstant(ImmValue, SDLoc(N), EltTy);
617  return true;
618  }
619  }
620 
621  return false;
622 }
623 
624 // Select constant vector splats.
625 bool MipsSEDAGToDAGISel::
626 selectVSplatUimm1(SDValue N, SDValue &Imm) const {
627  return selectVSplatCommon(N, Imm, false, 1);
628 }
629 
630 bool MipsSEDAGToDAGISel::
631 selectVSplatUimm2(SDValue N, SDValue &Imm) const {
632  return selectVSplatCommon(N, Imm, false, 2);
633 }
634 
635 bool MipsSEDAGToDAGISel::
636 selectVSplatUimm3(SDValue N, SDValue &Imm) const {
637  return selectVSplatCommon(N, Imm, false, 3);
638 }
639 
640 // Select constant vector splats.
641 bool MipsSEDAGToDAGISel::
642 selectVSplatUimm4(SDValue N, SDValue &Imm) const {
643  return selectVSplatCommon(N, Imm, false, 4);
644 }
645 
646 // Select constant vector splats.
647 bool MipsSEDAGToDAGISel::
648 selectVSplatUimm5(SDValue N, SDValue &Imm) const {
649  return selectVSplatCommon(N, Imm, false, 5);
650 }
651 
652 // Select constant vector splats.
653 bool MipsSEDAGToDAGISel::
654 selectVSplatUimm6(SDValue N, SDValue &Imm) const {
655  return selectVSplatCommon(N, Imm, false, 6);
656 }
657 
658 // Select constant vector splats.
659 bool MipsSEDAGToDAGISel::
660 selectVSplatUimm8(SDValue N, SDValue &Imm) const {
661  return selectVSplatCommon(N, Imm, false, 8);
662 }
663 
664 // Select constant vector splats.
665 bool MipsSEDAGToDAGISel::
666 selectVSplatSimm5(SDValue N, SDValue &Imm) const {
667  return selectVSplatCommon(N, Imm, true, 5);
668 }
669 
670 // Select constant vector splats whose value is a power of 2.
671 //
672 // In addition to the requirements of selectVSplat(), this function returns
673 // true and sets Imm if:
674 // * The splat value is the same width as the elements of the vector
675 // * The splat value is a power of two.
676 //
677 // This function looks through ISD::BITCAST nodes.
678 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
679 // sometimes a shuffle in big-endian mode.
680 bool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) 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  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
688  ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
689  int32_t Log2 = ImmValue.exactLogBase2();
690 
691  if (Log2 != -1) {
692  Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
693  return true;
694  }
695  }
696 
697  return false;
698 }
699 
700 // Select constant vector splats whose value only has a consecutive sequence
701 // of left-most bits set (e.g. 0b11...1100...00).
702 //
703 // In addition to the requirements of selectVSplat(), this function returns
704 // true and sets Imm if:
705 // * The splat value is the same width as the elements of the vector
706 // * The splat value is a consecutive sequence of left-most bits.
707 //
708 // This function looks through ISD::BITCAST nodes.
709 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
710 // sometimes a shuffle in big-endian mode.
711 bool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
712  APInt ImmValue;
713  EVT EltTy = N->getValueType(0).getVectorElementType();
714 
715  if (N->getOpcode() == ISD::BITCAST)
716  N = N->getOperand(0);
717 
718  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
719  ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
720  // Extract the run of set bits starting with bit zero from the bitwise
721  // inverse of ImmValue, and test that the inverse of this is the same
722  // as the original value.
723  if (ImmValue == ~(~ImmValue & ~(~ImmValue + 1))) {
724 
725  Imm = CurDAG->getTargetConstant(ImmValue.countPopulation() - 1, SDLoc(N),
726  EltTy);
727  return true;
728  }
729  }
730 
731  return false;
732 }
733 
734 // Select constant vector splats whose value only has a consecutive sequence
735 // of right-most bits set (e.g. 0b00...0011...11).
736 //
737 // In addition to the requirements of selectVSplat(), this function returns
738 // true and sets Imm if:
739 // * The splat value is the same width as the elements of the vector
740 // * The splat value is a consecutive sequence of right-most bits.
741 //
742 // This function looks through ISD::BITCAST nodes.
743 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
744 // sometimes a shuffle in big-endian mode.
745 bool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
746  APInt ImmValue;
747  EVT EltTy = N->getValueType(0).getVectorElementType();
748 
749  if (N->getOpcode() == ISD::BITCAST)
750  N = N->getOperand(0);
751 
752  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
753  ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
754  // Extract the run of set bits starting with bit zero, and test that the
755  // result is the same as the original value
756  if (ImmValue == (ImmValue & ~(ImmValue + 1))) {
757  Imm = CurDAG->getTargetConstant(ImmValue.countPopulation() - 1, SDLoc(N),
758  EltTy);
759  return true;
760  }
761  }
762 
763  return false;
764 }
765 
766 bool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
767  SDValue &Imm) const {
768  APInt ImmValue;
769  EVT EltTy = N->getValueType(0).getVectorElementType();
770 
771  if (N->getOpcode() == ISD::BITCAST)
772  N = N->getOperand(0);
773 
774  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
775  ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
776  int32_t Log2 = (~ImmValue).exactLogBase2();
777 
778  if (Log2 != -1) {
779  Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
780  return true;
781  }
782  }
783 
784  return false;
785 }
786 
787 bool MipsSEDAGToDAGISel::trySelect(SDNode *Node) {
788  unsigned Opcode = Node->getOpcode();
789  SDLoc DL(Node);
790 
791  ///
792  // Instruction Selection not handled by the auto-generated
793  // tablegen selection should be handled here.
794  ///
795  switch(Opcode) {
796  default: break;
797 
798  case Mips::PseudoD_SELECT_I:
799  case Mips::PseudoD_SELECT_I64: {
801  SDValue cond = Node->getOperand(0);
802  SDValue Hi1 = Node->getOperand(1);
803  SDValue Lo1 = Node->getOperand(2);
804  SDValue Hi2 = Node->getOperand(3);
805  SDValue Lo2 = Node->getOperand(4);
806 
807  SDValue ops[] = {cond, Hi1, Lo1, Hi2, Lo2};
808  EVT NodeTys[] = {VT, VT};
810  ? Mips::PseudoD_SELECT_I64
811  : Mips::PseudoD_SELECT_I,
812  DL, NodeTys, ops));
813  return true;
814  }
815 
816  case ISD::ADDE: {
817  selectAddE(Node, DL);
818  return true;
819  }
820 
821  case ISD::ConstantFP: {
823  if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
824  if (Subtarget->isGP64bit()) {
826  Mips::ZERO_64, MVT::i64);
827  ReplaceNode(Node,
828  CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero));
829  } else if (Subtarget->isFP64bit()) {
831  Mips::ZERO, MVT::i32);
832  ReplaceNode(Node, CurDAG->getMachineNode(Mips::BuildPairF64_64, DL,
833  MVT::f64, Zero, Zero));
834  } else {
836  Mips::ZERO, MVT::i32);
838  MVT::f64, Zero, Zero));
839  }
840  return true;
841  }
842  break;
843  }
844 
845  case ISD::Constant: {
846  const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node);
847  int64_t Imm = CN->getSExtValue();
848  unsigned Size = CN->getValueSizeInBits(0);
849 
850  if (isInt<32>(Imm))
851  break;
852 
853  MipsAnalyzeImmediate AnalyzeImm;
854 
855  const MipsAnalyzeImmediate::InstSeq &Seq =
856  AnalyzeImm.Analyze(Imm, Size, false);
857 
859  SDLoc DL(CN);
860  SDNode *RegOpnd;
861  SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
862  DL, MVT::i64);
863 
864  // The first instruction can be a LUi which is different from other
865  // instructions (ADDiu, ORI and SLL) in that it does not have a register
866  // operand.
867  if (Inst->Opc == Mips::LUi64)
868  RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
869  else
870  RegOpnd =
871  CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
872  CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
873  ImmOpnd);
874 
875  // The remaining instructions in the sequence are handled here.
876  for (++Inst; Inst != Seq.end(); ++Inst) {
877  ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), DL,
878  MVT::i64);
879  RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
880  SDValue(RegOpnd, 0), ImmOpnd);
881  }
882 
883  ReplaceNode(Node, RegOpnd);
884  return true;
885  }
886 
887  case ISD::INTRINSIC_W_CHAIN: {
888  switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
889  default:
890  break;
891 
892  case Intrinsic::mips_cfcmsa: {
893  SDValue ChainIn = Node->getOperand(0);
894  SDValue RegIdx = Node->getOperand(2);
895  SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
896  getMSACtrlReg(RegIdx), MVT::i32);
897  ReplaceNode(Node, Reg.getNode());
898  return true;
899  }
900  }
901  break;
902  }
903 
905  switch (cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue()) {
906  default:
907  break;
908 
910  // Like an assignment but will always produce a move.v even if
911  // unnecessary.
912  ReplaceNode(Node, CurDAG->getMachineNode(Mips::MOVE_V, DL,
913  Node->getValueType(0),
914  Node->getOperand(1)));
915  return true;
916  }
917  break;
918  }
919 
920  case ISD::INTRINSIC_VOID: {
921  switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
922  default:
923  break;
924 
925  case Intrinsic::mips_ctcmsa: {
926  SDValue ChainIn = Node->getOperand(0);
927  SDValue RegIdx = Node->getOperand(2);
928  SDValue Value = Node->getOperand(3);
929  SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
930  getMSACtrlReg(RegIdx), Value);
931  ReplaceNode(Node, ChainOut.getNode());
932  return true;
933  }
934  }
935  break;
936  }
937 
938  // Manually match MipsISD::Ins nodes to get the correct instruction. It has
939  // to be done in this fashion so that we respect the differences between
940  // dins and dinsm, as the difference is that the size operand has the range
941  // 0 < size <= 32 for dins while dinsm has the range 2 <= size <= 64 which
942  // means SelectionDAGISel would have to test all the operands at once to
943  // match the instruction.
944  case MipsISD::Ins: {
945 
946  // Sanity checking for the node operands.
947  if (Node->getValueType(0) != MVT::i32 && Node->getValueType(0) != MVT::i64)
948  return false;
949 
950  if (Node->getNumOperands() != 4)
951  return false;
952 
953  if (Node->getOperand(1)->getOpcode() != ISD::Constant ||
954  Node->getOperand(2)->getOpcode() != ISD::Constant)
955  return false;
956 
957  MVT ResTy = Node->getSimpleValueType(0);
958  uint64_t Pos = Node->getConstantOperandVal(1);
959  uint64_t Size = Node->getConstantOperandVal(2);
960 
961  // Size has to be >0 for 'ins', 'dins' and 'dinsu'.
962  if (!Size)
963  return false;
964 
965  if (Pos + Size > 64)
966  return false;
967 
968  if (ResTy != MVT::i32 && ResTy != MVT::i64)
969  return false;
970 
971  unsigned Opcode = 0;
972  if (ResTy == MVT::i32) {
973  if (Pos + Size <= 32)
974  Opcode = Mips::INS;
975  } else {
976  if (Pos + Size <= 32)
977  Opcode = Mips::DINS;
978  else if (Pos < 32 && 1 < Size)
979  Opcode = Mips::DINSM;
980  else
981  Opcode = Mips::DINSU;
982  }
983 
984  if (Opcode) {
985  SDValue Ops[4] = {
986  Node->getOperand(0), CurDAG->getTargetConstant(Pos, DL, MVT::i32),
987  CurDAG->getTargetConstant(Size, DL, MVT::i32), Node->getOperand(3)};
988 
989  ReplaceNode(Node, CurDAG->getMachineNode(Opcode, DL, ResTy, Ops));
990  return true;
991  }
992 
993  return false;
994  }
995 
996  case MipsISD::ThreadPointer: {
998  unsigned RdhwrOpc, DestReg;
999 
1000  if (PtrVT == MVT::i32) {
1001  RdhwrOpc = Mips::RDHWR;
1002  DestReg = Mips::V1;
1003  } else {
1004  RdhwrOpc = Mips::RDHWR64;
1005  DestReg = Mips::V1_64;
1006  }
1007 
1008  SDNode *Rdhwr =
1009  CurDAG->getMachineNode(RdhwrOpc, DL, Node->getValueType(0),
1010  CurDAG->getRegister(Mips::HWR29, MVT::i32),
1011  CurDAG->getTargetConstant(0, DL, MVT::i32));
1012  SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
1013  SDValue(Rdhwr, 0));
1014  SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
1015  ReplaceNode(Node, ResNode.getNode());
1016  return true;
1017  }
1018 
1019  case ISD::BUILD_VECTOR: {
1020  // Select appropriate ldi.[bhwd] instructions for constant splats of
1021  // 128-bit when MSA is enabled. Fixup any register class mismatches that
1022  // occur as a result.
1023  //
1024  // This allows the compiler to use a wider range of immediates than would
1025  // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
1026  // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
1027  // 0x01010101 } without using a constant pool. This would be sub-optimal
1028  // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
1029  // same set/ of registers. Similarly, ldi.h isn't capable of producing {
1030  // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
1031 
1032  const MipsABIInfo &ABI =
1033  static_cast<const MipsTargetMachine &>(TM).getABI();
1034 
1035  BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
1036  APInt SplatValue, SplatUndef;
1037  unsigned SplatBitSize;
1038  bool HasAnyUndefs;
1039  unsigned LdiOp;
1040  EVT ResVecTy = BVN->getValueType(0);
1041  EVT ViaVecTy;
1042 
1043  if (!Subtarget->hasMSA() || !BVN->getValueType(0).is128BitVector())
1044  return false;
1045 
1046  if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
1047  HasAnyUndefs, 8,
1048  !Subtarget->isLittle()))
1049  return false;
1050 
1051  switch (SplatBitSize) {
1052  default:
1053  return false;
1054  case 8:
1055  LdiOp = Mips::LDI_B;
1056  ViaVecTy = MVT::v16i8;
1057  break;
1058  case 16:
1059  LdiOp = Mips::LDI_H;
1060  ViaVecTy = MVT::v8i16;
1061  break;
1062  case 32:
1063  LdiOp = Mips::LDI_W;
1064  ViaVecTy = MVT::v4i32;
1065  break;
1066  case 64:
1067  LdiOp = Mips::LDI_D;
1068  ViaVecTy = MVT::v2i64;
1069  break;
1070  }
1071 
1072  SDNode *Res;
1073 
1074  // If we have a signed 10 bit integer, we can splat it directly.
1075  //
1076  // If we have something bigger we can synthesize the value into a GPR and
1077  // splat from there.
1078  if (SplatValue.isSignedIntN(10)) {
1079  SDValue Imm = CurDAG->getTargetConstant(SplatValue, DL,
1080  ViaVecTy.getVectorElementType());
1081 
1082  Res = CurDAG->getMachineNode(LdiOp, DL, ViaVecTy, Imm);
1083  } else if (SplatValue.isSignedIntN(16) &&
1084  ((ABI.IsO32() && SplatBitSize < 64) ||
1085  (ABI.IsN32() || ABI.IsN64()))) {
1086  // Only handle signed 16 bit values when the element size is GPR width.
1087  // MIPS64 can handle all the cases but MIPS32 would need to handle
1088  // negative cases specifically here. Instead, handle those cases as
1089  // 64bit values.
1090 
1091  bool Is32BitSplat = ABI.IsO32() || SplatBitSize < 64;
1092  const unsigned ADDiuOp = Is32BitSplat ? Mips::ADDiu : Mips::DADDiu;
1093  const MVT SplatMVT = Is32BitSplat ? MVT::i32 : MVT::i64;
1094  SDValue ZeroVal = CurDAG->getRegister(
1095  Is32BitSplat ? Mips::ZERO : Mips::ZERO_64, SplatMVT);
1096 
1097  const unsigned FILLOp =
1098  SplatBitSize == 16
1099  ? Mips::FILL_H
1100  : (SplatBitSize == 32 ? Mips::FILL_W
1101  : (SplatBitSize == 64 ? Mips::FILL_D : 0));
1102 
1103  assert(FILLOp != 0 && "Unknown FILL Op for splat synthesis!");
1104  assert((!ABI.IsO32() || (FILLOp != Mips::FILL_D)) &&
1105  "Attempting to use fill.d on MIPS32!");
1106 
1107  const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1108  SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, SplatMVT);
1109 
1110  Res = CurDAG->getMachineNode(ADDiuOp, DL, SplatMVT, ZeroVal, LoVal);
1111  Res = CurDAG->getMachineNode(FILLOp, DL, ViaVecTy, SDValue(Res, 0));
1112 
1113  } else if (SplatValue.isSignedIntN(32) && SplatBitSize == 32) {
1114  // Only handle the cases where the splat size agrees with the size
1115  // of the SplatValue here.
1116  const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1117  const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1118  SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1119 
1120  SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1121  SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1122 
1123  if (Hi)
1124  Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1125 
1126  if (Lo)
1127  Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1128  Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1129 
1130  assert((Hi || Lo) && "Zero case reached 32 bit case splat synthesis!");
1131  Res = CurDAG->getMachineNode(Mips::FILL_W, DL, MVT::v4i32, SDValue(Res, 0));
1132 
1133  } else if (SplatValue.isSignedIntN(32) && SplatBitSize == 64 &&
1134  (ABI.IsN32() || ABI.IsN64())) {
1135  // N32 and N64 can perform some tricks that O32 can't for signed 32 bit
1136  // integers due to having 64bit registers. lui will cause the necessary
1137  // zero/sign extension.
1138  const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1139  const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1140  SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1141 
1142  SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1143  SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1144 
1145  if (Hi)
1146  Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1147 
1148  if (Lo)
1149  Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1150  Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1151 
1152  Res = CurDAG->getMachineNode(
1153  Mips::SUBREG_TO_REG, DL, MVT::i64,
1154  CurDAG->getTargetConstant(((Hi >> 15) & 0x1), DL, MVT::i64),
1155  SDValue(Res, 0),
1156  CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1157 
1158  Res =
1159  CurDAG->getMachineNode(Mips::FILL_D, DL, MVT::v2i64, SDValue(Res, 0));
1160 
1161  } else if (SplatValue.isSignedIntN(64)) {
1162  // If we have a 64 bit Splat value, we perform a similar sequence to the
1163  // above:
1164  //
1165  // MIPS32: MIPS64:
1166  // lui $res, %highest(val) lui $res, %highest(val)
1167  // ori $res, $res, %higher(val) ori $res, $res, %higher(val)
1168  // lui $res2, %hi(val) lui $res2, %hi(val)
1169  // ori $res2, %res2, %lo(val) ori $res2, %res2, %lo(val)
1170  // $res3 = fill $res2 dinsu $res, $res2, 0, 32
1171  // $res4 = insert.w $res3[1], $res fill.d $res
1172  // splat.d $res4, 0
1173  //
1174  // The ability to use dinsu is guaranteed as MSA requires MIPSR5. This saves
1175  // having to materialize the value by shifts and ors.
1176  //
1177  // FIXME: Implement the preferred sequence for MIPS64R6:
1178  //
1179  // MIPS64R6:
1180  // ori $res, $zero, %lo(val)
1181  // daui $res, $res, %hi(val)
1182  // dahi $res, $res, %higher(val)
1183  // dati $res, $res, %highest(cal)
1184  // fill.d $res
1185  //
1186 
1187  const unsigned Lo = SplatValue.getLoBits(16).getZExtValue();
1188  const unsigned Hi = SplatValue.lshr(16).getLoBits(16).getZExtValue();
1189  const unsigned Higher = SplatValue.lshr(32).getLoBits(16).getZExtValue();
1190  const unsigned Highest = SplatValue.lshr(48).getLoBits(16).getZExtValue();
1191 
1192  SDValue LoVal = CurDAG->getTargetConstant(Lo, DL, MVT::i32);
1193  SDValue HiVal = CurDAG->getTargetConstant(Hi, DL, MVT::i32);
1194  SDValue HigherVal = CurDAG->getTargetConstant(Higher, DL, MVT::i32);
1195  SDValue HighestVal = CurDAG->getTargetConstant(Highest, DL, MVT::i32);
1196  SDValue ZeroVal = CurDAG->getRegister(Mips::ZERO, MVT::i32);
1197 
1198  // Independent of whether we're targeting MIPS64 or not, the basic
1199  // operations are the same. Also, directly use the $zero register if
1200  // the 16 bit chunk is zero.
1201  //
1202  // For optimization purposes we always synthesize the splat value as
1203  // an i32 value, then if we're targetting MIPS64, use SUBREG_TO_REG
1204  // just before combining the values with dinsu to produce an i64. This
1205  // enables SelectionDAG to aggressively share components of splat values
1206  // where possible.
1207  //
1208  // FIXME: This is the general constant synthesis problem. This code
1209  // should be factored out into a class shared between all the
1210  // classes that need it. Specifically, for a splat size of 64
1211  // bits that's a negative number we can do better than LUi/ORi
1212  // for the upper 32bits.
1213 
1214  if (Hi)
1215  Res = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HiVal);
1216 
1217  if (Lo)
1218  Res = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1219  Hi ? SDValue(Res, 0) : ZeroVal, LoVal);
1220 
1221  SDNode *HiRes;
1222  if (Highest)
1223  HiRes = CurDAG->getMachineNode(Mips::LUi, DL, MVT::i32, HighestVal);
1224 
1225  if (Higher)
1226  HiRes = CurDAG->getMachineNode(Mips::ORi, DL, MVT::i32,
1227  Highest ? SDValue(HiRes, 0) : ZeroVal,
1228  HigherVal);
1229 
1230 
1231  if (ABI.IsO32()) {
1232  Res = CurDAG->getMachineNode(Mips::FILL_W, DL, MVT::v4i32,
1233  (Hi || Lo) ? SDValue(Res, 0) : ZeroVal);
1234 
1235  Res = CurDAG->getMachineNode(
1236  Mips::INSERT_W, DL, MVT::v4i32, SDValue(Res, 0),
1237  (Highest || Higher) ? SDValue(HiRes, 0) : ZeroVal,
1238  CurDAG->getTargetConstant(1, DL, MVT::i32));
1239 
1241  const TargetRegisterClass *RC =
1242  TLI->getRegClassFor(ViaVecTy.getSimpleVT());
1243 
1244  Res = CurDAG->getMachineNode(
1245  Mips::COPY_TO_REGCLASS, DL, ViaVecTy, SDValue(Res, 0),
1246  CurDAG->getTargetConstant(RC->getID(), DL, MVT::i32));
1247 
1248  Res = CurDAG->getMachineNode(
1249  Mips::SPLATI_D, DL, MVT::v2i64, SDValue(Res, 0),
1250  CurDAG->getTargetConstant(0, DL, MVT::i32));
1251  } else if (ABI.IsN64() || ABI.IsN32()) {
1252 
1253  SDValue Zero64Val = CurDAG->getRegister(Mips::ZERO_64, MVT::i64);
1254  const bool HiResNonZero = Highest || Higher;
1255  const bool ResNonZero = Hi || Lo;
1256 
1257  if (HiResNonZero)
1258  HiRes = CurDAG->getMachineNode(
1259  Mips::SUBREG_TO_REG, DL, MVT::i64,
1260  CurDAG->getTargetConstant(((Highest >> 15) & 0x1), DL, MVT::i64),
1261  SDValue(HiRes, 0),
1262  CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1263 
1264  if (ResNonZero)
1265  Res = CurDAG->getMachineNode(
1266  Mips::SUBREG_TO_REG, DL, MVT::i64,
1267  CurDAG->getTargetConstant(((Hi >> 15) & 0x1), DL, MVT::i64),
1268  SDValue(Res, 0),
1269  CurDAG->getTargetConstant(Mips::sub_32, DL, MVT::i64));
1270 
1271  // We have 3 cases:
1272  // The HiRes is nonzero but Res is $zero => dsll32 HiRes, 0
1273  // The Res is nonzero but HiRes is $zero => dinsu Res, $zero, 32, 32
1274  // Both are non zero => dinsu Res, HiRes, 32, 32
1275  //
1276  // The obvious "missing" case is when both are zero, but that case is
1277  // handled by the ldi case.
1278  if (ResNonZero) {
1279  IntegerType *Int32Ty =
1281  const ConstantInt *Const32 = ConstantInt::get(Int32Ty, 32);
1282  SDValue Ops[4] = {HiResNonZero ? SDValue(HiRes, 0) : Zero64Val,
1283  CurDAG->getConstant(*Const32, DL, MVT::i32),
1284  CurDAG->getConstant(*Const32, DL, MVT::i32),
1285  SDValue(Res, 0)};
1286 
1287  Res = CurDAG->getMachineNode(Mips::DINSU, DL, MVT::i64, Ops);
1288  } else if (HiResNonZero) {
1289  Res = CurDAG->getMachineNode(
1290  Mips::DSLL32, DL, MVT::i64, SDValue(HiRes, 0),
1291  CurDAG->getTargetConstant(0, DL, MVT::i32));
1292  } else
1294  "Zero splat value handled by non-zero 64bit splat synthesis!");
1295 
1296  Res = CurDAG->getMachineNode(Mips::FILL_D, DL, MVT::v2i64, SDValue(Res, 0));
1297  } else
1298  llvm_unreachable("Unknown ABI in MipsISelDAGToDAG!");
1299 
1300  } else
1301  return false;
1302 
1303  if (ResVecTy != ViaVecTy) {
1304  // If LdiOp is writing to a different register class to ResVecTy, then
1305  // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
1306  // since the source and destination register sets contain the same
1307  // registers.
1309  MVT ResVecTySimple = ResVecTy.getSimpleVT();
1310  const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
1311  Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, DL,
1312  ResVecTy, SDValue(Res, 0),
1313  CurDAG->getTargetConstant(RC->getID(), DL,
1314  MVT::i32));
1315  }
1316 
1317  ReplaceNode(Node, Res);
1318  return true;
1319  }
1320 
1321  }
1322 
1323  return false;
1324 }
1325 
1326 bool MipsSEDAGToDAGISel::
1327 SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
1328  std::vector<SDValue> &OutOps) {
1329  SDValue Base, Offset;
1330 
1331  switch(ConstraintID) {
1332  default:
1333  llvm_unreachable("Unexpected asm memory constraint");
1334  // All memory constraints can at least accept raw pointers.
1336  OutOps.push_back(Op);
1337  OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1338  return false;
1340  if (selectAddrRegImm16(Op, Base, Offset)) {
1341  OutOps.push_back(Base);
1342  OutOps.push_back(Offset);
1343  return false;
1344  }
1345  OutOps.push_back(Op);
1346  OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1347  return false;
1349  // The 'R' constraint is supposed to be much more complicated than this.
1350  // However, it's becoming less useful due to architectural changes and
1351  // ought to be replaced by other constraints such as 'ZC'.
1352  // For now, support 9-bit signed offsets which is supportable by all
1353  // subtargets for all instructions.
1354  if (selectAddrRegImm9(Op, Base, Offset)) {
1355  OutOps.push_back(Base);
1356  OutOps.push_back(Offset);
1357  return false;
1358  }
1359  OutOps.push_back(Op);
1360  OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1361  return false;
1363  // ZC matches whatever the pref, ll, and sc instructions can handle for the
1364  // given subtarget.
1365  if (Subtarget->inMicroMipsMode()) {
1366  // On microMIPS, they can handle 12-bit offsets.
1367  if (selectAddrRegImm12(Op, Base, Offset)) {
1368  OutOps.push_back(Base);
1369  OutOps.push_back(Offset);
1370  return false;
1371  }
1372  } else if (Subtarget->hasMips32r6()) {
1373  // On MIPS32r6/MIPS64r6, they can only handle 9-bit offsets.
1374  if (selectAddrRegImm9(Op, Base, Offset)) {
1375  OutOps.push_back(Base);
1376  OutOps.push_back(Offset);
1377  return false;
1378  }
1379  } else if (selectAddrRegImm16(Op, Base, Offset)) {
1380  // Prior to MIPS32r6/MIPS64r6, they can handle 16-bit offsets.
1381  OutOps.push_back(Base);
1382  OutOps.push_back(Offset);
1383  return false;
1384  }
1385  // In all cases, 0-bit offsets are acceptable.
1386  OutOps.push_back(Op);
1387  OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
1388  return false;
1389  }
1390  return true;
1391 }
1392 
1395  return new MipsSEDAGToDAGISel(TM, OptLevel);
1396 }
bool isABI_FPXX() const
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition: ISDOpcodes.h:571
SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type...
EVT getValueType() const
Return the ValueType of the referenced return value.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
bool hasMTHC1() const
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
typename SuperClass::const_iterator const_iterator
Definition: SmallVector.h:328
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector...
This class represents lattice values for constants.
Definition: AllocatorList.h:24
FunctionPass * createMipsSEISelDag(MipsTargetMachine &TM, CodeGenOpt::Level OptLevel)
bool inMips16Mode() const
#define LLVM_FALLTHROUGH
Definition: Compiler.h:86
void addLiveIn(unsigned Reg, unsigned vreg=0)
addLiveIn - Add the specified register as a live-in.
Carry-setting nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:223
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
unsigned getReg() const
getReg - Returns the register number.
unsigned Reg
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition: ValueTypes.h:253
const MipsInstrInfo * getInstrInfo() const override
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition: ISDOpcodes.h:131
unsigned getValueSizeInBits(unsigned ResNo) const
Returns MVT::getSizeInBits(getValueType(ResNo)).
virtual const TargetRegisterClass * getRegClassFor(MVT VT) const
Return the register class that should be used for the specified value type.
A debug info location.
Definition: DebugLoc.h:34
MVT getSimpleValueType(unsigned ResNo) const
Return the type of a specified result as a simple type.
SDNode * getNode() const
get the SDNode which holds the desired result
const MachineInstrBuilder & addGlobalAddress(const GlobalValue *GV, int64_t Offset=0, unsigned char TargetFlags=0) const
bool isPHI() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
MachineFunction * MF
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1509
return AArch64::GPR64RegClass contains(Reg)
static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition: ISDOpcodes.h:159
GlobalBaseReg - On Darwin, this node represents the result of the mflr at function entry...
AnalysisUsage & addRequired()
static use_iterator use_end()
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
bool inMicroMipsMode() const
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s), MachineInstr opcode, and operands.
const TargetLowering * TLI
bool isGP64bit() const
bool hasMips32r6() const
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Definition: MachineInstr.h:409
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
Definition: SelectionDAG.h:460
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:401
bool IsN32() const
Definition: MipsABIInfo.h:43
unsigned getID() const
Return the register class ID number.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol address.
Definition: MipsBaseInfo.h:52
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
int64_t getSExtValue() const
bool IsN64() const
Definition: MipsABIInfo.h:44
unsigned getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:292
SDValue getTargetFrameIndex(int FI, EVT VT)
Definition: SelectionDAG.h:628
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:201
int32_t exactLogBase2() const
Definition: APInt.h:1788
const InstSeq & Analyze(uint64_t Imm, unsigned Size, bool LastInstrIsADDiu)
Analyze - Get an instruction sequence to load immediate Imm.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:576
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition: ISDOpcodes.h:151
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Definition: MCInstrDesc.h:118
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a vector with the specified, possibly variable...
Definition: ISDOpcodes.h:327
TargetInstrInfo - Interface to description of machine instruction set.
MachineRegisterInfo * RegInfo
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition: ISDOpcodes.h:166
CodeGenOpt::Level OptLevel
void addLiveIn(MCPhysReg PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
unsigned const MachineRegisterInfo * MRI
MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
unsigned countPopulation() const
Count the number of bits set.
Definition: APInt.h:1658
const MipsSubtarget * Subtarget
Keep a pointer to the MipsSubtarget around so that we can make the right decision when generating cod...
Machine Value Type.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
bool isPseudo(QueryType Type=IgnoreBundle) const
Return true if this is a pseudo instruction that doesn&#39;t correspond to a real machine instruction...
Definition: MachineInstr.h:619
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
Definition: SmallVector.h:129
const SDValue & getOperand(unsigned Num) const
Carry-using nodes for multiple precision addition and subtraction.
Definition: ISDOpcodes.h:232
Represent the analysis usage information of a pass.
bool isExactlyValue(double V) const
We don&#39;t rely on operator== working on double values, as it returns true for things that are clearly ...
bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side...
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:285
bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx=nullptr) const
Return true if the use operand of the specified index is tied to a def operand.
bool IsO32() const
Definition: MipsABIInfo.h:42
Class to represent integer types.
Definition: DerivedTypes.h:40
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
Definition: APInt.h:450
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
Definition: Function.cpp:193
Extended Value Type.
Definition: ValueTypes.h:34
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:398
const MachineBasicBlock & front() const
unsigned getNumOperands() const
Return the number of values used by this operation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:240
This is the shared class of boolean and integer constants.
Definition: Constants.h:84
constexpr bool isInt< 32 >(int64_t x)
Definition: MathExtras.h:309
void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
bool isLittle() const
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition: ValueTypes.h:265
double Log2(double Value)
Return the log base 2 of the specified value.
Definition: MathExtras.h:528
MachineOperand class - Representation of each machine instruction operand.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
Definition: Constants.cpp:622
Represents one node in the SelectionDAG.
int64_t getImm() const
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, unsigned Reg, SDValue N)
Definition: SelectionDAG.h:679
const Function & getFunction() const
Return the LLVM function that this machine code represents.
Class for arbitrary precision integers.
Definition: APInt.h:70
A "pseudo-class" with methods for operating on BUILD_VECTORs.
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
Definition: MachineInstr.h:64
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
Definition: SmallVector.h:133
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, unsigned Reg, EVT VT)
Definition: SelectionDAG.h:705
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
use_iterator use_begin(unsigned RegNo) const
xray Insert XRay ops
bool is128BitVector() const
Return true if this is a 128-bit vector type.
Definition: ValueTypes.h:182
bool isPositionIndependent() const
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode...
Definition: MCInstrInfo.h:45
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned char TargetFlags=0) const
void setReg(unsigned Reg)
Change the register this operand corresponds to.
#define I(x, y, z)
Definition: MD5.cpp:58
#define N
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
uint32_t Size
Definition: Profile.cpp:47
bool useOddSPReg() const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
MipsSEDAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL)
unsigned getOpcode() const
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
Definition: APInt.h:456
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
const TargetLowering * getTargetLowering() const
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
Definition: Value.h:73
uint64_t getConstantOperandVal(unsigned Num) const
Helper method returns the integer value of a ConstantSDNode operand.
SDValue getRegister(unsigned Reg, EVT VT)
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E&#39;s largest value.
Definition: BitmaskEnum.h:81
uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
Definition: MathExtras.h:727
IRTranslator LLVM IR MI
void ReplaceNode(SDNode *F, SDNode *T)
Replace all uses of F with T, then remove F from the DAG.
Legacy analysis pass which computes a DominatorTree.
Definition: Dominators.h:260
const SDValue & getOperand(unsigned i) const
uint64_t getZExtValue() const
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:414
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
const TargetInstrInfo * TII
reg_begin/reg_end - Provide iteration support to walk over all definitions and uses of a register wit...
bool isFP64bit() const
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
bool hasMSA() const
IntegerType * Int32Ty