MipsSEISelDAGToDAG.cpp revision a430cb613b6e93c05f128b04323c57acfd08686d
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 44f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI, 45554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const MachineInstr& MI) { 46554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned DstReg = 0, ZeroReg = 0; 47554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 48554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0". 49554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if ((MI.getOpcode() == Mips::ADDiu) && 50554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO) && 51554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 52554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 53554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ZeroReg = Mips::ZERO; 54554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else if ((MI.getOpcode() == Mips::DADDiu) && 55554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO_64) && 56554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 57554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 58554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ZeroReg = Mips::ZERO_64; 59554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 60554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 61554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!DstReg) 62554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 63554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 64554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Replace uses with ZeroReg. 65554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg), 66554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka E = MRI->use_end(); U != E;) { 67554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineOperand &MO = U.getOperand(); 68554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned OpNo = U.getOperandNo(); 69554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineInstr *MI = MO.getParent(); 70554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ++U; 71554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 72554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Do not replace if it is a phi's operand or is tied to def operand. 73554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo()) 74554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka continue; 75554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 76554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MO.setReg(ZeroReg); 77554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 78554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 79554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 80554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 81554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 82f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::initGlobalBaseReg(MachineFunction &MF) { 83554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>(); 84554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 85554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!MipsFI->globalBaseRegSet()) 86554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 87554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineBasicBlock &MBB = MF.front(); 89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineBasicBlock::iterator I = MBB.begin(); 90554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineRegisterInfo &RegInfo = MF.getRegInfo(); 91554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo(); 92554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc(); 93554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned V0, V1, GlobalBaseReg = MipsFI->getGlobalBaseReg(); 94554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const TargetRegisterClass *RC; 95554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 96554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N64()) 97554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPU64RegsRegClass; 98554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 99554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPURegsRegClass; 100554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 101554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka V0 = RegInfo.createVirtualRegister(RC); 102554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka V1 = RegInfo.createVirtualRegister(RC); 103554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 104554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N64()) { 105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9_64); 106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::T9_64); 107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 108554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 109554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // daddu $v1, $v0, $t9 110554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 111554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 112554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0) 113554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 114554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0) 115554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addReg(Mips::T9_64); 116554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1) 117554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 118554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 119554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 120554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 121554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (MF.getTarget().getRelocationModel() == Reloc::Static) { 122554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Set global register to __gnu_local_gp. 123554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 124554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(__gnu_local_gp) 125554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $globalbasereg, $v0, %lo(__gnu_local_gp) 126554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 127554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI); 128554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0) 129554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO); 130554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 131554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 132554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 133554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9); 134554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::T9); 135554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 136554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.isABI_N32()) { 137554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 138554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addu $v1, $v0, $t9 139554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 140554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 141554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 142554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 143554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9); 144554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1) 145554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 146554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return; 147554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 148554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 149554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka assert(Subtarget.isABI_O32()); 150554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 151554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // For O32 ABI, the following instruction sequence is emitted to initialize 152554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the global base register: 153554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 154554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 0. lui $2, %hi(_gp_disp) 155554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 1. addiu $2, $2, %lo(_gp_disp) 156554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 2. addu $globalbasereg, $2, $t9 157554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 158554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // We emit only the last instruction here. 159554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 160554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // GNU linker requires that the first two instructions appear at the beginning 161554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // of a function and no instructions be inserted before or between them. 162554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The two instructions are emitted during lowering to MC layer in order to 163554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // avoid any reordering. 164554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // 165554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Register $2 (Mips::V0) is added to the list of live-in registers to ensure 166554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the value instruction 1 (addiu) defines is valid when instruction 2 (addu) 167554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // reads it. 168554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::V0); 169554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MBB.addLiveIn(Mips::V0); 170554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg) 171554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka .addReg(Mips::V0).addReg(Mips::T9); 172554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 173554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 174f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakavoid MipsSEDAGToDAGISel::processFunctionAfterISel(MachineFunction &MF) { 175f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka initGlobalBaseReg(MF); 176554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 177554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MachineRegisterInfo *MRI = &MF.getRegInfo(); 178554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 179554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE; 180554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ++MFI) 181554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) 182f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka replaceUsesWithZeroReg(MRI, *I); 183554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 184554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 185554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Select multiply instructions. 186554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakastd::pair<SDNode*, SDNode*> 187f283512d72757aac5bedcb270f9199194e6a12c0Akira HatanakaMipsSEDAGToDAGISel::selectMULT(SDNode *N, unsigned Opc, DebugLoc DL, EVT Ty, 188554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka bool HasLo, bool HasHi) { 189554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *Lo = 0, *Hi = 0; 190f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDNode *Mul = CurDAG->getMachineNode(Opc, DL, MVT::Glue, N->getOperand(0), 191554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka N->getOperand(1)); 192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue InFlag = SDValue(Mul, 0); 193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (HasLo) { 195554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Opcode = (Ty == MVT::i32 ? Mips::MFLO : Mips::MFLO64); 196f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Lo = CurDAG->getMachineNode(Opcode, DL, Ty, MVT::Glue, InFlag); 197554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka InFlag = SDValue(Lo, 1); 198554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 199554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (HasHi) { 200554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Opcode = (Ty == MVT::i32 ? Mips::MFHI : Mips::MFHI64); 201f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Hi = CurDAG->getMachineNode(Opcode, DL, Ty, InFlag); 202554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 203554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(Lo, Hi); 204554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 205554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 206275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira HatanakaSDNode *MipsSEDAGToDAGISel::selectAddESubE(unsigned MOp, SDValue InFlag, 207275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue CmpLHS, DebugLoc DL, 208275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDNode *Node) const { 209275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka unsigned Opc = InFlag.getOpcode(); (void)Opc; 210275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 211275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) || 212275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka (Opc == ISD::SUBC || Opc == ISD::SUBE)) && 213275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn"); 214275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 215275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) }; 216275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue LHS = Node->getOperand(0), RHS = Node->getOperand(1); 217275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka EVT VT = LHS.getValueType(); 218275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 219275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDNode *Carry = CurDAG->getMachineNode(Mips::SLTu, DL, VT, Ops, 2); 220275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDNode *AddCarry = CurDAG->getMachineNode(Mips::ADDu, DL, VT, 221275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue(Carry, 0), RHS); 222275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS, 223275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue(AddCarry, 0)); 224275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka} 225275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka 226554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// ComplexPattern used on MipsInstrInfo 227554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka/// Used on Mips Load/Store instructions 228554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base, 229554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 230554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka EVT ValTy = Addr.getValueType(); 231554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 232554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // if Address is FI, get the TargetFrameIndex. 233554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) { 234554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 235554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(0, ValTy); 236554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 237554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 238554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 239554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // on PIC code Load GA 240554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOpcode() == MipsISD::Wrapper) { 241554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 242554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = Addr.getOperand(1); 243554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 244554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 245554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 246554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (TM.getRelocationModel() != Reloc::PIC_) { 247554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if ((Addr.getOpcode() == ISD::TargetExternalSymbol || 248554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Addr.getOpcode() == ISD::TargetGlobalAddress)) 249554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 250554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 251554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 252554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Addresses of the form FI+const or FI|const 253554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (CurDAG->isBaseWithConstantOffset(Addr)) { 254554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1)); 255554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (isInt<16>(CN->getSExtValue())) { 256554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 257554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // If the first operand is a FI, get the TargetFI Node 258554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode> 259554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka (Addr.getOperand(0))) 260554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 261554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 262554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 263554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 264554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy); 265554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 266554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 267554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 268554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 269554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Operand is a result from an ADD. 270554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOpcode() == ISD::ADD) { 271554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // When loading from constant pools, load the lower address part in 272554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // the instruction itself. Example, instead of: 273554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $2, %hi($CPI1_0) 274554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // addiu $2, $2, %lo($CPI1_0) 275554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lwc1 $f0, 0($2) 276554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Generate: 277554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lui $2, %hi($CPI1_0) 278554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // lwc1 $f0, %lo($CPI1_0)($2) 279554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Addr.getOperand(1).getOpcode() == MipsISD::Lo || 280554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Addr.getOperand(1).getOpcode() == MipsISD::GPRel) { 281554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue Opnd0 = Addr.getOperand(1).getOperand(0); 282554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) || 283554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka isa<JumpTableSDNode>(Opnd0)) { 284554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr.getOperand(0); 285554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = Opnd0; 286554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 287554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 288554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 289554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 290554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 291554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 292554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 293554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 294554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base, 295554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 296554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Base = Addr; 297554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Offset = CurDAG->getTargetConstant(0, Addr.getValueType()); 298554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return true; 299554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 300554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 301554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanakabool MipsSEDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base, 302554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset) const { 303554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return selectAddrRegImm(Addr, Base, Offset) || 304554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka selectAddrDefault(Addr, Base, Offset); 305554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 306554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 307f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakastd::pair<bool, SDNode*> MipsSEDAGToDAGISel::selectNode(SDNode *Node) { 308554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Opcode = Node->getOpcode(); 309f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka DebugLoc DL = Node->getDebugLoc(); 310554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 311554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// 312554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Instruction Selection not handled by the auto-generated 313554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // tablegen selection should be handled here. 314554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// 315554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka EVT NodeTy = Node->getValueType(0); 316554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *Result; 317554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned MultOpc; 318554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 319554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka switch(Opcode) { 320554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka default: break; 321554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 322275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka case ISD::SUBE: { 323275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue InFlag = Node->getOperand(2); 324275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka Result = selectAddESubE(Mips::SUBu, InFlag, InFlag.getOperand(0), DL, Node); 325275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka return std::make_pair(true, Result); 326275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka } 327554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 328275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka case ISD::ADDE: { 329275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka SDValue InFlag = Node->getOperand(2); 330275f354d6d459f4bcfb3d3e8b5b7f3ed08585940Akira Hatanaka Result = selectAddESubE(Mips::ADDu, InFlag, InFlag.getValue(0), DL, Node); 331554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 332554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 333554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 334554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// Mul with two results 335554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::SMUL_LOHI: 336554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::UMUL_LOHI: { 337554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (NodeTy == MVT::i32) 338554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MultOpc = (Opcode == ISD::UMUL_LOHI ? Mips::MULTu : Mips::MULT); 339554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 340554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MultOpc = (Opcode == ISD::UMUL_LOHI ? Mips::DMULTu : Mips::DMULT); 341554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 342f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka std::pair<SDNode*, SDNode*> LoHi = selectMULT(Node, MultOpc, DL, NodeTy, 343554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka true, true); 344554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 345554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!SDValue(Node, 0).use_empty()) 346554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ReplaceUses(SDValue(Node, 0), SDValue(LoHi.first, 0)); 347554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 348554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (!SDValue(Node, 1).use_empty()) 349554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ReplaceUses(SDValue(Node, 1), SDValue(LoHi.second, 0)); 350554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 351554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, (SDNode*)NULL); 352554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 353554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 354554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka /// Special Muls 355554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::MUL: { 356554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // Mips32 has a 32-bit three operand mul instruction. 357554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.hasMips32() && NodeTy == MVT::i32) 358554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 359554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MultOpc = NodeTy == MVT::i32 ? Mips::MULT : Mips::DMULT; 360f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = selectMULT(Node, MultOpc, DL, NodeTy, true, false).first; 361554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 362554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 363554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::MULHS: 364554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::MULHU: { 365554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (NodeTy == MVT::i32) 366554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MultOpc = (Opcode == ISD::MULHU ? Mips::MULTu : Mips::MULT); 367554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 368554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MultOpc = (Opcode == ISD::MULHU ? Mips::DMULTu : Mips::DMULT); 369554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 370f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = selectMULT(Node, MultOpc, DL, NodeTy, false, true).second; 371554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 372554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 373554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 374554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::ConstantFP: { 375554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node); 376554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) { 377554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Subtarget.hasMips64()) { 378f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, 379554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Mips::ZERO_64, MVT::i64); 380f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = CurDAG->getMachineNode(Mips::DMTC1, DL, MVT::f64, Zero); 381554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else { 382f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, 383554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Mips::ZERO, MVT::i32); 384f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka Result = CurDAG->getMachineNode(Mips::BuildPairF64, DL, MVT::f64, Zero, 385554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Zero); 386554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 387554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 388554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, Result); 389554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 390554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 391554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 392554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 393554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case ISD::Constant: { 394554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node); 395554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned Size = CN->getValueSizeInBits(0); 396554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 397554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Size == 32) 398554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka break; 399554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 400554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsAnalyzeImmediate AnalyzeImm; 401554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka int64_t Imm = CN->getSExtValue(); 402554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 403554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka const MipsAnalyzeImmediate::InstSeq &Seq = 404554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka AnalyzeImm.Analyze(Imm, Size, false); 405554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 406554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin(); 407554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DebugLoc DL = CN->getDebugLoc(); 408554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *RegOpnd; 409554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 410554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MVT::i64); 411554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 412554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The first instruction can be a LUi which is different from other 413554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // instructions (ADDiu, ORI and SLL) in that it does not have a register 414554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // operand. 415554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Inst->Opc == Mips::LUi64) 416554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd); 417554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka else 418554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = 419554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 420554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getRegister(Mips::ZERO_64, MVT::i64), 421554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ImmOpnd); 422554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 423554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // The remaining instructions in the sequence are handled here. 424554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka for (++Inst; Inst != Seq.end(); ++Inst) { 425554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 426554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka MVT::i64); 427554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 428554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue(RegOpnd, 0), ImmOpnd); 429554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 430554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 431554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, RegOpnd); 432554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 433554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 434554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka case MipsISD::ThreadPointer: { 435554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka EVT PtrVT = TLI.getPointerTy(); 436554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka unsigned RdhwrOpc, SrcReg, DestReg; 437554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 438554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (PtrVT == MVT::i32) { 439554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RdhwrOpc = Mips::RDHWR; 440554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SrcReg = Mips::HWR29; 441554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DestReg = Mips::V1; 442554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } else { 443554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka RdhwrOpc = Mips::RDHWR64; 444554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SrcReg = Mips::HWR29_64; 445554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka DestReg = Mips::V1_64; 446554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 447554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 448554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDNode *Rdhwr = 449554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getMachineNode(RdhwrOpc, Node->getDebugLoc(), 450554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka Node->getValueType(0), 451554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka CurDAG->getRegister(SrcReg, PtrVT)); 452f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), DL, DestReg, 453554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue(Rdhwr, 0)); 454f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka SDValue ResNode = CurDAG->getCopyFromReg(Chain, DL, DestReg, PtrVT); 455554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka ReplaceUses(SDValue(Node, 0), ResNode); 456554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(true, ResNode.getNode()); 457554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 458f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka 459f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka case MipsISD::InsertLOHI: { 460f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka unsigned RCID = Subtarget.hasDSP() ? Mips::ACRegsDSPRegClassID : 461f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka Mips::ACRegsRegClassID; 462f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue RegClass = CurDAG->getTargetConstant(RCID, MVT::i32); 463f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue LoIdx = CurDAG->getTargetConstant(Mips::sub_lo, MVT::i32); 464f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDValue HiIdx = CurDAG->getTargetConstant(Mips::sub_hi, MVT::i32); 465f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka const SDValue Ops[] = { RegClass, Node->getOperand(0), LoIdx, 466f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka Node->getOperand(1), HiIdx }; 467f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka SDNode *Res = CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, DL, 468f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka MVT::Untyped, Ops, 5); 469f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka return std::make_pair(true, Res); 470f5926fd844a84adcf1ae4f193146f2877997b82cAkira Hatanaka } 471554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka } 472554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 473554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return std::make_pair(false, (SDNode*)NULL); 474554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 475554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 476554d9312b284265f91ac5ee5bf0351d446f669b1Akira HatanakaFunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) { 477554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return new MipsSEDAGToDAGISel(TM); 478554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka} 479