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