Test commit
[oota-llvm.git] / lib / Target / Mips / MipsSEISelDAGToDAG.cpp
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"
15 #include "MCTargetDesc/MipsBaseInfo.h"
16 #include "Mips.h"
17 #include "MipsAnalyzeImmediate.h"
18 #include "MipsMachineFunction.h"
19 #include "MipsRegisterInfo.h"
20 #include "llvm/CodeGen/MachineConstantPool.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/MachineRegisterInfo.h"
25 #include "llvm/CodeGen/SelectionDAGNodes.h"
26 #include "llvm/IR/CFG.h"
27 #include "llvm/IR/GlobalValue.h"
28 #include "llvm/IR/Instructions.h"
29 #include "llvm/IR/Intrinsics.h"
30 #include "llvm/IR/Type.h"
31 #include "llvm/Support/Debug.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/raw_ostream.h"
34 #include "llvm/Target/TargetMachine.h"
35 using namespace llvm;
36
37 #define DEBUG_TYPE "mips-isel"
38
39 bool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
40   Subtarget = &TM.getSubtarget<MipsSubtarget>();
41   if (Subtarget->inMips16Mode())
42     return false;
43   return MipsDAGToDAGISel::runOnMachineFunction(MF);
44 }
45
46 void MipsSEDAGToDAGISel::addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI,
47                                                MachineFunction &MF) {
48   MachineInstrBuilder MIB(MF, &MI);
49   unsigned Mask = MI.getOperand(1).getImm();
50   unsigned Flag = IsDef ? RegState::ImplicitDefine : RegState::Implicit;
51
52   if (Mask & 1)
53     MIB.addReg(Mips::DSPPos, Flag);
54
55   if (Mask & 2)
56     MIB.addReg(Mips::DSPSCount, Flag);
57
58   if (Mask & 4)
59     MIB.addReg(Mips::DSPCarry, Flag);
60
61   if (Mask & 8)
62     MIB.addReg(Mips::DSPOutFlag, Flag);
63
64   if (Mask & 16)
65     MIB.addReg(Mips::DSPCCond, Flag);
66
67   if (Mask & 32)
68     MIB.addReg(Mips::DSPEFI, Flag);
69 }
70
71 unsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
72   switch (cast<ConstantSDNode>(RegIdx)->getZExtValue()) {
73   default:
74     llvm_unreachable("Could not map int to register");
75   case 0: return Mips::MSAIR;
76   case 1: return Mips::MSACSR;
77   case 2: return Mips::MSAAccess;
78   case 3: return Mips::MSASave;
79   case 4: return Mips::MSAModify;
80   case 5: return Mips::MSARequest;
81   case 6: return Mips::MSAMap;
82   case 7: return Mips::MSAUnmap;
83   }
84 }
85
86 bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
87                                                 const MachineInstr& MI) {
88   unsigned DstReg = 0, ZeroReg = 0;
89
90   // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
91   if ((MI.getOpcode() == Mips::ADDiu) &&
92       (MI.getOperand(1).getReg() == Mips::ZERO) &&
93       (MI.getOperand(2).getImm() == 0)) {
94     DstReg = MI.getOperand(0).getReg();
95     ZeroReg = Mips::ZERO;
96   } else if ((MI.getOpcode() == Mips::DADDiu) &&
97              (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
98              (MI.getOperand(2).getImm() == 0)) {
99     DstReg = MI.getOperand(0).getReg();
100     ZeroReg = Mips::ZERO_64;
101   }
102
103   if (!DstReg)
104     return false;
105
106   // Replace uses with ZeroReg.
107   for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
108        E = MRI->use_end(); U != E;) {
109     MachineOperand &MO = *U;
110     unsigned OpNo = U.getOperandNo();
111     MachineInstr *MI = MO.getParent();
112     ++U;
113
114     // Do not replace if it is a phi's operand or is tied to def operand.
115     if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
116       continue;
117
118     MO.setReg(ZeroReg);
119   }
120
121   return true;
122 }
123
124 void MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
125   MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
126
127   if (!MipsFI->globalBaseRegSet())
128     return;
129
130   MachineBasicBlock &MBB = MF.front();
131   MachineBasicBlock::iterator I = MBB.begin();
132   MachineRegisterInfo &RegInfo = MF.getRegInfo();
133   const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
134   DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
135   unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
136   const TargetRegisterClass *RC;
137
138   if (Subtarget->isABI_N64())
139     RC = (const TargetRegisterClass*)&Mips::GPR64RegClass;
140   else
141     RC = (const TargetRegisterClass*)&Mips::GPR32RegClass;
142
143   V0 = RegInfo.createVirtualRegister(RC);
144   V1 = RegInfo.createVirtualRegister(RC);
145
146   if (Subtarget->isABI_N64()) {
147     MF.getRegInfo().addLiveIn(Mips::T9_64);
148     MBB.addLiveIn(Mips::T9_64);
149
150     // lui $v0, %hi(%neg(%gp_rel(fname)))
151     // daddu $v1, $v0, $t9
152     // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
153     const GlobalValue *FName = MF.getFunction();
154     BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0)
155       .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
156     BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0)
157       .addReg(Mips::T9_64);
158     BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
159       .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
160     return;
161   }
162
163   if (MF.getTarget().getRelocationModel() == Reloc::Static) {
164     // Set global register to __gnu_local_gp.
165     //
166     // lui   $v0, %hi(__gnu_local_gp)
167     // addiu $globalbasereg, $v0, %lo(__gnu_local_gp)
168     BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
169       .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI);
170     BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0)
171       .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO);
172     return;
173   }
174
175   MF.getRegInfo().addLiveIn(Mips::T9);
176   MBB.addLiveIn(Mips::T9);
177
178   if (Subtarget->isABI_N32()) {
179     // lui $v0, %hi(%neg(%gp_rel(fname)))
180     // addu $v1, $v0, $t9
181     // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
182     const GlobalValue *FName = MF.getFunction();
183     BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
184       .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
185     BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
186     BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
187       .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
188     return;
189   }
190
191   assert(Subtarget->isABI_O32());
192
193   // For O32 ABI, the following instruction sequence is emitted to initialize
194   // the global base register:
195   //
196   //  0. lui   $2, %hi(_gp_disp)
197   //  1. addiu $2, $2, %lo(_gp_disp)
198   //  2. addu  $globalbasereg, $2, $t9
199   //
200   // We emit only the last instruction here.
201   //
202   // GNU linker requires that the first two instructions appear at the beginning
203   // of a function and no instructions be inserted before or between them.
204   // The two instructions are emitted during lowering to MC layer in order to
205   // avoid any reordering.
206   //
207   // Register $2 (Mips::V0) is added to the list of live-in registers to ensure
208   // the value instruction 1 (addiu) defines is valid when instruction 2 (addu)
209   // reads it.
210   MF.getRegInfo().addLiveIn(Mips::V0);
211   MBB.addLiveIn(Mips::V0);
212   BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
213     .addReg(Mips::V0).addReg(Mips::T9);
214 }
215
216 void MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
217   initGlobalBaseReg(MF);
218
219   MachineRegisterInfo *MRI = &MF.getRegInfo();
220
221   for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE;
222        ++MFI)
223     for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) {
224       if (I->getOpcode() == Mips::RDDSP)
225         addDSPCtrlRegOperands(false, *I, MF);
226       else if (I->getOpcode() == Mips::WRDSP)
227         addDSPCtrlRegOperands(true, *I, MF);
228       else
229         replaceUsesWithZeroReg(MRI, *I);
230     }
231 }
232
233 SDNode *MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag,
234                                            SDValue CmpLHS, SDLoc DL,
235                                            SDNode *Node) const {
236   unsigned Opc = InFlag.getOpcode(); (void)Opc;
237
238   assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) ||
239           (Opc == ISD::SUBC || Opc == ISD::SUBE)) &&
240          "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn");
241
242   SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) };
243   SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
244   EVT VT = LHS.getValueType();
245
246   SDNode *Carry = CurDAG->getMachineNode(Mips::SLTu, DL, VT, Ops);
247   SDNode *AddCarry = CurDAG->getMachineNode(Mips::ADDu, DL, VT,
248                                             SDValue(Carry, 0), RHS);
249   return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS,
250                               SDValue(AddCarry, 0));
251 }
252
253 /// Match frameindex
254 bool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
255                                               SDValue &Offset) const {
256   if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
257     EVT ValTy = Addr.getValueType();
258
259     Base   = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
260     Offset = CurDAG->getTargetConstant(0, ValTy);
261     return true;
262   }
263   return false;
264 }
265
266 /// Match frameindex+offset and frameindex|offset
267 bool MipsSEDAGToDAGISel::selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base,
268                                                     SDValue &Offset,
269                                                     unsigned OffsetBits) const {
270   if (CurDAG->isBaseWithConstantOffset(Addr)) {
271     ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
272     if (isIntN(OffsetBits, CN->getSExtValue())) {
273       EVT ValTy = Addr.getValueType();
274
275       // If the first operand is a FI, get the TargetFI Node
276       if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>
277                                   (Addr.getOperand(0)))
278         Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
279       else
280         Base = Addr.getOperand(0);
281
282       Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy);
283       return true;
284     }
285   }
286   return false;
287 }
288
289 /// ComplexPattern used on MipsInstrInfo
290 /// Used on Mips Load/Store instructions
291 bool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
292                                           SDValue &Offset) const {
293   // if Address is FI, get the TargetFrameIndex.
294   if (selectAddrFrameIndex(Addr, Base, Offset))
295     return true;
296
297   // on PIC code Load GA
298   if (Addr.getOpcode() == MipsISD::Wrapper) {
299     Base   = Addr.getOperand(0);
300     Offset = Addr.getOperand(1);
301     return true;
302   }
303
304   if (TM.getRelocationModel() != Reloc::PIC_) {
305     if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
306         Addr.getOpcode() == ISD::TargetGlobalAddress))
307       return false;
308   }
309
310   // Addresses of the form FI+const or FI|const
311   if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
312     return true;
313
314   // Operand is a result from an ADD.
315   if (Addr.getOpcode() == ISD::ADD) {
316     // When loading from constant pools, load the lower address part in
317     // the instruction itself. Example, instead of:
318     //  lui $2, %hi($CPI1_0)
319     //  addiu $2, $2, %lo($CPI1_0)
320     //  lwc1 $f0, 0($2)
321     // Generate:
322     //  lui $2, %hi($CPI1_0)
323     //  lwc1 $f0, %lo($CPI1_0)($2)
324     if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
325         Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
326       SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
327       if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
328           isa<JumpTableSDNode>(Opnd0)) {
329         Base = Addr.getOperand(0);
330         Offset = Opnd0;
331         return true;
332       }
333     }
334   }
335
336   return false;
337 }
338
339 /// ComplexPattern used on MipsInstrInfo
340 /// Used on Mips Load/Store instructions
341 bool MipsSEDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base,
342                                           SDValue &Offset) const {
343   // Operand is a result from an ADD.
344   if (Addr.getOpcode() == ISD::ADD) {
345     Base = Addr.getOperand(0);
346     Offset = Addr.getOperand(1);
347     return true;
348   }
349
350   return false;
351 }
352
353 bool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
354                                            SDValue &Offset) const {
355   Base = Addr;
356   Offset = CurDAG->getTargetConstant(0, Addr.getValueType());
357   return true;
358 }
359
360 bool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
361                                        SDValue &Offset) const {
362   return selectAddrRegImm(Addr, Base, Offset) ||
363     selectAddrDefault(Addr, Base, Offset);
364 }
365
366 bool MipsSEDAGToDAGISel::selectAddrRegImm10(SDValue Addr, SDValue &Base,
367                                             SDValue &Offset) const {
368   if (selectAddrFrameIndex(Addr, Base, Offset))
369     return true;
370
371   if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10))
372     return true;
373
374   return false;
375 }
376
377 /// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
378 bool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
379                                             SDValue &Offset) const {
380   if (selectAddrFrameIndex(Addr, Base, Offset))
381     return true;
382
383   if (selectAddrFrameIndexOffset(Addr, Base, Offset, 12))
384     return true;
385
386   return false;
387 }
388
389 bool MipsSEDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base,
390                                          SDValue &Offset) const {
391   return selectAddrRegImm12(Addr, Base, Offset) ||
392     selectAddrDefault(Addr, Base, Offset);
393 }
394
395 bool MipsSEDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base,
396                                           SDValue &Offset) const {
397   if (selectAddrRegImm10(Addr, Base, Offset))
398     return true;
399
400   if (selectAddrDefault(Addr, Base, Offset))
401     return true;
402
403   return false;
404 }
405
406 // Select constant vector splats.
407 //
408 // Returns true and sets Imm if:
409 // * MSA is enabled
410 // * N is a ISD::BUILD_VECTOR representing a constant splat
411 bool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm) const {
412   if (!Subtarget->hasMSA())
413     return false;
414
415   BuildVectorSDNode *Node = dyn_cast<BuildVectorSDNode>(N);
416
417   if (!Node)
418     return false;
419
420   APInt SplatValue, SplatUndef;
421   unsigned SplatBitSize;
422   bool HasAnyUndefs;
423
424   if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
425                              HasAnyUndefs, 8,
426                              !Subtarget->isLittle()))
427     return false;
428
429   Imm = SplatValue;
430
431   return true;
432 }
433
434 // Select constant vector splats.
435 //
436 // In addition to the requirements of selectVSplat(), this function returns
437 // true and sets Imm if:
438 // * The splat value is the same width as the elements of the vector
439 // * The splat value fits in an integer with the specified signed-ness and
440 //   width.
441 //
442 // This function looks through ISD::BITCAST nodes.
443 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
444 //       sometimes a shuffle in big-endian mode.
445 //
446 // It's worth noting that this function is not used as part of the selection
447 // of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
448 // instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
449 // MipsSEDAGToDAGISel::selectNode.
450 bool MipsSEDAGToDAGISel::
451 selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
452                    unsigned ImmBitSize) const {
453   APInt ImmValue;
454   EVT EltTy = N->getValueType(0).getVectorElementType();
455
456   if (N->getOpcode() == ISD::BITCAST)
457     N = N->getOperand(0);
458
459   if (selectVSplat (N.getNode(), ImmValue) &&
460       ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
461     if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
462         (!Signed && ImmValue.isIntN(ImmBitSize))) {
463       Imm = CurDAG->getTargetConstant(ImmValue, EltTy);
464       return true;
465     }
466   }
467
468   return false;
469 }
470
471 // Select constant vector splats.
472 bool MipsSEDAGToDAGISel::
473 selectVSplatUimm1(SDValue N, SDValue &Imm) const {
474   return selectVSplatCommon(N, Imm, false, 1);
475 }
476
477 bool MipsSEDAGToDAGISel::
478 selectVSplatUimm2(SDValue N, SDValue &Imm) const {
479   return selectVSplatCommon(N, Imm, false, 2);
480 }
481
482 bool MipsSEDAGToDAGISel::
483 selectVSplatUimm3(SDValue N, SDValue &Imm) const {
484   return selectVSplatCommon(N, Imm, false, 3);
485 }
486
487 // Select constant vector splats.
488 bool MipsSEDAGToDAGISel::
489 selectVSplatUimm4(SDValue N, SDValue &Imm) const {
490   return selectVSplatCommon(N, Imm, false, 4);
491 }
492
493 // Select constant vector splats.
494 bool MipsSEDAGToDAGISel::
495 selectVSplatUimm5(SDValue N, SDValue &Imm) const {
496   return selectVSplatCommon(N, Imm, false, 5);
497 }
498
499 // Select constant vector splats.
500 bool MipsSEDAGToDAGISel::
501 selectVSplatUimm6(SDValue N, SDValue &Imm) const {
502   return selectVSplatCommon(N, Imm, false, 6);
503 }
504
505 // Select constant vector splats.
506 bool MipsSEDAGToDAGISel::
507 selectVSplatUimm8(SDValue N, SDValue &Imm) const {
508   return selectVSplatCommon(N, Imm, false, 8);
509 }
510
511 // Select constant vector splats.
512 bool MipsSEDAGToDAGISel::
513 selectVSplatSimm5(SDValue N, SDValue &Imm) const {
514   return selectVSplatCommon(N, Imm, true, 5);
515 }
516
517 // Select constant vector splats whose value is a power of 2.
518 //
519 // In addition to the requirements of selectVSplat(), this function returns
520 // true and sets Imm if:
521 // * The splat value is the same width as the elements of the vector
522 // * The splat value is a power of two.
523 //
524 // This function looks through ISD::BITCAST nodes.
525 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
526 //       sometimes a shuffle in big-endian mode.
527 bool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
528   APInt ImmValue;
529   EVT EltTy = N->getValueType(0).getVectorElementType();
530
531   if (N->getOpcode() == ISD::BITCAST)
532     N = N->getOperand(0);
533
534   if (selectVSplat (N.getNode(), ImmValue) &&
535       ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
536     int32_t Log2 = ImmValue.exactLogBase2();
537
538     if (Log2 != -1) {
539       Imm = CurDAG->getTargetConstant(Log2, EltTy);
540       return true;
541     }
542   }
543
544   return false;
545 }
546
547 // Select constant vector splats whose value only has a consecutive sequence
548 // of left-most bits set (e.g. 0b11...1100...00).
549 //
550 // In addition to the requirements of selectVSplat(), this function returns
551 // true and sets Imm if:
552 // * The splat value is the same width as the elements of the vector
553 // * The splat value is a consecutive sequence of left-most bits.
554 //
555 // This function looks through ISD::BITCAST nodes.
556 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
557 //       sometimes a shuffle in big-endian mode.
558 bool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
559   APInt ImmValue;
560   EVT EltTy = N->getValueType(0).getVectorElementType();
561
562   if (N->getOpcode() == ISD::BITCAST)
563     N = N->getOperand(0);
564
565   if (selectVSplat(N.getNode(), ImmValue) &&
566       ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
567     // Extract the run of set bits starting with bit zero from the bitwise
568     // inverse of ImmValue, and test that the inverse of this is the same
569     // as the original value.
570     if (ImmValue == ~(~ImmValue & ~(~ImmValue + 1))) {
571
572       Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
573       return true;
574     }
575   }
576
577   return false;
578 }
579
580 // Select constant vector splats whose value only has a consecutive sequence
581 // of right-most bits set (e.g. 0b00...0011...11).
582 //
583 // In addition to the requirements of selectVSplat(), this function returns
584 // true and sets Imm if:
585 // * The splat value is the same width as the elements of the vector
586 // * The splat value is a consecutive sequence of right-most bits.
587 //
588 // This function looks through ISD::BITCAST nodes.
589 // TODO: This might not be appropriate for big-endian MSA since BITCAST is
590 //       sometimes a shuffle in big-endian mode.
591 bool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
592   APInt ImmValue;
593   EVT EltTy = N->getValueType(0).getVectorElementType();
594
595   if (N->getOpcode() == ISD::BITCAST)
596     N = N->getOperand(0);
597
598   if (selectVSplat(N.getNode(), ImmValue) &&
599       ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
600     // Extract the run of set bits starting with bit zero, and test that the
601     // result is the same as the original value
602     if (ImmValue == (ImmValue & ~(ImmValue + 1))) {
603       Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
604       return true;
605     }
606   }
607
608   return false;
609 }
610
611 bool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
612                                                  SDValue &Imm) const {
613   APInt ImmValue;
614   EVT EltTy = N->getValueType(0).getVectorElementType();
615
616   if (N->getOpcode() == ISD::BITCAST)
617     N = N->getOperand(0);
618
619   if (selectVSplat(N.getNode(), ImmValue) &&
620       ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
621     int32_t Log2 = (~ImmValue).exactLogBase2();
622
623     if (Log2 != -1) {
624       Imm = CurDAG->getTargetConstant(Log2, EltTy);
625       return true;
626     }
627   }
628
629   return false;
630 }
631
632 std::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) {
633   unsigned Opcode = Node->getOpcode();
634   SDLoc DL(Node);
635
636   ///
637   // Instruction Selection not handled by the auto-generated
638   // tablegen selection should be handled here.
639   ///
640   SDNode *Result;
641
642   switch(Opcode) {
643   default: break;
644
645   case ISD::SUBE: {
646     SDValue InFlag = Node->getOperand(2);
647     Result = selectAddESubE(Mips::SUBu, InFlag, InFlag.getOperand(0), DL, Node);
648     return std::make_pair(true, Result);
649   }
650
651   case ISD::ADDE: {
652     if (Subtarget->hasDSP()) // Select DSP instructions, ADDSC and ADDWC.
653       break;
654     SDValue InFlag = Node->getOperand(2);
655     Result = selectAddESubE(Mips::ADDu, InFlag, InFlag.getValue(0), DL, Node);
656     return std::make_pair(true, Result);
657   }
658
659   case ISD::ConstantFP: {
660     ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node);
661     if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
662       if (Subtarget->isGP64bit()) {
663         SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
664                                               Mips::ZERO_64, MVT::i64);
665         Result = CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero);
666       } else if (Subtarget->isFP64bit()) {
667         SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
668                                               Mips::ZERO, MVT::i32);
669         Result = CurDAG->getMachineNode(Mips::BuildPairF64_64, DL, MVT::f64,
670                                         Zero, Zero);
671       } else {
672         SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
673                                               Mips::ZERO, MVT::i32);
674         Result = CurDAG->getMachineNode(Mips::BuildPairF64, DL, MVT::f64, Zero,
675                                         Zero);
676       }
677
678       return std::make_pair(true, Result);
679     }
680     break;
681   }
682
683   case ISD::Constant: {
684     const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node);
685     unsigned Size = CN->getValueSizeInBits(0);
686
687     if (Size == 32)
688       break;
689
690     MipsAnalyzeImmediate AnalyzeImm;
691     int64_t Imm = CN->getSExtValue();
692
693     const MipsAnalyzeImmediate::InstSeq &Seq =
694       AnalyzeImm.Analyze(Imm, Size, false);
695
696     MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
697     SDLoc DL(CN);
698     SDNode *RegOpnd;
699     SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
700                                                 MVT::i64);
701
702     // The first instruction can be a LUi which is different from other
703     // instructions (ADDiu, ORI and SLL) in that it does not have a register
704     // operand.
705     if (Inst->Opc == Mips::LUi64)
706       RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
707     else
708       RegOpnd =
709         CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
710                                CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
711                                ImmOpnd);
712
713     // The remaining instructions in the sequence are handled here.
714     for (++Inst; Inst != Seq.end(); ++Inst) {
715       ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
716                                           MVT::i64);
717       RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
718                                        SDValue(RegOpnd, 0), ImmOpnd);
719     }
720
721     return std::make_pair(true, RegOpnd);
722   }
723
724   case ISD::INTRINSIC_W_CHAIN: {
725     switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
726     default:
727       break;
728
729     case Intrinsic::mips_cfcmsa: {
730       SDValue ChainIn = Node->getOperand(0);
731       SDValue RegIdx = Node->getOperand(2);
732       SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
733                                            getMSACtrlReg(RegIdx), MVT::i32);
734       return std::make_pair(true, Reg.getNode());
735     }
736     }
737     break;
738   }
739
740   case ISD::INTRINSIC_WO_CHAIN: {
741     switch (cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue()) {
742     default:
743       break;
744
745     case Intrinsic::mips_move_v:
746       // Like an assignment but will always produce a move.v even if
747       // unnecessary.
748       return std::make_pair(true,
749                             CurDAG->getMachineNode(Mips::MOVE_V, DL,
750                                                    Node->getValueType(0),
751                                                    Node->getOperand(1)));
752     }
753     break;
754   }
755
756   case ISD::INTRINSIC_VOID: {
757     switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
758     default:
759       break;
760
761     case Intrinsic::mips_ctcmsa: {
762       SDValue ChainIn = Node->getOperand(0);
763       SDValue RegIdx  = Node->getOperand(2);
764       SDValue Value   = Node->getOperand(3);
765       SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
766                                               getMSACtrlReg(RegIdx), Value);
767       return std::make_pair(true, ChainOut.getNode());
768     }
769     }
770     break;
771   }
772
773   case MipsISD::ThreadPointer: {
774     EVT PtrVT = getTargetLowering()->getPointerTy();
775     unsigned RdhwrOpc, DestReg;
776
777     if (PtrVT == MVT::i32) {
778       RdhwrOpc = Mips::RDHWR;
779       DestReg = Mips::V1;
780     } else {
781       RdhwrOpc = Mips::RDHWR64;
782       DestReg = Mips::V1_64;
783     }
784
785     SDNode *Rdhwr =
786       CurDAG->getMachineNode(RdhwrOpc, SDLoc(Node),
787                              Node->getValueType(0),
788                              CurDAG->getRegister(Mips::HWR29, MVT::i32));
789     SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
790                                          SDValue(Rdhwr, 0));
791     SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
792     ReplaceUses(SDValue(Node, 0), ResNode);
793     return std::make_pair(true, ResNode.getNode());
794   }
795
796   case ISD::BUILD_VECTOR: {
797     // Select appropriate ldi.[bhwd] instructions for constant splats of
798     // 128-bit when MSA is enabled. Fixup any register class mismatches that
799     // occur as a result.
800     //
801     // This allows the compiler to use a wider range of immediates than would
802     // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
803     // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
804     // 0x01010101 } without using a constant pool. This would be sub-optimal
805     // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
806     // same set/ of registers. Similarly, ldi.h isn't capable of producing {
807     // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
808
809     BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
810     APInt SplatValue, SplatUndef;
811     unsigned SplatBitSize;
812     bool HasAnyUndefs;
813     unsigned LdiOp;
814     EVT ResVecTy = BVN->getValueType(0);
815     EVT ViaVecTy;
816
817     if (!Subtarget->hasMSA() || !BVN->getValueType(0).is128BitVector())
818       return std::make_pair(false, nullptr);
819
820     if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
821                               HasAnyUndefs, 8,
822                               !Subtarget->isLittle()))
823       return std::make_pair(false, nullptr);
824
825     switch (SplatBitSize) {
826     default:
827       return std::make_pair(false, nullptr);
828     case 8:
829       LdiOp = Mips::LDI_B;
830       ViaVecTy = MVT::v16i8;
831       break;
832     case 16:
833       LdiOp = Mips::LDI_H;
834       ViaVecTy = MVT::v8i16;
835       break;
836     case 32:
837       LdiOp = Mips::LDI_W;
838       ViaVecTy = MVT::v4i32;
839       break;
840     case 64:
841       LdiOp = Mips::LDI_D;
842       ViaVecTy = MVT::v2i64;
843       break;
844     }
845
846     if (!SplatValue.isSignedIntN(10))
847       return std::make_pair(false, nullptr);
848
849     SDValue Imm = CurDAG->getTargetConstant(SplatValue,
850                                             ViaVecTy.getVectorElementType());
851
852     SDNode *Res = CurDAG->getMachineNode(LdiOp, SDLoc(Node), ViaVecTy, Imm);
853
854     if (ResVecTy != ViaVecTy) {
855       // If LdiOp is writing to a different register class to ResVecTy, then
856       // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
857       // since the source and destination register sets contain the same
858       // registers.
859       const TargetLowering *TLI = getTargetLowering();
860       MVT ResVecTySimple = ResVecTy.getSimpleVT();
861       const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
862       Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, SDLoc(Node),
863                                    ResVecTy, SDValue(Res, 0),
864                                    CurDAG->getTargetConstant(RC->getID(),
865                                                              MVT::i32));
866     }
867
868     return std::make_pair(true, Res);
869   }
870
871   }
872
873   return std::make_pair(false, nullptr);
874 }
875
876 FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) {
877   return new MipsSEDAGToDAGISel(TM);
878 }