1554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//===-- MipsSEISelDAGToDAG.cpp - A Dag to Dag Inst Selector for MipsSE ----===//
2554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//
3554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//                     The LLVM Compiler Infrastructure
4554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//
5554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka// This file is distributed under the University of Illinois Open Source
6554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka// License. See LICENSE.TXT for details.
7554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//
8554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//===----------------------------------------------------------------------===//
9554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//
10554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka// Subclass of MipsDAGToDAGISel specialized for mips32/64.
11554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//
12554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka//===----------------------------------------------------------------------===//
13554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
14554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsSEISelDAGToDAG.h"
15554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "Mips.h"
17554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsAnalyzeImmediate.h"
18554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsMachineFunction.h"
19554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsRegisterInfo.h"
20554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineConstantPool.h"
21554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineFrameInfo.h"
22554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineFunction.h"
23554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h"
24554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineRegisterInfo.h"
25554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/SelectionDAGNodes.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CFG.h"
27554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/IR/GlobalValue.h"
28554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/IR/Instructions.h"
29554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/IR/Intrinsics.h"
30554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/IR/Type.h"
31554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/Debug.h"
32554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/ErrorHandling.h"
33554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/raw_ostream.h"
34554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Target/TargetMachine.h"
35554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakausing namespace llvm;
36554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "mips-isel"
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
39a430cb613b6e93c05f128b04323c57acfd08686dReed Kotlerbool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (Subtarget->inMips16Mode())
42a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler    return false;
43a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler  return MipsDAGToDAGISel::runOnMachineFunction(MF);
44a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler}
45554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
46a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanakavoid MipsSEDAGToDAGISel::addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI,
47a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka                                               MachineFunction &MF) {
48a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  MachineInstrBuilder MIB(MF, &MI);
49a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  unsigned Mask = MI.getOperand(1).getImm();
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned Flag =
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      IsDef ? RegState::ImplicitDefine : RegState::Implicit | RegState::Undef;
52a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
53a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 1)
54a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPPos, Flag);
55a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
56a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 2)
57a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPSCount, Flag);
58a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
59a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 4)
60a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCarry, Flag);
61a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
62a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 8)
63a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPOutFlag, Flag);
64a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
65a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 16)
66a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCCond, Flag);
67a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
68a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 32)
69a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPEFI, Flag);
70a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka}
71a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
72a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sandersunsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
73a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  switch (cast<ConstantSDNode>(RegIdx)->getZExtValue()) {
74a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  default:
75a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    llvm_unreachable("Could not map int to register");
76a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 0: return Mips::MSAIR;
77a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 1: return Mips::MSACSR;
78a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 2: return Mips::MSAAccess;
79a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 3: return Mips::MSASave;
80a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 4: return Mips::MSAModify;
81a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 5: return Mips::MSARequest;
82a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 6: return Mips::MSAMap;
83a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 7: return Mips::MSAUnmap;
84a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
85a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders}
86a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
87f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                                const MachineInstr& MI) {
89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned DstReg = 0, ZeroReg = 0;
90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if ((MI.getOpcode() == Mips::ADDiu) &&
93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(1).getReg() == Mips::ZERO) &&
94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(2).getImm() == 0)) {
95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO;
97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  } else if ((MI.getOpcode() == Mips::DADDiu) &&
98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(2).getImm() == 0)) {
100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO_64;
102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!DstReg)
105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return false;
106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Replace uses with ZeroReg.
108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
109554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka       E = MRI->use_end(); U != E;) {
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MachineOperand &MO = *U;
111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned OpNo = U.getOperandNo();
112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MachineInstr *MI = MO.getParent();
113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ++U;
114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Do not replace if it is a phi's operand or is tied to def operand.
116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      continue;
118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Also, we have to check that the register class of the operand
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // contains the zero register.
121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!MRI->getRegClass(MO.getReg())->contains(ZeroReg))
122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      continue;
123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
124554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MO.setReg(ZeroReg);
125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
130f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
133554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!MipsFI->globalBaseRegSet())
134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock &MBB = MF.front();
137554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock::iterator I = MBB.begin();
138554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo &RegInfo = MF.getRegInfo();
139ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DebugLoc DL;
141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  const TargetRegisterClass *RC;
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MipsABIInfo &ABI = static_cast<const MipsTargetMachine &>(TM).getABI();
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  RC = (ABI.IsN64()) ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V0 = RegInfo.createVirtualRegister(RC);
147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V1 = RegInfo.createVirtualRegister(RC);
148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ABI.IsN64()) {
150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MF.getRegInfo().addLiveIn(Mips::T9_64);
151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MBB.addLiveIn(Mips::T9_64);
152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddu $v1, $v0, $t9
155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0)
158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0)
160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addReg(Mips::T9_64);
161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!MF.getTarget().isPositionIndependent()) {
167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Set global register to __gnu_local_gp.
168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //
169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui   $v0, %hi(__gnu_local_gp)
170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v0, %lo(__gnu_local_gp)
171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI);
173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0)
174554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO);
175554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::T9);
179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::T9);
180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
181ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ABI.IsN32()) {
182554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addu $v1, $v0, $t9
184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
187554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
188554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
194ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  assert(ABI.IsO32());
195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
196554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // For O32 ABI, the following instruction sequence is emitted to initialize
197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the global base register:
198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
199554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  0. lui   $2, %hi(_gp_disp)
200554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  1. addiu $2, $2, %lo(_gp_disp)
201554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  2. addu  $globalbasereg, $2, $t9
202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // We emit only the last instruction here.
204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // GNU linker requires that the first two instructions appear at the beginning
206554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // of a function and no instructions be inserted before or between them.
207554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // The two instructions are emitted during lowering to MC layer in order to
208554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // avoid any reordering.
209554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
210554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Register $2 (Mips::V0) is added to the list of live-in registers to ensure
211554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the value instruction 1 (addiu) defines is valid when instruction 2 (addu)
212554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // reads it.
213554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::V0);
214554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::V0);
215554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
216554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    .addReg(Mips::V0).addReg(Mips::T9);
217554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
218554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
219f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
220f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka  initGlobalBaseReg(MF);
221554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
222554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo *MRI = &MF.getRegInfo();
223554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &MBB: MF) {
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto &MI: MBB) {
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (MI.getOpcode()) {
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case Mips::RDDSP:
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        addDSPCtrlRegOperands(false, MI, MF);
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      case Mips::WRDSP:
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        addDSPCtrlRegOperands(true, MI, MF);
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        break;
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      default:
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        replaceUsesWithZeroReg(MRI, MI);
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
236a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    }
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
238554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
239554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag,
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        SDValue CmpLHS, const SDLoc &DL,
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        SDNode *Node) const {
243275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  unsigned Opc = InFlag.getOpcode(); (void)Opc;
244275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
245275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) ||
246275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka          (Opc == ISD::SUBC || Opc == ISD::SUBE)) &&
247275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka         "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn");
248275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
249ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned SLTuOp = Mips::SLTu, ADDuOp = Mips::ADDu;
250ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Subtarget->isGP64bit()) {
251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    SLTuOp = Mips::SLTu64;
252ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    ADDuOp = Mips::DADDu;
253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
254ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
255275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) };
256275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
257275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  EVT VT = LHS.getValueType();
258275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  SDNode *Carry = CurDAG->getMachineNode(SLTuOp, DL, VT, Ops);
260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Subtarget->isGP64bit()) {
262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // On 64-bit targets, sltu produces an i64 but our backend currently says
263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // that SLTu64 produces an i32. We need to fix this in the long run but for
264ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // now, just make the DAG type-correct by asserting the upper bits are zero.
265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Carry = CurDAG->getMachineNode(Mips::SUBREG_TO_REG, DL, VT,
2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                   CurDAG->getTargetConstant(0, DL, VT),
267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                   SDValue(Carry, 0),
2686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                   CurDAG->getTargetConstant(Mips::sub_32, DL,
2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                             VT));
270ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
271ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
2724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Generate a second addition only if we know that RHS is not a
2734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // constant-zero node.
2744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SDNode *AddCarry = Carry;
2754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS);
2764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (!C || C->getZExtValue())
2774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    AddCarry = CurDAG->getMachineNode(ADDuOp, DL, VT, SDValue(Carry, 0), RHS);
278ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS, SDValue(AddCarry, 0));
280275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka}
281275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Match frameindex
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                              SDValue &Offset) const {
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EVT ValTy = Addr.getValueType();
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Base   = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
2896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), ValTy);
29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Match frameindex+offset and frameindex|offset
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base,
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    SDValue &Offset,
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    unsigned OffsetBits) const {
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (CurDAG->isBaseWithConstantOffset(Addr)) {
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (isIntN(OffsetBits, CN->getSExtValue())) {
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      EVT ValTy = Addr.getValueType();
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // If the first operand is a FI, get the TargetFI Node
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  (Addr.getOperand(0)))
30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      else
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Base = Addr.getOperand(0);
31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr),
3126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                         ValTy);
31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return true;
31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
319554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// ComplexPattern used on MipsInstrInfo
320554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Used on Mips Load/Store instructions
321554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
322554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          SDValue &Offset) const {
323554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // if Address is FI, get the TargetFrameIndex.
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
325554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
326554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
327554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // on PIC code Load GA
328554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == MipsISD::Wrapper) {
329554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Base   = Addr.getOperand(0);
330554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Offset = Addr.getOperand(1);
331554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
332554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
333554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!TM.isPositionIndependent()) {
335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
336554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOpcode() == ISD::TargetGlobalAddress))
337554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return false;
338554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
339554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
340554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Addresses of the form FI+const or FI|const
34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Operand is a result from an ADD.
345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == ISD::ADD) {
346554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // When loading from constant pools, load the lower address part in
347554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // the instruction itself. Example, instead of:
348554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
349554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  addiu $2, $2, %lo($CPI1_0)
350554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, 0($2)
351554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Generate:
352554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
353554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, %lo($CPI1_0)($2)
354554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
355554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
356554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
357554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
358554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka          isa<JumpTableSDNode>(Opnd0)) {
359554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Base = Addr.getOperand(0);
360554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Offset = Opnd0;
361554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        return true;
362554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
363554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
364554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
365554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
366554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return false;
367554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
368554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
3692fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// ComplexPattern used on MipsInstrInfo
3702fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// Used on Mips Load/Store instructions
371554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
372554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                           SDValue &Offset) const {
373554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  Base = Addr;
3746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), Addr.getValueType());
375554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
376554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
377554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
378554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
379554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue &Offset) const {
380554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return selectAddrRegImm(Addr, Base, Offset) ||
381554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    selectAddrDefault(Addr, Base, Offset);
382554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
383554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
3844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectAddrRegImm9(SDValue Addr, SDValue &Base,
3854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                           SDValue &Offset) const {
3864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (selectAddrFrameIndex(Addr, Base, Offset))
3874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
3884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
3894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 9))
3904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
3914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
3924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return false;
3934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
3944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrRegImm10(SDValue Addr, SDValue &Base,
396da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                            SDValue &Offset) const {
39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
399da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10))
40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
402da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
405da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Used on microMIPS LWC2, LDC2, SWC2 and SDC2 instructions (11-bit offset)
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectAddrRegImm11(SDValue Addr, SDValue &Base,
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            SDValue &Offset) const {
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (selectAddrFrameIndex(Addr, Base, Offset))
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 11))
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                            SDValue &Offset) const {
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 12))
42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
426da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
427da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return false;
428da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
429da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
4304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectAddrRegImm16(SDValue Addr, SDValue &Base,
4314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                            SDValue &Offset) const {
4324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (selectAddrFrameIndex(Addr, Base, Offset))
4334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
4344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
4354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
4364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return true;
4374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
4384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return false;
4394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
4404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         SDValue &Offset) const {
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return selectAddrRegImm11(Addr, Base, Offset) ||
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    selectAddrDefault(Addr, Base, Offset);
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
448da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                         SDValue &Offset) const {
449da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return selectAddrRegImm12(Addr, Base, Offset) ||
450da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    selectAddrDefault(Addr, Base, Offset);
451da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
452da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                         SDValue &Offset) const {
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return selectAddrRegImm16(Addr, Base, Offset) ||
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    selectAddrDefault(Addr, Base, Offset);
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
459ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
460ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                             SDValue &Offset) const {
461ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 7)) {
462ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (isa<FrameIndexSDNode>(Base))
463ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return false;
464ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
465ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Offset)) {
466ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      unsigned CnstOff = CN->getZExtValue();
467ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return (CnstOff == (CnstOff & 0x3c));
468ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
469ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
470ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
471ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
472ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
473ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // For all other cases where "lw" would be selected, don't select "lw16"
474ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // because it would result in additional instructions to prepare operands.
475ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (selectAddrRegImm(Addr, Base, Offset))
476ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
477ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
478ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return selectAddrDefault(Addr, Base, Offset);
479ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
480ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base,
48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          SDValue &Offset) const {
48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrRegImm10(Addr, Base, Offset))
48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrDefault(Addr, Base, Offset))
48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
492acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
493acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
494acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Returns true and sets Imm if:
495acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * MSA is enabled
496acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * N is a ISD::BUILD_VECTOR representing a constant splat
4976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm,
4986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                      unsigned MinSizeInBits) const {
499c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!Subtarget->hasMSA())
500acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
501acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
502acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  BuildVectorSDNode *Node = dyn_cast<BuildVectorSDNode>(N);
503acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
504dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Node)
505acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
506acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
507acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt SplatValue, SplatUndef;
508acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  unsigned SplatBitSize;
509acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  bool HasAnyUndefs;
510acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
5116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
5126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                             MinSizeInBits, !Subtarget->isLittle()))
513acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
514acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
515acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  Imm = SplatValue;
516acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
517acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return true;
518acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
519acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
520acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
521acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
522acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
523acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
524acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
525acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value fits in an integer with the specified signed-ness and
526acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//   width.
527acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
528acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
529acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
530acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
531acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
532acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// It's worth noting that this function is not used as part of the selection
533acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
534acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
535acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// MipsSEDAGToDAGISel::selectNode.
536acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
537acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
538acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                   unsigned ImmBitSize) const {
539acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
540acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
541acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
542acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
543acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
544acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
5456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
546acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
5476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
548acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
549acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders        (!Signed && ImmValue.isIntN(ImmBitSize))) {
5506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Imm = CurDAG->getTargetConstant(ImmValue, SDLoc(N), EltTy);
551acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
552acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
553acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
554acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
555acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
556acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
557acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
558acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
559acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
560c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm1(SDValue N, SDValue &Imm) const {
561c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 1);
562c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
563c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
564c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
565c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm2(SDValue N, SDValue &Imm) const {
566c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 2);
567c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
568c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
569c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
570acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm3(SDValue N, SDValue &Imm) const {
571acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 3);
572acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
573acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
574acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
575acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
576acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm4(SDValue N, SDValue &Imm) const {
577acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 4);
578acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
579acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
580acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
581acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
582acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm5(SDValue N, SDValue &Imm) const {
583acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 5);
584acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
585acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
586acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
587acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
588acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm6(SDValue N, SDValue &Imm) const {
589acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 6);
590acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
591acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
592acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
593acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
594acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm8(SDValue N, SDValue &Imm) const {
595acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 8);
596acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
597acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
598acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
599acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
600acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatSimm5(SDValue N, SDValue &Imm) const {
601acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, true, 5);
602acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
603acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
604acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats whose value is a power of 2.
605acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
606acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
607acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
608acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
609acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is a power of two.
610acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
611acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
612acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
613acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
614acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
615acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
616acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
617acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
618acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
619acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
620acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
6216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
622acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
623acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    int32_t Log2 = ImmValue.exactLogBase2();
624acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
625acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (Log2 != -1) {
6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
627acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
628acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
629acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
630acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
631acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
632acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
633acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
6346ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
6356ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of left-most bits set (e.g. 0b11...1100...00).
6366ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6376ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
6386ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
6396ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
6406ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of left-most bits.
6416ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6426ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
6436ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
6446ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
6456ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
6466ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
6476ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
6486ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6496ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
6506ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
6516ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
6536ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
6546ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero from the bitwise
6556ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // inverse of ImmValue, and test that the inverse of this is the same
6566ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // as the original value.
6576ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == ~(~ImmValue & ~(~ImmValue + 1))) {
6586ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), SDLoc(N),
6606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                      EltTy);
6616ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
6626ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
6636ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
6646ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6656ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
6666ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
6676ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6686ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
6696ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of right-most bits set (e.g. 0b00...0011...11).
6706ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6716ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
6726ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
6736ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
6746ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of right-most bits.
6756ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6766ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
6776ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
6786ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
6796ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
6806ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
6816ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
6826ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6836ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
6846ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
6856ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
6876ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
6886ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero, and test that the
6896ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // result is the same as the original value
6906ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == (ImmValue & ~(ImmValue + 1))) {
6916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), SDLoc(N),
6926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                      EltTy);
6936ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
6946ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
6956ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
6966ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6976ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
6986ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
6996ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
700bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
701bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders                                                 SDValue &Imm) const {
702bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  APInt ImmValue;
703bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
704bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
705bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
706bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    N = N->getOperand(0);
707bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
7086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
709bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
710bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    int32_t Log2 = (~ImmValue).exactLogBase2();
711bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
712bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    if (Log2 != -1) {
7136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Imm = CurDAG->getTargetConstant(Log2, SDLoc(N), EltTy);
714bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders      return true;
715bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    }
716bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  }
717bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
718bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  return false;
719bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders}
720bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MipsSEDAGToDAGISel::trySelect(SDNode *Node) {
722554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned Opcode = Node->getOpcode();
723ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(Node);
724554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
725554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
726554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Instruction Selection not handled by the auto-generated
727554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // tablegen selection should be handled here.
728554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
729554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  switch(Opcode) {
730554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  default: break;
731554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
732275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::SUBE: {
733275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
734ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned Opc = Subtarget->isGP64bit() ? Mips::DSUBu : Mips::SUBu;
735de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    selectAddESubE(Opc, InFlag, InFlag.getOperand(0), DL, Node);
736de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
737275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  }
738554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
739275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::ADDE: {
740c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (Subtarget->hasDSP()) // Select DSP instructions, ADDSC and ADDWC.
7413d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka      break;
742275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
743ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned Opc = Subtarget->isGP64bit() ? Mips::DADDu : Mips::ADDu;
744de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    selectAddESubE(Opc, InFlag, InFlag.getValue(0), DL, Node);
745de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
746554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
747554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
748554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::ConstantFP: {
749554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node);
750554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
751c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (Subtarget->isGP64bit()) {
752f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
753554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO_64, MVT::i64);
754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ReplaceNode(Node,
755de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero));
756c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      } else if (Subtarget->isFP64bit()) {
75723427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
75823427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders                                              Mips::ZERO, MVT::i32);
759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ReplaceNode(Node, CurDAG->getMachineNode(Mips::BuildPairF64_64, DL,
760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 MVT::f64, Zero, Zero));
761554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      } else {
762f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
763554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO, MVT::i32);
764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        ReplaceNode(Node, CurDAG->getMachineNode(Mips::BuildPairF64, DL,
765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 MVT::f64, Zero, Zero));
766554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
768554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
769554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    break;
770554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
771554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
772554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::Constant: {
773554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node);
774554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned Size = CN->getValueSizeInBits(0);
775554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
776554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Size == 32)
777554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      break;
778554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
779554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate AnalyzeImm;
780554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    int64_t Imm = CN->getSExtValue();
781554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
782554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const MipsAnalyzeImmediate::InstSeq &Seq =
783554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      AnalyzeImm.Analyze(Imm, Size, false);
784554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
785554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
786ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    SDLoc DL(CN);
787554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *RegOpnd;
788554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
7896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                                DL, MVT::i64);
790554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
791554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The first instruction can be a LUi which is different from other
792554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // instructions (ADDiu, ORI and SLL) in that it does not have a register
793554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // operand.
794554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Inst->Opc == Mips::LUi64)
795554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
796554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    else
797554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd =
798554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
799554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
800554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               ImmOpnd);
801554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
802554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The remaining instructions in the sequence are handled here.
803554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    for (++Inst; Inst != Seq.end(); ++Inst) {
8046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), DL,
805554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          MVT::i64);
806554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
807554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue(RegOpnd, 0), ImmOpnd);
808554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
809554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ReplaceNode(Node, RegOpnd);
811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
812554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
813554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
814a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_W_CHAIN: {
815a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
816a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
817a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
818a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
819a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_cfcmsa: {
820a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
821a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx = Node->getOperand(2);
822a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
823a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                           getMSACtrlReg(RegIdx), MVT::i32);
824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ReplaceNode(Node, Reg.getNode());
825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
826a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
827a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
828a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
829a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
830a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
831abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  case ISD::INTRINSIC_WO_CHAIN: {
832abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue()) {
833abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    default:
834abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      break;
835abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
836abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    case Intrinsic::mips_move_v:
837abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // Like an assignment but will always produce a move.v even if
838abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // unnecessary.
839de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ReplaceNode(Node, CurDAG->getMachineNode(Mips::MOVE_V, DL,
840de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               Node->getValueType(0),
841de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               Node->getOperand(1)));
842de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
843abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    }
844abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    break;
845abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  }
846abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
847a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_VOID: {
848a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
849a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
850a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
851a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
852a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_ctcmsa: {
853a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
854a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx  = Node->getOperand(2);
855a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Value   = Node->getOperand(3);
856a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
857a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                              getMSACtrlReg(RegIdx), Value);
858de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ReplaceNode(Node, ChainOut.getNode());
859de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return true;
860a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
861a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
862a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
863a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
864a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
865554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case MipsISD::ThreadPointer: {
866f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    EVT PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout());
86794a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka    unsigned RdhwrOpc, DestReg;
868554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
869554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (PtrVT == MVT::i32) {
870554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR;
871554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1;
872554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    } else {
873554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR64;
874554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1_64;
875554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
876554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
877554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *Rdhwr =
8786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      CurDAG->getMachineNode(RdhwrOpc, DL,
879554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                             Node->getValueType(0),
88094a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka                             CurDAG->getRegister(Mips::HWR29, MVT::i32));
881f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
882554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                         SDValue(Rdhwr, 0));
883f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
884de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ReplaceNode(Node, ResNode.getNode());
885de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
886554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
887f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
888acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  case ISD::BUILD_VECTOR: {
889acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // Select appropriate ldi.[bhwd] instructions for constant splats of
890acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 128-bit when MSA is enabled. Fixup any register class mismatches that
891acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // occur as a result.
892acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    //
893acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // This allows the compiler to use a wider range of immediates than would
894acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
895acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
896acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x01010101 } without using a constant pool. This would be sub-optimal
897acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
898acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // same set/ of registers. Similarly, ldi.h isn't capable of producing {
899acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
900acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
901acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
902acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    APInt SplatValue, SplatUndef;
903acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned SplatBitSize;
904acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    bool HasAnyUndefs;
905acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned LdiOp;
906acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ResVecTy = BVN->getValueType(0);
907acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ViaVecTy;
908acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
909c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (!Subtarget->hasMSA() || !BVN->getValueType(0).is128BitVector())
910de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
911acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
912acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
913acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                              HasAnyUndefs, 8,
914c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                              !Subtarget->isLittle()))
915de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
916acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
917acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    switch (SplatBitSize) {
918acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    default:
919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
920acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 8:
921acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_B;
922acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v16i8;
923acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
924acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 16:
925acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_H;
926acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v8i16;
927acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
928acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 32:
929acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_W;
930acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v4i32;
931acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
932acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 64:
933acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_D;
934acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v2i64;
935acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
936acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
937acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
938acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!SplatValue.isSignedIntN(10))
939de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return false;
940acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
9416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    SDValue Imm = CurDAG->getTargetConstant(SplatValue, DL,
942acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                            ViaVecTy.getVectorElementType());
943acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
9446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    SDNode *Res = CurDAG->getMachineNode(LdiOp, DL, ViaVecTy, Imm);
945acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
946acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (ResVecTy != ViaVecTy) {
947acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // If LdiOp is writing to a different register class to ResVecTy, then
948acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
949acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // since the source and destination register sets contain the same
950acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // registers.
951acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetLowering *TLI = getTargetLowering();
952acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      MVT ResVecTySimple = ResVecTy.getSimpleVT();
953acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
9546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, DL,
955acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                   ResVecTy, SDValue(Res, 0),
9566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                   CurDAG->getTargetConstant(RC->getID(), DL,
957acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                                             MVT::i32));
958acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
959acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
960de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ReplaceNode(Node, Res);
961de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
962acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
963acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
964554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
965554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
966de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
967554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
968554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
9694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool MipsSEDAGToDAGISel::
9704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarSelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
9714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                             std::vector<SDValue> &OutOps) {
9724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  SDValue Base, Offset;
9734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
9744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch(ConstraintID) {
9754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
9764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unexpected asm memory constraint");
9774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // All memory constraints can at least accept raw pointers.
9784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case InlineAsm::Constraint_i:
9794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    OutOps.push_back(Op);
9806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
9814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return false;
9824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case InlineAsm::Constraint_m:
9834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (selectAddrRegImm16(Op, Base, Offset)) {
9844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      OutOps.push_back(Base);
9854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      OutOps.push_back(Offset);
9864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return false;
9874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
9884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    OutOps.push_back(Op);
9896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
9904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return false;
9910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  case InlineAsm::Constraint_R:
9920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // The 'R' constraint is supposed to be much more complicated than this.
9930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // However, it's becoming less useful due to architectural changes and
9940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // ought to be replaced by other constraints such as 'ZC'.
9950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // For now, support 9-bit signed offsets which is supportable by all
9960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // subtargets for all instructions.
9970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (selectAddrRegImm9(Op, Base, Offset)) {
9980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      OutOps.push_back(Base);
9990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      OutOps.push_back(Offset);
10000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      return false;
10010c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
10020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    OutOps.push_back(Op);
10036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
10040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return false;
10054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case InlineAsm::Constraint_ZC:
10064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    // ZC matches whatever the pref, ll, and sc instructions can handle for the
10074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    // given subtarget.
10084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (Subtarget->inMicroMipsMode()) {
10094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // On microMIPS, they can handle 12-bit offsets.
10104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      if (selectAddrRegImm12(Op, Base, Offset)) {
10114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        OutOps.push_back(Base);
10124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        OutOps.push_back(Offset);
10134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        return false;
10144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      }
10154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    } else if (Subtarget->hasMips32r6()) {
10164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // On MIPS32r6/MIPS64r6, they can only handle 9-bit offsets.
10174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      if (selectAddrRegImm9(Op, Base, Offset)) {
10184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        OutOps.push_back(Base);
10194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        OutOps.push_back(Offset);
10204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        return false;
10214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      }
10224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    } else if (selectAddrRegImm16(Op, Base, Offset)) {
10234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      // Prior to MIPS32r6/MIPS64r6, they can handle 16-bit offsets.
10244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      OutOps.push_back(Base);
10254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      OutOps.push_back(Offset);
10264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return false;
10274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
10284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    // In all cases, 0-bit offsets are acceptable.
10294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    OutOps.push_back(Op);
10306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32));
10314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return false;
10324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
10334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return true;
10344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
10354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1036de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarFunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM,
1037de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        CodeGenOpt::Level OptLevel) {
1038de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return new MipsSEDAGToDAGISel(TM, OptLevel);
1039554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
1040