MipsSEISelDAGToDAG.cpp revision ba54bca472a15d0657e1b88776f7069042b60b4e
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 69f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI, 70554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const MachineInstr& MI) { 71554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned DstReg = 0, ZeroReg = 0; 72554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 73554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0". 74554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if ((MI.getOpcode() == Mips::ADDiu) && 75554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO) && 76554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 77554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 78554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ZeroReg = Mips::ZERO; 79554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else if ((MI.getOpcode() == Mips::DADDiu) && 80554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO_64) && 81554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 82554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 83554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ZeroReg = Mips::ZERO_64; 84554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 85554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 86554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!DstReg) 87554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Replace uses with ZeroReg. 90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg), 91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka E = MRI->use_end(); U != E;) { 92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineOperand &MO = U.getOperand(); 93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned OpNo = U.getOperandNo(); 94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineInstr *MI = MO.getParent(); 95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ++U; 96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Do not replace if it is a phi's operand or is tied to def operand. 98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo()) 99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka continue; 100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MO.setReg(ZeroReg); 102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 107f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) { 108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>(); 109554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 110554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!MipsFI->globalBaseRegSet()) 111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineBasicBlock &MBB = MF.front(); 114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineBasicBlock::iterator I = MBB.begin(); 115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineRegisterInfo &RegInfo = MF.getRegInfo(); 116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo(); 117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc(); 118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg(); 119554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const TargetRegisterClass *RC; 120554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 121554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N64()) 122554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPU64RegsRegClass; 123554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 124554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPURegsRegClass; 125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka V0 = RegInfo.createVirtualRegister(RC); 127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka V1 = RegInfo.createVirtualRegister(RC); 128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N64()) { 130554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9_64); 131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::T9_64); 132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 133554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // daddu $v1, $v0, $t9 135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 137554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0) 138554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 139554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0) 140554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addReg(Mips::T9_64); 141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1) 142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 143554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 144554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (MF.getTarget().getRelocationModel() == Reloc::Static) { 147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Set global register to __gnu_local_gp. 148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 149554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(__gnu_local_gp) 150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $globalbasereg, $v0, %lo(__gnu_local_gp) 151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI); 153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0) 154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO); 155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9); 159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::T9); 160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N32()) { 162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addu $v1, $v0, $t9 164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 166554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9); 169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1) 170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 174554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka assert(Subtarget.isABI_O32()); 175554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // For O32 ABI, the following instruction sequence is emitted to initialize 177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the global base register: 178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 0. lui $2, %hi(_gp_disp) 180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 1. addiu $2, $2, %lo(_gp_disp) 181554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 2. addu $globalbasereg, $2, $t9 182554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // We emit only the last instruction here. 184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // GNU linker requires that the first two instructions appear at the beginning 186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // of a function and no instructions be inserted before or between them. 187554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The two instructions are emitted during lowering to MC layer in order to 188554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // avoid any reordering. 189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Register $2 (Mips::V0) is added to the list of live-in registers to ensure 191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the value instruction 1 (addiu) defines is valid when instruction 2 (addu) 192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // reads it. 193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::V0); 194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::V0); 195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg) 196554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addReg(Mips::V0).addReg(Mips::T9); 197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 199f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) { 200f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka initGlobalBaseReg(MF); 201554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineRegisterInfo *MRI = &MF.getRegInfo(); 203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE; 205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ++MFI) 206a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) { 207a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka if (I->getOpcode() == Mips::RDDSP) 208a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka addDSPCtrlRegOperands(false, *I, MF); 209a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka else if (I->getOpcode() == Mips::WRDSP) 210a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka addDSPCtrlRegOperands(true, *I, MF); 211a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka else 212a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka replaceUsesWithZeroReg(MRI, *I); 213a2b2200ff8684ba23c64b24c0128a78f4b6e3c73Akira Hatanaka } 214554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 215554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 216275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira HatanakaSDNode *MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag, 217ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDValue CmpLHS, SDLoc DL, 218275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDNode *Node) const { 219275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka unsigned Opc = InFlag.getOpcode(); (void)Opc; 220275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 221275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) || 222275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka (Opc == ISD::SUBC || Opc == ISD::SUBE)) && 223275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn"); 224275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 225275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) }; 226275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1); 227275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka EVT VT = LHS.getValueType(); 228275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 2292a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao SDNode *Carry = CurDAG->getMachineNode(Mips::SLTu, DL, VT, Ops); 230275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDNode *AddCarry = CurDAG->getMachineNode(Mips::ADDu, DL, VT, 231275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue(Carry, 0), RHS); 232275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS, 233275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue(AddCarry, 0)); 234275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka} 235275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 236554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// ComplexPattern used on MipsInstrInfo 237554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Used on Mips Load/Store instructions 238554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base, 239554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 240554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka EVT ValTy = Addr.getValueType(); 241554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 242554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // if Address is FI, get the TargetFrameIndex. 243554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) { 244554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 245554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(0, ValTy); 246554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 247554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 248554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 249554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // on PIC code Load GA 250554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOpcode() == MipsISD::Wrapper) { 251554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 252554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = Addr.getOperand(1); 253554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 254554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 255554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 256554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (TM.getRelocationModel() != Reloc::PIC_) { 257554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if ((Addr.getOpcode() == ISD::TargetExternalSymbol || 258554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Addr.getOpcode() == ISD::TargetGlobalAddress)) 259554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 260554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 261554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 262554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Addresses of the form FI+const or FI|const 263554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (CurDAG->isBaseWithConstantOffset(Addr)) { 264554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1)); 265554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (isInt<16>(CN->getSExtValue())) { 266554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 267554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // If the first operand is a FI, get the TargetFI Node 268554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode> 269554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (Addr.getOperand(0))) 270554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 271554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 272554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 273554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 274554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy); 275554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 276554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 277554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 278554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 279554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Operand is a result from an ADD. 280554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOpcode() == ISD::ADD) { 281554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // When loading from constant pools, load the lower address part in 282554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the instruction itself. Example, instead of: 283554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $2, %hi($CPI1_0) 284554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $2, $2, %lo($CPI1_0) 285554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lwc1 $f0, 0($2) 286554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Generate: 287554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $2, %hi($CPI1_0) 288554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lwc1 $f0, %lo($CPI1_0)($2) 289554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOperand(1).getOpcode() == MipsISD::Lo || 290554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Addr.getOperand(1).getOpcode() == MipsISD::GPRel) { 291554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue Opnd0 = Addr.getOperand(1).getOperand(0); 292554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) || 293554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka isa<JumpTableSDNode>(Opnd0)) { 294554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 295554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = Opnd0; 296554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 297554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 298554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 299554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 300554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 301554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 302554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 303554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 304554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base, 305554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 306554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr; 307554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(0, Addr.getValueType()); 308554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 309554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 310554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 311554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base, 312554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 313554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return selectAddrRegImm(Addr, Base, Offset) || 314554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka selectAddrDefault(Addr, Base, Offset); 315554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 316554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 317f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakastd::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) { 318554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Opcode = Node->getOpcode(); 319ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL(Node); 320554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 321554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// 322554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Instruction Selection not handled by the auto-generated 323554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // tablegen selection should be handled here. 324554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// 325554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *Result; 326554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 327554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka switch(Opcode) { 328554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka default: break; 329554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 330275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka case ISD::SUBE: { 331275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue InFlag = Node->getOperand(2); 332275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka Result = selectAddESubE(Mips::SUBu, InFlag, InFlag.getOperand(0), DL, Node); 333275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return std::make_pair(true, Result); 334275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka } 335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 336275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka case ISD::ADDE: { 3373d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka if (Subtarget.hasDSP()) // Select DSP instructions, ADDSC and ADDWC. 3383d60241c3e86973be281660bc5971c3a46cfdc47Akira Hatanaka break; 339275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue InFlag = Node->getOperand(2); 340275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka Result = selectAddESubE(Mips::ADDu, InFlag, InFlag.getValue(0), DL, Node); 341554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 342554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::ConstantFP: { 345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node); 346554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) { 347554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.hasMips64()) { 348f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, 349554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Mips::ZERO_64, MVT::i64); 350f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero); 351554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else { 352f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, 353554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Mips::ZERO, MVT::i32); 354f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = CurDAG->getMachineNode(Mips::BuildPairF64, DL, MVT::f64, Zero, 355554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Zero); 356554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 357554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 358554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 359554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 360554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 361554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 362554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 363554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::Constant: { 364554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node); 365554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Size = CN->getValueSizeInBits(0); 366554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 367554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Size == 32) 368554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 369554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 370554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsAnalyzeImmediate AnalyzeImm; 371554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int64_t Imm = CN->getSExtValue(); 372554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 373554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const MipsAnalyzeImmediate::InstSeq &Seq = 374554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka AnalyzeImm.Analyze(Imm, Size, false); 375554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 376554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin(); 377ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick SDLoc DL(CN); 378554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *RegOpnd; 379554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 380554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MVT::i64); 381554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 382554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The first instruction can be a LUi which is different from other 383554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // instructions (ADDiu, ORI and SLL) in that it does not have a register 384554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // operand. 385554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Inst->Opc == Mips::LUi64) 386554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd); 387554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 388554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = 389554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 390554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getRegister(Mips::ZERO_64, MVT::i64), 391554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ImmOpnd); 392554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 393554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The remaining instructions in the sequence are handled here. 394554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (++Inst; Inst != Seq.end(); ++Inst) { 395554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 396554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MVT::i64); 397554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 398554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue(RegOpnd, 0), ImmOpnd); 399554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 400554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 401554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, RegOpnd); 402554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 403554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 404554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case MipsISD::ThreadPointer: { 405ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling EVT PtrVT = getTargetLowering()->getPointerTy(); 406554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned RdhwrOpc, SrcReg, DestReg; 407554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 408554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (PtrVT == MVT::i32) { 409554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RdhwrOpc = Mips::RDHWR; 410554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SrcReg = Mips::HWR29; 411554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DestReg = Mips::V1; 412554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else { 413554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RdhwrOpc = Mips::RDHWR64; 414554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SrcReg = Mips::HWR29_64; 415554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DestReg = Mips::V1_64; 416554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 417554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 418554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *Rdhwr = 419ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick CurDAG->getMachineNode(RdhwrOpc, SDLoc(Node), 420554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Node->getValueType(0), 421554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getRegister(SrcReg, PtrVT)); 422f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg, 423554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue(Rdhwr, 0)); 424f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT); 425554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ReplaceUses(SDValue(Node, 0), ResNode); 426554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, ResNode.getNode()); 427554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 428f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka 429f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka case MipsISD::InsertLOHI: { 430f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka unsigned RCID = Subtarget.hasDSP() ? Mips::ACRegsDSPRegClassID : 431f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka Mips::ACRegsRegClassID; 432f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue RegClass = CurDAG->getTargetConstant(RCID, MVT::i32); 433f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue LoIdx = CurDAG->getTargetConstant(Mips::sub_lo, MVT::i32); 434f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue HiIdx = CurDAG->getTargetConstant(Mips::sub_hi, MVT::i32); 435f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka const SDValue Ops[] = { RegClass, Node->getOperand(0), LoIdx, 436f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka Node->getOperand(1), HiIdx }; 437f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDNode *Res = CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, DL, 4382a8bea7a8eba9bfa05dcc7a87e9152a0043841b2Michael Liao MVT::Untyped, Ops); 439f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka return std::make_pair(true, Res); 440f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka } 441554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 442554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 443554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(false, (SDNode*)NULL); 444554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 445554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 446554d9312b284265f91ac5ee5bf0351d446f669b1Akira HatanakaFunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) { 447554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return new MipsSEDAGToDAGISel(TM); 448554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 449