blob: 0e1173f1c6177f7e10710208e9b450621624957b [file] [log] [blame]
Jia Liu9f610112012-02-17 08:55:11 +00001//===-- MipsISelDAGToDAG.cpp - A Dag to Dag Inst Selector for Mips --------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00007//
Akira Hatanakae2489122011-04-15 21:51:11 +00008//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00009//
10// This file defines an instruction selector for the MIPS target.
11//
Akira Hatanakae2489122011-04-15 21:51:11 +000012//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000013
Akira Hatanaka30a84782013-03-14 18:27:31 +000014#include "MipsISelDAGToDAG.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "MCTargetDesc/MipsBaseInfo.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000016#include "Mips.h"
17#include "Mips16ISelDAGToDAG.h"
Bruno Cardoso Lopes3e0d0302007-11-05 03:02:32 +000018#include "MipsMachineFunction.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000019#include "MipsRegisterInfo.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000020#include "MipsSEISelDAGToDAG.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000021#include "llvm/CodeGen/MachineConstantPool.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000022#include "llvm/CodeGen/MachineFrameInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000023#include "llvm/CodeGen/MachineFunction.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000024#include "llvm/CodeGen/MachineInstrBuilder.h"
Chris Lattnera10fff52007-12-31 04:13:23 +000025#include "llvm/CodeGen/MachineRegisterInfo.h"
Akira Hatanaka330d9012012-02-28 02:55:02 +000026#include "llvm/CodeGen/SelectionDAGNodes.h"
Chandler Carruth1305dc32014-03-04 11:45:46 +000027#include "llvm/IR/CFG.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000028#include "llvm/IR/GlobalValue.h"
29#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Intrinsics.h"
31#include "llvm/IR/Type.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000032#include "llvm/Support/Debug.h"
Torok Edwinfb8d6d52009-07-08 20:53:28 +000033#include "llvm/Support/ErrorHandling.h"
34#include "llvm/Support/raw_ostream.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000035#include "llvm/Target/TargetMachine.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000036using namespace llvm;
37
Chandler Carruth84e68b22014-04-22 02:41:26 +000038#define DEBUG_TYPE "mips-isel"
39
Akira Hatanakae2489122011-04-15 21:51:11 +000040//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000041// Instruction Selector Implementation
Akira Hatanakae2489122011-04-15 21:51:11 +000042//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000043
Akira Hatanakae2489122011-04-15 21:51:11 +000044//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000045// MipsDAGToDAGISel - MIPS specific code to select MIPS machine
46// instructions for SelectionDAG operations.
Akira Hatanakae2489122011-04-15 21:51:11 +000047//===----------------------------------------------------------------------===//
Akira Hatanaka0b2fa912012-03-08 01:51:59 +000048
Akira Hatanakab049aef2012-02-24 22:34:47 +000049bool MipsDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
Eric Christopher96e72c62015-01-29 23:27:36 +000050 Subtarget = &static_cast<const MipsSubtarget &>(MF.getSubtarget());
Akira Hatanakab049aef2012-02-24 22:34:47 +000051 bool Ret = SelectionDAGISel::runOnMachineFunction(MF);
Jia Liuf54f60f2012-02-28 07:46:26 +000052
Akira Hatanaka040d2252013-03-14 18:33:23 +000053 processFunctionAfterISel(MF);
Akira Hatanakab049aef2012-02-24 22:34:47 +000054
55 return Ret;
56}
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000057
Bruno Cardoso Lopesb4391322007-11-12 19:49:57 +000058/// getGlobalBaseReg - Output the instructions required to put the
59/// GOT address into a register.
Dan Gohmand5ca70642009-06-03 20:30:14 +000060SDNode *MipsDAGToDAGISel::getGlobalBaseReg() {
Akira Hatanakab049aef2012-02-24 22:34:47 +000061 unsigned GlobalBaseReg = MF->getInfo<MipsFunctionInfo>()->getGlobalBaseReg();
Mehdi Amini44ede332015-07-09 02:09:04 +000062 return CurDAG->getRegister(GlobalBaseReg, getTargetLowering()->getPointerTy(
63 CurDAG->getDataLayout()))
64 .getNode();
Bruno Cardoso Lopesb4391322007-11-12 19:49:57 +000065}
66
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000067/// ComplexPattern used on MipsInstrInfo
68/// Used on Mips Load/Store instructions
Akira Hatanakaa35bc832013-02-16 00:14:37 +000069bool MipsDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
70 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000071 llvm_unreachable("Unimplemented function.");
Akira Hatanaka69fb3d12013-02-15 21:20:45 +000072 return false;
73}
74
Akira Hatanakaa35bc832013-02-16 00:14:37 +000075bool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
76 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000077 llvm_unreachable("Unimplemented function.");
78 return false;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000079}
80
Akira Hatanakaa35bc832013-02-16 00:14:37 +000081bool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
82 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000083 llvm_unreachable("Unimplemented function.");
84 return false;
Akira Hatanaka69fb3d12013-02-15 21:20:45 +000085}
86
Zlatko Buljancba9f802016-07-11 07:41:56 +000087bool MipsDAGToDAGISel::selectIntAddr11MM(SDValue Addr, SDValue &Base,
88 SDValue &Offset) const {
89 llvm_unreachable("Unimplemented function.");
90 return false;
91}
92
93bool MipsDAGToDAGISel::selectIntAddr12MM(SDValue Addr, SDValue &Base,
94 SDValue &Offset) const {
95 llvm_unreachable("Unimplemented function.");
96 return false;
97}
98
99bool MipsDAGToDAGISel::selectIntAddr16MM(SDValue Addr, SDValue &Base,
Jack Carter97700972013-08-13 20:19:16 +0000100 SDValue &Offset) const {
101 llvm_unreachable("Unimplemented function.");
102 return false;
103}
104
Zoran Jovanovic5a1a7802015-02-04 15:43:17 +0000105bool MipsDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
106 SDValue &Offset) const {
107 llvm_unreachable("Unimplemented function.");
108 return false;
109}
110
Hrvoje Varga00d96ee2016-08-01 06:46:20 +0000111bool MipsDAGToDAGISel::selectIntAddrSImm10(SDValue Addr, SDValue &Base,
112 SDValue &Offset) const {
113 llvm_unreachable("Unimplemented function.");
114 return false;
115}
116
117bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
118 SDValue &Offset) const {
119 llvm_unreachable("Unimplemented function.");
120 return false;
121}
122
123bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
124 SDValue &Offset) const {
125 llvm_unreachable("Unimplemented function.");
126 return false;
127}
128
129bool MipsDAGToDAGISel::selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
130 SDValue &Offset) const {
Daniel Sandersfa961d72014-03-03 14:31:21 +0000131 llvm_unreachable("Unimplemented function.");
132 return false;
133}
134
Daniel Sandersde7816b2016-06-16 10:20:59 +0000135bool MipsDAGToDAGISel::selectAddr16(SDValue Addr, SDValue &Base,
136 SDValue &Offset) {
137 llvm_unreachable("Unimplemented function.");
138 return false;
139}
140
141bool MipsDAGToDAGISel::selectAddr16SP(SDValue Addr, SDValue &Base,
142 SDValue &Offset) {
Akira Hatanaka30a84782013-03-14 18:27:31 +0000143 llvm_unreachable("Unimplemented function.");
144 return false;
Reed Kotler3589dd72012-10-28 06:02:37 +0000145}
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000146
Daniel Sandersc8cd58f2015-05-19 12:24:52 +0000147bool MipsDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm,
148 unsigned MinSizeInBits) const {
Daniel Sandersf49dd822013-09-24 13:33:07 +0000149 llvm_unreachable("Unimplemented function.");
150 return false;
151}
152
Daniel Sanders7e51fe12013-09-27 11:48:57 +0000153bool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const {
154 llvm_unreachable("Unimplemented function.");
155 return false;
156}
157
158bool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const {
159 llvm_unreachable("Unimplemented function.");
160 return false;
161}
162
Daniel Sandersf49dd822013-09-24 13:33:07 +0000163bool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const {
164 llvm_unreachable("Unimplemented function.");
165 return false;
166}
167
168bool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const {
169 llvm_unreachable("Unimplemented function.");
170 return false;
171}
172
173bool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const {
174 llvm_unreachable("Unimplemented function.");
175 return false;
176}
177
178bool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const {
179 llvm_unreachable("Unimplemented function.");
180 return false;
181}
182
183bool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const {
184 llvm_unreachable("Unimplemented function.");
185 return false;
186}
187
188bool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const {
189 llvm_unreachable("Unimplemented function.");
190 return false;
191}
192
193bool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
194 llvm_unreachable("Unimplemented function.");
195 return false;
196}
197
Daniel Sanders3f6eb542013-11-12 10:45:18 +0000198bool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const {
199 llvm_unreachable("Unimplemented function.");
200 return false;
201}
202
Daniel Sandersd74b1302013-10-30 14:45:14 +0000203bool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
204 llvm_unreachable("Unimplemented function.");
205 return false;
206}
207
208bool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
209 llvm_unreachable("Unimplemented function.");
210 return false;
211}
212
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000213/// Select instructions not customized! Used for
214/// expanded, promoted and normal instructions
Justin Bognereeae7512016-05-13 23:55:59 +0000215void MipsDAGToDAGISel::Select(SDNode *Node) {
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000216 unsigned Opcode = Node->getOpcode();
217
218 // Dump information about the Node being selected
Chris Lattnerf98f1242010-03-02 06:34:30 +0000219 DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n");
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000220
221 // If we have a custom node, we already have selected!
Dan Gohman17059682008-07-17 19:10:17 +0000222 if (Node->isMachineOpcode()) {
Chris Lattnerf98f1242010-03-02 06:34:30 +0000223 DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
Tim Northover31d093c2013-09-22 08:21:56 +0000224 Node->setNodeId(-1);
Justin Bognereeae7512016-05-13 23:55:59 +0000225 return;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000226 }
227
Akira Hatanaka30a84782013-03-14 18:27:31 +0000228 // See if subclasses can handle this node.
Justin Bognereeae7512016-05-13 23:55:59 +0000229 if (trySelect(Node))
230 return;
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000231
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000232 switch(Opcode) {
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000233 default: break;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000234
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000235 // Get target GOT address.
236 case ISD::GLOBAL_OFFSET_TABLE:
Justin Bognereeae7512016-05-13 23:55:59 +0000237 ReplaceNode(Node, getGlobalBaseReg());
238 return;
Akira Hatanakadee6c822011-12-08 20:34:32 +0000239
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000240#ifndef NDEBUG
241 case ISD::LOAD:
242 case ISD::STORE:
Eric Christopher22405e42014-07-10 17:26:51 +0000243 assert((Subtarget->systemSupportsUnalignedAccess() ||
Daniel Sandersac272632014-05-23 13:18:02 +0000244 cast<MemSDNode>(Node)->getMemoryVT().getSizeInBits() / 8 <=
245 cast<MemSDNode>(Node)->getAlignment()) &&
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000246 "Unexpected unaligned loads/stores.");
247 break;
248#endif
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000249 }
250
251 // Select the default instruction
Justin Bognereeae7512016-05-13 23:55:59 +0000252 SelectCode(Node);
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000253}
254
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000255bool MipsDAGToDAGISel::
Daniel Sanders60f1db02015-03-13 12:45:09 +0000256SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000257 std::vector<SDValue> &OutOps) {
Daniel Sandersa73d8fe2015-03-24 11:26:34 +0000258 // All memory constraints can at least accept raw pointers.
259 switch(ConstraintID) {
260 default:
261 llvm_unreachable("Unexpected asm memory constraint");
262 case InlineAsm::Constraint_i:
263 case InlineAsm::Constraint_m:
264 case InlineAsm::Constraint_R:
265 case InlineAsm::Constraint_ZC:
266 OutOps.push_back(Op);
267 return false;
268 }
269 return true;
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000270}