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 14554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka#include "MipsISelDAGToDAG.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/MipsBaseInfo.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "Mips.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "Mips16ISelDAGToDAG.h" 18c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes#include "MipsMachineFunction.h" 19972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsRegisterInfo.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MipsSEISelDAGToDAG.h" 21972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineConstantPool.h" 22972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunction.h" 24972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h" 2584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h" 2644b6c715ac87505f98066fa3bf6e3e99a26b886aAkira Hatanaka#include "llvm/CodeGen/SelectionDAGNodes.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CFG.h" 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h" 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Intrinsics.h" 310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 32972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "llvm/Support/Debug.h" 33dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/ErrorHandling.h" 34dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 36972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesusing namespace llvm; 37972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "mips-isel" 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 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//===----------------------------------------------------------------------===// 487065b7b20341aaeb93ac3ce09726f69657ff3da8Akira Hatanaka 49648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanakabool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) { 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Subtarget = &TM.getSubtarget<MipsSubtarget>(); 51648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka bool Ret = SelectionDAGISel::runOnMachineFunction(MF); 52bb481f882093fb738d2bb15610c79364bada5496Jia Liu 53f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka processFunctionAfterISel(MF); 54648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka 55648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka return Ret; 56648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka} 57972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 58753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes/// getGlobalBaseReg - Output the instructions required to put the 59753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes/// GOT address into a register. 609911405183f8596fe9d521467f83f6652a296cf4Dan GohmanSDNode *MipsDAGToDAGISel::getGlobalBaseReg() { 61648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka unsigned GlobalBaseReg = MF->getInfo<MipsFunctionInfo>()->getGlobalBaseReg(); 62ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling return CurDAG->getRegister(GlobalBaseReg, 63ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling getTargetLowering()->getPointerTy()).getNode(); 64753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes} 65753a98740bfe3164fd0961a1959306c46135cf19Bruno Cardoso Lopes 66972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// ComplexPattern used on MipsInstrInfo 67972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// Used on Mips Load/Store instructions 68abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanakabool MipsDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base, 69abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanaka SDValue &Offset) const { 70554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka llvm_unreachable("Unimplemented function."); 71dc2f79274021a590d6b72acd741117068c3e49bdAkira Hatanaka return false; 72dc2f79274021a590d6b72acd741117068c3e49bdAkira Hatanaka} 73dc2f79274021a590d6b72acd741117068c3e49bdAkira Hatanaka 742fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sandersbool MipsDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base, 752fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders SDValue &Offset) const { 762fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders llvm_unreachable("Unimplemented function."); 772fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders return false; 782fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders} 792fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders 80abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanakabool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base, 81abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanaka SDValue &Offset) const { 82554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka llvm_unreachable("Unimplemented function."); 83554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 84972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 85972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 86abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanakabool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base, 87abbf9df7f42e8e3e95b02b16ebbc6a0684bb4f6dAkira Hatanaka SDValue &Offset) const { 88554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka llvm_unreachable("Unimplemented function."); 89554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 90f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler} 91f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler 92da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carterbool MipsDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base, 93da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter SDValue &Offset) const { 94da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter llvm_unreachable("Unimplemented function."); 95da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter return false; 96da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter} 97da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base, 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SDValue &Offset) const { 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Unimplemented function."); 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 104f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanakabool MipsDAGToDAGISel::selectAddr16(SDNode *Parent, SDValue N, SDValue &Base, 105554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka SDValue &Offset, SDValue &Alias) { 106554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka llvm_unreachable("Unimplemented function."); 107554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return false; 1082fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka} 1092fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 110acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm) const { 111acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 112acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 113acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 114acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 115c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const { 116c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders llvm_unreachable("Unimplemented function."); 117c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders return false; 118c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders} 119c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders 120c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const { 121c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders llvm_unreachable("Unimplemented function."); 122c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders return false; 123c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders} 124c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders 125acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const { 126acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 127acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 128acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 129acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 130acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const { 131acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 132acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 133acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 134acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 135acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const { 136acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 137acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 138acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 139acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 140acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const { 141acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 142acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 143acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 144acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 145acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const { 146acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 147acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 148acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 149acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 150acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const { 151acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 152acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 153acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 154acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 155acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const { 156acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders llvm_unreachable("Unimplemented function."); 157acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders return false; 158acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders} 159acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 160bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sandersbool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const { 161bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders llvm_unreachable("Unimplemented function."); 162bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders return false; 163bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders} 164bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders 1656ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const { 1666ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders llvm_unreachable("Unimplemented function."); 1676ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders return false; 1686ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders} 1696ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders 1706ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sandersbool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const { 1716ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders llvm_unreachable("Unimplemented function."); 1726ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders return false; 1736ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders} 1746ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders 175972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// Select instructions not customized! Used for 176972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// expanded, promoted and normal instructions 177eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan GohmanSDNode* MipsDAGToDAGISel::Select(SDNode *Node) { 178972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes unsigned Opcode = Node->getOpcode(); 179972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 180972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Dump information about the Node being selected 1817c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n"); 182972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 183972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // If we have a custom node, we already have selected! 184e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman if (Node->isMachineOpcode()) { 1857c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n"); 1863e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover Node->setNodeId(-1); 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 188972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 189972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 190554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka // See if subclasses can handle this node. 191f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka std::pair<bool, SDNode*> Ret = selectNode(Node); 192554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 193554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (Ret.first) 194554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return Ret.second; 1952fd0475cdbf7e80d4e5097ab0ddedcce18711ec9Akira Hatanaka 196972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes switch(Opcode) { 19749d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka default: break; 19849d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka 19949d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka // Get target GOT address. 20049d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka case ISD::GLOBAL_OFFSET_TABLE: 20149d534bb3d21cfefd372e7d337af41dbab6738e3Akira Hatanaka return getGlobalBaseReg(); 202990d639f552308220dae062661fa3ba074d7150cAkira Hatanaka 2035a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka#ifndef NDEBUG 2045a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka case ISD::LOAD: 2055a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka case ISD::STORE: 206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines assert((Subtarget->systemSupportsUnalignedAccess() || 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cast<MemSDNode>(Node)->getMemoryVT().getSizeInBits() / 8 <= 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cast<MemSDNode>(Node)->getAlignment()) && 2095a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka "Unexpected unaligned loads/stores."); 2105a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka break; 2115a7dd43f045f2f78adc81b497c5d78bd9da0884eAkira Hatanaka#endif 212972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes } 213972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 214972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes // Select the default instruction 215eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman SDNode *ResNode = SelectCode(Node); 216972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 2177c306da505e2d7f64e160890b274a47fa0740962Chris Lattner DEBUG(errs() << "=> "); 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (ResNode == nullptr || ResNode == Node) 219eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman DEBUG(Node->dump(CurDAG)); 220972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes else 221972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes DEBUG(ResNode->dump(CurDAG)); 222893e1c90a03a53cf13f73849324e83612688428aChris Lattner DEBUG(errs() << "\n"); 223972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes return ResNode; 224972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 225972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes 22621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanakabool MipsDAGToDAGISel:: 22721afc63ea7b8227ccb1b735255be55bf422136d6Akira HatanakaSelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, 22821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka std::vector<SDValue> &OutOps) { 22921afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka assert(ConstraintCode == 'm' && "unexpected asm memory constraint"); 23021afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka OutOps.push_back(Op); 23121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka return false; 23221afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka} 23321afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka 23481092dc20abe5253a5b4d48a75997baa84dde196Bruno Cardoso Lopes/// createMipsISelDag - This pass converts a legalized DAG into a 235972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes/// MIPS-specific DAG, ready for instruction scheduling. 236972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso LopesFunctionPass *llvm::createMipsISelDag(MipsTargetMachine &TM) { 237554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka if (TM.getSubtargetImpl()->inMips16Mode()) 238554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return llvm::createMips16ISelDag(TM); 239554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka 240554d9312b284265f91ac5ee5bf0351d446f669b1Akira Hatanaka return llvm::createMipsSEISelDag(TM); 241972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes} 242