1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsISelDAGToDAG.cpp - A Dag to Dag Inst Selector for Mips --------===// 2972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 3972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// The LLVM Compiler Infrastructure 4972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 9972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 10972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// This file defines an instruction selector for the MIPS target. 11972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// 124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 13972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 14972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#define DEBUG_TYPE "mips-isel" 15972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "Mips.h" 1657fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka#include "MipsAnalyzeImmediate.h" 17c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes#include "MipsMachineFunction.h" 18972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsRegisterInfo.h" 19972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsSubtarget.h" 20972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsTargetMachine.h" 21648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka#include "MCTargetDesc/MipsBaseInfo.h" 22972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/GlobalValue.h" 23972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Instructions.h" 24972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Intrinsics.h" 25972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Support/CFG.h" 26972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Type.h" 27972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineConstantPool.h" 28972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFunction.h" 29972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h" 30972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h" 3184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h" 32972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/SelectionDAGISel.h" 3344b6c715ac87505f98066fa3bf6e3e99a26b886aAkira Hatanaka#include "llvm/CodeGen/SelectionDAGNodes.h" 34972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Target/TargetMachine.h" 35972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Support/Debug.h" 36dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/ErrorHandling.h" 37dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h" 38972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesusing namespace llvm; 39972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 404552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 41972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// Instruction Selector Implementation 424552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 43972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 444552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 45972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// MipsDAGToDAGISel - MIPS specific code to select MIPS machine 46972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes// instructions for SelectionDAG operations. 474552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===// 48972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesnamespace { 49972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 506726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewyckyclass MipsDAGToDAGISel : public SelectionDAGISel { 51972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 52972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes /// TM - Keep a reference to MipsTargetMachine. 53972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes MipsTargetMachine &TM; 54972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 55972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes /// Subtarget - Keep a pointer to the MipsSubtarget around so that we can 56972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes /// make the right decision when generating code for different targets. 57225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes const MipsSubtarget &Subtarget; 5881092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 59972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopespublic: 601002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit MipsDAGToDAGISel(MipsTargetMachine &tm) : 6179ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman SelectionDAGISel(tm), 62da8ac5fd9130b70b61be61e4819faa8d842d708fDan Gohman TM(tm), Subtarget(tm.getSubtarget<MipsSubtarget>()) {} 6381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 64972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Pass Name 65972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes virtual const char *getPassName() const { 66972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return "MIPS DAG->DAG Pattern Instruction Selection"; 6781092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes } 68972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 69648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka virtual bool runOnMachineFunction(MachineFunction &MF); 7081092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 7181092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopesprivate: 72972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Include the pieces autogenerated from the target description. 73972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes #include "MipsGenDAGISel.inc" 74972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 759911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// getTargetMachine - Return a reference to the TargetMachine, casted 769911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// to the target-specific type. 779911405183f8596fe9d521467f83f6652a296cf4Dan Gohman const MipsTargetMachine &getTargetMachine() { 789911405183f8596fe9d521467f83f6652a296cf4Dan Gohman return static_cast<const MipsTargetMachine &>(TM); 799911405183f8596fe9d521467f83f6652a296cf4Dan Gohman } 809911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 819911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// getInstrInfo - Return a reference to the TargetInstrInfo, casted 829911405183f8596fe9d521467f83f6652a296cf4Dan Gohman /// to the target-specific type. 839911405183f8596fe9d521467f83f6652a296cf4Dan Gohman const MipsInstrInfo *getInstrInfo() { 849911405183f8596fe9d521467f83f6652a296cf4Dan Gohman return getTargetMachine().getInstrInfo(); 859911405183f8596fe9d521467f83f6652a296cf4Dan Gohman } 869911405183f8596fe9d521467f83f6652a296cf4Dan Gohman 879911405183f8596fe9d521467f83f6652a296cf4Dan Gohman SDNode *getGlobalBaseReg(); 882fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 892fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka std::pair<SDNode*, SDNode*> SelectMULT(SDNode *N, unsigned Opc, DebugLoc dl, 902fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka EVT Ty, bool HasLo, bool HasHi); 912fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 92eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman SDNode *Select(SDNode *N); 93972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 94972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Complex Pattern. 9544b6c715ac87505f98066fa3bf6e3e99a26b886aAkira Hatanaka bool SelectAddr(SDNode *Parent, SDValue N, SDValue &Base, SDValue &Offset); 96972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 97bd15090aa21738aa0670fc894f4b49c8fa93e3f5Akira Hatanaka // getImm - Return a target constant with the specified value. 984d0eb637f0798726ef49d93ecb1e6ab371ab9ca3Akira Hatanaka inline SDValue getImm(const SDNode *Node, unsigned Imm) { 994d0eb637f0798726ef49d93ecb1e6ab371ab9ca3Akira Hatanaka return CurDAG->getTargetConstant(Imm, Node->getValueType(0)); 100972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 10121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka 1027065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka void ProcessFunctionAfterISel(MachineFunction &MF); 1037065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka bool ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI, const MachineInstr&); 104648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka void InitGlobalBaseReg(MachineFunction &MF); 105648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 10621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, 10721afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka char ConstraintCode, 10821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka std::vector<SDValue> &OutOps); 109972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes}; 110972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 111972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 112972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 113648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka// Insert instructions to initialize the global base register in the 114648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka// first MBB of the function. When the ABI is O32 and the relocation model is 115648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka// PIC, the necessary instructions are emitted later to prevent optimization 116648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka// passes from moving them. 117648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakavoid MipsDAGToDAGISel::InitGlobalBaseReg(MachineFunction &MF) { 118648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>(); 119bb481f882093fb738d2bb15610c79364bada5496Jia Liu 120de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka if (!MipsFI->globalBaseRegSet()) 1214782a6e06ad4c6227831b70bb76165bc7b14bff3Akira Hatanaka return; 1224782a6e06ad4c6227831b70bb76165bc7b14bff3Akira Hatanaka 123648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka MachineBasicBlock &MBB = MF.front(); 124648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka MachineBasicBlock::iterator I = MBB.begin(); 125648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka MachineRegisterInfo &RegInfo = MF.getRegInfo(); 126648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo(); 127648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka DebugLoc DL = I != MBB.end() ? I->getDebugLoc() : DebugLoc(); 1283ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka unsigned V0, V1, V2, GlobalBaseReg = MipsFI->getGlobalBaseReg(); 129de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka const TargetRegisterClass *RC; 13054c5bc87992ebeaa9e71f2bfb60ac5cf74b77db3Akira Hatanaka 131de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka if (Subtarget.isABI_N64()) 132de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPU64RegsRegClass; 133de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka else if (Subtarget.inMips16Mode()) 134de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPU16RegsRegClass; 135de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka else 136de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka RC = (const TargetRegisterClass*)&Mips::CPURegsRegClass; 1373ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka 13827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka V0 = RegInfo.createVirtualRegister(RC); 13927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka V1 = RegInfo.createVirtualRegister(RC); 1403ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka V2 = RegInfo.createVirtualRegister(RC); 141648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 142648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka if (Subtarget.isABI_N64()) { 143648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9_64); 14456e1ed53f515704f2171155e19d1dee7990762a3Akira Hatanaka MBB.addLiveIn(Mips::T9_64); 145648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 146648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 147648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // daddu $v1, $v0, $t9 148648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // daddiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 149648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 150648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi64), V0) 151648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 152864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDu), V1).addReg(V0) 153864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka .addReg(Mips::T9_64); 154648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::DADDiu), GlobalBaseReg).addReg(V1) 155648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 15627ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka return; 15727ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka } 15827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka 1593ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka if (Subtarget.inMips16Mode()) { 1603ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmX16), V0) 161de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); 162de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) 163de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); 164de4a1274706d7449870dac5bed05d27a6772d4edAkira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::SllX16), V2).addReg(V0).addImm(16); 1653ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::AdduRxRyRz16), GlobalBaseReg) 1663ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka .addReg(V1).addReg(V2); 1673ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka return; 1683ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka } 1693ee306cbc0a295409c464ffaad5ef694de8eb09aAkira Hatanaka 17027ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka if (MF.getTarget().getRelocationModel() == Reloc::Static) { 171648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // Set global register to __gnu_local_gp. 172648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // 173648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // lui $v0, %hi(__gnu_local_gp) 174648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka // addiu $globalbasereg, $v0, %lo(__gnu_local_gp) 175648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 176648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_HI); 177648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V0) 178648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka .addExternalSymbol("__gnu_local_gp", MipsII::MO_ABS_LO); 17927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka return; 180bb481f882093fb738d2bb15610c79364bada5496Jia Liu } 18127ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka 18227ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::T9); 18327ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka MBB.addLiveIn(Mips::T9); 18427ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka 18527ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka if (Subtarget.isABI_N32()) { 18627ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // lui $v0, %hi(%neg(%gp_rel(fname))) 18727ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // addu $v1, $v0, $t9 18827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // addiu $globalbasereg, $v1, %lo(%neg(%gp_rel(fname))) 18927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka const GlobalValue *FName = MF.getFunction(); 19027ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::LUi), V0) 19127ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_HI); 19227ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), V1).addReg(V0).addReg(Mips::T9); 19327ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDiu), GlobalBaseReg).addReg(V1) 19427ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka .addGlobalAddress(FName, 0, MipsII::MO_GPOFF_LO); 19527ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka return; 19627ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka } 19727ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka 19827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka assert(Subtarget.isABI_O32()); 19927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka 20027ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // For O32 ABI, the following instruction sequence is emitted to initialize 20127ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // the global base register: 20227ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 20327ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 0. lui $2, %hi(_gp_disp) 20427ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 1. addiu $2, $2, %lo(_gp_disp) 20527ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 2. addu $globalbasereg, $2, $t9 20627ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 20727ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // We emit only the last instruction here. 20827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 20927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // GNU linker requires that the first two instructions appear at the beginning 210d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer // of a function and no instructions be inserted before or between them. 21127ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // The two instructions are emitted during lowering to MC layer in order to 21227ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // avoid any reordering. 21327ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // 21427ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // Register $2 (Mips::V0) is added to the list of live-in registers to ensure 21527ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // the value instruction 1 (addiu) defines is valid when instruction 2 (addu) 21627ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka // reads it. 21727ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka MF.getRegInfo().addLiveIn(Mips::V0); 21827ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka MBB.addLiveIn(Mips::V0); 21927ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka BuildMI(MBB, I, DL, TII.get(Mips::ADDu), GlobalBaseReg) 22027ba61df9f9decc70124b7559f777ad596dfda29Akira Hatanaka .addReg(Mips::V0).addReg(Mips::T9); 221648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka} 222648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 2237065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanakabool MipsDAGToDAGISel::ReplaceUsesWithZeroReg(MachineRegisterInfo *MRI, 2247065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka const MachineInstr& MI) { 2257065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka unsigned DstReg = 0, ZeroReg = 0; 2267065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2277065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka // Check if MI is "addiu $dst, $zero, 0" or "daddiu $dst, $zero, 0". 2287065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka if ((MI.getOpcode() == Mips::ADDiu) && 2297065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO) && 2307065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 2317065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 2327065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka ZeroReg = Mips::ZERO; 2337065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka } else if ((MI.getOpcode() == Mips::DADDiu) && 2347065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka (MI.getOperand(1).getReg() == Mips::ZERO_64) && 2357065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka (MI.getOperand(2).getImm() == 0)) { 2367065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka DstReg = MI.getOperand(0).getReg(); 2377065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka ZeroReg = Mips::ZERO_64; 2387065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka } 2397065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2407065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka if (!DstReg) 2417065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka return false; 2427065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2437065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka // Replace uses with ZeroReg. 2447065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka for (MachineRegisterInfo::use_iterator U = MRI->use_begin(DstReg), 24569a0aa87f8d64895af082cb52c7ecee0f6021d20Jakob Stoklund Olesen E = MRI->use_end(); U != E;) { 2467065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka MachineOperand &MO = U.getOperand(); 24769a0aa87f8d64895af082cb52c7ecee0f6021d20Jakob Stoklund Olesen unsigned OpNo = U.getOperandNo(); 2487065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka MachineInstr *MI = MO.getParent(); 24969a0aa87f8d64895af082cb52c7ecee0f6021d20Jakob Stoklund Olesen ++U; 2507065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2517065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka // Do not replace if it is a phi's operand or is tied to def operand. 25269a0aa87f8d64895af082cb52c7ecee0f6021d20Jakob Stoklund Olesen if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo()) 2537065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka continue; 2547065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2557065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka MO.setReg(ZeroReg); 2567065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka } 2577065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2587065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka return true; 2597065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka} 2607065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2617065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanakavoid MipsDAGToDAGISel::ProcessFunctionAfterISel(MachineFunction &MF) { 2627065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka InitGlobalBaseReg(MF); 2637065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2647065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka MachineRegisterInfo *MRI = &MF.getRegInfo(); 2657065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 2667065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end(); MFI != MFE; 2677065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka ++MFI) 2687065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka for (MachineBasicBlock::iterator I = MFI->begin(); I != MFI->end(); ++I) 2697065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka ReplaceUsesWithZeroReg(MRI, *I); 2707065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka} 2717065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 272648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakabool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) { 273648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka bool Ret = SelectionDAGISel::runOnMachineFunction(MF); 274bb481f882093fb738d2bb15610c79364bada5496Jia Liu 2757065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka ProcessFunctionAfterISel(MF); 276648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 277648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka return Ret; 278648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka} 279972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 280753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes/// getGlobalBaseReg - Output the instructions required to put the 281753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes/// GOT address into a register. 2829911405183f8596fe9d521467f83f6652a296cf4Dan GohmanSDNode *MipsDAGToDAGISel::getGlobalBaseReg() { 283648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka unsigned GlobalBaseReg = MF->getInfo<MipsFunctionInfo>()->getGlobalBaseReg(); 2849911405183f8596fe9d521467f83f6652a296cf4Dan Gohman return CurDAG->getRegister(GlobalBaseReg, TLI.getPointerTy()).getNode(); 285753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes} 286753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes 287972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// ComplexPattern used on MipsInstrInfo 288972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// Used on Mips Load/Store instructions 289972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesbool MipsDAGToDAGISel:: 29044b6c715ac87505f98066fa3bf6e3e99a26b886aAkira HatanakaSelectAddr(SDNode *Parent, SDValue Addr, SDValue &Base, SDValue &Offset) { 291381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka EVT ValTy = Addr.getValueType(); 292381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka 293972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // if Address is FI, get the TargetFrameIndex. 294972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) { 295381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 296381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka Offset = CurDAG->getTargetConstant(0, ValTy); 297972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return true; 298972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 29981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 300c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes // on PIC code Load GA 3016df7e23f0c9e9e4aa5560f3b0ecb2bb7d53f7d81Akira Hatanaka if (Addr.getOpcode() == MipsISD::Wrapper) { 302648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka Base = Addr.getOperand(0); 303648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka Offset = Addr.getOperand(1); 304ca0747917d3daa85287fd7ea6f91349b8d5a5b29Akira Hatanaka return true; 305ca0747917d3daa85287fd7ea6f91349b8d5a5b29Akira Hatanaka } 306ca0747917d3daa85287fd7ea6f91349b8d5a5b29Akira Hatanaka 307ca0747917d3daa85287fd7ea6f91349b8d5a5b29Akira Hatanaka if (TM.getRelocationModel() != Reloc::PIC_) { 308056292fd738924f3f7703725d8f630983794b5a5Bill Wendling if ((Addr.getOpcode() == ISD::TargetExternalSymbol || 309c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes Addr.getOpcode() == ISD::TargetGlobalAddress)) 310c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes return false; 31181092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes } 31281092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes 3135e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka // Addresses of the form FI+const or FI|const 3145e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka if (CurDAG->isBaseWithConstantOffset(Addr)) { 3155e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1)); 3165e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka if (isInt<16>(CN->getSExtValue())) { 3175e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka 3185e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka // If the first operand is a FI, get the TargetFI Node 3195e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode> 3205e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka (Addr.getOperand(0))) 321381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), ValTy); 3225e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka else 3235e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka Base = Addr.getOperand(0); 3245e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka 325381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka Offset = CurDAG->getTargetConstant(CN->getZExtValue(), ValTy); 3265e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka return true; 327972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 3285e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka } 3296e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes 3305e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka // Operand is a result from an ADD. 3315e06903e66a1f89b29a7cdf89421e3d8d12f6a77Akira Hatanaka if (Addr.getOpcode() == ISD::ADD) { 3326e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // When loading from constant pools, load the lower address part in 333d71cebf57591e2dc27930d3002848dddc76c3f92Bruno Cardoso Lopes // the instruction itself. Example, instead of: 3346e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // lui $2, %hi($CPI1_0) 3356e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // addiu $2, $2, %lo($CPI1_0) 3366e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // lwc1 $f0, 0($2) 3376e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // Generate: 3386e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // lui $2, %hi($CPI1_0) 3396e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes // lwc1 $f0, %lo($CPI1_0)($2) 34045d8dbc92d365e9c0a08ceb0bc7a9014e6064bdbAkira Hatanaka if (Addr.getOperand(1).getOpcode() == MipsISD::Lo || 34145d8dbc92d365e9c0a08ceb0bc7a9014e6064bdbAkira Hatanaka Addr.getOperand(1).getOpcode() == MipsISD::GPRel) { 34245d8dbc92d365e9c0a08ceb0bc7a9014e6064bdbAkira Hatanaka SDValue Opnd0 = Addr.getOperand(1).getOperand(0); 3438782707f5074ab3951eb6424394bc8d2a2fa584aAkira Hatanaka if (isa<ConstantPoolSDNode>(Opnd0) || isa<GlobalAddressSDNode>(Opnd0) || 3448782707f5074ab3951eb6424394bc8d2a2fa584aAkira Hatanaka isa<JumpTableSDNode>(Opnd0)) { 345d71cebf57591e2dc27930d3002848dddc76c3f92Bruno Cardoso Lopes Base = Addr.getOperand(0); 3468782707f5074ab3951eb6424394bc8d2a2fa584aAkira Hatanaka Offset = Opnd0; 347d71cebf57591e2dc27930d3002848dddc76c3f92Bruno Cardoso Lopes return true; 3486e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes } 3496e0b658dadc15aecc4e8503b39741148cf18ee1fBruno Cardoso Lopes } 35044b6c715ac87505f98066fa3bf6e3e99a26b886aAkira Hatanaka 351dfa27aea12ae1d69a7e94ed5e6df6be1cc90d9e3Akira Hatanaka // If an indexed floating point load/store can be emitted, return false. 35236bcc11236af961ff94820bf9817ecb4f98ace7eAkira Hatanaka const LSBaseSDNode *LS = dyn_cast<LSBaseSDNode>(Parent); 35336bcc11236af961ff94820bf9817ecb4f98ace7eAkira Hatanaka 354864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka if (LS && 355864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka (LS->getMemoryVT() == MVT::f32 || LS->getMemoryVT() == MVT::f64) && 356dfa27aea12ae1d69a7e94ed5e6df6be1cc90d9e3Akira Hatanaka Subtarget.hasMips32r2Or64()) 357dfa27aea12ae1d69a7e94ed5e6df6be1cc90d9e3Akira Hatanaka return false; 358972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 359972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 360a4e8200366805c665bb1424d8af5550f5d3d6863Bruno Cardoso Lopes Base = Addr; 361381e97dcf6852323d053122cb222751d6578534fAkira Hatanaka Offset = CurDAG->getTargetConstant(0, ValTy); 362972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return true; 363972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 364972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 3652fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka/// Select multiply instructions. 3662fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanakastd::pair<SDNode*, SDNode*> 367bb481f882093fb738d2bb15610c79364bada5496Jia LiuMipsDAGToDAGISel::SelectMULT(SDNode *N, unsigned Opc, DebugLoc dl, EVT Ty, 3682fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka bool HasLo, bool HasHi) { 369a32a08c8e26049457bd3df39bea5f4a80e308d4aChad Rosier SDNode *Lo = 0, *Hi = 0; 3702fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka SDNode *Mul = CurDAG->getMachineNode(Opc, dl, MVT::Glue, N->getOperand(0), 3712fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka N->getOperand(1)); 3722fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka SDValue InFlag = SDValue(Mul, 0); 3732fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 3742fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka if (HasLo) { 3752fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka Lo = CurDAG->getMachineNode(Ty == MVT::i32 ? Mips::MFLO : Mips::MFLO64, dl, 3762fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka Ty, MVT::Glue, InFlag); 3772fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka InFlag = SDValue(Lo, 1); 3782fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka } 3792fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka if (HasHi) 3802fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka Hi = CurDAG->getMachineNode(Ty == MVT::i32 ? Mips::MFHI : Mips::MFHI64, dl, 3812fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka Ty, InFlag); 382bb481f882093fb738d2bb15610c79364bada5496Jia Liu 3832fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka return std::make_pair(Lo, Hi); 3842fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka} 3852fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 3862fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 387972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// Select instructions not customized! Used for 388972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// expanded, promoted and normal instructions 389eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan GohmanSDNode* MipsDAGToDAGISel::Select(SDNode *Node) { 390972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes unsigned Opcode = Node->getOpcode(); 391a05dca4f9e051fad19fe9b5f6cce2715c1e5d505Dale Johannesen DebugLoc dl = Node->getDebugLoc(); 392972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 393972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Dump information about the Node being selected 3947c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n"); 395972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 396972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // If we have a custom node, we already have selected! 397e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman if (Node->isMachineOpcode()) { 3987c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n"); 399972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return NULL; 400972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 401972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 402972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes /// 40381092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes // Instruction Selection not handled by the auto-generated 404b42abebe36f1dfbd0c779fd1471618c42ed3fec5Bruno Cardoso Lopes // tablegen selection should be handled here. 40581092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes /// 4062fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka EVT NodeTy = Node->getValueType(0); 4072fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka unsigned MultOpc; 4082fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 409972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes switch(Opcode) { 41049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka default: break; 41149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka 41249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::SUBE: 41349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::ADDE: { 41449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue InFlag = Node->getOperand(2), CmpLHS; 41549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka unsigned Opc = InFlag.getOpcode(); (void)Opc; 41649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) || 41749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka (Opc == ISD::SUBC || Opc == ISD::SUBE)) && 41849d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn"); 41949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka 42049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka unsigned MOp; 42149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (Opcode == ISD::ADDE) { 42249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka CmpLHS = InFlag.getValue(0); 42349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka MOp = Mips::ADDu; 42449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } else { 42549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka CmpLHS = InFlag.getOperand(0); 42649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka MOp = Mips::SUBu; 42749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 4280af5e095ad16091457c35edd015fe2931023f58bBruno Cardoso Lopes 42949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue Ops[] = { CmpLHS, InFlag.getOperand(1) }; 43007cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 43149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue LHS = Node->getOperand(0); 43249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue RHS = Node->getOperand(1); 43307cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 43449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka EVT VT = LHS.getValueType(); 43549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDNode *Carry = CurDAG->getMachineNode(Mips::SLTu, dl, VT, Ops, 2); 43649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDNode *AddCarry = CurDAG->getMachineNode(Mips::ADDu, dl, VT, 43749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue(Carry,0), RHS); 43807cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 43949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, 44049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka LHS, SDValue(AddCarry,0)); 44149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 44207cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 44349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka /// Mul with two results 44449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::SMUL_LOHI: 44549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::UMUL_LOHI: { 4462fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka if (NodeTy == MVT::i32) 4472fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka MultOpc = (Opcode == ISD::UMUL_LOHI ? Mips::MULTu : Mips::MULT); 4482fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka else 4492fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka MultOpc = (Opcode == ISD::UMUL_LOHI ? Mips::DMULTu : Mips::DMULT); 45007cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 4512fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka std::pair<SDNode*, SDNode*> LoHi = SelectMULT(Node, MultOpc, dl, NodeTy, 4522fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka true, true); 4530af5e095ad16091457c35edd015fe2931023f58bBruno Cardoso Lopes 45449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (!SDValue(Node, 0).use_empty()) 4552fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka ReplaceUses(SDValue(Node, 0), SDValue(LoHi.first, 0)); 4560af5e095ad16091457c35edd015fe2931023f58bBruno Cardoso Lopes 45749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (!SDValue(Node, 1).use_empty()) 4582fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka ReplaceUses(SDValue(Node, 1), SDValue(LoHi.second, 0)); 4590af5e095ad16091457c35edd015fe2931023f58bBruno Cardoso Lopes 46049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return NULL; 46149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 46207cec75913b74d04df40ff7fecf51f87175076c1Bruno Cardoso Lopes 46349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka /// Special Muls 4642fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka case ISD::MUL: { 46549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka // Mips32 has a 32-bit three operand mul instruction. 4662fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka if (Subtarget.hasMips32() && NodeTy == MVT::i32) 46749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka break; 4682fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka return SelectMULT(Node, NodeTy == MVT::i32 ? Mips::MULT : Mips::DMULT, 4692fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka dl, NodeTy, true, false).first; 4702fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka } 47149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::MULHS: 47249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::MULHU: { 4732fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka if (NodeTy == MVT::i32) 4742fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka MultOpc = (Opcode == ISD::MULHU ? Mips::MULTu : Mips::MULT); 47549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka else 4762fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka MultOpc = (Opcode == ISD::MULHU ? Mips::DMULTu : Mips::DMULT); 4772fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 4782fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka return SelectMULT(Node, MultOpc, dl, NodeTy, false, true).second; 47949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 480972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 48149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka // Get target GOT address. 48249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::GLOBAL_OFFSET_TABLE: 48349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return getGlobalBaseReg(); 484990d639f552308220dae062661fa3ba074d7150cAkira Hatanaka 48549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::ConstantFP: { 48649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(Node); 48749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (Node->getValueType(0) == MVT::f64 && CN->isExactlyValue(+0.0)) { 48849d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (Subtarget.hasMips64()) { 48981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl, 49049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka Mips::ZERO_64, MVT::i64); 49149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return CurDAG->getMachineNode(Mips::DMTC1, dl, MVT::f64, Zero); 492a8173b934fdfdc7a3ca543a0734b7c8fa1969366Bruno Cardoso Lopes } 49349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka 49449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue Zero = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), dl, 49549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka Mips::ZERO, MVT::i32); 49649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return CurDAG->getMachineNode(Mips::BuildPairF64, dl, MVT::f64, Zero, 49749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka Zero); 498a8173b934fdfdc7a3ca543a0734b7c8fa1969366Bruno Cardoso Lopes } 49949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka break; 50049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 501a8173b934fdfdc7a3ca543a0734b7c8fa1969366Bruno Cardoso Lopes 50257fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka case ISD::Constant: { 50357fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka const ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Node); 50457fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka unsigned Size = CN->getValueSizeInBits(0); 50557fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 50657fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka if (Size == 32) 50757fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka break; 50857fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 50957fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka MipsAnalyzeImmediate AnalyzeImm; 51057fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka int64_t Imm = CN->getSExtValue(); 51157fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 51257fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka const MipsAnalyzeImmediate::InstSeq &Seq = 51357fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka AnalyzeImm.Analyze(Imm, Size, false); 514bb481f882093fb738d2bb15610c79364bada5496Jia Liu 51557fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka MipsAnalyzeImmediate::InstSeq::const_iterator Inst = Seq.begin(); 51657fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka DebugLoc DL = CN->getDebugLoc(); 51757fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka SDNode *RegOpnd; 51857fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka SDValue ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 51957fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka MVT::i64); 52057fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 52157fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka // The first instruction can be a LUi which is different from other 52257fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka // instructions (ADDiu, ORI and SLL) in that it does not have a register 52357fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka // operand. 52457fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka if (Inst->Opc == Mips::LUi64) 52557fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, ImmOpnd); 52657fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka else 52757fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka RegOpnd = 52857fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 52957fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka CurDAG->getRegister(Mips::ZERO_64, MVT::i64), 53057fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka ImmOpnd); 53157fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 53257fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka // The remaining instructions in the sequence are handled here. 53357fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka for (++Inst; Inst != Seq.end(); ++Inst) { 53457fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka ImmOpnd = CurDAG->getTargetConstant(SignExtend64<16>(Inst->ImmOpnd), 53557fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka MVT::i64); 53657fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka RegOpnd = CurDAG->getMachineNode(Inst->Opc, DL, MVT::i64, 53757fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka SDValue(RegOpnd, 0), ImmOpnd); 53857fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka } 53957fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 54057fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka return RegOpnd; 54157fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka } 54257fa38225cfeded40a38770a2cc52e10a4e7268dAkira Hatanaka 54349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case MipsISD::ThreadPointer: { 54449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka EVT PtrVT = TLI.getPointerTy(); 54549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka unsigned RdhwrOpc, SrcReg, DestReg; 54649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka 54749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka if (PtrVT == MVT::i32) { 54849d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka RdhwrOpc = Mips::RDHWR; 54949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SrcReg = Mips::HWR29; 55049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka DestReg = Mips::V1; 55149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } else { 55249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka RdhwrOpc = Mips::RDHWR64; 55349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SrcReg = Mips::HWR29_64; 55449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka DestReg = Mips::V1_64; 555d979686bb47f2dcdca60f0a088f59d1964346453Bruno Cardoso Lopes } 556bb481f882093fb738d2bb15610c79364bada5496Jia Liu 55749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDNode *Rdhwr = 55849d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka CurDAG->getMachineNode(RdhwrOpc, Node->getDebugLoc(), 55949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka Node->getValueType(0), 56049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka CurDAG->getRegister(SrcReg, PtrVT)); 56149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue Chain = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, DestReg, 56249d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue(Rdhwr, 0)); 56349d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka SDValue ResNode = CurDAG->getCopyFromReg(Chain, dl, DestReg, PtrVT); 56449d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka ReplaceUses(SDValue(Node, 0), ResNode); 56549d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return ResNode.getNode(); 56649d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka } 567972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 568972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 569972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Select the default instruction 570eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman SDNode *ResNode = SelectCode(Node); 571972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 5727c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "=> "); 573eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman if (ResNode == NULL || ResNode == Node) 574eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman DEBUG(Node->dump(CurDAG)); 575972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes else 576972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes DEBUG(ResNode->dump(CurDAG)); 577893e1c90a03a53cf13f73849324e83612688428aChris Lattner DEBUG(errs() << "\n"); 578972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return ResNode; 579972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 580972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 58121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanakabool MipsDAGToDAGISel:: 58221afc63ea7b8227ccb1b735255be55bf422136d6Akira HatanakaSelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, 58321afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka std::vector<SDValue> &OutOps) { 58421afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka assert(ConstraintCode == 'm' && "unexpected asm memory constraint"); 58521afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka OutOps.push_back(Op); 58621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka return false; 58721afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka} 58821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka 58981092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes/// createMipsISelDag - This pass converts a legalized DAG into a 590972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// MIPS-specific DAG, ready for instruction scheduling. 591972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso LopesFunctionPass *llvm::createMipsISelDag(MipsTargetMachine &TM) { 592972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return new MipsDAGToDAGISel(TM); 593972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 594