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