blob: 06502397b6b8c826855f339966341439b2cc7d39 [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
Daniel Sanderse6ed5b72013-08-28 12:04:29 +000075bool MipsDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base,
76 SDValue &Offset) const {
77 llvm_unreachable("Unimplemented function.");
78 return false;
79}
80
Akira Hatanakaa35bc832013-02-16 00:14:37 +000081bool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
82 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000083 llvm_unreachable("Unimplemented function.");
84 return false;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000085}
86
Akira Hatanakaa35bc832013-02-16 00:14:37 +000087bool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
88 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000089 llvm_unreachable("Unimplemented function.");
90 return false;
Akira Hatanaka69fb3d12013-02-15 21:20:45 +000091}
92
Jack Carter97700972013-08-13 20:19:16 +000093bool MipsDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base,
94 SDValue &Offset) const {
95 llvm_unreachable("Unimplemented function.");
96 return false;
97}
98
Zoran Jovanovic5a1a7802015-02-04 15:43:17 +000099bool MipsDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
100 SDValue &Offset) const {
101 llvm_unreachable("Unimplemented function.");
102 return false;
103}
104
Daniel Sandersfa961d72014-03-03 14:31:21 +0000105bool MipsDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base,
106 SDValue &Offset) const {
107 llvm_unreachable("Unimplemented function.");
108 return false;
109}
110
Akira Hatanaka040d2252013-03-14 18:33:23 +0000111bool MipsDAGToDAGISel::selectAddr16(SDNode *Parent, SDValue N, SDValue &Base,
Akira Hatanaka30a84782013-03-14 18:27:31 +0000112 SDValue &Offset, SDValue &Alias) {
113 llvm_unreachable("Unimplemented function.");
114 return false;
Reed Kotler3589dd72012-10-28 06:02:37 +0000115}
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000116
Daniel Sandersc8cd58f2015-05-19 12:24:52 +0000117bool MipsDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm,
118 unsigned MinSizeInBits) const {
Daniel Sandersf49dd822013-09-24 13:33:07 +0000119 llvm_unreachable("Unimplemented function.");
120 return false;
121}
122
Daniel Sanders7e51fe12013-09-27 11:48:57 +0000123bool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const {
124 llvm_unreachable("Unimplemented function.");
125 return false;
126}
127
128bool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const {
129 llvm_unreachable("Unimplemented function.");
130 return false;
131}
132
Daniel Sandersf49dd822013-09-24 13:33:07 +0000133bool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const {
134 llvm_unreachable("Unimplemented function.");
135 return false;
136}
137
138bool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const {
139 llvm_unreachable("Unimplemented function.");
140 return false;
141}
142
143bool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const {
144 llvm_unreachable("Unimplemented function.");
145 return false;
146}
147
148bool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const {
149 llvm_unreachable("Unimplemented function.");
150 return false;
151}
152
153bool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const {
154 llvm_unreachable("Unimplemented function.");
155 return false;
156}
157
158bool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const {
159 llvm_unreachable("Unimplemented function.");
160 return false;
161}
162
163bool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
164 llvm_unreachable("Unimplemented function.");
165 return false;
166}
167
Daniel Sanders3f6eb542013-11-12 10:45:18 +0000168bool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const {
169 llvm_unreachable("Unimplemented function.");
170 return false;
171}
172
Daniel Sandersd74b1302013-10-30 14:45:14 +0000173bool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
174 llvm_unreachable("Unimplemented function.");
175 return false;
176}
177
178bool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
179 llvm_unreachable("Unimplemented function.");
180 return false;
181}
182
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000183/// Select instructions not customized! Used for
184/// expanded, promoted and normal instructions
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000185SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000186 unsigned Opcode = Node->getOpcode();
187
188 // Dump information about the Node being selected
Chris Lattnerf98f1242010-03-02 06:34:30 +0000189 DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n");
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000190
191 // If we have a custom node, we already have selected!
Dan Gohman17059682008-07-17 19:10:17 +0000192 if (Node->isMachineOpcode()) {
Chris Lattnerf98f1242010-03-02 06:34:30 +0000193 DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
Tim Northover31d093c2013-09-22 08:21:56 +0000194 Node->setNodeId(-1);
Craig Topper062a2ba2014-04-25 05:30:21 +0000195 return nullptr;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000196 }
197
Akira Hatanaka30a84782013-03-14 18:27:31 +0000198 // See if subclasses can handle this node.
Akira Hatanaka040d2252013-03-14 18:33:23 +0000199 std::pair<bool, SDNode*> Ret = selectNode(Node);
Akira Hatanaka30a84782013-03-14 18:27:31 +0000200
201 if (Ret.first)
202 return Ret.second;
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000203
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000204 switch(Opcode) {
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000205 default: break;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000206
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000207 // Get target GOT address.
208 case ISD::GLOBAL_OFFSET_TABLE:
209 return getGlobalBaseReg();
Akira Hatanakadee6c822011-12-08 20:34:32 +0000210
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000211#ifndef NDEBUG
212 case ISD::LOAD:
213 case ISD::STORE:
Eric Christopher22405e42014-07-10 17:26:51 +0000214 assert((Subtarget->systemSupportsUnalignedAccess() ||
Daniel Sandersac272632014-05-23 13:18:02 +0000215 cast<MemSDNode>(Node)->getMemoryVT().getSizeInBits() / 8 <=
216 cast<MemSDNode>(Node)->getAlignment()) &&
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000217 "Unexpected unaligned loads/stores.");
218 break;
219#endif
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000220 }
221
222 // Select the default instruction
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000223 SDNode *ResNode = SelectCode(Node);
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000224
Chris Lattnerf98f1242010-03-02 06:34:30 +0000225 DEBUG(errs() << "=> ");
Craig Topper062a2ba2014-04-25 05:30:21 +0000226 if (ResNode == nullptr || ResNode == Node)
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000227 DEBUG(Node->dump(CurDAG));
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000228 else
229 DEBUG(ResNode->dump(CurDAG));
Chris Lattneraf29ea62009-08-23 06:49:22 +0000230 DEBUG(errs() << "\n");
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000231 return ResNode;
232}
233
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000234bool MipsDAGToDAGISel::
Daniel Sanders60f1db02015-03-13 12:45:09 +0000235SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000236 std::vector<SDValue> &OutOps) {
Daniel Sandersa73d8fe2015-03-24 11:26:34 +0000237 // All memory constraints can at least accept raw pointers.
238 switch(ConstraintID) {
239 default:
240 llvm_unreachable("Unexpected asm memory constraint");
241 case InlineAsm::Constraint_i:
242 case InlineAsm::Constraint_m:
243 case InlineAsm::Constraint_R:
244 case InlineAsm::Constraint_ZC:
245 OutOps.push_back(Op);
246 return false;
247 }
248 return true;
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000249}