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