MipsSEISelDAGToDAG.cpp revision ebe69fe11e48d322045d5949c83283927a0d790b
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();
50a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  unsigned Flag = IsDef ? RegState::ImplicitDefine : RegState::Implicit;
51a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
52a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 1)
53a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPPos, Flag);
54a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
55a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 2)
56a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPSCount, Flag);
57a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
58a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 4)
59a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCarry, Flag);
60a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
61a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 8)
62a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPOutFlag, Flag);
63a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
64a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 16)
65a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPCCond, Flag);
66a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
67a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka  if (Mask & 32)
68a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    MIB.addReg(Mips::DSPEFI, Flag);
69a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka}
70a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka
71a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sandersunsigned MipsSEDAGToDAGISel::getMSACtrlReg(const SDValue RegIdx) const {
72a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  switch (cast<ConstantSDNode>(RegIdx)->getZExtValue()) {
73a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  default:
74a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    llvm_unreachable("Could not map int to register");
75a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 0: return Mips::MSAIR;
76a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 1: return Mips::MSACSR;
77a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 2: return Mips::MSAAccess;
78a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 3: return Mips::MSASave;
79a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 4: return Mips::MSAModify;
80a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 5: return Mips::MSARequest;
81a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 6: return Mips::MSAMap;
82a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case 7: return Mips::MSAUnmap;
83a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
84a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders}
85a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
86f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
87554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                                const MachineInstr& MI) {
88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned DstReg = 0, ZeroReg = 0;
89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0".
91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if ((MI.getOpcode() == Mips::ADDiu) &&
92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(1).getReg() == Mips::ZERO) &&
93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      (MI.getOperand(2).getImm() == 0)) {
94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO;
96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  } else if ((MI.getOpcode() == Mips::DADDiu) &&
97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(1).getReg() == Mips::ZERO_64) &&
98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka             (MI.getOperand(2).getImm() == 0)) {
99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    DstReg = MI.getOperand(0).getReg();
100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ZeroReg = Mips::ZERO_64;
101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!DstReg)
104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return false;
105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Replace uses with ZeroReg.
107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg),
108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka       E = MRI->use_end(); U != E;) {
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MachineOperand &MO = *U;
110554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned OpNo = U.getOperandNo();
111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MachineInstr *MI = MO.getParent();
112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ++U;
113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Do not replace if it is a phi's operand or is tied to def operand.
115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      continue;
117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MO.setReg(ZeroReg);
119554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
120554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
121554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
122554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
123554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
124f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) {
125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (!MipsFI->globalBaseRegSet())
128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
130554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock &MBB = MF.front();
131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineBasicBlock::iterator I = MBB.begin();
132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo &RegInfo = MF.getRegInfo();
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg();
136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  const TargetRegisterClass *RC;
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MipsABIInfo &ABI = static_cast<const MipsTargetMachine &>(TM).getABI();
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  RC = (ABI.IsN64()) ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
139554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
140554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V0 = RegInfo.createVirtualRegister(RC);
141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  V1 = RegInfo.createVirtualRegister(RC);
142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ABI.IsN64()) {
144554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MF.getRegInfo().addLiveIn(Mips::T9_64);
145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MBB.addLiveIn(Mips::T9_64);
146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddu $v1, $v0, $t9
149554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0)
152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0)
154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addReg(Mips::T9_64);
155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1)
156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (MF.getTarget().getRelocationModel() == Reloc::Static) {
161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Set global register to __gnu_local_gp.
162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //
163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui   $v0, %hi(__gnu_local_gp)
164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v0, %lo(__gnu_local_gp)
165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
166554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI);
167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0)
168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO);
169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::T9);
173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::T9);
174554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ABI.IsN32()) {
176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // lui $v0, %hi(%neg(%gp_rel(fname)))
177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addu $v1, $v0, $t9
178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname)))
179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const GlobalValue *FName = MF.getFunction();
180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0)
181554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI);
182554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9);
183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1)
184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO);
185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return;
186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
187554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  assert(ABI.IsO32());
189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // For O32 ABI, the following instruction sequence is emitted to initialize
191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the global base register:
192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  0. lui   $2, %hi(_gp_disp)
194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  1. addiu $2, $2, %lo(_gp_disp)
195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //  2. addu  $globalbasereg, $2, $t9
196554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // We emit only the last instruction here.
198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
199554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // GNU linker requires that the first two instructions appear at the beginning
200554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // of a function and no instructions be inserted before or between them.
201554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // The two instructions are emitted during lowering to MC layer in order to
202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // avoid any reordering.
203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  //
204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Register $2 (Mips::V0) is added to the list of live-in registers to ensure
205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // the value instruction 1 (addiu) defines is valid when instruction 2 (addu)
206554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // reads it.
207554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MF.getRegInfo().addLiveIn(Mips::V0);
208554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MBB.addLiveIn(Mips::V0);
209554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg)
210554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    .addReg(Mips::V0).addReg(Mips::T9);
211554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
212554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
213f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) {
214f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka  initGlobalBaseReg(MF);
215554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
216554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  MachineRegisterInfo *MRI = &MF.getRegInfo();
217554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
218554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE;
219554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka       ++MFI)
220a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) {
221a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      if (I->getOpcode() == Mips::RDDSP)
222a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        addDSPCtrlRegOperands(false, *I, MF);
223a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      else if (I->getOpcode() == Mips::WRDSP)
224a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        addDSPCtrlRegOperands(true, *I, MF);
225a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka      else
226a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka        replaceUsesWithZeroReg(MRI, *I);
227a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka    }
228554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
229554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
230275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira HatanakaSDNode *MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag,
231ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                           SDValue CmpLHS, SDLoc DL,
232275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                                           SDNode *Node) const {
233275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  unsigned Opc = InFlag.getOpcode(); (void)Opc;
234275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
235275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) ||
236275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka          (Opc == ISD::SUBC || Opc == ISD::SUBE)) &&
237275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka         "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn");
238275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
239ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned SLTuOp = Mips::SLTu, ADDuOp = Mips::ADDu;
240ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Subtarget->isGP64bit()) {
241ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    SLTuOp = Mips::SLTu64;
242ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    ADDuOp = Mips::DADDu;
243ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
244ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
245275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) };
246275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1);
247275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  EVT VT = LHS.getValueType();
248275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
249ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  SDNode *Carry = CurDAG->getMachineNode(SLTuOp, DL, VT, Ops);
250ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Subtarget->isGP64bit()) {
252ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // On 64-bit targets, sltu produces an i64 but our backend currently says
253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // that SLTu64 produces an i32. We need to fix this in the long run but for
254ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // now, just make the DAG type-correct by asserting the upper bits are zero.
255ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Carry = CurDAG->getMachineNode(Mips::SUBREG_TO_REG, DL, VT,
256ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                   CurDAG->getTargetConstant(0, VT),
257ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                   SDValue(Carry, 0),
258ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                   CurDAG->getTargetConstant(Mips::sub_32, VT));
259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  SDNode *AddCarry = CurDAG->getMachineNode(ADDuOp, DL, VT,
262275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                                            SDValue(Carry, 0), RHS);
263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
264275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS,
265275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka                              SDValue(AddCarry, 0));
266275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka}
267275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka
26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Match frameindex
26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrFrameIndex(SDValue Addr, SDValue &Base,
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                              SDValue &Offset) const {
27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EVT ValTy = Addr.getValueType();
27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Base   = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Offset = CurDAG->getTargetConstant(0, ValTy);
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Match frameindex+offset and frameindex|offset
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base,
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    SDValue &Offset,
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    unsigned OffsetBits) const {
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (CurDAG->isBaseWithConstantOffset(Addr)) {
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (isIntN(OffsetBits, CN->getSExtValue())) {
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      EVT ValTy = Addr.getValueType();
28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // If the first operand is a FI, get the TargetFI Node
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  (Addr.getOperand(0)))
29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy);
29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      else
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Base = Addr.getOperand(0);
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy);
29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return true;
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
304554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// ComplexPattern used on MipsInstrInfo
305554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Used on Mips Load/Store instructions
306554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
307554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          SDValue &Offset) const {
308554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // if Address is FI, get the TargetFrameIndex.
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
310554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
311554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
312554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // on PIC code Load GA
313554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == MipsISD::Wrapper) {
314554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Base   = Addr.getOperand(0);
315554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    Offset = Addr.getOperand(1);
316554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return true;
317554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
318554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
319554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (TM.getRelocationModel() != Reloc::PIC_) {
320554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if ((Addr.getOpcode() == ISD::TargetExternalSymbol ||
321554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOpcode() == ISD::TargetGlobalAddress))
322554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return false;
323554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
324554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
325554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Addresses of the form FI+const or FI|const
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 16))
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
328554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
329554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Operand is a result from an ADD.
330554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  if (Addr.getOpcode() == ISD::ADD) {
331554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // When loading from constant pools, load the lower address part in
332554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // the instruction itself. Example, instead of:
333554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
334554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  addiu $2, $2, %lo($CPI1_0)
335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, 0($2)
336554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // Generate:
337554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lui $2, %hi($CPI1_0)
338554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    //  lwc1 $f0, %lo($CPI1_0)($2)
339554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Addr.getOperand(1).getOpcode() == MipsISD::Lo ||
340554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Addr.getOperand(1).getOpcode() == MipsISD::GPRel) {
341554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      SDValue Opnd0 = Addr.getOperand(1).getOperand(0);
342554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) ||
343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka          isa<JumpTableSDNode>(Opnd0)) {
344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Base = Addr.getOperand(0);
345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        Offset = Opnd0;
346554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        return true;
347554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
348554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
349554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
350554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
351554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return false;
352554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
353554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
3542fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// ComplexPattern used on MipsInstrInfo
3552fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders/// Used on Mips Load/Store instructions
3562fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sandersbool MipsSEDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base,
3572fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders                                          SDValue &Offset) const {
3582fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  // Operand is a result from an ADD.
3592fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  if (Addr.getOpcode() == ISD::ADD) {
3602fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    Base = Addr.getOperand(0);
3612fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    Offset = Addr.getOperand(1);
3622fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders    return true;
3632fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  }
3642fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders
3652fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders  return false;
3662fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders}
3672fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders
368554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
369554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                           SDValue &Offset) const {
370554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  Base = Addr;
371554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  Offset = CurDAG->getTargetConstant(0, Addr.getValueType());
372554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return true;
373554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
374554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
375554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
376554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue &Offset) const {
377554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return selectAddrRegImm(Addr, Base, Offset) ||
378554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    selectAddrDefault(Addr, Base, Offset);
379554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
380554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrRegImm10(SDValue Addr, SDValue &Base,
382da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                            SDValue &Offset) const {
38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
385da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 10))
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
388da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
391da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Used on microMIPS Load/Store unaligned instructions (12-bit offset)
39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectAddrRegImm12(SDValue Addr, SDValue &Base,
39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                            SDValue &Offset) const {
39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndex(Addr, Base, Offset))
39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 12))
39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
400da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
401da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return false;
402da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
403da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
404da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carterbool MipsSEDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base,
405da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter                                         SDValue &Offset) const {
406da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter  return selectAddrRegImm12(Addr, Base, Offset) ||
407da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter    selectAddrDefault(Addr, Base, Offset);
408da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter}
409da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter
410ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool MipsSEDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
411ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                             SDValue &Offset) const {
412ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (selectAddrFrameIndexOffset(Addr, Base, Offset, 7)) {
413ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (isa<FrameIndexSDNode>(Base))
414ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return false;
415ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
416ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Offset)) {
417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      unsigned CnstOff = CN->getZExtValue();
418ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return (CnstOff == (CnstOff & 0x3c));
419ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
420ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
421ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
422ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
423ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
424ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // For all other cases where "lw" would be selected, don't select "lw16"
425ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // because it would result in additional instructions to prepare operands.
426ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (selectAddrRegImm(Addr, Base, Offset))
427ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
428ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return selectAddrDefault(Addr, Base, Offset);
430ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
431ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsSEDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base,
43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          SDValue &Offset) const {
43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrRegImm10(Addr, Base, Offset))
43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (selectAddrDefault(Addr, Base, Offset))
43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
443acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
444acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
445acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Returns true and sets Imm if:
446acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * MSA is enabled
447acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * N is a ISD::BUILD_VECTOR representing a constant splat
448acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm) const {
449c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!Subtarget->hasMSA())
450acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
451acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
452acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  BuildVectorSDNode *Node = dyn_cast<BuildVectorSDNode>(N);
453acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
454dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Node)
455acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
456acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
457acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt SplatValue, SplatUndef;
458acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  unsigned SplatBitSize;
459acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  bool HasAnyUndefs;
460acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
461acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
462acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                             HasAnyUndefs, 8,
463c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                             !Subtarget->isLittle()))
464acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return false;
465acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
466acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  Imm = SplatValue;
467acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
468acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return true;
469acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
470acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
471acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
472acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
473acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
474acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
475acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
476acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value fits in an integer with the specified signed-ness and
477acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//   width.
478acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
479acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
480acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
481acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
482acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
483acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// It's worth noting that this function is not used as part of the selection
484acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// of ldi.[bhwd] since it does not permit using the wrong-typed ldi.[bhwd]
485acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// instruction to achieve the desired bit pattern. ldi.[bhwd] is selected in
486acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// MipsSEDAGToDAGISel::selectNode.
487acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
488acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatCommon(SDValue N, SDValue &Imm, bool Signed,
489acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                   unsigned ImmBitSize) const {
490acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
491acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
492acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
493acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
494acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
495acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
496acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (selectVSplat (N.getNode(), ImmValue) &&
497acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
498acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (( Signed && ImmValue.isSignedIntN(ImmBitSize)) ||
499acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders        (!Signed && ImmValue.isIntN(ImmBitSize))) {
500acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue, EltTy);
501acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
502acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
503acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
504acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
505acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
506acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
507acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
508acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
509acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
510c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm1(SDValue N, SDValue &Imm) const {
511c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 1);
512c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
513c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
514c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
515c8a1fa77a73e7c885035421712ceba951f9024cbDaniel SandersselectVSplatUimm2(SDValue N, SDValue &Imm) const {
516c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  return selectVSplatCommon(N, Imm, false, 2);
517c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders}
518c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders
519c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsSEDAGToDAGISel::
520acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm3(SDValue N, SDValue &Imm) const {
521acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 3);
522acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
523acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
524acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
525acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
526acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm4(SDValue N, SDValue &Imm) const {
527acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 4);
528acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
529acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
530acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
531acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
532acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm5(SDValue N, SDValue &Imm) const {
533acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 5);
534acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
535acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
536acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
537acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
538acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm6(SDValue N, SDValue &Imm) const {
539acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 6);
540acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
541acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
542acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
543acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
544acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatUimm8(SDValue N, SDValue &Imm) const {
545acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, false, 8);
546acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
547acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
548acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats.
549acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::
550acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel SandersselectVSplatSimm5(SDValue N, SDValue &Imm) const {
551acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return selectVSplatCommon(N, Imm, true, 5);
552acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
553acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
554acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// Select constant vector splats whose value is a power of 2.
555acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
556acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// In addition to the requirements of selectVSplat(), this function returns
557acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// true and sets Imm if:
558acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is the same width as the elements of the vector
559acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// * The splat value is a power of two.
560acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//
561acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// This function looks through ISD::BITCAST nodes.
562acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
563acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders//       sometimes a shuffle in big-endian mode.
564acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
565acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  APInt ImmValue;
566acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
567acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
568acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
569acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    N = N->getOperand(0);
570acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
571acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  if (selectVSplat (N.getNode(), ImmValue) &&
572acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
573acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    int32_t Log2 = ImmValue.exactLogBase2();
574acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
575acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (Log2 != -1) {
576acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Imm = CurDAG->getTargetConstant(Log2, EltTy);
577acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      return true;
578acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
579acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
580acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
581acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  return false;
582acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders}
583acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
5846ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
5856ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of left-most bits set (e.g. 0b11...1100...00).
5866ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5876ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
5886ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
5896ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
5906ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of left-most bits.
5916ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
5926ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
5936ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
5946ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
5956ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
5966ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
5976ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
5986ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
5996ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
6006ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
6016ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6026ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (selectVSplat(N.getNode(), ImmValue) &&
6036ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
6046ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero from the bitwise
6056ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // inverse of ImmValue, and test that the inverse of this is the same
6066ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // as the original value.
6076ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == ~(~ImmValue & ~(~ImmValue + 1))) {
6086ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6096ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
6106ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
6116ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
6126ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
6136ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6146ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
6156ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
6166ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6176ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// Select constant vector splats whose value only has a consecutive sequence
6186ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// of right-most bits set (e.g. 0b00...0011...11).
6196ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6206ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// In addition to the requirements of selectVSplat(), this function returns
6216ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// true and sets Imm if:
6226ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is the same width as the elements of the vector
6236ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// * The splat value is a consecutive sequence of right-most bits.
6246ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//
6256ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// This function looks through ISD::BITCAST nodes.
6266ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders// TODO: This might not be appropriate for big-endian MSA since BITCAST is
6276ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders//       sometimes a shuffle in big-endian mode.
6286ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsSEDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
6296ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  APInt ImmValue;
6306ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
6316ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6326ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (N->getOpcode() == ISD::BITCAST)
6336ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    N = N->getOperand(0);
6346ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6356ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  if (selectVSplat(N.getNode(), ImmValue) &&
6366ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
6376ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // Extract the run of set bits starting with bit zero, and test that the
6386ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    // result is the same as the original value
6396ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    if (ImmValue == (ImmValue & ~(ImmValue + 1))) {
6406ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      Imm = CurDAG->getTargetConstant(ImmValue.countPopulation(), EltTy);
6416ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders      return true;
6426ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders    }
6436ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  }
6446ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
6456ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  return false;
6466ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders}
6476ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders
648bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sandersbool MipsSEDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N,
649bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders                                                 SDValue &Imm) const {
650bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  APInt ImmValue;
651bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  EVT EltTy = N->getValueType(0).getVectorElementType();
652bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
653bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  if (N->getOpcode() == ISD::BITCAST)
654bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    N = N->getOperand(0);
655bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
656bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  if (selectVSplat(N.getNode(), ImmValue) &&
657bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders      ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
658bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    int32_t Log2 = (~ImmValue).exactLogBase2();
659bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
660bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    if (Log2 != -1) {
661bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders      Imm = CurDAG->getTargetConstant(Log2, EltTy);
662bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders      return true;
663bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders    }
664bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  }
665bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
666bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  return false;
667bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders}
668bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders
669f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakastd::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) {
670554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  unsigned Opcode = Node->getOpcode();
671ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc DL(Node);
672554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
673554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
674554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // Instruction Selection not handled by the auto-generated
675554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  // tablegen selection should be handled here.
676554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  ///
677554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  SDNode *Result;
678554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
679554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  switch(Opcode) {
680554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  default: break;
681554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
682275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::SUBE: {
683275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
684ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned Opc = Subtarget->isGP64bit() ? Mips::DSUBu : Mips::SUBu;
685ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Result = selectAddESubE(Opc, InFlag, InFlag.getOperand(0), DL, Node);
686275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    return std::make_pair(true, Result);
687275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  }
688554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
689275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka  case ISD::ADDE: {
690c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (Subtarget->hasDSP()) // Select DSP instructions, ADDSC and ADDWC.
6913d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka      break;
692275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka    SDValue InFlag = Node->getOperand(2);
693ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned Opc = Subtarget->isGP64bit() ? Mips::DADDu : Mips::ADDu;
694ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Result = selectAddESubE(Opc, InFlag, InFlag.getValue(0), DL, Node);
695554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, Result);
696554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
697554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
698554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::ConstantFP: {
699554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node);
700554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) {
701c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (Subtarget->isGP64bit()) {
702f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
703554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO_64, MVT::i64);
704f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        Result = CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero);
705c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      } else if (Subtarget->isFP64bit()) {
70623427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
70723427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders                                              Mips::ZERO, MVT::i32);
70823427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders        Result = CurDAG->getMachineNode(Mips::BuildPairF64_64, DL, MVT::f64,
70923427207ea575f57b571cf5aad1effb1f97e7ee1Daniel Sanders                                        Zero, Zero);
710554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      } else {
711f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
712554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                              Mips::ZERO, MVT::i32);
713f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka        Result = CurDAG->getMachineNode(Mips::BuildPairF64, DL, MVT::f64, Zero,
714554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                        Zero);
715554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      }
716554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
717554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      return std::make_pair(true, Result);
718554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
719554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    break;
720554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
721554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
722554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case ISD::Constant: {
723554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node);
724554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    unsigned Size = CN->getValueSizeInBits(0);
725554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
726554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Size == 32)
727554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      break;
728554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
729554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate AnalyzeImm;
730554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    int64_t Imm = CN->getSExtValue();
731554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
732554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    const MipsAnalyzeImmediate::InstSeq &Seq =
733554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      AnalyzeImm.Analyze(Imm, Size, false);
734554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
735554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin();
736ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    SDLoc DL(CN);
737554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *RegOpnd;
738554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
739554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                                MVT::i64);
740554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
741554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The first instruction can be a LUi which is different from other
742554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // instructions (ADDiu, ORI and SLL) in that it does not have a register
743554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // operand.
744554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (Inst->Opc == Mips::LUi64)
745554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd);
746554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    else
747554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd =
748554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka        CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
749554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               CurDAG->getRegister(Mips::ZERO_64, MVT::i64),
750554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                               ImmOpnd);
751554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
752554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    // The remaining instructions in the sequence are handled here.
753554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    for (++Inst; Inst != Seq.end(); ++Inst) {
754554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd),
755554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                          MVT::i64);
756554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64,
757554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                       SDValue(RegOpnd, 0), ImmOpnd);
758554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
759554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
760554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, RegOpnd);
761554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
762554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
763a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_W_CHAIN: {
764a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
765a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
766a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
767a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
768a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_cfcmsa: {
769a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
770a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx = Node->getOperand(2);
771a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Reg = CurDAG->getCopyFromReg(ChainIn, DL,
772a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                           getMSACtrlReg(RegIdx), MVT::i32);
773a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      return std::make_pair(true, Reg.getNode());
774a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
775a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
776a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
777a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
778a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
779abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  case ISD::INTRINSIC_WO_CHAIN: {
780abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(0))->getZExtValue()) {
781abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    default:
782abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      break;
783abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
784abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    case Intrinsic::mips_move_v:
785abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // Like an assignment but will always produce a move.v even if
786abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      // unnecessary.
787abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders      return std::make_pair(true,
788abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                            CurDAG->getMachineNode(Mips::MOVE_V, DL,
789abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                                                   Node->getValueType(0),
790abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders                                                   Node->getOperand(1)));
791abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    }
792abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders    break;
793abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders  }
794abbcf3bd47ad8ffa70f48ebd924f99fff5c22131Daniel Sanders
795a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  case ISD::INTRINSIC_VOID: {
796a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    switch (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
797a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    default:
798a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      break;
799a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
800a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    case Intrinsic::mips_ctcmsa: {
801a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainIn = Node->getOperand(0);
802a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue RegIdx  = Node->getOperand(2);
803a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue Value   = Node->getOperand(3);
804a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      SDValue ChainOut = CurDAG->getCopyToReg(ChainIn, DL,
805a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders                                              getMSACtrlReg(RegIdx), Value);
806a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders      return std::make_pair(true, ChainOut.getNode());
807a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
808a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    }
809a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders    break;
810a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders  }
811a6c3a4ee76ef8464d3c83472e15af521ade7eeb4Daniel Sanders
812554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  case MipsISD::ThreadPointer: {
813ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling    EVT PtrVT = getTargetLowering()->getPointerTy();
81494a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka    unsigned RdhwrOpc, DestReg;
815554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
816554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    if (PtrVT == MVT::i32) {
817554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR;
818554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1;
819554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    } else {
820554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      RdhwrOpc = Mips::RDHWR64;
821554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka      DestReg = Mips::V1_64;
822554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    }
823554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
824554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    SDNode *Rdhwr =
825ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick      CurDAG->getMachineNode(RdhwrOpc, SDLoc(Node),
826554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                             Node->getValueType(0),
82794a88c49b0e87ee8c911669ff6c6bbd31b912542Akira Hatanaka                             CurDAG->getRegister(Mips::HWR29, MVT::i32));
828f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg,
829554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka                                         SDValue(Rdhwr, 0));
830f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka    SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT);
831554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    ReplaceUses(SDValue(Node, 0), ResNode);
832554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka    return std::make_pair(true, ResNode.getNode());
833554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
834f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka
835acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  case ISD::BUILD_VECTOR: {
836acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // Select appropriate ldi.[bhwd] instructions for constant splats of
837acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 128-bit when MSA is enabled. Fixup any register class mismatches that
838acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // occur as a result.
839acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    //
840acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // This allows the compiler to use a wider range of immediates than would
841acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // otherwise be allowed. If, for example, v4i32 could only use ldi.h then
842acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // it would not be possible to load { 0x01010101, 0x01010101, 0x01010101,
843acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x01010101 } without using a constant pool. This would be sub-optimal
844acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // when // 'ldi.b wd, 1' is capable of producing that bit-pattern in the
845acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // same set/ of registers. Similarly, ldi.h isn't capable of producing {
846acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    // 0x00000000, 0x00000001, 0x00000000, 0x00000001 } but 'ldi.d wd, 1' can.
847acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
848acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Node);
849acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    APInt SplatValue, SplatUndef;
850acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned SplatBitSize;
851acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    bool HasAnyUndefs;
852acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    unsigned LdiOp;
853acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ResVecTy = BVN->getValueType(0);
854acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    EVT ViaVecTy;
855acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
856c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (!Subtarget->hasMSA() || !BVN->getValueType(0).is128BitVector())
857dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return std::make_pair(false, nullptr);
858acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
859acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
860acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                              HasAnyUndefs, 8,
861c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                              !Subtarget->isLittle()))
862dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return std::make_pair(false, nullptr);
863acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
864acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    switch (SplatBitSize) {
865acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    default:
866dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return std::make_pair(false, nullptr);
867acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 8:
868acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_B;
869acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v16i8;
870acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
871acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 16:
872acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_H;
873acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v8i16;
874acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
875acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 32:
876acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_W;
877acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v4i32;
878acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
879acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    case 64:
880acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      LdiOp = Mips::LDI_D;
881acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      ViaVecTy = MVT::v2i64;
882acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      break;
883acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
884acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
885acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (!SplatValue.isSignedIntN(10))
886dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return std::make_pair(false, nullptr);
887acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
888acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    SDValue Imm = CurDAG->getTargetConstant(SplatValue,
889acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                            ViaVecTy.getVectorElementType());
890acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
891acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    SDNode *Res = CurDAG->getMachineNode(LdiOp, SDLoc(Node), ViaVecTy, Imm);
892acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
893acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    if (ResVecTy != ViaVecTy) {
894acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // If LdiOp is writing to a different register class to ResVecTy, then
895acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // fix it up here. This COPY_TO_REGCLASS should never cause a move.v
896acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // since the source and destination register sets contain the same
897acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      // registers.
898acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetLowering *TLI = getTargetLowering();
899acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      MVT ResVecTySimple = ResVecTy.getSimpleVT();
900acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      const TargetRegisterClass *RC = TLI->getRegClassFor(ResVecTySimple);
901acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders      Res = CurDAG->getMachineNode(Mips::COPY_TO_REGCLASS, SDLoc(Node),
902acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                   ResVecTy, SDValue(Res, 0),
903acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                   CurDAG->getTargetConstant(RC->getID(),
904acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders                                                             MVT::i32));
905acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    }
906acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
907acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders    return std::make_pair(true, Res);
908acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  }
909acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
910554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  }
911554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
912dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return std::make_pair(false, nullptr);
913554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
914554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka
915554d9312b284265f91ac5ee5bf0351d446f669b1Akira HatanakaFunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) {
916554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka  return new MipsSEDAGToDAGISel(TM);
917554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka}
918