blob: c78c3296762088a30abc384d5c3596d7d33b9bd4 [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();
Bill Wendlinga3cd3502013-06-19 21:36:55 +000062 return CurDAG->getRegister(GlobalBaseReg,
63 getTargetLowering()->getPointerTy()).getNode();
Bruno Cardoso Lopesb4391322007-11-12 19:49:57 +000064}
65
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000066/// ComplexPattern used on MipsInstrInfo
67/// Used on Mips Load/Store instructions
Akira Hatanakaa35bc832013-02-16 00:14:37 +000068bool MipsDAGToDAGISel::selectAddrRegImm(SDValue Addr, SDValue &Base,
69 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000070 llvm_unreachable("Unimplemented function.");
Akira Hatanaka69fb3d12013-02-15 21:20:45 +000071 return false;
72}
73
Daniel Sanderse6ed5b72013-08-28 12:04:29 +000074bool MipsDAGToDAGISel::selectAddrRegReg(SDValue Addr, SDValue &Base,
75 SDValue &Offset) const {
76 llvm_unreachable("Unimplemented function.");
77 return false;
78}
79
Akira Hatanakaa35bc832013-02-16 00:14:37 +000080bool MipsDAGToDAGISel::selectAddrDefault(SDValue Addr, SDValue &Base,
81 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000082 llvm_unreachable("Unimplemented function.");
83 return false;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000084}
85
Akira Hatanakaa35bc832013-02-16 00:14:37 +000086bool MipsDAGToDAGISel::selectIntAddr(SDValue Addr, SDValue &Base,
87 SDValue &Offset) const {
Akira Hatanaka30a84782013-03-14 18:27:31 +000088 llvm_unreachable("Unimplemented function.");
89 return false;
Akira Hatanaka69fb3d12013-02-15 21:20:45 +000090}
91
Jack Carter97700972013-08-13 20:19:16 +000092bool MipsDAGToDAGISel::selectIntAddrMM(SDValue Addr, SDValue &Base,
93 SDValue &Offset) const {
94 llvm_unreachable("Unimplemented function.");
95 return false;
96}
97
Zoran Jovanovic5a1a7802015-02-04 15:43:17 +000098bool MipsDAGToDAGISel::selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
99 SDValue &Offset) const {
100 llvm_unreachable("Unimplemented function.");
101 return false;
102}
103
Daniel Sandersfa961d72014-03-03 14:31:21 +0000104bool MipsDAGToDAGISel::selectIntAddrMSA(SDValue Addr, SDValue &Base,
105 SDValue &Offset) const {
106 llvm_unreachable("Unimplemented function.");
107 return false;
108}
109
Akira Hatanaka040d2252013-03-14 18:33:23 +0000110bool MipsDAGToDAGISel::selectAddr16(SDNode *Parent, SDValue N, SDValue &Base,
Akira Hatanaka30a84782013-03-14 18:27:31 +0000111 SDValue &Offset, SDValue &Alias) {
112 llvm_unreachable("Unimplemented function.");
113 return false;
Reed Kotler3589dd72012-10-28 06:02:37 +0000114}
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000115
Daniel Sandersf49dd822013-09-24 13:33:07 +0000116bool MipsDAGToDAGISel::selectVSplat(SDNode *N, APInt &Imm) const {
117 llvm_unreachable("Unimplemented function.");
118 return false;
119}
120
Daniel Sanders7e51fe12013-09-27 11:48:57 +0000121bool MipsDAGToDAGISel::selectVSplatUimm1(SDValue N, SDValue &Imm) const {
122 llvm_unreachable("Unimplemented function.");
123 return false;
124}
125
126bool MipsDAGToDAGISel::selectVSplatUimm2(SDValue N, SDValue &Imm) const {
127 llvm_unreachable("Unimplemented function.");
128 return false;
129}
130
Daniel Sandersf49dd822013-09-24 13:33:07 +0000131bool MipsDAGToDAGISel::selectVSplatUimm3(SDValue N, SDValue &Imm) const {
132 llvm_unreachable("Unimplemented function.");
133 return false;
134}
135
136bool MipsDAGToDAGISel::selectVSplatUimm4(SDValue N, SDValue &Imm) const {
137 llvm_unreachable("Unimplemented function.");
138 return false;
139}
140
141bool MipsDAGToDAGISel::selectVSplatUimm5(SDValue N, SDValue &Imm) const {
142 llvm_unreachable("Unimplemented function.");
143 return false;
144}
145
146bool MipsDAGToDAGISel::selectVSplatUimm6(SDValue N, SDValue &Imm) const {
147 llvm_unreachable("Unimplemented function.");
148 return false;
149}
150
151bool MipsDAGToDAGISel::selectVSplatUimm8(SDValue N, SDValue &Imm) const {
152 llvm_unreachable("Unimplemented function.");
153 return false;
154}
155
156bool MipsDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &Imm) const {
157 llvm_unreachable("Unimplemented function.");
158 return false;
159}
160
161bool MipsDAGToDAGISel::selectVSplatUimmPow2(SDValue N, SDValue &Imm) const {
162 llvm_unreachable("Unimplemented function.");
163 return false;
164}
165
Daniel Sanders3f6eb542013-11-12 10:45:18 +0000166bool MipsDAGToDAGISel::selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const {
167 llvm_unreachable("Unimplemented function.");
168 return false;
169}
170
Daniel Sandersd74b1302013-10-30 14:45:14 +0000171bool MipsDAGToDAGISel::selectVSplatMaskL(SDValue N, SDValue &Imm) const {
172 llvm_unreachable("Unimplemented function.");
173 return false;
174}
175
176bool MipsDAGToDAGISel::selectVSplatMaskR(SDValue N, SDValue &Imm) const {
177 llvm_unreachable("Unimplemented function.");
178 return false;
179}
180
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000181/// Select instructions not customized! Used for
182/// expanded, promoted and normal instructions
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000183SDNode* MipsDAGToDAGISel::Select(SDNode *Node) {
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000184 unsigned Opcode = Node->getOpcode();
185
186 // Dump information about the Node being selected
Chris Lattnerf98f1242010-03-02 06:34:30 +0000187 DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n");
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000188
189 // If we have a custom node, we already have selected!
Dan Gohman17059682008-07-17 19:10:17 +0000190 if (Node->isMachineOpcode()) {
Chris Lattnerf98f1242010-03-02 06:34:30 +0000191 DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
Tim Northover31d093c2013-09-22 08:21:56 +0000192 Node->setNodeId(-1);
Craig Topper062a2ba2014-04-25 05:30:21 +0000193 return nullptr;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000194 }
195
Akira Hatanaka30a84782013-03-14 18:27:31 +0000196 // See if subclasses can handle this node.
Akira Hatanaka040d2252013-03-14 18:33:23 +0000197 std::pair<bool, SDNode*> Ret = selectNode(Node);
Akira Hatanaka30a84782013-03-14 18:27:31 +0000198
199 if (Ret.first)
200 return Ret.second;
Akira Hatanakacb2a85b2011-12-20 23:10:57 +0000201
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000202 switch(Opcode) {
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000203 default: break;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000204
Akira Hatanaka2c8d17342011-12-20 22:58:01 +0000205 // Get target GOT address.
206 case ISD::GLOBAL_OFFSET_TABLE:
207 return getGlobalBaseReg();
Akira Hatanakadee6c822011-12-08 20:34:32 +0000208
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000209#ifndef NDEBUG
210 case ISD::LOAD:
211 case ISD::STORE:
Eric Christopher22405e42014-07-10 17:26:51 +0000212 assert((Subtarget->systemSupportsUnalignedAccess() ||
Daniel Sandersac272632014-05-23 13:18:02 +0000213 cast<MemSDNode>(Node)->getMemoryVT().getSizeInBits() / 8 <=
214 cast<MemSDNode>(Node)->getAlignment()) &&
Akira Hatanaka3e7ba762012-09-15 01:52:08 +0000215 "Unexpected unaligned loads/stores.");
216 break;
217#endif
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000218 }
219
220 // Select the default instruction
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000221 SDNode *ResNode = SelectCode(Node);
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000222
Chris Lattnerf98f1242010-03-02 06:34:30 +0000223 DEBUG(errs() << "=> ");
Craig Topper062a2ba2014-04-25 05:30:21 +0000224 if (ResNode == nullptr || ResNode == Node)
Dan Gohmanea6f91f2010-01-05 01:24:18 +0000225 DEBUG(Node->dump(CurDAG));
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000226 else
227 DEBUG(ResNode->dump(CurDAG));
Chris Lattneraf29ea62009-08-23 06:49:22 +0000228 DEBUG(errs() << "\n");
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000229 return ResNode;
230}
231
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000232bool MipsDAGToDAGISel::
Daniel Sanders60f1db02015-03-13 12:45:09 +0000233SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000234 std::vector<SDValue> &OutOps) {
Daniel Sandersa73d8fe2015-03-24 11:26:34 +0000235 // All memory constraints can at least accept raw pointers.
236 switch(ConstraintID) {
237 default:
238 llvm_unreachable("Unexpected asm memory constraint");
239 case InlineAsm::Constraint_i:
240 case InlineAsm::Constraint_m:
241 case InlineAsm::Constraint_R:
242 case InlineAsm::Constraint_ZC:
243 OutOps.push_back(Op);
244 return false;
245 }
246 return true;
Akira Hatanaka4c406e72011-06-21 00:40:49 +0000247}