MipsSEISelDAGToDAG.cpp revision 6ff1ef9931b50763a40e9ae8696cfab9e25cf4de
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#define DEBUG_TYPE "mips-isel"
15554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsSEISelDAGToDAG.h"
16554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "Mips.h"
17554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h"
18554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsAnalyzeImmediate.h"
19554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsMachineFunction.h"
20554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsRegisterInfo.h"
21554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineConstantPool.h"
22554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineFrameInfo.h"
23554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineFunction.h"
24554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineInstrBuilder.h"
25554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/MachineRegisterInfo.h"
26554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/CodeGen/SelectionDAGNodes.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/CFG.h"
32554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/Debug.h"
33554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/ErrorHandling.h"
34554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Support/raw_ostream.h"
35554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "llvm/Target/TargetMachine.h"
36554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakausing namespace llvm;
37554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
38a430cb613b6e93c05f128b04323c57acfd08686dReed Kotlerbool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
39a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler  if (Subtarget.inMips16Mode())
40a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler    return false;
41a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler  return MipsDAGToDAGISel::runOnMachineFunction(MF);
42a430cb613b6e93c05f128b04323c57acfd08686dReed Kotler}
43554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
44a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanakavoid MipsSEDAGToDAGISel::addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI,
45a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka                                               MachineFunction &MF) {
46a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  MachineInstrBuilder MIB(MF, &MI);
47a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  unsigned Mask = MI.getOperand(1).getImm();
48a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  unsigned Flag = IsDef ? RegState::ImplicitDefine : RegState::Implicit;
49a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
50a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 1)
51a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPPos, Flag);
52a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
53a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 2)
54a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPSCount, Flag);
55a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
56a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 4)
57a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCarry, Flag);
58a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
59a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 8)
60a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPOutFlag, Flag);
61a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
62a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 16)
63a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCCond, Flag);
64a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
65a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 32)
66a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPEFI, Flag);
67a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka}
68a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
69a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sandersunsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
70a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  switch (cast<ConstantSDNode>(RegIdx)->getZExtValue()) {
71a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  default:
72a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    llvm_unreachable("Could not map int to register");
73a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 0: return Mips::MSAIR;
74a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 1: return Mips::MSACSR;
75a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 2: return Mips::MSAAccess;
76a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 3: return Mips::MSASave;
77a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 4: return Mips::MSAModify;
78a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 5: return Mips::MSARequest;
79a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 6: return Mips::MSAMap;
80a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 7: return Mips::MSAUnmap;
81a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
82a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders}
83a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
84f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
85554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                                const MachineInstr& MI) {
86554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned DstReg = 0, ZeroReg = 0;
87554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if ((MI.getOpcode() == Mips::ADDiu) &&
90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(1).getReg() == Mips::ZERO) &&
91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(2).getImm() == 0)) {
92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO;
94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  } else if ((MI.getOpcode() == Mips::DADDiu) &&
95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(2).getImm() == 0)) {
97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO_64;
99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!DstReg)
102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return false;
103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Replace uses with ZeroReg.
105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka       E = MRI->use_end(); U != E;) {
107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MachineOperand &MO = U.getOperand();
108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned OpNo = U.getOperandNo();
109554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MachineInstr *MI = MO.getParent();
110554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ++U;
111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Do not replace if it is a phi's operand or is tied to def operand.
113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      continue;
115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MO.setReg(ZeroReg);
117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
119554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
120554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
121554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
122f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
123554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
124554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!MipsFI->globalBaseRegSet())
126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock &MBB = MF.front();
129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock::iterator I = MBB.begin();
130554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo &RegInfo = MF.getRegInfo();
131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
133554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  const TargetRegisterClass *RC;
135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Subtarget.isABI_N64())
1371858786285139b87961d9ca08de91dcd59364afbAkira Hatanaka    RC = (const TargetRegisterClass*)&Mips::GPR64RegClass;
138554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  else
1391858786285139b87961d9ca08de91dcd59364afbAkira Hatanaka    RC = (const TargetRegisterClass*)&Mips::GPR32RegClass;
140554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V0 = RegInfo.createVirtualRegister(RC);
142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V1 = RegInfo.createVirtualRegister(RC);
143554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
144554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Subtarget.isABI_N64()) {
145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MF.getRegInfo().addLiveIn(Mips::T9_64);
146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MBB.addLiveIn(Mips::T9_64);
147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
149554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddu $v1, $v0, $t9
150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0)
153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0)
155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addReg(Mips::T9_64);
156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (MF.getTarget().getRelocationModel() == Reloc::Static) {
162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Set global register to __gnu_local_gp.
163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //
164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui   $v0, %hi(__gnu_local_gp)
165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v0, %lo(__gnu_local_gp)
166554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI);
168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0)
169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO);
170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::T9);
174554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::T9);
175554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Subtarget.isABI_N32()) {
177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addu $v1, $v0, $t9
179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
181554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
182554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
187554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
188554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  assert(Subtarget.isABI_O32());
190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // For O32 ABI, the following instruction sequence is emitted to initialize
192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the global base register:
193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  0. lui   $2, %hi(_gp_disp)
195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  1. addiu $2, $2, %lo(_gp_disp)
196554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  2. addu  $globalbasereg, $2, $t9
197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // We emit only the last instruction here.
199554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
200554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // GNU linker requires that the first two instructions appear at the beginning
201554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // of a function and no instructions be inserted before or between them.
202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // The two instructions are emitted during lowering to MC layer in order to
203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // avoid any reordering.
204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Register $2 (Mips::V0) is added to the list of live-in registers to ensure
206554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the value instruction 1 (addiu) defines is valid when instruction 2 (addu)
207554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // reads it.
208554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::V0);
209554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::V0);
210554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
211554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    .addReg(Mips::V0).addReg(Mips::T9);
212554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
213554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
214f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
215f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka  initGlobalBaseReg(MF);
216554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
217554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo *MRI = &MF.getRegInfo();
218554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
219554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE;
220554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka       ++MFI)
221a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) {
222a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      if (I->getOpcode() == Mips::RDDSP)
223a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        addDSPCtrlRegOperands(false, *I, MF);
224a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      else if (I->getOpcode() == Mips::WRDSP)
225a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        addDSPCtrlRegOperands(true, *I, MF);
226a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      else
227a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        replaceUsesWithZeroReg(MRI, *I);
228a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    }
229554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
230554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
231275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira HatanakaSDNode *MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag,
232ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                           SDValue CmpLHS, SDLoc DL,
233275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                                           SDNode *Node) const {
234275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  unsigned Opc = InFlag.getOpcode(); (void)Opc;
235275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
236275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) ||
237275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka          (Opc == ISD::SUBC || Opc == ISD::SUBE)) &&
238275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka         "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn");
239275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
240275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) };
241275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
242275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  EVT VT = LHS.getValueType();
243275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
2442a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao  SDNode *Carry = CurDAG->getMachineNode(Mips::SLTu, DL, VT, Ops);
245275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDNode *AddCarry = CurDAG->getMachineNode(Mips::ADDu, DL, VT,
246275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                                            SDValue(Carry, 0), RHS);
247275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS,
248275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                              SDValue(AddCarry, 0));
249275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka}
250275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
251554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// ComplexPattern used on MipsInstrInfo
252554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Used on Mips Load/Store instructions
253554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
254554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          SDValue &Offset) const {
255554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  EVT ValTy = Addr.getValueType();
256554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
257554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // if Address is FI, get the TargetFrameIndex.
258554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
259554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Base   = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
260554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Offset = CurDAG->getTargetConstant(0, ValTy);
261554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
262554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
263554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
264554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // on PIC code Load GA
265554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == MipsISD::Wrapper) {
266554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Base   = Addr.getOperand(0);
267554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Offset = Addr.getOperand(1);
268554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
269554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
270554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
271554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (TM.getRelocationModel() != Reloc::PIC_) {
272554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
273554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOpcode() == ISD::TargetGlobalAddress))
274554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return false;
275554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
276554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
277554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Addresses of the form FI+const or FI|const
278554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (CurDAG->isBaseWithConstantOffset(Addr)) {
279554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
280554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (isInt<16>(CN->getSExtValue())) {
281554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
282554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      // If the first operand is a FI, get the TargetFI Node
283554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>
284554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                  (Addr.getOperand(0)))
285554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
286554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      else
287554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Base = Addr.getOperand(0);
288554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
289554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy);
290554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return true;
291554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
292554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
293554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
294554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Operand is a result from an ADD.
295554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == ISD::ADD) {
296554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // When loading from constant pools, load the lower address part in
297554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // the instruction itself. Example, instead of:
298554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
299554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  addiu $2, $2, %lo($CPI1_0)
300554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, 0($2)
301554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Generate:
302554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
303554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, %lo($CPI1_0)($2)
304554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
305554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
306554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
307554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
308554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka          isa<JumpTableSDNode>(Opnd0)) {
309554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Base = Addr.getOperand(0);
310554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Offset = Opnd0;
311554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        return true;
312554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
313554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
314554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
315554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
316554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return false;
317554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
318554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
3192fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// ComplexPattern used on MipsInstrInfo
3202fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// Used on Mips Load/Store instructions
3212fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sandersbool MipsSEDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base,
3222fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders                                          SDValue &Offset) const {
3232fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  // Operand is a result from an ADD.
3242fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  if (Addr.getOpcode() == ISD::ADD) {
3252fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    Base = Addr.getOperand(0);
3262fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    Offset = Addr.getOperand(1);
3272fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    return true;
3282fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  }
3292fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders
3302fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  return false;
3312fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders}
3322fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders
333554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
334554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                           SDValue &Offset) const {
335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  Base = Addr;
336554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  Offset = CurDAG->getTargetConstant(0, Addr.getValueType());
337554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
338554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
339554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
340554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
341554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue &Offset) const {
342554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return selectAddrRegImm(Addr, Base, Offset) ||
343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    selectAddrDefault(Addr, Base, Offset);
344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
346da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter/// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
347da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carterbool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
348da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                            SDValue &Offset) const {
349da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  EVT ValTy = Addr.getValueType();
350da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
351da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  // Addresses of the form FI+const or FI|const
352da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  if (CurDAG->isBaseWithConstantOffset(Addr)) {
353da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
354da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    if (isInt<12>(CN->getSExtValue())) {
355da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
356906ae15d5fa5784595273228b33e16ca16a0431dZoran Jovanovic      // If the first operand is a FI then get the TargetFI Node
357da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter      if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>
358da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                  (Addr.getOperand(0)))
359da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
360da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter      else
361da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter        Base = Addr.getOperand(0);
362da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
363da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy);
364da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter      return true;
365da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    }
366da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  }
367da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
368da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return false;
369da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
370da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
371da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carterbool MipsSEDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base,
372da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                         SDValue &Offset) const {
373da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return selectAddrRegImm12(Addr, Base, Offset) ||
374da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    selectAddrDefault(Addr, Base, Offset);
375da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
376da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
377acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
378acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
379acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Returns true and sets Imm if:
380acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * MSA is enabled
381acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * N is a ISD::BUILD_VECTOR representing a constant splat
382acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm) const {
383acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (!Subtarget.hasMSA())
384acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
385acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
386acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  BuildVectorSDNode *Node = dyn_cast<BuildVectorSDNode>(N);
387acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
388acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (Node == NULL)
389acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
390acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
391acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt SplatValue, SplatUndef;
392acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  unsigned SplatBitSize;
393acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  bool HasAnyUndefs;
394acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
395acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
396acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                             HasAnyUndefs, 8,
397acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                             !Subtarget.isLittle()))
398acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
399acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
400acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  Imm = SplatValue;
401acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
402acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return true;
403acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
404acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
405acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
406acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
407acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
408acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
409acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
410acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value fits in an integer with the specified signed-ness and
411acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//   width.
412acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
413acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
414acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
415acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
416acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
417acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// It's worth noting that this function is not used as part of the selection
418acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
419acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
420acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// MipsSEDAGToDAGISel::selectNode.
421acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
422acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
423acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                   unsigned ImmBitSize) const {
424acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
425acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
426acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
427acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
428acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
429acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
430acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (selectVSplat (N.getNode(), ImmValue) &&
431acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
432acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
433acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders        (!Signed && ImmValue.isIntN(ImmBitSize))) {
434acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue, EltTy);
435acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
436acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
437acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
438acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
439acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
440acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
441acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
442acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
443acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
444c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm1(SDValue N, SDValue &Imm) const {
445c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 1);
446c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
447c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
448c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
449c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm2(SDValue N, SDValue &Imm) const {
450c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 2);
451c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
452c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
453c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
454acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm3(SDValue N, SDValue &Imm) const {
455acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 3);
456acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
457acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
458acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
459acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
460acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm4(SDValue N, SDValue &Imm) const {
461acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 4);
462acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
463acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
464acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
465acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
466acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm5(SDValue N, SDValue &Imm) const {
467acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 5);
468acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
469acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
470acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
471acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
472acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm6(SDValue N, SDValue &Imm) const {
473acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 6);
474acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
475acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
476acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
477acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
478acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm8(SDValue N, SDValue &Imm) const {
479acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 8);
480acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
481acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
482acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
483acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
484acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatSimm5(SDValue N, SDValue &Imm) const {
485acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, true, 5);
486acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
487acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
488acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats whose value is a power of 2.
489acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
490acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
491acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
492acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
493acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is a power of two.
494acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
495acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
496acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
497acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
498acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
499acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
500acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
501acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
502acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
503acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
504acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
505acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (selectVSplat (N.getNode(), ImmValue) &&
506acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
507acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    int32_t Log2 = ImmValue.exactLogBase2();
508acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
509acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (Log2 != -1) {
510acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Imm = CurDAG->getTargetConstant(Log2, EltTy);
511acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
512acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
513acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
514acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
515acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
516acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
517acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
5186ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
5196ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of left-most bits set (e.g. 0b11...1100...00).
5206ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5216ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
5226ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
5236ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
5246ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of left-most bits.
5256ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5266ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
5276ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
5286ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
5296ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
5306ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
5316ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
5326ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5336ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
5346ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
5356ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5366ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (selectVSplat(N.getNode(), ImmValue) &&
5376ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
5386ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero from the bitwise
5396ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // inverse of ImmValue, and test that the inverse of this is the same
5406ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // as the original value.
5416ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == ~(~ImmValue & ~(~ImmValue + 1))) {
5426ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5436ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
5446ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
5456ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
5466ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
5476ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5486ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
5496ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
5506ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5516ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
5526ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of right-most bits set (e.g. 0b00...0011...11).
5536ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5546ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
5556ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
5566ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
5576ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of right-most bits.
5586ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5596ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
5606ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
5616ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
5626ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
5636ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
5646ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
5656ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5666ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
5676ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
5686ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5696ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (selectVSplat(N.getNode(), ImmValue) &&
5706ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
5716ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero, and test that the
5726ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // result is the same as the original value
5736ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == (ImmValue & ~(ImmValue + 1))) {
5746ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
5756ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
5766ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
5776ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
5786ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5796ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
5806ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
5816ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
582f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakastd::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) {
583554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned Opcode = Node->getOpcode();
584ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(Node);
585554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
586554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
587554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Instruction Selection not handled by the auto-generated
588554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // tablegen selection should be handled here.
589554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
590554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  SDNode *Result;
591554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
592554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  switch(Opcode) {
593554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  default: break;
594554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
595275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::SUBE: {
596275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
597275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    Result = selectAddESubE(Mips::SUBu, InFlag, InFlag.getOperand(0), DL, Node);
598275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    return std::make_pair(true, Result);
599275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  }
600554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
601275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::ADDE: {
6023d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka    if (Subtarget.hasDSP()) // Select DSP instructions, ADDSC and ADDWC.
6033d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka      break;
604275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
605275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    Result = selectAddESubE(Mips::ADDu, InFlag, InFlag.getValue(0), DL, Node);
606554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, Result);
607554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
608554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
609554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::ConstantFP: {
610554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node);
611554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
612554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      if (Subtarget.hasMips64()) {
613f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
614554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO_64, MVT::i64);
615f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        Result = CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero);
616554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      } else {
617f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
618554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO, MVT::i32);
619f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        Result = CurDAG->getMachineNode(Mips::BuildPairF64, DL, MVT::f64, Zero,
620554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                        Zero);
621554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
622554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
623554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return std::make_pair(true, Result);
624554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
625554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    break;
626554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
627554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
628554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::Constant: {
629554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node);
630554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned Size = CN->getValueSizeInBits(0);
631554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
632554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Size == 32)
633554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      break;
634554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
635554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate AnalyzeImm;
636554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    int64_t Imm = CN->getSExtValue();
637554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
638554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const MipsAnalyzeImmediate::InstSeq &Seq =
639554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      AnalyzeImm.Analyze(Imm, Size, false);
640554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
641554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
642ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    SDLoc DL(CN);
643554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *RegOpnd;
644554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
645554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                                MVT::i64);
646554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
647554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The first instruction can be a LUi which is different from other
648554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // instructions (ADDiu, ORI and SLL) in that it does not have a register
649554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // operand.
650554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Inst->Opc == Mips::LUi64)
651554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
652554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    else
653554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd =
654554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
655554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
656554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               ImmOpnd);
657554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
658554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The remaining instructions in the sequence are handled here.
659554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    for (++Inst; Inst != Seq.end(); ++Inst) {
660554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
661554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          MVT::i64);
662554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
663554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue(RegOpnd, 0), ImmOpnd);
664554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
665554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
666554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, RegOpnd);
667554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
668554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
669a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_W_CHAIN: {
670a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
671a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
672a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
673a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
674a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_cfcmsa: {
675a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
676a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx = Node->getOperand(2);
677a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
678a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                           getMSACtrlReg(RegIdx), MVT::i32);
679a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      return std::make_pair(true, Reg.getNode());
680a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
681a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
682a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
683a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
684a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
685abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  case ISD::INTRINSIC_WO_CHAIN: {
686abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue()) {
687abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    default:
688abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      break;
689abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
690abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    case Intrinsic::mips_move_v:
691abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // Like an assignment but will always produce a move.v even if
692abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // unnecessary.
693abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      return std::make_pair(true,
694abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                            CurDAG->getMachineNode(Mips::MOVE_V, DL,
695abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                                                   Node->getValueType(0),
696abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                                                   Node->getOperand(1)));
697abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    }
698abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    break;
699abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  }
700abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
701a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_VOID: {
702a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
703a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
704a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
705a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
706a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_ctcmsa: {
707a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
708a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx  = Node->getOperand(2);
709a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Value   = Node->getOperand(3);
710a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
711a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                              getMSACtrlReg(RegIdx), Value);
712a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      return std::make_pair(true, ChainOut.getNode());
713a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
714a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
715a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
716a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
717a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
718554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case MipsISD::ThreadPointer: {
719ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling    EVT PtrVT = getTargetLowering()->getPointerTy();
72094a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka    unsigned RdhwrOpc, DestReg;
721554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
722554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (PtrVT == MVT::i32) {
723554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR;
724554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1;
725554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    } else {
726554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR64;
727554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1_64;
728554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
729554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
730554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *Rdhwr =
731ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick      CurDAG->getMachineNode(RdhwrOpc, SDLoc(Node),
732554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                             Node->getValueType(0),
73394a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka                             CurDAG->getRegister(Mips::HWR29, MVT::i32));
734f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
735554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                         SDValue(Rdhwr, 0));
736f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
737554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ReplaceUses(SDValue(Node, 0), ResNode);
738554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, ResNode.getNode());
739554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
740f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
741acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  case ISD::BUILD_VECTOR: {
742acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // Select appropriate ldi.[bhwd] instructions for constant splats of
743acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 128-bit when MSA is enabled. Fixup any register class mismatches that
744acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // occur as a result.
745acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    //
746acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // This allows the compiler to use a wider range of immediates than would
747acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
748acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
749acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x01010101 } without using a constant pool. This would be sub-optimal
750acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
751acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // same set/ of registers. Similarly, ldi.h isn't capable of producing {
752acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
753acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
754acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
755acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    APInt SplatValue, SplatUndef;
756acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned SplatBitSize;
757acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    bool HasAnyUndefs;
758acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned LdiOp;
759acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ResVecTy = BVN->getValueType(0);
760acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ViaVecTy;
761acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
762acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!Subtarget.hasMSA() || !BVN->getValueType(0).is128BitVector())
763acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return std::make_pair(false, (SDNode*)NULL);
764acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
765acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
766acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                              HasAnyUndefs, 8,
767acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                              !Subtarget.isLittle()))
768acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return std::make_pair(false, (SDNode*)NULL);
769acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
770acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    switch (SplatBitSize) {
771acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    default:
772acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return std::make_pair(false, (SDNode*)NULL);
773acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 8:
774acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_B;
775acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v16i8;
776acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
777acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 16:
778acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_H;
779acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v8i16;
780acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
781acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 32:
782acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_W;
783acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v4i32;
784acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
785acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 64:
786acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_D;
787acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v2i64;
788acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
789acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
790acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
791acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!SplatValue.isSignedIntN(10))
792acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return std::make_pair(false, (SDNode*)NULL);
793acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
794acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    SDValue Imm = CurDAG->getTargetConstant(SplatValue,
795acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                            ViaVecTy.getVectorElementType());
796acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
797acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    SDNode *Res = CurDAG->getMachineNode(LdiOp, SDLoc(Node), ViaVecTy, Imm);
798acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
799acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (ResVecTy != ViaVecTy) {
800acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // If LdiOp is writing to a different register class to ResVecTy, then
801acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
802acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // since the source and destination register sets contain the same
803acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // registers.
804acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetLowering *TLI = getTargetLowering();
805acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      MVT ResVecTySimple = ResVecTy.getSimpleVT();
806acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
807acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, SDLoc(Node),
808acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                   ResVecTy, SDValue(Res, 0),
809acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                   CurDAG->getTargetConstant(RC->getID(),
810acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                                             MVT::i32));
811acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
812acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
813acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return std::make_pair(true, Res);
814acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
815acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
816554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
817554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
818554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return std::make_pair(false, (SDNode*)NULL);
819554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
820554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
821554d9312b284265f91ac5ee5bf0351d446f669b1Akira HatanakaFunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) {
822554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return new MipsSEDAGToDAGISel(TM);
823554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
824