1*9880d681SAndroid Build Coastguard Worker //
2*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
3*9880d681SAndroid Build Coastguard Worker //
4*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
5*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
6*9880d681SAndroid Build Coastguard Worker //
7*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*9880d681SAndroid Build Coastguard Worker //
9*9880d681SAndroid Build Coastguard Worker // This file defines the interfaces that NVPTX uses to lower LLVM code into a
10*9880d681SAndroid Build Coastguard Worker // selection DAG.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "NVPTXISelLowering.h"
15*9880d681SAndroid Build Coastguard Worker #include "NVPTX.h"
16*9880d681SAndroid Build Coastguard Worker #include "NVPTXTargetMachine.h"
17*9880d681SAndroid Build Coastguard Worker #include "NVPTXTargetObjectFile.h"
18*9880d681SAndroid Build Coastguard Worker #include "NVPTXUtilities.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Analysis.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstrBuilder.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/CallSite.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IntrinsicInst.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Intrinsics.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionELF.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
38*9880d681SAndroid Build Coastguard Worker #include <sstream>
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker #undef DEBUG_TYPE
41*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "nvptx-lower"
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker using namespace llvm;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker static unsigned int uniqueCallSite = 0;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> sched4reg(
48*9880d681SAndroid Build Coastguard Worker "nvptx-sched4reg",
49*9880d681SAndroid Build Coastguard Worker cl::desc("NVPTX Specific: schedule for register pressue"), cl::init(false));
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned>
52*9880d681SAndroid Build Coastguard Worker FMAContractLevelOpt("nvptx-fma-level", cl::ZeroOrMore, cl::Hidden,
53*9880d681SAndroid Build Coastguard Worker cl::desc("NVPTX Specific: FMA contraction (0: don't do it"
54*9880d681SAndroid Build Coastguard Worker " 1: do it 2: do it aggressively"),
55*9880d681SAndroid Build Coastguard Worker cl::init(2));
56*9880d681SAndroid Build Coastguard Worker
IsPTXVectorType(MVT VT)57*9880d681SAndroid Build Coastguard Worker static bool IsPTXVectorType(MVT VT) {
58*9880d681SAndroid Build Coastguard Worker switch (VT.SimpleTy) {
59*9880d681SAndroid Build Coastguard Worker default:
60*9880d681SAndroid Build Coastguard Worker return false;
61*9880d681SAndroid Build Coastguard Worker case MVT::v2i1:
62*9880d681SAndroid Build Coastguard Worker case MVT::v4i1:
63*9880d681SAndroid Build Coastguard Worker case MVT::v2i8:
64*9880d681SAndroid Build Coastguard Worker case MVT::v4i8:
65*9880d681SAndroid Build Coastguard Worker case MVT::v2i16:
66*9880d681SAndroid Build Coastguard Worker case MVT::v4i16:
67*9880d681SAndroid Build Coastguard Worker case MVT::v2i32:
68*9880d681SAndroid Build Coastguard Worker case MVT::v4i32:
69*9880d681SAndroid Build Coastguard Worker case MVT::v2i64:
70*9880d681SAndroid Build Coastguard Worker case MVT::v2f32:
71*9880d681SAndroid Build Coastguard Worker case MVT::v4f32:
72*9880d681SAndroid Build Coastguard Worker case MVT::v2f64:
73*9880d681SAndroid Build Coastguard Worker return true;
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker }
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker /// ComputePTXValueVTs - For the given Type \p Ty, returns the set of primitive
78*9880d681SAndroid Build Coastguard Worker /// EVTs that compose it. Unlike ComputeValueVTs, this will break apart vectors
79*9880d681SAndroid Build Coastguard Worker /// into their primitive components.
80*9880d681SAndroid Build Coastguard Worker /// NOTE: This is a band-aid for code that expects ComputeValueVTs to return the
81*9880d681SAndroid Build Coastguard Worker /// same number of types as the Ins/Outs arrays in LowerFormalArguments,
82*9880d681SAndroid Build Coastguard Worker /// LowerCall, and LowerReturn.
ComputePTXValueVTs(const TargetLowering & TLI,const DataLayout & DL,Type * Ty,SmallVectorImpl<EVT> & ValueVTs,SmallVectorImpl<uint64_t> * Offsets=nullptr,uint64_t StartingOffset=0)83*9880d681SAndroid Build Coastguard Worker static void ComputePTXValueVTs(const TargetLowering &TLI, const DataLayout &DL,
84*9880d681SAndroid Build Coastguard Worker Type *Ty, SmallVectorImpl<EVT> &ValueVTs,
85*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<uint64_t> *Offsets = nullptr,
86*9880d681SAndroid Build Coastguard Worker uint64_t StartingOffset = 0) {
87*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> TempVTs;
88*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> TempOffsets;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker ComputeValueVTs(TLI, DL, Ty, TempVTs, &TempOffsets, StartingOffset);
91*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = TempVTs.size(); i != e; ++i) {
92*9880d681SAndroid Build Coastguard Worker EVT VT = TempVTs[i];
93*9880d681SAndroid Build Coastguard Worker uint64_t Off = TempOffsets[i];
94*9880d681SAndroid Build Coastguard Worker if (VT.isVector())
95*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0, je = VT.getVectorNumElements(); j != je; ++j) {
96*9880d681SAndroid Build Coastguard Worker ValueVTs.push_back(VT.getVectorElementType());
97*9880d681SAndroid Build Coastguard Worker if (Offsets)
98*9880d681SAndroid Build Coastguard Worker Offsets->push_back(Off+j*VT.getVectorElementType().getStoreSize());
99*9880d681SAndroid Build Coastguard Worker }
100*9880d681SAndroid Build Coastguard Worker else {
101*9880d681SAndroid Build Coastguard Worker ValueVTs.push_back(VT);
102*9880d681SAndroid Build Coastguard Worker if (Offsets)
103*9880d681SAndroid Build Coastguard Worker Offsets->push_back(Off);
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker // NVPTXTargetLowering Constructor.
NVPTXTargetLowering(const NVPTXTargetMachine & TM,const NVPTXSubtarget & STI)109*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
110*9880d681SAndroid Build Coastguard Worker const NVPTXSubtarget &STI)
111*9880d681SAndroid Build Coastguard Worker : TargetLowering(TM), nvTM(&TM), STI(STI) {
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker // always lower memset, memcpy, and memmove intrinsics to load/store
114*9880d681SAndroid Build Coastguard Worker // instructions, rather
115*9880d681SAndroid Build Coastguard Worker // then generating calls to memset, mempcy or memmove.
116*9880d681SAndroid Build Coastguard Worker MaxStoresPerMemset = (unsigned) 0xFFFFFFFF;
117*9880d681SAndroid Build Coastguard Worker MaxStoresPerMemcpy = (unsigned) 0xFFFFFFFF;
118*9880d681SAndroid Build Coastguard Worker MaxStoresPerMemmove = (unsigned) 0xFFFFFFFF;
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker setBooleanContents(ZeroOrNegativeOneBooleanContent);
121*9880d681SAndroid Build Coastguard Worker setBooleanVectorContents(ZeroOrNegativeOneBooleanContent);
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker // Jump is Expensive. Don't create extra control flow for 'and', 'or'
124*9880d681SAndroid Build Coastguard Worker // condition branches.
125*9880d681SAndroid Build Coastguard Worker setJumpIsExpensive(true);
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker // Wide divides are _very_ slow. Try to reduce the width of the divide if
128*9880d681SAndroid Build Coastguard Worker // possible.
129*9880d681SAndroid Build Coastguard Worker addBypassSlowDiv(64, 32);
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker // By default, use the Source scheduling
132*9880d681SAndroid Build Coastguard Worker if (sched4reg)
133*9880d681SAndroid Build Coastguard Worker setSchedulingPreference(Sched::RegPressure);
134*9880d681SAndroid Build Coastguard Worker else
135*9880d681SAndroid Build Coastguard Worker setSchedulingPreference(Sched::Source);
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::i1, &NVPTX::Int1RegsRegClass);
138*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::i16, &NVPTX::Int16RegsRegClass);
139*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::i32, &NVPTX::Int32RegsRegClass);
140*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::i64, &NVPTX::Int64RegsRegClass);
141*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::f32, &NVPTX::Float32RegsRegClass);
142*9880d681SAndroid Build Coastguard Worker addRegisterClass(MVT::f64, &NVPTX::Float64RegsRegClass);
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker // Operations not directly supported by NVPTX.
145*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::f32, Expand);
146*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::f64, Expand);
147*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::i1, Expand);
148*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::i8, Expand);
149*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::i16, Expand);
150*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::i32, Expand);
151*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT_CC, MVT::i64, Expand);
152*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::f32, Expand);
153*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::f64, Expand);
154*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::i1, Expand);
155*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::i8, Expand);
156*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::i16, Expand);
157*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::i32, Expand);
158*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_CC, MVT::i64, Expand);
159*9880d681SAndroid Build Coastguard Worker // Some SIGN_EXTEND_INREG can be done using cvt instruction.
160*9880d681SAndroid Build Coastguard Worker // For others we will expand to a SHL/SRA pair.
161*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i64, Legal);
162*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Legal);
163*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Legal);
164*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8 , Legal);
165*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SHL_PARTS, MVT::i32 , Custom);
168*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SRA_PARTS, MVT::i32 , Custom);
169*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SRL_PARTS, MVT::i32 , Custom);
170*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SHL_PARTS, MVT::i64 , Custom);
171*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SRA_PARTS, MVT::i64 , Custom);
172*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SRL_PARTS, MVT::i64 , Custom);
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker if (STI.hasROT64()) {
175*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i64, Legal);
176*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i64, Legal);
177*9880d681SAndroid Build Coastguard Worker } else {
178*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i64, Expand);
179*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i64, Expand);
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker if (STI.hasROT32()) {
182*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i32, Legal);
183*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i32, Legal);
184*9880d681SAndroid Build Coastguard Worker } else {
185*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i32, Expand);
186*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i32, Expand);
187*9880d681SAndroid Build Coastguard Worker }
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i16, Expand);
190*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i16, Expand);
191*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTL, MVT::i8, Expand);
192*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ROTR, MVT::i8, Expand);
193*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BSWAP, MVT::i16, Expand);
194*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BSWAP, MVT::i32, Expand);
195*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BSWAP, MVT::i64, Expand);
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker // Indirect branch is not supported.
198*9880d681SAndroid Build Coastguard Worker // This also disables Jump Table creation.
199*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BR_JT, MVT::Other, Expand);
200*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::BRIND, MVT::Other, Expand);
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
203*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::GlobalAddress, MVT::i64, Custom);
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker // We want to legalize constant related memmove and memcopy
206*9880d681SAndroid Build Coastguard Worker // intrinsics.
207*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::Other, Custom);
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker // Turn FP extload into load/fextend
210*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Expand);
211*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Expand);
212*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f32, Expand);
213*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v2f32, MVT::v2f16, Expand);
214*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v2f64, MVT::v2f16, Expand);
215*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v2f64, MVT::v2f32, Expand);
216*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v4f32, MVT::v4f16, Expand);
217*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v4f64, MVT::v4f16, Expand);
218*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::EXTLOAD, MVT::v4f64, MVT::v4f32, Expand);
219*9880d681SAndroid Build Coastguard Worker // Turn FP truncstore into trunc + store.
220*9880d681SAndroid Build Coastguard Worker // FIXME: vector types should also be expanded
221*9880d681SAndroid Build Coastguard Worker setTruncStoreAction(MVT::f32, MVT::f16, Expand);
222*9880d681SAndroid Build Coastguard Worker setTruncStoreAction(MVT::f64, MVT::f16, Expand);
223*9880d681SAndroid Build Coastguard Worker setTruncStoreAction(MVT::f64, MVT::f32, Expand);
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker // PTX does not support load / store predicate registers
226*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::LOAD, MVT::i1, Custom);
227*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::STORE, MVT::i1, Custom);
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker for (MVT VT : MVT::integer_valuetypes()) {
230*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i1, Promote);
231*9880d681SAndroid Build Coastguard Worker setLoadExtAction(ISD::ZEXTLOAD, VT, MVT::i1, Promote);
232*9880d681SAndroid Build Coastguard Worker setTruncStoreAction(VT, MVT::i1, Expand);
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker // This is legal in NVPTX
236*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ConstantFP, MVT::f64, Legal);
237*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ConstantFP, MVT::f32, Legal);
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker // TRAP can be lowered to PTX trap
240*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::TRAP, MVT::Other, Legal);
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ADDC, MVT::i64, Expand);
243*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::ADDE, MVT::i64, Expand);
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker // Register custom handling for vector loads/stores
246*9880d681SAndroid Build Coastguard Worker for (MVT VT : MVT::vector_valuetypes()) {
247*9880d681SAndroid Build Coastguard Worker if (IsPTXVectorType(VT)) {
248*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::LOAD, VT, Custom);
249*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::STORE, VT, Custom);
250*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::INTRINSIC_W_CHAIN, VT, Custom);
251*9880d681SAndroid Build Coastguard Worker }
252*9880d681SAndroid Build Coastguard Worker }
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker // Custom handling for i8 intrinsics
255*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::i8, Custom);
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTLZ, MVT::i16, Legal);
258*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTLZ, MVT::i32, Legal);
259*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTLZ, MVT::i64, Legal);
260*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTTZ, MVT::i16, Expand);
261*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTTZ, MVT::i32, Expand);
262*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTTZ, MVT::i64, Expand);
263*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTPOP, MVT::i16, Legal);
264*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTPOP, MVT::i32, Legal);
265*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::CTPOP, MVT::i64, Legal);
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker // PTX does not directly support SELP of i1, so promote to i32 first
268*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SELECT, MVT::i1, Custom);
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker // PTX cannot multiply two i64s in a single instruction.
271*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::SMUL_LOHI, MVT::i64, Expand);
272*9880d681SAndroid Build Coastguard Worker setOperationAction(ISD::UMUL_LOHI, MVT::i64, Expand);
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker // We have some custom DAG combine patterns for these nodes
275*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::ADD);
276*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::AND);
277*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::FADD);
278*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::MUL);
279*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::SHL);
280*9880d681SAndroid Build Coastguard Worker setTargetDAGCombine(ISD::SELECT);
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker // Now deduce the information based on the above mentioned
283*9880d681SAndroid Build Coastguard Worker // actions
284*9880d681SAndroid Build Coastguard Worker computeRegisterProperties(STI.getRegisterInfo());
285*9880d681SAndroid Build Coastguard Worker }
286*9880d681SAndroid Build Coastguard Worker
getTargetNodeName(unsigned Opcode) const287*9880d681SAndroid Build Coastguard Worker const char *NVPTXTargetLowering::getTargetNodeName(unsigned Opcode) const {
288*9880d681SAndroid Build Coastguard Worker switch ((NVPTXISD::NodeType)Opcode) {
289*9880d681SAndroid Build Coastguard Worker case NVPTXISD::FIRST_NUMBER:
290*9880d681SAndroid Build Coastguard Worker break;
291*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CALL:
292*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CALL";
293*9880d681SAndroid Build Coastguard Worker case NVPTXISD::RET_FLAG:
294*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::RET_FLAG";
295*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LOAD_PARAM:
296*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LOAD_PARAM";
297*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Wrapper:
298*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Wrapper";
299*9880d681SAndroid Build Coastguard Worker case NVPTXISD::DeclareParam:
300*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::DeclareParam";
301*9880d681SAndroid Build Coastguard Worker case NVPTXISD::DeclareScalarParam:
302*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::DeclareScalarParam";
303*9880d681SAndroid Build Coastguard Worker case NVPTXISD::DeclareRet:
304*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::DeclareRet";
305*9880d681SAndroid Build Coastguard Worker case NVPTXISD::DeclareScalarRet:
306*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::DeclareScalarRet";
307*9880d681SAndroid Build Coastguard Worker case NVPTXISD::DeclareRetParam:
308*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::DeclareRetParam";
309*9880d681SAndroid Build Coastguard Worker case NVPTXISD::PrintCall:
310*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::PrintCall";
311*9880d681SAndroid Build Coastguard Worker case NVPTXISD::PrintConvergentCall:
312*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::PrintConvergentCall";
313*9880d681SAndroid Build Coastguard Worker case NVPTXISD::PrintCallUni:
314*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::PrintCallUni";
315*9880d681SAndroid Build Coastguard Worker case NVPTXISD::PrintConvergentCallUni:
316*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::PrintConvergentCallUni";
317*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParam:
318*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LoadParam";
319*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV2:
320*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LoadParamV2";
321*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadParamV4:
322*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LoadParamV4";
323*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParam:
324*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreParam";
325*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV2:
326*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreParamV2";
327*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamV4:
328*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreParamV4";
329*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamS32:
330*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreParamS32";
331*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreParamU32:
332*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreParamU32";
333*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallArgBegin:
334*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallArgBegin";
335*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallArg:
336*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallArg";
337*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LastCallArg:
338*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LastCallArg";
339*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallArgEnd:
340*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallArgEnd";
341*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallVoid:
342*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallVoid";
343*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallVal:
344*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallVal";
345*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallSymbol:
346*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallSymbol";
347*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Prototype:
348*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Prototype";
349*9880d681SAndroid Build Coastguard Worker case NVPTXISD::MoveParam:
350*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::MoveParam";
351*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetval:
352*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreRetval";
353*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV2:
354*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreRetvalV2";
355*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreRetvalV4:
356*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreRetvalV4";
357*9880d681SAndroid Build Coastguard Worker case NVPTXISD::PseudoUseParam:
358*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::PseudoUseParam";
359*9880d681SAndroid Build Coastguard Worker case NVPTXISD::RETURN:
360*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::RETURN";
361*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallSeqBegin:
362*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallSeqBegin";
363*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallSeqEnd:
364*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallSeqEnd";
365*9880d681SAndroid Build Coastguard Worker case NVPTXISD::CallPrototype:
366*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::CallPrototype";
367*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV2:
368*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LoadV2";
369*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LoadV4:
370*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LoadV4";
371*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV2:
372*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LDGV2";
373*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDGV4:
374*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LDGV4";
375*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV2:
376*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LDUV2";
377*9880d681SAndroid Build Coastguard Worker case NVPTXISD::LDUV4:
378*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::LDUV4";
379*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV2:
380*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreV2";
381*9880d681SAndroid Build Coastguard Worker case NVPTXISD::StoreV4:
382*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::StoreV4";
383*9880d681SAndroid Build Coastguard Worker case NVPTXISD::FUN_SHFL_CLAMP:
384*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::FUN_SHFL_CLAMP";
385*9880d681SAndroid Build Coastguard Worker case NVPTXISD::FUN_SHFR_CLAMP:
386*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::FUN_SHFR_CLAMP";
387*9880d681SAndroid Build Coastguard Worker case NVPTXISD::IMAD:
388*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::IMAD";
389*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Dummy:
390*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Dummy";
391*9880d681SAndroid Build Coastguard Worker case NVPTXISD::MUL_WIDE_SIGNED:
392*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::MUL_WIDE_SIGNED";
393*9880d681SAndroid Build Coastguard Worker case NVPTXISD::MUL_WIDE_UNSIGNED:
394*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::MUL_WIDE_UNSIGNED";
395*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatS32: return "NVPTXISD::Tex1DFloatS32";
396*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloat: return "NVPTXISD::Tex1DFloatFloat";
397*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatLevel:
398*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DFloatFloatLevel";
399*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DFloatFloatGrad:
400*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DFloatFloatGrad";
401*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32S32: return "NVPTXISD::Tex1DS32S32";
402*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32Float: return "NVPTXISD::Tex1DS32Float";
403*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatLevel:
404*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DS32FloatLevel";
405*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DS32FloatGrad:
406*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DS32FloatGrad";
407*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32S32: return "NVPTXISD::Tex1DU32S32";
408*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32Float: return "NVPTXISD::Tex1DU32Float";
409*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatLevel:
410*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DU32FloatLevel";
411*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DU32FloatGrad:
412*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DU32FloatGrad";
413*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatS32: return "NVPTXISD::Tex1DArrayFloatS32";
414*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloat: return "NVPTXISD::Tex1DArrayFloatFloat";
415*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatLevel:
416*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayFloatFloatLevel";
417*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayFloatFloatGrad:
418*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayFloatFloatGrad";
419*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32S32: return "NVPTXISD::Tex1DArrayS32S32";
420*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32Float: return "NVPTXISD::Tex1DArrayS32Float";
421*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatLevel:
422*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayS32FloatLevel";
423*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayS32FloatGrad:
424*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayS32FloatGrad";
425*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32S32: return "NVPTXISD::Tex1DArrayU32S32";
426*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32Float: return "NVPTXISD::Tex1DArrayU32Float";
427*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatLevel:
428*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayU32FloatLevel";
429*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex1DArrayU32FloatGrad:
430*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex1DArrayU32FloatGrad";
431*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatS32: return "NVPTXISD::Tex2DFloatS32";
432*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloat: return "NVPTXISD::Tex2DFloatFloat";
433*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatLevel:
434*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DFloatFloatLevel";
435*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DFloatFloatGrad:
436*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DFloatFloatGrad";
437*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32S32: return "NVPTXISD::Tex2DS32S32";
438*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32Float: return "NVPTXISD::Tex2DS32Float";
439*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatLevel:
440*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DS32FloatLevel";
441*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DS32FloatGrad:
442*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DS32FloatGrad";
443*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32S32: return "NVPTXISD::Tex2DU32S32";
444*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32Float: return "NVPTXISD::Tex2DU32Float";
445*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatLevel:
446*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DU32FloatLevel";
447*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DU32FloatGrad:
448*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DU32FloatGrad";
449*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatS32: return "NVPTXISD::Tex2DArrayFloatS32";
450*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloat: return "NVPTXISD::Tex2DArrayFloatFloat";
451*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatLevel:
452*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayFloatFloatLevel";
453*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayFloatFloatGrad:
454*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayFloatFloatGrad";
455*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32S32: return "NVPTXISD::Tex2DArrayS32S32";
456*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32Float: return "NVPTXISD::Tex2DArrayS32Float";
457*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatLevel:
458*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayS32FloatLevel";
459*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayS32FloatGrad:
460*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayS32FloatGrad";
461*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32S32: return "NVPTXISD::Tex2DArrayU32S32";
462*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32Float: return "NVPTXISD::Tex2DArrayU32Float";
463*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatLevel:
464*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayU32FloatLevel";
465*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex2DArrayU32FloatGrad:
466*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex2DArrayU32FloatGrad";
467*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatS32: return "NVPTXISD::Tex3DFloatS32";
468*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloat: return "NVPTXISD::Tex3DFloatFloat";
469*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatLevel:
470*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DFloatFloatLevel";
471*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DFloatFloatGrad:
472*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DFloatFloatGrad";
473*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32S32: return "NVPTXISD::Tex3DS32S32";
474*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32Float: return "NVPTXISD::Tex3DS32Float";
475*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatLevel:
476*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DS32FloatLevel";
477*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DS32FloatGrad:
478*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DS32FloatGrad";
479*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32S32: return "NVPTXISD::Tex3DU32S32";
480*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32Float: return "NVPTXISD::Tex3DU32Float";
481*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatLevel:
482*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DU32FloatLevel";
483*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tex3DU32FloatGrad:
484*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tex3DU32FloatGrad";
485*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloat: return "NVPTXISD::TexCubeFloatFloat";
486*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeFloatFloatLevel:
487*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeFloatFloatLevel";
488*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32Float: return "NVPTXISD::TexCubeS32Float";
489*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeS32FloatLevel:
490*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeS32FloatLevel";
491*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32Float: return "NVPTXISD::TexCubeU32Float";
492*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeU32FloatLevel:
493*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeU32FloatLevel";
494*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloat:
495*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayFloatFloat";
496*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayFloatFloatLevel:
497*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayFloatFloatLevel";
498*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32Float:
499*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayS32Float";
500*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayS32FloatLevel:
501*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayS32FloatLevel";
502*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32Float:
503*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayU32Float";
504*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexCubeArrayU32FloatLevel:
505*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexCubeArrayU32FloatLevel";
506*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DFloatFloat:
507*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4R2DFloatFloat";
508*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DFloatFloat:
509*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4G2DFloatFloat";
510*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DFloatFloat:
511*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4B2DFloatFloat";
512*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DFloatFloat:
513*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4A2DFloatFloat";
514*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DS64Float:
515*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4R2DS64Float";
516*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DS64Float:
517*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4G2DS64Float";
518*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DS64Float:
519*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4B2DS64Float";
520*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DS64Float:
521*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4A2DS64Float";
522*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4R2DU64Float:
523*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4R2DU64Float";
524*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4G2DU64Float:
525*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4G2DU64Float";
526*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4B2DU64Float:
527*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4B2DU64Float";
528*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4A2DU64Float:
529*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4A2DU64Float";
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatS32:
532*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DFloatS32";
533*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloat:
534*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DFloatFloat";
535*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatLevel:
536*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DFloatFloatLevel";
537*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DFloatFloatGrad:
538*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DFloatFloatGrad";
539*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32S32:
540*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DS32S32";
541*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32Float:
542*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DS32Float";
543*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatLevel:
544*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DS32FloatLevel";
545*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DS32FloatGrad:
546*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DS32FloatGrad";
547*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32S32:
548*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DU32S32";
549*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32Float:
550*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DU32Float";
551*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatLevel:
552*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DU32FloatLevel";
553*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DU32FloatGrad:
554*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DU32FloatGrad";
555*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatS32:
556*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayFloatS32";
557*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloat:
558*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayFloatFloat";
559*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatLevel:
560*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayFloatFloatLevel";
561*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayFloatFloatGrad:
562*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayFloatFloatGrad";
563*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32S32:
564*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayS32S32";
565*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32Float:
566*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayS32Float";
567*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatLevel:
568*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayS32FloatLevel";
569*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayS32FloatGrad:
570*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayS32FloatGrad";
571*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32S32:
572*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayU32S32";
573*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32Float:
574*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayU32Float";
575*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatLevel:
576*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayU32FloatLevel";
577*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified1DArrayU32FloatGrad:
578*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified1DArrayU32FloatGrad";
579*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatS32:
580*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DFloatS32";
581*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloat:
582*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DFloatFloat";
583*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatLevel:
584*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DFloatFloatLevel";
585*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DFloatFloatGrad:
586*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DFloatFloatGrad";
587*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32S32:
588*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DS32S32";
589*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32Float:
590*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DS32Float";
591*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatLevel:
592*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DS32FloatLevel";
593*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DS32FloatGrad:
594*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DS32FloatGrad";
595*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32S32:
596*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DU32S32";
597*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32Float:
598*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DU32Float";
599*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatLevel:
600*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DU32FloatLevel";
601*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DU32FloatGrad:
602*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DU32FloatGrad";
603*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatS32:
604*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayFloatS32";
605*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloat:
606*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayFloatFloat";
607*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatLevel:
608*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayFloatFloatLevel";
609*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayFloatFloatGrad:
610*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayFloatFloatGrad";
611*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32S32:
612*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayS32S32";
613*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32Float:
614*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayS32Float";
615*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatLevel:
616*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayS32FloatLevel";
617*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayS32FloatGrad:
618*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayS32FloatGrad";
619*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32S32:
620*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayU32S32";
621*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32Float:
622*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayU32Float";
623*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatLevel:
624*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayU32FloatLevel";
625*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified2DArrayU32FloatGrad:
626*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified2DArrayU32FloatGrad";
627*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatS32:
628*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DFloatS32";
629*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloat:
630*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DFloatFloat";
631*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatLevel:
632*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DFloatFloatLevel";
633*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DFloatFloatGrad:
634*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DFloatFloatGrad";
635*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32S32:
636*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DS32S32";
637*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32Float:
638*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DS32Float";
639*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatLevel:
640*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DS32FloatLevel";
641*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DS32FloatGrad:
642*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DS32FloatGrad";
643*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32S32:
644*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DU32S32";
645*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32Float:
646*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DU32Float";
647*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatLevel:
648*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DU32FloatLevel";
649*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnified3DU32FloatGrad:
650*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnified3DU32FloatGrad";
651*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloat:
652*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeFloatFloat";
653*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeFloatFloatLevel:
654*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeFloatFloatLevel";
655*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32Float:
656*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeS32Float";
657*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeS32FloatLevel:
658*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeS32FloatLevel";
659*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32Float:
660*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeU32Float";
661*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeU32FloatLevel:
662*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeU32FloatLevel";
663*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloat:
664*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayFloatFloat";
665*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel:
666*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel";
667*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32Float:
668*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayS32Float";
669*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayS32FloatLevel:
670*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayS32FloatLevel";
671*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32Float:
672*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayU32Float";
673*9880d681SAndroid Build Coastguard Worker case NVPTXISD::TexUnifiedCubeArrayU32FloatLevel:
674*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::TexUnifiedCubeArrayU32FloatLevel";
675*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DFloatFloat:
676*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedR2DFloatFloat";
677*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DFloatFloat:
678*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedG2DFloatFloat";
679*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DFloatFloat:
680*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedB2DFloatFloat";
681*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DFloatFloat:
682*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedA2DFloatFloat";
683*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DS64Float:
684*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedR2DS64Float";
685*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DS64Float:
686*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedG2DS64Float";
687*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DS64Float:
688*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedB2DS64Float";
689*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DS64Float:
690*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedA2DS64Float";
691*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedR2DU64Float:
692*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedR2DU64Float";
693*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedG2DU64Float:
694*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedG2DU64Float";
695*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedB2DU64Float:
696*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedB2DU64Float";
697*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Tld4UnifiedA2DU64Float:
698*9880d681SAndroid Build Coastguard Worker return "NVPTXISD::Tld4UnifiedA2DU64Float";
699*9880d681SAndroid Build Coastguard Worker
700*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Clamp: return "NVPTXISD::Suld1DI8Clamp";
701*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Clamp: return "NVPTXISD::Suld1DI16Clamp";
702*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Clamp: return "NVPTXISD::Suld1DI32Clamp";
703*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Clamp: return "NVPTXISD::Suld1DI64Clamp";
704*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Clamp: return "NVPTXISD::Suld1DV2I8Clamp";
705*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Clamp: return "NVPTXISD::Suld1DV2I16Clamp";
706*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Clamp: return "NVPTXISD::Suld1DV2I32Clamp";
707*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Clamp: return "NVPTXISD::Suld1DV2I64Clamp";
708*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Clamp: return "NVPTXISD::Suld1DV4I8Clamp";
709*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Clamp: return "NVPTXISD::Suld1DV4I16Clamp";
710*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Clamp: return "NVPTXISD::Suld1DV4I32Clamp";
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Clamp: return "NVPTXISD::Suld1DArrayI8Clamp";
713*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Clamp: return "NVPTXISD::Suld1DArrayI16Clamp";
714*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Clamp: return "NVPTXISD::Suld1DArrayI32Clamp";
715*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Clamp: return "NVPTXISD::Suld1DArrayI64Clamp";
716*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Clamp: return "NVPTXISD::Suld1DArrayV2I8Clamp";
717*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Clamp:return "NVPTXISD::Suld1DArrayV2I16Clamp";
718*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Clamp:return "NVPTXISD::Suld1DArrayV2I32Clamp";
719*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Clamp:return "NVPTXISD::Suld1DArrayV2I64Clamp";
720*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Clamp: return "NVPTXISD::Suld1DArrayV4I8Clamp";
721*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Clamp:return "NVPTXISD::Suld1DArrayV4I16Clamp";
722*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Clamp:return "NVPTXISD::Suld1DArrayV4I32Clamp";
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Clamp: return "NVPTXISD::Suld2DI8Clamp";
725*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Clamp: return "NVPTXISD::Suld2DI16Clamp";
726*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Clamp: return "NVPTXISD::Suld2DI32Clamp";
727*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Clamp: return "NVPTXISD::Suld2DI64Clamp";
728*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Clamp: return "NVPTXISD::Suld2DV2I8Clamp";
729*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Clamp: return "NVPTXISD::Suld2DV2I16Clamp";
730*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Clamp: return "NVPTXISD::Suld2DV2I32Clamp";
731*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Clamp: return "NVPTXISD::Suld2DV2I64Clamp";
732*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Clamp: return "NVPTXISD::Suld2DV4I8Clamp";
733*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Clamp: return "NVPTXISD::Suld2DV4I16Clamp";
734*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Clamp: return "NVPTXISD::Suld2DV4I32Clamp";
735*9880d681SAndroid Build Coastguard Worker
736*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Clamp: return "NVPTXISD::Suld2DArrayI8Clamp";
737*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Clamp: return "NVPTXISD::Suld2DArrayI16Clamp";
738*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Clamp: return "NVPTXISD::Suld2DArrayI32Clamp";
739*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Clamp: return "NVPTXISD::Suld2DArrayI64Clamp";
740*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Clamp: return "NVPTXISD::Suld2DArrayV2I8Clamp";
741*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Clamp:return "NVPTXISD::Suld2DArrayV2I16Clamp";
742*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Clamp:return "NVPTXISD::Suld2DArrayV2I32Clamp";
743*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Clamp:return "NVPTXISD::Suld2DArrayV2I64Clamp";
744*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Clamp: return "NVPTXISD::Suld2DArrayV4I8Clamp";
745*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Clamp:return "NVPTXISD::Suld2DArrayV4I16Clamp";
746*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Clamp:return "NVPTXISD::Suld2DArrayV4I32Clamp";
747*9880d681SAndroid Build Coastguard Worker
748*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Clamp: return "NVPTXISD::Suld3DI8Clamp";
749*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Clamp: return "NVPTXISD::Suld3DI16Clamp";
750*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Clamp: return "NVPTXISD::Suld3DI32Clamp";
751*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Clamp: return "NVPTXISD::Suld3DI64Clamp";
752*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Clamp: return "NVPTXISD::Suld3DV2I8Clamp";
753*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Clamp: return "NVPTXISD::Suld3DV2I16Clamp";
754*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Clamp: return "NVPTXISD::Suld3DV2I32Clamp";
755*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Clamp: return "NVPTXISD::Suld3DV2I64Clamp";
756*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Clamp: return "NVPTXISD::Suld3DV4I8Clamp";
757*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Clamp: return "NVPTXISD::Suld3DV4I16Clamp";
758*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Clamp: return "NVPTXISD::Suld3DV4I32Clamp";
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Trap: return "NVPTXISD::Suld1DI8Trap";
761*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Trap: return "NVPTXISD::Suld1DI16Trap";
762*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Trap: return "NVPTXISD::Suld1DI32Trap";
763*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Trap: return "NVPTXISD::Suld1DI64Trap";
764*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Trap: return "NVPTXISD::Suld1DV2I8Trap";
765*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Trap: return "NVPTXISD::Suld1DV2I16Trap";
766*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Trap: return "NVPTXISD::Suld1DV2I32Trap";
767*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Trap: return "NVPTXISD::Suld1DV2I64Trap";
768*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Trap: return "NVPTXISD::Suld1DV4I8Trap";
769*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Trap: return "NVPTXISD::Suld1DV4I16Trap";
770*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Trap: return "NVPTXISD::Suld1DV4I32Trap";
771*9880d681SAndroid Build Coastguard Worker
772*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Trap: return "NVPTXISD::Suld1DArrayI8Trap";
773*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Trap: return "NVPTXISD::Suld1DArrayI16Trap";
774*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Trap: return "NVPTXISD::Suld1DArrayI32Trap";
775*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Trap: return "NVPTXISD::Suld1DArrayI64Trap";
776*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Trap: return "NVPTXISD::Suld1DArrayV2I8Trap";
777*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Trap: return "NVPTXISD::Suld1DArrayV2I16Trap";
778*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Trap: return "NVPTXISD::Suld1DArrayV2I32Trap";
779*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Trap: return "NVPTXISD::Suld1DArrayV2I64Trap";
780*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Trap: return "NVPTXISD::Suld1DArrayV4I8Trap";
781*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Trap: return "NVPTXISD::Suld1DArrayV4I16Trap";
782*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Trap: return "NVPTXISD::Suld1DArrayV4I32Trap";
783*9880d681SAndroid Build Coastguard Worker
784*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Trap: return "NVPTXISD::Suld2DI8Trap";
785*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Trap: return "NVPTXISD::Suld2DI16Trap";
786*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Trap: return "NVPTXISD::Suld2DI32Trap";
787*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Trap: return "NVPTXISD::Suld2DI64Trap";
788*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Trap: return "NVPTXISD::Suld2DV2I8Trap";
789*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Trap: return "NVPTXISD::Suld2DV2I16Trap";
790*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Trap: return "NVPTXISD::Suld2DV2I32Trap";
791*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Trap: return "NVPTXISD::Suld2DV2I64Trap";
792*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Trap: return "NVPTXISD::Suld2DV4I8Trap";
793*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Trap: return "NVPTXISD::Suld2DV4I16Trap";
794*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Trap: return "NVPTXISD::Suld2DV4I32Trap";
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Trap: return "NVPTXISD::Suld2DArrayI8Trap";
797*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Trap: return "NVPTXISD::Suld2DArrayI16Trap";
798*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Trap: return "NVPTXISD::Suld2DArrayI32Trap";
799*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Trap: return "NVPTXISD::Suld2DArrayI64Trap";
800*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Trap: return "NVPTXISD::Suld2DArrayV2I8Trap";
801*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Trap: return "NVPTXISD::Suld2DArrayV2I16Trap";
802*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Trap: return "NVPTXISD::Suld2DArrayV2I32Trap";
803*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Trap: return "NVPTXISD::Suld2DArrayV2I64Trap";
804*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Trap: return "NVPTXISD::Suld2DArrayV4I8Trap";
805*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Trap: return "NVPTXISD::Suld2DArrayV4I16Trap";
806*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Trap: return "NVPTXISD::Suld2DArrayV4I32Trap";
807*9880d681SAndroid Build Coastguard Worker
808*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Trap: return "NVPTXISD::Suld3DI8Trap";
809*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Trap: return "NVPTXISD::Suld3DI16Trap";
810*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Trap: return "NVPTXISD::Suld3DI32Trap";
811*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Trap: return "NVPTXISD::Suld3DI64Trap";
812*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Trap: return "NVPTXISD::Suld3DV2I8Trap";
813*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Trap: return "NVPTXISD::Suld3DV2I16Trap";
814*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Trap: return "NVPTXISD::Suld3DV2I32Trap";
815*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Trap: return "NVPTXISD::Suld3DV2I64Trap";
816*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Trap: return "NVPTXISD::Suld3DV4I8Trap";
817*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Trap: return "NVPTXISD::Suld3DV4I16Trap";
818*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Trap: return "NVPTXISD::Suld3DV4I32Trap";
819*9880d681SAndroid Build Coastguard Worker
820*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI8Zero: return "NVPTXISD::Suld1DI8Zero";
821*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI16Zero: return "NVPTXISD::Suld1DI16Zero";
822*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI32Zero: return "NVPTXISD::Suld1DI32Zero";
823*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DI64Zero: return "NVPTXISD::Suld1DI64Zero";
824*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I8Zero: return "NVPTXISD::Suld1DV2I8Zero";
825*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I16Zero: return "NVPTXISD::Suld1DV2I16Zero";
826*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I32Zero: return "NVPTXISD::Suld1DV2I32Zero";
827*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV2I64Zero: return "NVPTXISD::Suld1DV2I64Zero";
828*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I8Zero: return "NVPTXISD::Suld1DV4I8Zero";
829*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I16Zero: return "NVPTXISD::Suld1DV4I16Zero";
830*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DV4I32Zero: return "NVPTXISD::Suld1DV4I32Zero";
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI8Zero: return "NVPTXISD::Suld1DArrayI8Zero";
833*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI16Zero: return "NVPTXISD::Suld1DArrayI16Zero";
834*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI32Zero: return "NVPTXISD::Suld1DArrayI32Zero";
835*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayI64Zero: return "NVPTXISD::Suld1DArrayI64Zero";
836*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I8Zero: return "NVPTXISD::Suld1DArrayV2I8Zero";
837*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I16Zero: return "NVPTXISD::Suld1DArrayV2I16Zero";
838*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I32Zero: return "NVPTXISD::Suld1DArrayV2I32Zero";
839*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV2I64Zero: return "NVPTXISD::Suld1DArrayV2I64Zero";
840*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I8Zero: return "NVPTXISD::Suld1DArrayV4I8Zero";
841*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I16Zero: return "NVPTXISD::Suld1DArrayV4I16Zero";
842*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld1DArrayV4I32Zero: return "NVPTXISD::Suld1DArrayV4I32Zero";
843*9880d681SAndroid Build Coastguard Worker
844*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI8Zero: return "NVPTXISD::Suld2DI8Zero";
845*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI16Zero: return "NVPTXISD::Suld2DI16Zero";
846*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI32Zero: return "NVPTXISD::Suld2DI32Zero";
847*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DI64Zero: return "NVPTXISD::Suld2DI64Zero";
848*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I8Zero: return "NVPTXISD::Suld2DV2I8Zero";
849*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I16Zero: return "NVPTXISD::Suld2DV2I16Zero";
850*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I32Zero: return "NVPTXISD::Suld2DV2I32Zero";
851*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV2I64Zero: return "NVPTXISD::Suld2DV2I64Zero";
852*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I8Zero: return "NVPTXISD::Suld2DV4I8Zero";
853*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I16Zero: return "NVPTXISD::Suld2DV4I16Zero";
854*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DV4I32Zero: return "NVPTXISD::Suld2DV4I32Zero";
855*9880d681SAndroid Build Coastguard Worker
856*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI8Zero: return "NVPTXISD::Suld2DArrayI8Zero";
857*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI16Zero: return "NVPTXISD::Suld2DArrayI16Zero";
858*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI32Zero: return "NVPTXISD::Suld2DArrayI32Zero";
859*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayI64Zero: return "NVPTXISD::Suld2DArrayI64Zero";
860*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I8Zero: return "NVPTXISD::Suld2DArrayV2I8Zero";
861*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I16Zero: return "NVPTXISD::Suld2DArrayV2I16Zero";
862*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I32Zero: return "NVPTXISD::Suld2DArrayV2I32Zero";
863*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV2I64Zero: return "NVPTXISD::Suld2DArrayV2I64Zero";
864*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I8Zero: return "NVPTXISD::Suld2DArrayV4I8Zero";
865*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I16Zero: return "NVPTXISD::Suld2DArrayV4I16Zero";
866*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld2DArrayV4I32Zero: return "NVPTXISD::Suld2DArrayV4I32Zero";
867*9880d681SAndroid Build Coastguard Worker
868*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI8Zero: return "NVPTXISD::Suld3DI8Zero";
869*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI16Zero: return "NVPTXISD::Suld3DI16Zero";
870*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI32Zero: return "NVPTXISD::Suld3DI32Zero";
871*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DI64Zero: return "NVPTXISD::Suld3DI64Zero";
872*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I8Zero: return "NVPTXISD::Suld3DV2I8Zero";
873*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I16Zero: return "NVPTXISD::Suld3DV2I16Zero";
874*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I32Zero: return "NVPTXISD::Suld3DV2I32Zero";
875*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV2I64Zero: return "NVPTXISD::Suld3DV2I64Zero";
876*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I8Zero: return "NVPTXISD::Suld3DV4I8Zero";
877*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I16Zero: return "NVPTXISD::Suld3DV4I16Zero";
878*9880d681SAndroid Build Coastguard Worker case NVPTXISD::Suld3DV4I32Zero: return "NVPTXISD::Suld3DV4I32Zero";
879*9880d681SAndroid Build Coastguard Worker }
880*9880d681SAndroid Build Coastguard Worker return nullptr;
881*9880d681SAndroid Build Coastguard Worker }
882*9880d681SAndroid Build Coastguard Worker
883*9880d681SAndroid Build Coastguard Worker TargetLoweringBase::LegalizeTypeAction
getPreferredVectorAction(EVT VT) const884*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::getPreferredVectorAction(EVT VT) const {
885*9880d681SAndroid Build Coastguard Worker if (VT.getVectorNumElements() != 1 && VT.getScalarType() == MVT::i1)
886*9880d681SAndroid Build Coastguard Worker return TypeSplitVector;
887*9880d681SAndroid Build Coastguard Worker
888*9880d681SAndroid Build Coastguard Worker return TargetLoweringBase::getPreferredVectorAction(VT);
889*9880d681SAndroid Build Coastguard Worker }
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Worker SDValue
LowerGlobalAddress(SDValue Op,SelectionDAG & DAG) const892*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
893*9880d681SAndroid Build Coastguard Worker SDLoc dl(Op);
894*9880d681SAndroid Build Coastguard Worker const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
895*9880d681SAndroid Build Coastguard Worker auto PtrVT = getPointerTy(DAG.getDataLayout());
896*9880d681SAndroid Build Coastguard Worker Op = DAG.getTargetGlobalAddress(GV, dl, PtrVT);
897*9880d681SAndroid Build Coastguard Worker return DAG.getNode(NVPTXISD::Wrapper, dl, PtrVT, Op);
898*9880d681SAndroid Build Coastguard Worker }
899*9880d681SAndroid Build Coastguard Worker
getPrototype(const DataLayout & DL,Type * retTy,const ArgListTy & Args,const SmallVectorImpl<ISD::OutputArg> & Outs,unsigned retAlignment,const ImmutableCallSite * CS) const900*9880d681SAndroid Build Coastguard Worker std::string NVPTXTargetLowering::getPrototype(
901*9880d681SAndroid Build Coastguard Worker const DataLayout &DL, Type *retTy, const ArgListTy &Args,
902*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<ISD::OutputArg> &Outs, unsigned retAlignment,
903*9880d681SAndroid Build Coastguard Worker const ImmutableCallSite *CS) const {
904*9880d681SAndroid Build Coastguard Worker auto PtrVT = getPointerTy(DL);
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Worker bool isABI = (STI.getSmVersion() >= 20);
907*9880d681SAndroid Build Coastguard Worker assert(isABI && "Non-ABI compilation is not supported");
908*9880d681SAndroid Build Coastguard Worker if (!isABI)
909*9880d681SAndroid Build Coastguard Worker return "";
910*9880d681SAndroid Build Coastguard Worker
911*9880d681SAndroid Build Coastguard Worker std::stringstream O;
912*9880d681SAndroid Build Coastguard Worker O << "prototype_" << uniqueCallSite << " : .callprototype ";
913*9880d681SAndroid Build Coastguard Worker
914*9880d681SAndroid Build Coastguard Worker if (retTy->getTypeID() == Type::VoidTyID) {
915*9880d681SAndroid Build Coastguard Worker O << "()";
916*9880d681SAndroid Build Coastguard Worker } else {
917*9880d681SAndroid Build Coastguard Worker O << "(";
918*9880d681SAndroid Build Coastguard Worker if (retTy->isFloatingPointTy() || retTy->isIntegerTy()) {
919*9880d681SAndroid Build Coastguard Worker unsigned size = 0;
920*9880d681SAndroid Build Coastguard Worker if (auto *ITy = dyn_cast<IntegerType>(retTy)) {
921*9880d681SAndroid Build Coastguard Worker size = ITy->getBitWidth();
922*9880d681SAndroid Build Coastguard Worker if (size < 32)
923*9880d681SAndroid Build Coastguard Worker size = 32;
924*9880d681SAndroid Build Coastguard Worker } else {
925*9880d681SAndroid Build Coastguard Worker assert(retTy->isFloatingPointTy() &&
926*9880d681SAndroid Build Coastguard Worker "Floating point type expected here");
927*9880d681SAndroid Build Coastguard Worker size = retTy->getPrimitiveSizeInBits();
928*9880d681SAndroid Build Coastguard Worker }
929*9880d681SAndroid Build Coastguard Worker
930*9880d681SAndroid Build Coastguard Worker O << ".param .b" << size << " _";
931*9880d681SAndroid Build Coastguard Worker } else if (isa<PointerType>(retTy)) {
932*9880d681SAndroid Build Coastguard Worker O << ".param .b" << PtrVT.getSizeInBits() << " _";
933*9880d681SAndroid Build Coastguard Worker } else if ((retTy->getTypeID() == Type::StructTyID) ||
934*9880d681SAndroid Build Coastguard Worker isa<VectorType>(retTy)) {
935*9880d681SAndroid Build Coastguard Worker auto &DL = CS->getCalledFunction()->getParent()->getDataLayout();
936*9880d681SAndroid Build Coastguard Worker O << ".param .align " << retAlignment << " .b8 _["
937*9880d681SAndroid Build Coastguard Worker << DL.getTypeAllocSize(retTy) << "]";
938*9880d681SAndroid Build Coastguard Worker } else {
939*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown return type");
940*9880d681SAndroid Build Coastguard Worker }
941*9880d681SAndroid Build Coastguard Worker O << ") ";
942*9880d681SAndroid Build Coastguard Worker }
943*9880d681SAndroid Build Coastguard Worker O << "_ (";
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Worker bool first = true;
946*9880d681SAndroid Build Coastguard Worker
947*9880d681SAndroid Build Coastguard Worker unsigned OIdx = 0;
948*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i != e; ++i, ++OIdx) {
949*9880d681SAndroid Build Coastguard Worker Type *Ty = Args[i].Ty;
950*9880d681SAndroid Build Coastguard Worker if (!first) {
951*9880d681SAndroid Build Coastguard Worker O << ", ";
952*9880d681SAndroid Build Coastguard Worker }
953*9880d681SAndroid Build Coastguard Worker first = false;
954*9880d681SAndroid Build Coastguard Worker
955*9880d681SAndroid Build Coastguard Worker if (!Outs[OIdx].Flags.isByVal()) {
956*9880d681SAndroid Build Coastguard Worker if (Ty->isAggregateType() || Ty->isVectorTy()) {
957*9880d681SAndroid Build Coastguard Worker unsigned align = 0;
958*9880d681SAndroid Build Coastguard Worker const CallInst *CallI = cast<CallInst>(CS->getInstruction());
959*9880d681SAndroid Build Coastguard Worker // +1 because index 0 is reserved for return type alignment
960*9880d681SAndroid Build Coastguard Worker if (!llvm::getAlign(*CallI, i + 1, align))
961*9880d681SAndroid Build Coastguard Worker align = DL.getABITypeAlignment(Ty);
962*9880d681SAndroid Build Coastguard Worker unsigned sz = DL.getTypeAllocSize(Ty);
963*9880d681SAndroid Build Coastguard Worker O << ".param .align " << align << " .b8 ";
964*9880d681SAndroid Build Coastguard Worker O << "_";
965*9880d681SAndroid Build Coastguard Worker O << "[" << sz << "]";
966*9880d681SAndroid Build Coastguard Worker // update the index for Outs
967*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> vtparts;
968*9880d681SAndroid Build Coastguard Worker ComputeValueVTs(*this, DL, Ty, vtparts);
969*9880d681SAndroid Build Coastguard Worker if (unsigned len = vtparts.size())
970*9880d681SAndroid Build Coastguard Worker OIdx += len - 1;
971*9880d681SAndroid Build Coastguard Worker continue;
972*9880d681SAndroid Build Coastguard Worker }
973*9880d681SAndroid Build Coastguard Worker // i8 types in IR will be i16 types in SDAG
974*9880d681SAndroid Build Coastguard Worker assert((getValueType(DL, Ty) == Outs[OIdx].VT ||
975*9880d681SAndroid Build Coastguard Worker (getValueType(DL, Ty) == MVT::i8 && Outs[OIdx].VT == MVT::i16)) &&
976*9880d681SAndroid Build Coastguard Worker "type mismatch between callee prototype and arguments");
977*9880d681SAndroid Build Coastguard Worker // scalar type
978*9880d681SAndroid Build Coastguard Worker unsigned sz = 0;
979*9880d681SAndroid Build Coastguard Worker if (isa<IntegerType>(Ty)) {
980*9880d681SAndroid Build Coastguard Worker sz = cast<IntegerType>(Ty)->getBitWidth();
981*9880d681SAndroid Build Coastguard Worker if (sz < 32)
982*9880d681SAndroid Build Coastguard Worker sz = 32;
983*9880d681SAndroid Build Coastguard Worker } else if (isa<PointerType>(Ty))
984*9880d681SAndroid Build Coastguard Worker sz = PtrVT.getSizeInBits();
985*9880d681SAndroid Build Coastguard Worker else
986*9880d681SAndroid Build Coastguard Worker sz = Ty->getPrimitiveSizeInBits();
987*9880d681SAndroid Build Coastguard Worker O << ".param .b" << sz << " ";
988*9880d681SAndroid Build Coastguard Worker O << "_";
989*9880d681SAndroid Build Coastguard Worker continue;
990*9880d681SAndroid Build Coastguard Worker }
991*9880d681SAndroid Build Coastguard Worker auto *PTy = dyn_cast<PointerType>(Ty);
992*9880d681SAndroid Build Coastguard Worker assert(PTy && "Param with byval attribute should be a pointer type");
993*9880d681SAndroid Build Coastguard Worker Type *ETy = PTy->getElementType();
994*9880d681SAndroid Build Coastguard Worker
995*9880d681SAndroid Build Coastguard Worker unsigned align = Outs[OIdx].Flags.getByValAlign();
996*9880d681SAndroid Build Coastguard Worker unsigned sz = DL.getTypeAllocSize(ETy);
997*9880d681SAndroid Build Coastguard Worker O << ".param .align " << align << " .b8 ";
998*9880d681SAndroid Build Coastguard Worker O << "_";
999*9880d681SAndroid Build Coastguard Worker O << "[" << sz << "]";
1000*9880d681SAndroid Build Coastguard Worker }
1001*9880d681SAndroid Build Coastguard Worker O << ");";
1002*9880d681SAndroid Build Coastguard Worker return O.str();
1003*9880d681SAndroid Build Coastguard Worker }
1004*9880d681SAndroid Build Coastguard Worker
1005*9880d681SAndroid Build Coastguard Worker unsigned
getArgumentAlignment(SDValue Callee,const ImmutableCallSite * CS,Type * Ty,unsigned Idx) const1006*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::getArgumentAlignment(SDValue Callee,
1007*9880d681SAndroid Build Coastguard Worker const ImmutableCallSite *CS,
1008*9880d681SAndroid Build Coastguard Worker Type *Ty,
1009*9880d681SAndroid Build Coastguard Worker unsigned Idx) const {
1010*9880d681SAndroid Build Coastguard Worker unsigned Align = 0;
1011*9880d681SAndroid Build Coastguard Worker const Value *DirectCallee = CS->getCalledFunction();
1012*9880d681SAndroid Build Coastguard Worker
1013*9880d681SAndroid Build Coastguard Worker if (!DirectCallee) {
1014*9880d681SAndroid Build Coastguard Worker // We don't have a direct function symbol, but that may be because of
1015*9880d681SAndroid Build Coastguard Worker // constant cast instructions in the call.
1016*9880d681SAndroid Build Coastguard Worker const Instruction *CalleeI = CS->getInstruction();
1017*9880d681SAndroid Build Coastguard Worker assert(CalleeI && "Call target is not a function or derived value?");
1018*9880d681SAndroid Build Coastguard Worker
1019*9880d681SAndroid Build Coastguard Worker // With bitcast'd call targets, the instruction will be the call
1020*9880d681SAndroid Build Coastguard Worker if (isa<CallInst>(CalleeI)) {
1021*9880d681SAndroid Build Coastguard Worker // Check if we have call alignment metadata
1022*9880d681SAndroid Build Coastguard Worker if (llvm::getAlign(*cast<CallInst>(CalleeI), Idx, Align))
1023*9880d681SAndroid Build Coastguard Worker return Align;
1024*9880d681SAndroid Build Coastguard Worker
1025*9880d681SAndroid Build Coastguard Worker const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue();
1026*9880d681SAndroid Build Coastguard Worker // Ignore any bitcast instructions
1027*9880d681SAndroid Build Coastguard Worker while(isa<ConstantExpr>(CalleeV)) {
1028*9880d681SAndroid Build Coastguard Worker const ConstantExpr *CE = cast<ConstantExpr>(CalleeV);
1029*9880d681SAndroid Build Coastguard Worker if (!CE->isCast())
1030*9880d681SAndroid Build Coastguard Worker break;
1031*9880d681SAndroid Build Coastguard Worker // Look through the bitcast
1032*9880d681SAndroid Build Coastguard Worker CalleeV = cast<ConstantExpr>(CalleeV)->getOperand(0);
1033*9880d681SAndroid Build Coastguard Worker }
1034*9880d681SAndroid Build Coastguard Worker
1035*9880d681SAndroid Build Coastguard Worker // We have now looked past all of the bitcasts. Do we finally have a
1036*9880d681SAndroid Build Coastguard Worker // Function?
1037*9880d681SAndroid Build Coastguard Worker if (isa<Function>(CalleeV))
1038*9880d681SAndroid Build Coastguard Worker DirectCallee = CalleeV;
1039*9880d681SAndroid Build Coastguard Worker }
1040*9880d681SAndroid Build Coastguard Worker }
1041*9880d681SAndroid Build Coastguard Worker
1042*9880d681SAndroid Build Coastguard Worker // Check for function alignment information if we found that the
1043*9880d681SAndroid Build Coastguard Worker // ultimate target is a Function
1044*9880d681SAndroid Build Coastguard Worker if (DirectCallee)
1045*9880d681SAndroid Build Coastguard Worker if (llvm::getAlign(*cast<Function>(DirectCallee), Idx, Align))
1046*9880d681SAndroid Build Coastguard Worker return Align;
1047*9880d681SAndroid Build Coastguard Worker
1048*9880d681SAndroid Build Coastguard Worker // Call is indirect or alignment information is not available, fall back to
1049*9880d681SAndroid Build Coastguard Worker // the ABI type alignment
1050*9880d681SAndroid Build Coastguard Worker auto &DL = CS->getCaller()->getParent()->getDataLayout();
1051*9880d681SAndroid Build Coastguard Worker return DL.getABITypeAlignment(Ty);
1052*9880d681SAndroid Build Coastguard Worker }
1053*9880d681SAndroid Build Coastguard Worker
LowerCall(TargetLowering::CallLoweringInfo & CLI,SmallVectorImpl<SDValue> & InVals) const1054*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1055*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &InVals) const {
1056*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG = CLI.DAG;
1057*9880d681SAndroid Build Coastguard Worker SDLoc dl = CLI.DL;
1058*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
1059*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1060*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
1061*9880d681SAndroid Build Coastguard Worker SDValue Chain = CLI.Chain;
1062*9880d681SAndroid Build Coastguard Worker SDValue Callee = CLI.Callee;
1063*9880d681SAndroid Build Coastguard Worker bool &isTailCall = CLI.IsTailCall;
1064*9880d681SAndroid Build Coastguard Worker ArgListTy &Args = CLI.getArgs();
1065*9880d681SAndroid Build Coastguard Worker Type *retTy = CLI.RetTy;
1066*9880d681SAndroid Build Coastguard Worker ImmutableCallSite *CS = CLI.CS;
1067*9880d681SAndroid Build Coastguard Worker
1068*9880d681SAndroid Build Coastguard Worker bool isABI = (STI.getSmVersion() >= 20);
1069*9880d681SAndroid Build Coastguard Worker assert(isABI && "Non-ABI compilation is not supported");
1070*9880d681SAndroid Build Coastguard Worker if (!isABI)
1071*9880d681SAndroid Build Coastguard Worker return Chain;
1072*9880d681SAndroid Build Coastguard Worker MachineFunction &MF = DAG.getMachineFunction();
1073*9880d681SAndroid Build Coastguard Worker const Function *F = MF.getFunction();
1074*9880d681SAndroid Build Coastguard Worker auto &DL = MF.getDataLayout();
1075*9880d681SAndroid Build Coastguard Worker
1076*9880d681SAndroid Build Coastguard Worker SDValue tempChain = Chain;
1077*9880d681SAndroid Build Coastguard Worker Chain = DAG.getCALLSEQ_START(Chain,
1078*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(uniqueCallSite, dl, true),
1079*9880d681SAndroid Build Coastguard Worker dl);
1080*9880d681SAndroid Build Coastguard Worker SDValue InFlag = Chain.getValue(1);
1081*9880d681SAndroid Build Coastguard Worker
1082*9880d681SAndroid Build Coastguard Worker unsigned paramCount = 0;
1083*9880d681SAndroid Build Coastguard Worker // Args.size() and Outs.size() need not match.
1084*9880d681SAndroid Build Coastguard Worker // Outs.size() will be larger
1085*9880d681SAndroid Build Coastguard Worker // * if there is an aggregate argument with multiple fields (each field
1086*9880d681SAndroid Build Coastguard Worker // showing up separately in Outs)
1087*9880d681SAndroid Build Coastguard Worker // * if there is a vector argument with more than typical vector-length
1088*9880d681SAndroid Build Coastguard Worker // elements (generally if more than 4) where each vector element is
1089*9880d681SAndroid Build Coastguard Worker // individually present in Outs.
1090*9880d681SAndroid Build Coastguard Worker // So a different index should be used for indexing into Outs/OutVals.
1091*9880d681SAndroid Build Coastguard Worker // See similar issue in LowerFormalArguments.
1092*9880d681SAndroid Build Coastguard Worker unsigned OIdx = 0;
1093*9880d681SAndroid Build Coastguard Worker // Declare the .params or .reg need to pass values
1094*9880d681SAndroid Build Coastguard Worker // to the function
1095*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i != e; ++i, ++OIdx) {
1096*9880d681SAndroid Build Coastguard Worker EVT VT = Outs[OIdx].VT;
1097*9880d681SAndroid Build Coastguard Worker Type *Ty = Args[i].Ty;
1098*9880d681SAndroid Build Coastguard Worker
1099*9880d681SAndroid Build Coastguard Worker if (!Outs[OIdx].Flags.isByVal()) {
1100*9880d681SAndroid Build Coastguard Worker if (Ty->isAggregateType()) {
1101*9880d681SAndroid Build Coastguard Worker // aggregate
1102*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> vtparts;
1103*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> Offsets;
1104*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), Ty, vtparts, &Offsets,
1105*9880d681SAndroid Build Coastguard Worker 0);
1106*9880d681SAndroid Build Coastguard Worker
1107*9880d681SAndroid Build Coastguard Worker unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1);
1108*9880d681SAndroid Build Coastguard Worker // declare .param .align <align> .b8 .param<n>[<size>];
1109*9880d681SAndroid Build Coastguard Worker unsigned sz = DL.getTypeAllocSize(Ty);
1110*9880d681SAndroid Build Coastguard Worker SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1111*9880d681SAndroid Build Coastguard Worker SDValue DeclareParamOps[] = { Chain, DAG.getConstant(align, dl,
1112*9880d681SAndroid Build Coastguard Worker MVT::i32),
1113*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1114*9880d681SAndroid Build Coastguard Worker DAG.getConstant(sz, dl, MVT::i32),
1115*9880d681SAndroid Build Coastguard Worker InFlag };
1116*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareParam, dl, DeclareParamVTs,
1117*9880d681SAndroid Build Coastguard Worker DeclareParamOps);
1118*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1119*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0, je = vtparts.size(); j != je; ++j) {
1120*9880d681SAndroid Build Coastguard Worker EVT elemtype = vtparts[j];
1121*9880d681SAndroid Build Coastguard Worker unsigned ArgAlign = GreatestCommonDivisor64(align, Offsets[j]);
1122*9880d681SAndroid Build Coastguard Worker if (elemtype.isInteger() && (sz < 8))
1123*9880d681SAndroid Build Coastguard Worker sz = 8;
1124*9880d681SAndroid Build Coastguard Worker SDValue StVal = OutVals[OIdx];
1125*9880d681SAndroid Build Coastguard Worker if (elemtype.getSizeInBits() < 16) {
1126*9880d681SAndroid Build Coastguard Worker StVal = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i16, StVal);
1127*9880d681SAndroid Build Coastguard Worker }
1128*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1129*9880d681SAndroid Build Coastguard Worker SDValue CopyParamOps[] = { Chain,
1130*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1131*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Offsets[j], dl, MVT::i32),
1132*9880d681SAndroid Build Coastguard Worker StVal, InFlag };
1133*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreParam, dl,
1134*9880d681SAndroid Build Coastguard Worker CopyParamVTs, CopyParamOps,
1135*9880d681SAndroid Build Coastguard Worker elemtype, MachinePointerInfo(),
1136*9880d681SAndroid Build Coastguard Worker ArgAlign);
1137*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1138*9880d681SAndroid Build Coastguard Worker ++OIdx;
1139*9880d681SAndroid Build Coastguard Worker }
1140*9880d681SAndroid Build Coastguard Worker if (vtparts.size() > 0)
1141*9880d681SAndroid Build Coastguard Worker --OIdx;
1142*9880d681SAndroid Build Coastguard Worker ++paramCount;
1143*9880d681SAndroid Build Coastguard Worker continue;
1144*9880d681SAndroid Build Coastguard Worker }
1145*9880d681SAndroid Build Coastguard Worker if (Ty->isVectorTy()) {
1146*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, Ty);
1147*9880d681SAndroid Build Coastguard Worker unsigned align = getArgumentAlignment(Callee, CS, Ty, paramCount + 1);
1148*9880d681SAndroid Build Coastguard Worker // declare .param .align <align> .b8 .param<n>[<size>];
1149*9880d681SAndroid Build Coastguard Worker unsigned sz = DL.getTypeAllocSize(Ty);
1150*9880d681SAndroid Build Coastguard Worker SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1151*9880d681SAndroid Build Coastguard Worker SDValue DeclareParamOps[] = { Chain,
1152*9880d681SAndroid Build Coastguard Worker DAG.getConstant(align, dl, MVT::i32),
1153*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1154*9880d681SAndroid Build Coastguard Worker DAG.getConstant(sz, dl, MVT::i32),
1155*9880d681SAndroid Build Coastguard Worker InFlag };
1156*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareParam, dl, DeclareParamVTs,
1157*9880d681SAndroid Build Coastguard Worker DeclareParamOps);
1158*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1159*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ObjectVT.getVectorNumElements();
1160*9880d681SAndroid Build Coastguard Worker EVT EltVT = ObjectVT.getVectorElementType();
1161*9880d681SAndroid Build Coastguard Worker EVT MemVT = EltVT;
1162*9880d681SAndroid Build Coastguard Worker bool NeedExtend = false;
1163*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() < 16) {
1164*9880d681SAndroid Build Coastguard Worker NeedExtend = true;
1165*9880d681SAndroid Build Coastguard Worker EltVT = MVT::i16;
1166*9880d681SAndroid Build Coastguard Worker }
1167*9880d681SAndroid Build Coastguard Worker
1168*9880d681SAndroid Build Coastguard Worker // V1 store
1169*9880d681SAndroid Build Coastguard Worker if (NumElts == 1) {
1170*9880d681SAndroid Build Coastguard Worker SDValue Elt = OutVals[OIdx++];
1171*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
1172*9880d681SAndroid Build Coastguard Worker Elt = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Elt);
1173*9880d681SAndroid Build Coastguard Worker
1174*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1175*9880d681SAndroid Build Coastguard Worker SDValue CopyParamOps[] = { Chain,
1176*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1177*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), Elt,
1178*9880d681SAndroid Build Coastguard Worker InFlag };
1179*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreParam, dl,
1180*9880d681SAndroid Build Coastguard Worker CopyParamVTs, CopyParamOps,
1181*9880d681SAndroid Build Coastguard Worker MemVT, MachinePointerInfo());
1182*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1183*9880d681SAndroid Build Coastguard Worker } else if (NumElts == 2) {
1184*9880d681SAndroid Build Coastguard Worker SDValue Elt0 = OutVals[OIdx++];
1185*9880d681SAndroid Build Coastguard Worker SDValue Elt1 = OutVals[OIdx++];
1186*9880d681SAndroid Build Coastguard Worker if (NeedExtend) {
1187*9880d681SAndroid Build Coastguard Worker Elt0 = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Elt0);
1188*9880d681SAndroid Build Coastguard Worker Elt1 = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Elt1);
1189*9880d681SAndroid Build Coastguard Worker }
1190*9880d681SAndroid Build Coastguard Worker
1191*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1192*9880d681SAndroid Build Coastguard Worker SDValue CopyParamOps[] = { Chain,
1193*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1194*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), Elt0,
1195*9880d681SAndroid Build Coastguard Worker Elt1, InFlag };
1196*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreParamV2, dl,
1197*9880d681SAndroid Build Coastguard Worker CopyParamVTs, CopyParamOps,
1198*9880d681SAndroid Build Coastguard Worker MemVT, MachinePointerInfo());
1199*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1200*9880d681SAndroid Build Coastguard Worker } else {
1201*9880d681SAndroid Build Coastguard Worker unsigned curOffset = 0;
1202*9880d681SAndroid Build Coastguard Worker // V4 stores
1203*9880d681SAndroid Build Coastguard Worker // We have at least 4 elements (<3 x Ty> expands to 4 elements) and
1204*9880d681SAndroid Build Coastguard Worker // the
1205*9880d681SAndroid Build Coastguard Worker // vector will be expanded to a power of 2 elements, so we know we can
1206*9880d681SAndroid Build Coastguard Worker // always round up to the next multiple of 4 when creating the vector
1207*9880d681SAndroid Build Coastguard Worker // stores.
1208*9880d681SAndroid Build Coastguard Worker // e.g. 4 elem => 1 st.v4
1209*9880d681SAndroid Build Coastguard Worker // 6 elem => 2 st.v4
1210*9880d681SAndroid Build Coastguard Worker // 8 elem => 2 st.v4
1211*9880d681SAndroid Build Coastguard Worker // 11 elem => 3 st.v4
1212*9880d681SAndroid Build Coastguard Worker unsigned VecSize = 4;
1213*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() == 64)
1214*9880d681SAndroid Build Coastguard Worker VecSize = 2;
1215*9880d681SAndroid Build Coastguard Worker
1216*9880d681SAndroid Build Coastguard Worker // This is potentially only part of a vector, so assume all elements
1217*9880d681SAndroid Build Coastguard Worker // are packed together.
1218*9880d681SAndroid Build Coastguard Worker unsigned PerStoreOffset = MemVT.getStoreSizeInBits() / 8 * VecSize;
1219*9880d681SAndroid Build Coastguard Worker
1220*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; i += VecSize) {
1221*9880d681SAndroid Build Coastguard Worker // Get values
1222*9880d681SAndroid Build Coastguard Worker SDValue StoreVal;
1223*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
1224*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
1225*9880d681SAndroid Build Coastguard Worker Ops.push_back(DAG.getConstant(paramCount, dl, MVT::i32));
1226*9880d681SAndroid Build Coastguard Worker Ops.push_back(DAG.getConstant(curOffset, dl, MVT::i32));
1227*9880d681SAndroid Build Coastguard Worker
1228*9880d681SAndroid Build Coastguard Worker unsigned Opc = NVPTXISD::StoreParamV2;
1229*9880d681SAndroid Build Coastguard Worker
1230*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[OIdx++];
1231*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
1232*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal);
1233*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
1234*9880d681SAndroid Build Coastguard Worker
1235*9880d681SAndroid Build Coastguard Worker if (i + 1 < NumElts) {
1236*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[OIdx++];
1237*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
1238*9880d681SAndroid Build Coastguard Worker StoreVal =
1239*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal);
1240*9880d681SAndroid Build Coastguard Worker } else {
1241*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(EltVT);
1242*9880d681SAndroid Build Coastguard Worker }
1243*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
1244*9880d681SAndroid Build Coastguard Worker
1245*9880d681SAndroid Build Coastguard Worker if (VecSize == 4) {
1246*9880d681SAndroid Build Coastguard Worker Opc = NVPTXISD::StoreParamV4;
1247*9880d681SAndroid Build Coastguard Worker if (i + 2 < NumElts) {
1248*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[OIdx++];
1249*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
1250*9880d681SAndroid Build Coastguard Worker StoreVal =
1251*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal);
1252*9880d681SAndroid Build Coastguard Worker } else {
1253*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(EltVT);
1254*9880d681SAndroid Build Coastguard Worker }
1255*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
1256*9880d681SAndroid Build Coastguard Worker
1257*9880d681SAndroid Build Coastguard Worker if (i + 3 < NumElts) {
1258*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[OIdx++];
1259*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
1260*9880d681SAndroid Build Coastguard Worker StoreVal =
1261*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal);
1262*9880d681SAndroid Build Coastguard Worker } else {
1263*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(EltVT);
1264*9880d681SAndroid Build Coastguard Worker }
1265*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
1266*9880d681SAndroid Build Coastguard Worker }
1267*9880d681SAndroid Build Coastguard Worker
1268*9880d681SAndroid Build Coastguard Worker Ops.push_back(InFlag);
1269*9880d681SAndroid Build Coastguard Worker
1270*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1271*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(Opc, dl, CopyParamVTs, Ops,
1272*9880d681SAndroid Build Coastguard Worker MemVT, MachinePointerInfo());
1273*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1274*9880d681SAndroid Build Coastguard Worker curOffset += PerStoreOffset;
1275*9880d681SAndroid Build Coastguard Worker }
1276*9880d681SAndroid Build Coastguard Worker }
1277*9880d681SAndroid Build Coastguard Worker ++paramCount;
1278*9880d681SAndroid Build Coastguard Worker --OIdx;
1279*9880d681SAndroid Build Coastguard Worker continue;
1280*9880d681SAndroid Build Coastguard Worker }
1281*9880d681SAndroid Build Coastguard Worker // Plain scalar
1282*9880d681SAndroid Build Coastguard Worker // for ABI, declare .param .b<size> .param<n>;
1283*9880d681SAndroid Build Coastguard Worker unsigned sz = VT.getSizeInBits();
1284*9880d681SAndroid Build Coastguard Worker bool needExtend = false;
1285*9880d681SAndroid Build Coastguard Worker if (VT.isInteger()) {
1286*9880d681SAndroid Build Coastguard Worker if (sz < 16)
1287*9880d681SAndroid Build Coastguard Worker needExtend = true;
1288*9880d681SAndroid Build Coastguard Worker if (sz < 32)
1289*9880d681SAndroid Build Coastguard Worker sz = 32;
1290*9880d681SAndroid Build Coastguard Worker }
1291*9880d681SAndroid Build Coastguard Worker SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1292*9880d681SAndroid Build Coastguard Worker SDValue DeclareParamOps[] = { Chain,
1293*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1294*9880d681SAndroid Build Coastguard Worker DAG.getConstant(sz, dl, MVT::i32),
1295*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), InFlag };
1296*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareScalarParam, dl, DeclareParamVTs,
1297*9880d681SAndroid Build Coastguard Worker DeclareParamOps);
1298*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1299*9880d681SAndroid Build Coastguard Worker SDValue OutV = OutVals[OIdx];
1300*9880d681SAndroid Build Coastguard Worker if (needExtend) {
1301*9880d681SAndroid Build Coastguard Worker // zext/sext i1 to i16
1302*9880d681SAndroid Build Coastguard Worker unsigned opc = ISD::ZERO_EXTEND;
1303*9880d681SAndroid Build Coastguard Worker if (Outs[OIdx].Flags.isSExt())
1304*9880d681SAndroid Build Coastguard Worker opc = ISD::SIGN_EXTEND;
1305*9880d681SAndroid Build Coastguard Worker OutV = DAG.getNode(opc, dl, MVT::i16, OutV);
1306*9880d681SAndroid Build Coastguard Worker }
1307*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1308*9880d681SAndroid Build Coastguard Worker SDValue CopyParamOps[] = { Chain,
1309*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1310*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), OutV,
1311*9880d681SAndroid Build Coastguard Worker InFlag };
1312*9880d681SAndroid Build Coastguard Worker
1313*9880d681SAndroid Build Coastguard Worker unsigned opcode = NVPTXISD::StoreParam;
1314*9880d681SAndroid Build Coastguard Worker if (Outs[OIdx].Flags.isZExt() && VT.getSizeInBits() < 32)
1315*9880d681SAndroid Build Coastguard Worker opcode = NVPTXISD::StoreParamU32;
1316*9880d681SAndroid Build Coastguard Worker else if (Outs[OIdx].Flags.isSExt() && VT.getSizeInBits() < 32)
1317*9880d681SAndroid Build Coastguard Worker opcode = NVPTXISD::StoreParamS32;
1318*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(opcode, dl, CopyParamVTs, CopyParamOps,
1319*9880d681SAndroid Build Coastguard Worker VT, MachinePointerInfo());
1320*9880d681SAndroid Build Coastguard Worker
1321*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1322*9880d681SAndroid Build Coastguard Worker ++paramCount;
1323*9880d681SAndroid Build Coastguard Worker continue;
1324*9880d681SAndroid Build Coastguard Worker }
1325*9880d681SAndroid Build Coastguard Worker // struct or vector
1326*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> vtparts;
1327*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> Offsets;
1328*9880d681SAndroid Build Coastguard Worker auto *PTy = dyn_cast<PointerType>(Args[i].Ty);
1329*9880d681SAndroid Build Coastguard Worker assert(PTy && "Type of a byval parameter should be pointer");
1330*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), PTy->getElementType(),
1331*9880d681SAndroid Build Coastguard Worker vtparts, &Offsets, 0);
1332*9880d681SAndroid Build Coastguard Worker
1333*9880d681SAndroid Build Coastguard Worker // declare .param .align <align> .b8 .param<n>[<size>];
1334*9880d681SAndroid Build Coastguard Worker unsigned sz = Outs[OIdx].Flags.getByValSize();
1335*9880d681SAndroid Build Coastguard Worker SDVTList DeclareParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1336*9880d681SAndroid Build Coastguard Worker unsigned ArgAlign = Outs[OIdx].Flags.getByValAlign();
1337*9880d681SAndroid Build Coastguard Worker // The ByValAlign in the Outs[OIdx].Flags is alway set at this point,
1338*9880d681SAndroid Build Coastguard Worker // so we don't need to worry about natural alignment or not.
1339*9880d681SAndroid Build Coastguard Worker // See TargetLowering::LowerCallTo().
1340*9880d681SAndroid Build Coastguard Worker SDValue DeclareParamOps[] = {
1341*9880d681SAndroid Build Coastguard Worker Chain, DAG.getConstant(Outs[OIdx].Flags.getByValAlign(), dl, MVT::i32),
1342*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1343*9880d681SAndroid Build Coastguard Worker DAG.getConstant(sz, dl, MVT::i32), InFlag
1344*9880d681SAndroid Build Coastguard Worker };
1345*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareParam, dl, DeclareParamVTs,
1346*9880d681SAndroid Build Coastguard Worker DeclareParamOps);
1347*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1348*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0, je = vtparts.size(); j != je; ++j) {
1349*9880d681SAndroid Build Coastguard Worker EVT elemtype = vtparts[j];
1350*9880d681SAndroid Build Coastguard Worker int curOffset = Offsets[j];
1351*9880d681SAndroid Build Coastguard Worker unsigned PartAlign = GreatestCommonDivisor64(ArgAlign, curOffset);
1352*9880d681SAndroid Build Coastguard Worker auto PtrVT = getPointerTy(DAG.getDataLayout());
1353*9880d681SAndroid Build Coastguard Worker SDValue srcAddr = DAG.getNode(ISD::ADD, dl, PtrVT, OutVals[OIdx],
1354*9880d681SAndroid Build Coastguard Worker DAG.getConstant(curOffset, dl, PtrVT));
1355*9880d681SAndroid Build Coastguard Worker SDValue theVal = DAG.getLoad(elemtype, dl, tempChain, srcAddr,
1356*9880d681SAndroid Build Coastguard Worker MachinePointerInfo(), false, false, false,
1357*9880d681SAndroid Build Coastguard Worker PartAlign);
1358*9880d681SAndroid Build Coastguard Worker if (elemtype.getSizeInBits() < 16) {
1359*9880d681SAndroid Build Coastguard Worker theVal = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i16, theVal);
1360*9880d681SAndroid Build Coastguard Worker }
1361*9880d681SAndroid Build Coastguard Worker SDVTList CopyParamVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1362*9880d681SAndroid Build Coastguard Worker SDValue CopyParamOps[] = { Chain,
1363*9880d681SAndroid Build Coastguard Worker DAG.getConstant(paramCount, dl, MVT::i32),
1364*9880d681SAndroid Build Coastguard Worker DAG.getConstant(curOffset, dl, MVT::i32),
1365*9880d681SAndroid Build Coastguard Worker theVal, InFlag };
1366*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreParam, dl, CopyParamVTs,
1367*9880d681SAndroid Build Coastguard Worker CopyParamOps, elemtype,
1368*9880d681SAndroid Build Coastguard Worker MachinePointerInfo());
1369*9880d681SAndroid Build Coastguard Worker
1370*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1371*9880d681SAndroid Build Coastguard Worker }
1372*9880d681SAndroid Build Coastguard Worker ++paramCount;
1373*9880d681SAndroid Build Coastguard Worker }
1374*9880d681SAndroid Build Coastguard Worker
1375*9880d681SAndroid Build Coastguard Worker GlobalAddressSDNode *Func = dyn_cast<GlobalAddressSDNode>(Callee.getNode());
1376*9880d681SAndroid Build Coastguard Worker unsigned retAlignment = 0;
1377*9880d681SAndroid Build Coastguard Worker
1378*9880d681SAndroid Build Coastguard Worker // Handle Result
1379*9880d681SAndroid Build Coastguard Worker if (Ins.size() > 0) {
1380*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> resvtparts;
1381*9880d681SAndroid Build Coastguard Worker ComputeValueVTs(*this, DL, retTy, resvtparts);
1382*9880d681SAndroid Build Coastguard Worker
1383*9880d681SAndroid Build Coastguard Worker // Declare
1384*9880d681SAndroid Build Coastguard Worker // .param .align 16 .b8 retval0[<size-in-bytes>], or
1385*9880d681SAndroid Build Coastguard Worker // .param .b<size-in-bits> retval0
1386*9880d681SAndroid Build Coastguard Worker unsigned resultsz = DL.getTypeAllocSizeInBits(retTy);
1387*9880d681SAndroid Build Coastguard Worker // Emit ".param .b<size-in-bits> retval0" instead of byte arrays only for
1388*9880d681SAndroid Build Coastguard Worker // these three types to match the logic in
1389*9880d681SAndroid Build Coastguard Worker // NVPTXAsmPrinter::printReturnValStr and NVPTXTargetLowering::getPrototype.
1390*9880d681SAndroid Build Coastguard Worker // Plus, this behavior is consistent with nvcc's.
1391*9880d681SAndroid Build Coastguard Worker if (retTy->isFloatingPointTy() || retTy->isIntegerTy() ||
1392*9880d681SAndroid Build Coastguard Worker retTy->isPointerTy()) {
1393*9880d681SAndroid Build Coastguard Worker // Scalar needs to be at least 32bit wide
1394*9880d681SAndroid Build Coastguard Worker if (resultsz < 32)
1395*9880d681SAndroid Build Coastguard Worker resultsz = 32;
1396*9880d681SAndroid Build Coastguard Worker SDVTList DeclareRetVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1397*9880d681SAndroid Build Coastguard Worker SDValue DeclareRetOps[] = { Chain, DAG.getConstant(1, dl, MVT::i32),
1398*9880d681SAndroid Build Coastguard Worker DAG.getConstant(resultsz, dl, MVT::i32),
1399*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), InFlag };
1400*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareRet, dl, DeclareRetVTs,
1401*9880d681SAndroid Build Coastguard Worker DeclareRetOps);
1402*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1403*9880d681SAndroid Build Coastguard Worker } else {
1404*9880d681SAndroid Build Coastguard Worker retAlignment = getArgumentAlignment(Callee, CS, retTy, 0);
1405*9880d681SAndroid Build Coastguard Worker SDVTList DeclareRetVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1406*9880d681SAndroid Build Coastguard Worker SDValue DeclareRetOps[] = { Chain,
1407*9880d681SAndroid Build Coastguard Worker DAG.getConstant(retAlignment, dl, MVT::i32),
1408*9880d681SAndroid Build Coastguard Worker DAG.getConstant(resultsz / 8, dl, MVT::i32),
1409*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), InFlag };
1410*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::DeclareRetParam, dl, DeclareRetVTs,
1411*9880d681SAndroid Build Coastguard Worker DeclareRetOps);
1412*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1413*9880d681SAndroid Build Coastguard Worker }
1414*9880d681SAndroid Build Coastguard Worker }
1415*9880d681SAndroid Build Coastguard Worker
1416*9880d681SAndroid Build Coastguard Worker if (!Func) {
1417*9880d681SAndroid Build Coastguard Worker // This is indirect function call case : PTX requires a prototype of the
1418*9880d681SAndroid Build Coastguard Worker // form
1419*9880d681SAndroid Build Coastguard Worker // proto_0 : .callprototype(.param .b32 _) _ (.param .b32 _);
1420*9880d681SAndroid Build Coastguard Worker // to be emitted, and the label has to used as the last arg of call
1421*9880d681SAndroid Build Coastguard Worker // instruction.
1422*9880d681SAndroid Build Coastguard Worker // The prototype is embedded in a string and put as the operand for a
1423*9880d681SAndroid Build Coastguard Worker // CallPrototype SDNode which will print out to the value of the string.
1424*9880d681SAndroid Build Coastguard Worker SDVTList ProtoVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1425*9880d681SAndroid Build Coastguard Worker std::string Proto =
1426*9880d681SAndroid Build Coastguard Worker getPrototype(DAG.getDataLayout(), retTy, Args, Outs, retAlignment, CS);
1427*9880d681SAndroid Build Coastguard Worker const char *ProtoStr =
1428*9880d681SAndroid Build Coastguard Worker nvTM->getManagedStrPool()->getManagedString(Proto.c_str())->c_str();
1429*9880d681SAndroid Build Coastguard Worker SDValue ProtoOps[] = {
1430*9880d681SAndroid Build Coastguard Worker Chain, DAG.getTargetExternalSymbol(ProtoStr, MVT::i32), InFlag,
1431*9880d681SAndroid Build Coastguard Worker };
1432*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::CallPrototype, dl, ProtoVTs, ProtoOps);
1433*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1434*9880d681SAndroid Build Coastguard Worker }
1435*9880d681SAndroid Build Coastguard Worker // Op to just print "call"
1436*9880d681SAndroid Build Coastguard Worker SDVTList PrintCallVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1437*9880d681SAndroid Build Coastguard Worker SDValue PrintCallOps[] = {
1438*9880d681SAndroid Build Coastguard Worker Chain, DAG.getConstant((Ins.size() == 0) ? 0 : 1, dl, MVT::i32), InFlag
1439*9880d681SAndroid Build Coastguard Worker };
1440*9880d681SAndroid Build Coastguard Worker // We model convergent calls as separate opcodes.
1441*9880d681SAndroid Build Coastguard Worker unsigned Opcode = Func ? NVPTXISD::PrintCallUni : NVPTXISD::PrintCall;
1442*9880d681SAndroid Build Coastguard Worker if (CLI.IsConvergent)
1443*9880d681SAndroid Build Coastguard Worker Opcode = Opcode == NVPTXISD::PrintCallUni ? NVPTXISD::PrintConvergentCallUni
1444*9880d681SAndroid Build Coastguard Worker : NVPTXISD::PrintConvergentCall;
1445*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(Opcode, dl, PrintCallVTs, PrintCallOps);
1446*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1447*9880d681SAndroid Build Coastguard Worker
1448*9880d681SAndroid Build Coastguard Worker // Ops to print out the function name
1449*9880d681SAndroid Build Coastguard Worker SDVTList CallVoidVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1450*9880d681SAndroid Build Coastguard Worker SDValue CallVoidOps[] = { Chain, Callee, InFlag };
1451*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::CallVoid, dl, CallVoidVTs, CallVoidOps);
1452*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1453*9880d681SAndroid Build Coastguard Worker
1454*9880d681SAndroid Build Coastguard Worker // Ops to print out the param list
1455*9880d681SAndroid Build Coastguard Worker SDVTList CallArgBeginVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1456*9880d681SAndroid Build Coastguard Worker SDValue CallArgBeginOps[] = { Chain, InFlag };
1457*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::CallArgBegin, dl, CallArgBeginVTs,
1458*9880d681SAndroid Build Coastguard Worker CallArgBeginOps);
1459*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1460*9880d681SAndroid Build Coastguard Worker
1461*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = paramCount; i != e; ++i) {
1462*9880d681SAndroid Build Coastguard Worker unsigned opcode;
1463*9880d681SAndroid Build Coastguard Worker if (i == (e - 1))
1464*9880d681SAndroid Build Coastguard Worker opcode = NVPTXISD::LastCallArg;
1465*9880d681SAndroid Build Coastguard Worker else
1466*9880d681SAndroid Build Coastguard Worker opcode = NVPTXISD::CallArg;
1467*9880d681SAndroid Build Coastguard Worker SDVTList CallArgVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1468*9880d681SAndroid Build Coastguard Worker SDValue CallArgOps[] = { Chain, DAG.getConstant(1, dl, MVT::i32),
1469*9880d681SAndroid Build Coastguard Worker DAG.getConstant(i, dl, MVT::i32), InFlag };
1470*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(opcode, dl, CallArgVTs, CallArgOps);
1471*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1472*9880d681SAndroid Build Coastguard Worker }
1473*9880d681SAndroid Build Coastguard Worker SDVTList CallArgEndVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1474*9880d681SAndroid Build Coastguard Worker SDValue CallArgEndOps[] = { Chain,
1475*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Func ? 1 : 0, dl, MVT::i32),
1476*9880d681SAndroid Build Coastguard Worker InFlag };
1477*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::CallArgEnd, dl, CallArgEndVTs, CallArgEndOps);
1478*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1479*9880d681SAndroid Build Coastguard Worker
1480*9880d681SAndroid Build Coastguard Worker if (!Func) {
1481*9880d681SAndroid Build Coastguard Worker SDVTList PrototypeVTs = DAG.getVTList(MVT::Other, MVT::Glue);
1482*9880d681SAndroid Build Coastguard Worker SDValue PrototypeOps[] = { Chain,
1483*9880d681SAndroid Build Coastguard Worker DAG.getConstant(uniqueCallSite, dl, MVT::i32),
1484*9880d681SAndroid Build Coastguard Worker InFlag };
1485*9880d681SAndroid Build Coastguard Worker Chain = DAG.getNode(NVPTXISD::Prototype, dl, PrototypeVTs, PrototypeOps);
1486*9880d681SAndroid Build Coastguard Worker InFlag = Chain.getValue(1);
1487*9880d681SAndroid Build Coastguard Worker }
1488*9880d681SAndroid Build Coastguard Worker
1489*9880d681SAndroid Build Coastguard Worker // Generate loads from param memory/moves from registers for result
1490*9880d681SAndroid Build Coastguard Worker if (Ins.size() > 0) {
1491*9880d681SAndroid Build Coastguard Worker if (retTy && retTy->isVectorTy()) {
1492*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, retTy);
1493*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ObjectVT.getVectorNumElements();
1494*9880d681SAndroid Build Coastguard Worker EVT EltVT = ObjectVT.getVectorElementType();
1495*9880d681SAndroid Build Coastguard Worker assert(STI.getTargetLowering()->getNumRegisters(F->getContext(),
1496*9880d681SAndroid Build Coastguard Worker ObjectVT) == NumElts &&
1497*9880d681SAndroid Build Coastguard Worker "Vector was not scalarized");
1498*9880d681SAndroid Build Coastguard Worker unsigned sz = EltVT.getSizeInBits();
1499*9880d681SAndroid Build Coastguard Worker bool needTruncate = sz < 8;
1500*9880d681SAndroid Build Coastguard Worker
1501*9880d681SAndroid Build Coastguard Worker if (NumElts == 1) {
1502*9880d681SAndroid Build Coastguard Worker // Just a simple load
1503*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 4> LoadRetVTs;
1504*9880d681SAndroid Build Coastguard Worker if (EltVT == MVT::i1 || EltVT == MVT::i8) {
1505*9880d681SAndroid Build Coastguard Worker // If loading i1/i8 result, generate
1506*9880d681SAndroid Build Coastguard Worker // load.b8 i16
1507*9880d681SAndroid Build Coastguard Worker // if i1
1508*9880d681SAndroid Build Coastguard Worker // trunc i16 to i1
1509*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i16);
1510*9880d681SAndroid Build Coastguard Worker } else
1511*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(EltVT);
1512*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Other);
1513*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Glue);
1514*9880d681SAndroid Build Coastguard Worker SDValue LoadRetOps[] = {Chain, DAG.getConstant(1, dl, MVT::i32),
1515*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), InFlag};
1516*9880d681SAndroid Build Coastguard Worker SDValue retval = DAG.getMemIntrinsicNode(
1517*9880d681SAndroid Build Coastguard Worker NVPTXISD::LoadParam, dl,
1518*9880d681SAndroid Build Coastguard Worker DAG.getVTList(LoadRetVTs), LoadRetOps, EltVT, MachinePointerInfo());
1519*9880d681SAndroid Build Coastguard Worker Chain = retval.getValue(1);
1520*9880d681SAndroid Build Coastguard Worker InFlag = retval.getValue(2);
1521*9880d681SAndroid Build Coastguard Worker SDValue Ret0 = retval;
1522*9880d681SAndroid Build Coastguard Worker if (needTruncate)
1523*9880d681SAndroid Build Coastguard Worker Ret0 = DAG.getNode(ISD::TRUNCATE, dl, EltVT, Ret0);
1524*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret0);
1525*9880d681SAndroid Build Coastguard Worker } else if (NumElts == 2) {
1526*9880d681SAndroid Build Coastguard Worker // LoadV2
1527*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 4> LoadRetVTs;
1528*9880d681SAndroid Build Coastguard Worker if (EltVT == MVT::i1 || EltVT == MVT::i8) {
1529*9880d681SAndroid Build Coastguard Worker // If loading i1/i8 result, generate
1530*9880d681SAndroid Build Coastguard Worker // load.b8 i16
1531*9880d681SAndroid Build Coastguard Worker // if i1
1532*9880d681SAndroid Build Coastguard Worker // trunc i16 to i1
1533*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i16);
1534*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i16);
1535*9880d681SAndroid Build Coastguard Worker } else {
1536*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(EltVT);
1537*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(EltVT);
1538*9880d681SAndroid Build Coastguard Worker }
1539*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Other);
1540*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Glue);
1541*9880d681SAndroid Build Coastguard Worker SDValue LoadRetOps[] = {Chain, DAG.getConstant(1, dl, MVT::i32),
1542*9880d681SAndroid Build Coastguard Worker DAG.getConstant(0, dl, MVT::i32), InFlag};
1543*9880d681SAndroid Build Coastguard Worker SDValue retval = DAG.getMemIntrinsicNode(
1544*9880d681SAndroid Build Coastguard Worker NVPTXISD::LoadParamV2, dl,
1545*9880d681SAndroid Build Coastguard Worker DAG.getVTList(LoadRetVTs), LoadRetOps, EltVT, MachinePointerInfo());
1546*9880d681SAndroid Build Coastguard Worker Chain = retval.getValue(2);
1547*9880d681SAndroid Build Coastguard Worker InFlag = retval.getValue(3);
1548*9880d681SAndroid Build Coastguard Worker SDValue Ret0 = retval.getValue(0);
1549*9880d681SAndroid Build Coastguard Worker SDValue Ret1 = retval.getValue(1);
1550*9880d681SAndroid Build Coastguard Worker if (needTruncate) {
1551*9880d681SAndroid Build Coastguard Worker Ret0 = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, Ret0);
1552*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret0);
1553*9880d681SAndroid Build Coastguard Worker Ret1 = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, Ret1);
1554*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret1);
1555*9880d681SAndroid Build Coastguard Worker } else {
1556*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret0);
1557*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret1);
1558*9880d681SAndroid Build Coastguard Worker }
1559*9880d681SAndroid Build Coastguard Worker } else {
1560*9880d681SAndroid Build Coastguard Worker // Split into N LoadV4
1561*9880d681SAndroid Build Coastguard Worker unsigned Ofst = 0;
1562*9880d681SAndroid Build Coastguard Worker unsigned VecSize = 4;
1563*9880d681SAndroid Build Coastguard Worker unsigned Opc = NVPTXISD::LoadParamV4;
1564*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() == 64) {
1565*9880d681SAndroid Build Coastguard Worker VecSize = 2;
1566*9880d681SAndroid Build Coastguard Worker Opc = NVPTXISD::LoadParamV2;
1567*9880d681SAndroid Build Coastguard Worker }
1568*9880d681SAndroid Build Coastguard Worker EVT VecVT = EVT::getVectorVT(F->getContext(), EltVT, VecSize);
1569*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; i += VecSize) {
1570*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 8> LoadRetVTs;
1571*9880d681SAndroid Build Coastguard Worker if (EltVT == MVT::i1 || EltVT == MVT::i8) {
1572*9880d681SAndroid Build Coastguard Worker // If loading i1/i8 result, generate
1573*9880d681SAndroid Build Coastguard Worker // load.b8 i16
1574*9880d681SAndroid Build Coastguard Worker // if i1
1575*9880d681SAndroid Build Coastguard Worker // trunc i16 to i1
1576*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0; j < VecSize; ++j)
1577*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i16);
1578*9880d681SAndroid Build Coastguard Worker } else {
1579*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0; j < VecSize; ++j)
1580*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(EltVT);
1581*9880d681SAndroid Build Coastguard Worker }
1582*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Other);
1583*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Glue);
1584*9880d681SAndroid Build Coastguard Worker SDValue LoadRetOps[] = {Chain, DAG.getConstant(1, dl, MVT::i32),
1585*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Ofst, dl, MVT::i32), InFlag};
1586*9880d681SAndroid Build Coastguard Worker SDValue retval = DAG.getMemIntrinsicNode(
1587*9880d681SAndroid Build Coastguard Worker Opc, dl, DAG.getVTList(LoadRetVTs),
1588*9880d681SAndroid Build Coastguard Worker LoadRetOps, EltVT, MachinePointerInfo());
1589*9880d681SAndroid Build Coastguard Worker if (VecSize == 2) {
1590*9880d681SAndroid Build Coastguard Worker Chain = retval.getValue(2);
1591*9880d681SAndroid Build Coastguard Worker InFlag = retval.getValue(3);
1592*9880d681SAndroid Build Coastguard Worker } else {
1593*9880d681SAndroid Build Coastguard Worker Chain = retval.getValue(4);
1594*9880d681SAndroid Build Coastguard Worker InFlag = retval.getValue(5);
1595*9880d681SAndroid Build Coastguard Worker }
1596*9880d681SAndroid Build Coastguard Worker
1597*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0; j < VecSize; ++j) {
1598*9880d681SAndroid Build Coastguard Worker if (i + j >= NumElts)
1599*9880d681SAndroid Build Coastguard Worker break;
1600*9880d681SAndroid Build Coastguard Worker SDValue Elt = retval.getValue(j);
1601*9880d681SAndroid Build Coastguard Worker if (needTruncate)
1602*9880d681SAndroid Build Coastguard Worker Elt = DAG.getNode(ISD::TRUNCATE, dl, EltVT, Elt);
1603*9880d681SAndroid Build Coastguard Worker InVals.push_back(Elt);
1604*9880d681SAndroid Build Coastguard Worker }
1605*9880d681SAndroid Build Coastguard Worker Ofst += DL.getTypeAllocSize(VecVT.getTypeForEVT(F->getContext()));
1606*9880d681SAndroid Build Coastguard Worker }
1607*9880d681SAndroid Build Coastguard Worker }
1608*9880d681SAndroid Build Coastguard Worker } else {
1609*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> VTs;
1610*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> Offsets;
1611*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), retTy, VTs, &Offsets, 0);
1612*9880d681SAndroid Build Coastguard Worker assert(VTs.size() == Ins.size() && "Bad value decomposition");
1613*9880d681SAndroid Build Coastguard Worker unsigned RetAlign = getArgumentAlignment(Callee, CS, retTy, 0);
1614*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
1615*9880d681SAndroid Build Coastguard Worker unsigned sz = VTs[i].getSizeInBits();
1616*9880d681SAndroid Build Coastguard Worker unsigned AlignI = GreatestCommonDivisor64(RetAlign, Offsets[i]);
1617*9880d681SAndroid Build Coastguard Worker bool needTruncate = false;
1618*9880d681SAndroid Build Coastguard Worker if (VTs[i].isInteger() && sz < 8) {
1619*9880d681SAndroid Build Coastguard Worker sz = 8;
1620*9880d681SAndroid Build Coastguard Worker needTruncate = true;
1621*9880d681SAndroid Build Coastguard Worker }
1622*9880d681SAndroid Build Coastguard Worker
1623*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 4> LoadRetVTs;
1624*9880d681SAndroid Build Coastguard Worker EVT TheLoadType = VTs[i];
1625*9880d681SAndroid Build Coastguard Worker if (retTy->isIntegerTy() && DL.getTypeAllocSizeInBits(retTy) < 32) {
1626*9880d681SAndroid Build Coastguard Worker // This is for integer types only, and specifically not for
1627*9880d681SAndroid Build Coastguard Worker // aggregates.
1628*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i32);
1629*9880d681SAndroid Build Coastguard Worker TheLoadType = MVT::i32;
1630*9880d681SAndroid Build Coastguard Worker needTruncate = true;
1631*9880d681SAndroid Build Coastguard Worker } else if (sz < 16) {
1632*9880d681SAndroid Build Coastguard Worker // If loading i1/i8 result, generate
1633*9880d681SAndroid Build Coastguard Worker // load i8 (-> i16)
1634*9880d681SAndroid Build Coastguard Worker // trunc i16 to i1/i8
1635*9880d681SAndroid Build Coastguard Worker
1636*9880d681SAndroid Build Coastguard Worker // FIXME: Do we need to set needTruncate to true here, too? We could
1637*9880d681SAndroid Build Coastguard Worker // not figure out what this branch is for in D17872, so we left it
1638*9880d681SAndroid Build Coastguard Worker // alone. The comment above about loading i1/i8 may be wrong, as the
1639*9880d681SAndroid Build Coastguard Worker // branch above seems to cover integers of size < 32.
1640*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::i16);
1641*9880d681SAndroid Build Coastguard Worker } else
1642*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(Ins[i].VT);
1643*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Other);
1644*9880d681SAndroid Build Coastguard Worker LoadRetVTs.push_back(MVT::Glue);
1645*9880d681SAndroid Build Coastguard Worker
1646*9880d681SAndroid Build Coastguard Worker SDValue LoadRetOps[] = {Chain, DAG.getConstant(1, dl, MVT::i32),
1647*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Offsets[i], dl, MVT::i32),
1648*9880d681SAndroid Build Coastguard Worker InFlag};
1649*9880d681SAndroid Build Coastguard Worker SDValue retval = DAG.getMemIntrinsicNode(
1650*9880d681SAndroid Build Coastguard Worker NVPTXISD::LoadParam, dl,
1651*9880d681SAndroid Build Coastguard Worker DAG.getVTList(LoadRetVTs), LoadRetOps,
1652*9880d681SAndroid Build Coastguard Worker TheLoadType, MachinePointerInfo(), AlignI);
1653*9880d681SAndroid Build Coastguard Worker Chain = retval.getValue(1);
1654*9880d681SAndroid Build Coastguard Worker InFlag = retval.getValue(2);
1655*9880d681SAndroid Build Coastguard Worker SDValue Ret0 = retval.getValue(0);
1656*9880d681SAndroid Build Coastguard Worker if (needTruncate)
1657*9880d681SAndroid Build Coastguard Worker Ret0 = DAG.getNode(ISD::TRUNCATE, dl, Ins[i].VT, Ret0);
1658*9880d681SAndroid Build Coastguard Worker InVals.push_back(Ret0);
1659*9880d681SAndroid Build Coastguard Worker }
1660*9880d681SAndroid Build Coastguard Worker }
1661*9880d681SAndroid Build Coastguard Worker }
1662*9880d681SAndroid Build Coastguard Worker
1663*9880d681SAndroid Build Coastguard Worker Chain = DAG.getCALLSEQ_END(Chain,
1664*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(uniqueCallSite, dl, true),
1665*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(uniqueCallSite + 1, dl,
1666*9880d681SAndroid Build Coastguard Worker true),
1667*9880d681SAndroid Build Coastguard Worker InFlag, dl);
1668*9880d681SAndroid Build Coastguard Worker uniqueCallSite++;
1669*9880d681SAndroid Build Coastguard Worker
1670*9880d681SAndroid Build Coastguard Worker // set isTailCall to false for now, until we figure out how to express
1671*9880d681SAndroid Build Coastguard Worker // tail call optimization in PTX
1672*9880d681SAndroid Build Coastguard Worker isTailCall = false;
1673*9880d681SAndroid Build Coastguard Worker return Chain;
1674*9880d681SAndroid Build Coastguard Worker }
1675*9880d681SAndroid Build Coastguard Worker
1676*9880d681SAndroid Build Coastguard Worker // By default CONCAT_VECTORS is lowered by ExpandVectorBuildThroughStack()
1677*9880d681SAndroid Build Coastguard Worker // (see LegalizeDAG.cpp). This is slow and uses local memory.
1678*9880d681SAndroid Build Coastguard Worker // We use extract/insert/build vector just as what LegalizeOp() does in llvm 2.5
1679*9880d681SAndroid Build Coastguard Worker SDValue
LowerCONCAT_VECTORS(SDValue Op,SelectionDAG & DAG) const1680*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const {
1681*9880d681SAndroid Build Coastguard Worker SDNode *Node = Op.getNode();
1682*9880d681SAndroid Build Coastguard Worker SDLoc dl(Node);
1683*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
1684*9880d681SAndroid Build Coastguard Worker unsigned NumOperands = Node->getNumOperands();
1685*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumOperands; ++i) {
1686*9880d681SAndroid Build Coastguard Worker SDValue SubOp = Node->getOperand(i);
1687*9880d681SAndroid Build Coastguard Worker EVT VVT = SubOp.getNode()->getValueType(0);
1688*9880d681SAndroid Build Coastguard Worker EVT EltVT = VVT.getVectorElementType();
1689*9880d681SAndroid Build Coastguard Worker unsigned NumSubElem = VVT.getVectorNumElements();
1690*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0; j < NumSubElem; ++j) {
1691*9880d681SAndroid Build Coastguard Worker Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, SubOp,
1692*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(j, dl)));
1693*9880d681SAndroid Build Coastguard Worker }
1694*9880d681SAndroid Build Coastguard Worker }
1695*9880d681SAndroid Build Coastguard Worker return DAG.getBuildVector(Node->getValueType(0), dl, Ops);
1696*9880d681SAndroid Build Coastguard Worker }
1697*9880d681SAndroid Build Coastguard Worker
1698*9880d681SAndroid Build Coastguard Worker /// LowerShiftRightParts - Lower SRL_PARTS, SRA_PARTS, which
1699*9880d681SAndroid Build Coastguard Worker /// 1) returns two i32 values and take a 2 x i32 value to shift plus a shift
1700*9880d681SAndroid Build Coastguard Worker /// amount, or
1701*9880d681SAndroid Build Coastguard Worker /// 2) returns two i64 values and take a 2 x i64 value to shift plus a shift
1702*9880d681SAndroid Build Coastguard Worker /// amount.
LowerShiftRightParts(SDValue Op,SelectionDAG & DAG) const1703*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerShiftRightParts(SDValue Op,
1704*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const {
1705*9880d681SAndroid Build Coastguard Worker assert(Op.getNumOperands() == 3 && "Not a double-shift!");
1706*9880d681SAndroid Build Coastguard Worker assert(Op.getOpcode() == ISD::SRA_PARTS || Op.getOpcode() == ISD::SRL_PARTS);
1707*9880d681SAndroid Build Coastguard Worker
1708*9880d681SAndroid Build Coastguard Worker EVT VT = Op.getValueType();
1709*9880d681SAndroid Build Coastguard Worker unsigned VTBits = VT.getSizeInBits();
1710*9880d681SAndroid Build Coastguard Worker SDLoc dl(Op);
1711*9880d681SAndroid Build Coastguard Worker SDValue ShOpLo = Op.getOperand(0);
1712*9880d681SAndroid Build Coastguard Worker SDValue ShOpHi = Op.getOperand(1);
1713*9880d681SAndroid Build Coastguard Worker SDValue ShAmt = Op.getOperand(2);
1714*9880d681SAndroid Build Coastguard Worker unsigned Opc = (Op.getOpcode() == ISD::SRA_PARTS) ? ISD::SRA : ISD::SRL;
1715*9880d681SAndroid Build Coastguard Worker
1716*9880d681SAndroid Build Coastguard Worker if (VTBits == 32 && STI.getSmVersion() >= 35) {
1717*9880d681SAndroid Build Coastguard Worker
1718*9880d681SAndroid Build Coastguard Worker // For 32bit and sm35, we can use the funnel shift 'shf' instruction.
1719*9880d681SAndroid Build Coastguard Worker // {dHi, dLo} = {aHi, aLo} >> Amt
1720*9880d681SAndroid Build Coastguard Worker // dHi = aHi >> Amt
1721*9880d681SAndroid Build Coastguard Worker // dLo = shf.r.clamp aLo, aHi, Amt
1722*9880d681SAndroid Build Coastguard Worker
1723*9880d681SAndroid Build Coastguard Worker SDValue Hi = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
1724*9880d681SAndroid Build Coastguard Worker SDValue Lo = DAG.getNode(NVPTXISD::FUN_SHFR_CLAMP, dl, VT, ShOpLo, ShOpHi,
1725*9880d681SAndroid Build Coastguard Worker ShAmt);
1726*9880d681SAndroid Build Coastguard Worker
1727*9880d681SAndroid Build Coastguard Worker SDValue Ops[2] = { Lo, Hi };
1728*9880d681SAndroid Build Coastguard Worker return DAG.getMergeValues(Ops, dl);
1729*9880d681SAndroid Build Coastguard Worker }
1730*9880d681SAndroid Build Coastguard Worker else {
1731*9880d681SAndroid Build Coastguard Worker
1732*9880d681SAndroid Build Coastguard Worker // {dHi, dLo} = {aHi, aLo} >> Amt
1733*9880d681SAndroid Build Coastguard Worker // - if (Amt>=size) then
1734*9880d681SAndroid Build Coastguard Worker // dLo = aHi >> (Amt-size)
1735*9880d681SAndroid Build Coastguard Worker // dHi = aHi >> Amt (this is either all 0 or all 1)
1736*9880d681SAndroid Build Coastguard Worker // else
1737*9880d681SAndroid Build Coastguard Worker // dLo = (aLo >>logic Amt) | (aHi << (size-Amt))
1738*9880d681SAndroid Build Coastguard Worker // dHi = aHi >> Amt
1739*9880d681SAndroid Build Coastguard Worker
1740*9880d681SAndroid Build Coastguard Worker SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
1741*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32),
1742*9880d681SAndroid Build Coastguard Worker ShAmt);
1743*9880d681SAndroid Build Coastguard Worker SDValue Tmp1 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, ShAmt);
1744*9880d681SAndroid Build Coastguard Worker SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
1745*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32));
1746*9880d681SAndroid Build Coastguard Worker SDValue Tmp2 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, RevShAmt);
1747*9880d681SAndroid Build Coastguard Worker SDValue FalseVal = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
1748*9880d681SAndroid Build Coastguard Worker SDValue TrueVal = DAG.getNode(Opc, dl, VT, ShOpHi, ExtraShAmt);
1749*9880d681SAndroid Build Coastguard Worker
1750*9880d681SAndroid Build Coastguard Worker SDValue Cmp = DAG.getSetCC(dl, MVT::i1, ShAmt,
1751*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32),
1752*9880d681SAndroid Build Coastguard Worker ISD::SETGE);
1753*9880d681SAndroid Build Coastguard Worker SDValue Hi = DAG.getNode(Opc, dl, VT, ShOpHi, ShAmt);
1754*9880d681SAndroid Build Coastguard Worker SDValue Lo = DAG.getNode(ISD::SELECT, dl, VT, Cmp, TrueVal, FalseVal);
1755*9880d681SAndroid Build Coastguard Worker
1756*9880d681SAndroid Build Coastguard Worker SDValue Ops[2] = { Lo, Hi };
1757*9880d681SAndroid Build Coastguard Worker return DAG.getMergeValues(Ops, dl);
1758*9880d681SAndroid Build Coastguard Worker }
1759*9880d681SAndroid Build Coastguard Worker }
1760*9880d681SAndroid Build Coastguard Worker
1761*9880d681SAndroid Build Coastguard Worker /// LowerShiftLeftParts - Lower SHL_PARTS, which
1762*9880d681SAndroid Build Coastguard Worker /// 1) returns two i32 values and take a 2 x i32 value to shift plus a shift
1763*9880d681SAndroid Build Coastguard Worker /// amount, or
1764*9880d681SAndroid Build Coastguard Worker /// 2) returns two i64 values and take a 2 x i64 value to shift plus a shift
1765*9880d681SAndroid Build Coastguard Worker /// amount.
LowerShiftLeftParts(SDValue Op,SelectionDAG & DAG) const1766*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerShiftLeftParts(SDValue Op,
1767*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const {
1768*9880d681SAndroid Build Coastguard Worker assert(Op.getNumOperands() == 3 && "Not a double-shift!");
1769*9880d681SAndroid Build Coastguard Worker assert(Op.getOpcode() == ISD::SHL_PARTS);
1770*9880d681SAndroid Build Coastguard Worker
1771*9880d681SAndroid Build Coastguard Worker EVT VT = Op.getValueType();
1772*9880d681SAndroid Build Coastguard Worker unsigned VTBits = VT.getSizeInBits();
1773*9880d681SAndroid Build Coastguard Worker SDLoc dl(Op);
1774*9880d681SAndroid Build Coastguard Worker SDValue ShOpLo = Op.getOperand(0);
1775*9880d681SAndroid Build Coastguard Worker SDValue ShOpHi = Op.getOperand(1);
1776*9880d681SAndroid Build Coastguard Worker SDValue ShAmt = Op.getOperand(2);
1777*9880d681SAndroid Build Coastguard Worker
1778*9880d681SAndroid Build Coastguard Worker if (VTBits == 32 && STI.getSmVersion() >= 35) {
1779*9880d681SAndroid Build Coastguard Worker
1780*9880d681SAndroid Build Coastguard Worker // For 32bit and sm35, we can use the funnel shift 'shf' instruction.
1781*9880d681SAndroid Build Coastguard Worker // {dHi, dLo} = {aHi, aLo} << Amt
1782*9880d681SAndroid Build Coastguard Worker // dHi = shf.l.clamp aLo, aHi, Amt
1783*9880d681SAndroid Build Coastguard Worker // dLo = aLo << Amt
1784*9880d681SAndroid Build Coastguard Worker
1785*9880d681SAndroid Build Coastguard Worker SDValue Hi = DAG.getNode(NVPTXISD::FUN_SHFL_CLAMP, dl, VT, ShOpLo, ShOpHi,
1786*9880d681SAndroid Build Coastguard Worker ShAmt);
1787*9880d681SAndroid Build Coastguard Worker SDValue Lo = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
1788*9880d681SAndroid Build Coastguard Worker
1789*9880d681SAndroid Build Coastguard Worker SDValue Ops[2] = { Lo, Hi };
1790*9880d681SAndroid Build Coastguard Worker return DAG.getMergeValues(Ops, dl);
1791*9880d681SAndroid Build Coastguard Worker }
1792*9880d681SAndroid Build Coastguard Worker else {
1793*9880d681SAndroid Build Coastguard Worker
1794*9880d681SAndroid Build Coastguard Worker // {dHi, dLo} = {aHi, aLo} << Amt
1795*9880d681SAndroid Build Coastguard Worker // - if (Amt>=size) then
1796*9880d681SAndroid Build Coastguard Worker // dLo = aLo << Amt (all 0)
1797*9880d681SAndroid Build Coastguard Worker // dLo = aLo << (Amt-size)
1798*9880d681SAndroid Build Coastguard Worker // else
1799*9880d681SAndroid Build Coastguard Worker // dLo = aLo << Amt
1800*9880d681SAndroid Build Coastguard Worker // dHi = (aHi << Amt) | (aLo >> (size-Amt))
1801*9880d681SAndroid Build Coastguard Worker
1802*9880d681SAndroid Build Coastguard Worker SDValue RevShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32,
1803*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32),
1804*9880d681SAndroid Build Coastguard Worker ShAmt);
1805*9880d681SAndroid Build Coastguard Worker SDValue Tmp1 = DAG.getNode(ISD::SHL, dl, VT, ShOpHi, ShAmt);
1806*9880d681SAndroid Build Coastguard Worker SDValue ExtraShAmt = DAG.getNode(ISD::SUB, dl, MVT::i32, ShAmt,
1807*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32));
1808*9880d681SAndroid Build Coastguard Worker SDValue Tmp2 = DAG.getNode(ISD::SRL, dl, VT, ShOpLo, RevShAmt);
1809*9880d681SAndroid Build Coastguard Worker SDValue FalseVal = DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
1810*9880d681SAndroid Build Coastguard Worker SDValue TrueVal = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ExtraShAmt);
1811*9880d681SAndroid Build Coastguard Worker
1812*9880d681SAndroid Build Coastguard Worker SDValue Cmp = DAG.getSetCC(dl, MVT::i1, ShAmt,
1813*9880d681SAndroid Build Coastguard Worker DAG.getConstant(VTBits, dl, MVT::i32),
1814*9880d681SAndroid Build Coastguard Worker ISD::SETGE);
1815*9880d681SAndroid Build Coastguard Worker SDValue Lo = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
1816*9880d681SAndroid Build Coastguard Worker SDValue Hi = DAG.getNode(ISD::SELECT, dl, VT, Cmp, TrueVal, FalseVal);
1817*9880d681SAndroid Build Coastguard Worker
1818*9880d681SAndroid Build Coastguard Worker SDValue Ops[2] = { Lo, Hi };
1819*9880d681SAndroid Build Coastguard Worker return DAG.getMergeValues(Ops, dl);
1820*9880d681SAndroid Build Coastguard Worker }
1821*9880d681SAndroid Build Coastguard Worker }
1822*9880d681SAndroid Build Coastguard Worker
1823*9880d681SAndroid Build Coastguard Worker SDValue
LowerOperation(SDValue Op,SelectionDAG & DAG) const1824*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
1825*9880d681SAndroid Build Coastguard Worker switch (Op.getOpcode()) {
1826*9880d681SAndroid Build Coastguard Worker case ISD::RETURNADDR:
1827*9880d681SAndroid Build Coastguard Worker return SDValue();
1828*9880d681SAndroid Build Coastguard Worker case ISD::FRAMEADDR:
1829*9880d681SAndroid Build Coastguard Worker return SDValue();
1830*9880d681SAndroid Build Coastguard Worker case ISD::GlobalAddress:
1831*9880d681SAndroid Build Coastguard Worker return LowerGlobalAddress(Op, DAG);
1832*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
1833*9880d681SAndroid Build Coastguard Worker return Op;
1834*9880d681SAndroid Build Coastguard Worker case ISD::BUILD_VECTOR:
1835*9880d681SAndroid Build Coastguard Worker case ISD::EXTRACT_SUBVECTOR:
1836*9880d681SAndroid Build Coastguard Worker return Op;
1837*9880d681SAndroid Build Coastguard Worker case ISD::CONCAT_VECTORS:
1838*9880d681SAndroid Build Coastguard Worker return LowerCONCAT_VECTORS(Op, DAG);
1839*9880d681SAndroid Build Coastguard Worker case ISD::STORE:
1840*9880d681SAndroid Build Coastguard Worker return LowerSTORE(Op, DAG);
1841*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
1842*9880d681SAndroid Build Coastguard Worker return LowerLOAD(Op, DAG);
1843*9880d681SAndroid Build Coastguard Worker case ISD::SHL_PARTS:
1844*9880d681SAndroid Build Coastguard Worker return LowerShiftLeftParts(Op, DAG);
1845*9880d681SAndroid Build Coastguard Worker case ISD::SRA_PARTS:
1846*9880d681SAndroid Build Coastguard Worker case ISD::SRL_PARTS:
1847*9880d681SAndroid Build Coastguard Worker return LowerShiftRightParts(Op, DAG);
1848*9880d681SAndroid Build Coastguard Worker case ISD::SELECT:
1849*9880d681SAndroid Build Coastguard Worker return LowerSelect(Op, DAG);
1850*9880d681SAndroid Build Coastguard Worker default:
1851*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Custom lowering not defined for operation");
1852*9880d681SAndroid Build Coastguard Worker }
1853*9880d681SAndroid Build Coastguard Worker }
1854*9880d681SAndroid Build Coastguard Worker
LowerSelect(SDValue Op,SelectionDAG & DAG) const1855*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerSelect(SDValue Op, SelectionDAG &DAG) const {
1856*9880d681SAndroid Build Coastguard Worker SDValue Op0 = Op->getOperand(0);
1857*9880d681SAndroid Build Coastguard Worker SDValue Op1 = Op->getOperand(1);
1858*9880d681SAndroid Build Coastguard Worker SDValue Op2 = Op->getOperand(2);
1859*9880d681SAndroid Build Coastguard Worker SDLoc DL(Op.getNode());
1860*9880d681SAndroid Build Coastguard Worker
1861*9880d681SAndroid Build Coastguard Worker assert(Op.getValueType() == MVT::i1 && "Custom lowering enabled only for i1");
1862*9880d681SAndroid Build Coastguard Worker
1863*9880d681SAndroid Build Coastguard Worker Op1 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Op1);
1864*9880d681SAndroid Build Coastguard Worker Op2 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Op2);
1865*9880d681SAndroid Build Coastguard Worker SDValue Select = DAG.getNode(ISD::SELECT, DL, MVT::i32, Op0, Op1, Op2);
1866*9880d681SAndroid Build Coastguard Worker SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, Select);
1867*9880d681SAndroid Build Coastguard Worker
1868*9880d681SAndroid Build Coastguard Worker return Trunc;
1869*9880d681SAndroid Build Coastguard Worker }
1870*9880d681SAndroid Build Coastguard Worker
LowerLOAD(SDValue Op,SelectionDAG & DAG) const1871*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1872*9880d681SAndroid Build Coastguard Worker if (Op.getValueType() == MVT::i1)
1873*9880d681SAndroid Build Coastguard Worker return LowerLOADi1(Op, DAG);
1874*9880d681SAndroid Build Coastguard Worker else
1875*9880d681SAndroid Build Coastguard Worker return SDValue();
1876*9880d681SAndroid Build Coastguard Worker }
1877*9880d681SAndroid Build Coastguard Worker
1878*9880d681SAndroid Build Coastguard Worker // v = ld i1* addr
1879*9880d681SAndroid Build Coastguard Worker // =>
1880*9880d681SAndroid Build Coastguard Worker // v1 = ld i8* addr (-> i16)
1881*9880d681SAndroid Build Coastguard Worker // v = trunc i16 to i1
LowerLOADi1(SDValue Op,SelectionDAG & DAG) const1882*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerLOADi1(SDValue Op, SelectionDAG &DAG) const {
1883*9880d681SAndroid Build Coastguard Worker SDNode *Node = Op.getNode();
1884*9880d681SAndroid Build Coastguard Worker LoadSDNode *LD = cast<LoadSDNode>(Node);
1885*9880d681SAndroid Build Coastguard Worker SDLoc dl(Node);
1886*9880d681SAndroid Build Coastguard Worker assert(LD->getExtensionType() == ISD::NON_EXTLOAD);
1887*9880d681SAndroid Build Coastguard Worker assert(Node->getValueType(0) == MVT::i1 &&
1888*9880d681SAndroid Build Coastguard Worker "Custom lowering for i1 load only");
1889*9880d681SAndroid Build Coastguard Worker SDValue newLD =
1890*9880d681SAndroid Build Coastguard Worker DAG.getLoad(MVT::i16, dl, LD->getChain(), LD->getBasePtr(),
1891*9880d681SAndroid Build Coastguard Worker LD->getPointerInfo(), LD->isVolatile(), LD->isNonTemporal(),
1892*9880d681SAndroid Build Coastguard Worker LD->isInvariant(), LD->getAlignment());
1893*9880d681SAndroid Build Coastguard Worker SDValue result = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, newLD);
1894*9880d681SAndroid Build Coastguard Worker // The legalizer (the caller) is expecting two values from the legalized
1895*9880d681SAndroid Build Coastguard Worker // load, so we build a MergeValues node for it. See ExpandUnalignedLoad()
1896*9880d681SAndroid Build Coastguard Worker // in LegalizeDAG.cpp which also uses MergeValues.
1897*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { result, LD->getChain() };
1898*9880d681SAndroid Build Coastguard Worker return DAG.getMergeValues(Ops, dl);
1899*9880d681SAndroid Build Coastguard Worker }
1900*9880d681SAndroid Build Coastguard Worker
LowerSTORE(SDValue Op,SelectionDAG & DAG) const1901*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1902*9880d681SAndroid Build Coastguard Worker EVT ValVT = Op.getOperand(1).getValueType();
1903*9880d681SAndroid Build Coastguard Worker if (ValVT == MVT::i1)
1904*9880d681SAndroid Build Coastguard Worker return LowerSTOREi1(Op, DAG);
1905*9880d681SAndroid Build Coastguard Worker else if (ValVT.isVector())
1906*9880d681SAndroid Build Coastguard Worker return LowerSTOREVector(Op, DAG);
1907*9880d681SAndroid Build Coastguard Worker else
1908*9880d681SAndroid Build Coastguard Worker return SDValue();
1909*9880d681SAndroid Build Coastguard Worker }
1910*9880d681SAndroid Build Coastguard Worker
1911*9880d681SAndroid Build Coastguard Worker SDValue
LowerSTOREVector(SDValue Op,SelectionDAG & DAG) const1912*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const {
1913*9880d681SAndroid Build Coastguard Worker SDNode *N = Op.getNode();
1914*9880d681SAndroid Build Coastguard Worker SDValue Val = N->getOperand(1);
1915*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
1916*9880d681SAndroid Build Coastguard Worker EVT ValVT = Val.getValueType();
1917*9880d681SAndroid Build Coastguard Worker
1918*9880d681SAndroid Build Coastguard Worker if (ValVT.isVector()) {
1919*9880d681SAndroid Build Coastguard Worker // We only handle "native" vector sizes for now, e.g. <4 x double> is not
1920*9880d681SAndroid Build Coastguard Worker // legal. We can (and should) split that into 2 stores of <2 x double> here
1921*9880d681SAndroid Build Coastguard Worker // but I'm leaving that as a TODO for now.
1922*9880d681SAndroid Build Coastguard Worker if (!ValVT.isSimple())
1923*9880d681SAndroid Build Coastguard Worker return SDValue();
1924*9880d681SAndroid Build Coastguard Worker switch (ValVT.getSimpleVT().SimpleTy) {
1925*9880d681SAndroid Build Coastguard Worker default:
1926*9880d681SAndroid Build Coastguard Worker return SDValue();
1927*9880d681SAndroid Build Coastguard Worker case MVT::v2i8:
1928*9880d681SAndroid Build Coastguard Worker case MVT::v2i16:
1929*9880d681SAndroid Build Coastguard Worker case MVT::v2i32:
1930*9880d681SAndroid Build Coastguard Worker case MVT::v2i64:
1931*9880d681SAndroid Build Coastguard Worker case MVT::v2f32:
1932*9880d681SAndroid Build Coastguard Worker case MVT::v2f64:
1933*9880d681SAndroid Build Coastguard Worker case MVT::v4i8:
1934*9880d681SAndroid Build Coastguard Worker case MVT::v4i16:
1935*9880d681SAndroid Build Coastguard Worker case MVT::v4i32:
1936*9880d681SAndroid Build Coastguard Worker case MVT::v4f32:
1937*9880d681SAndroid Build Coastguard Worker // This is a "native" vector type
1938*9880d681SAndroid Build Coastguard Worker break;
1939*9880d681SAndroid Build Coastguard Worker }
1940*9880d681SAndroid Build Coastguard Worker
1941*9880d681SAndroid Build Coastguard Worker MemSDNode *MemSD = cast<MemSDNode>(N);
1942*9880d681SAndroid Build Coastguard Worker const DataLayout &TD = DAG.getDataLayout();
1943*9880d681SAndroid Build Coastguard Worker
1944*9880d681SAndroid Build Coastguard Worker unsigned Align = MemSD->getAlignment();
1945*9880d681SAndroid Build Coastguard Worker unsigned PrefAlign =
1946*9880d681SAndroid Build Coastguard Worker TD.getPrefTypeAlignment(ValVT.getTypeForEVT(*DAG.getContext()));
1947*9880d681SAndroid Build Coastguard Worker if (Align < PrefAlign) {
1948*9880d681SAndroid Build Coastguard Worker // This store is not sufficiently aligned, so bail out and let this vector
1949*9880d681SAndroid Build Coastguard Worker // store be scalarized. Note that we may still be able to emit smaller
1950*9880d681SAndroid Build Coastguard Worker // vector stores. For example, if we are storing a <4 x float> with an
1951*9880d681SAndroid Build Coastguard Worker // alignment of 8, this check will fail but the legalizer will try again
1952*9880d681SAndroid Build Coastguard Worker // with 2 x <2 x float>, which will succeed with an alignment of 8.
1953*9880d681SAndroid Build Coastguard Worker return SDValue();
1954*9880d681SAndroid Build Coastguard Worker }
1955*9880d681SAndroid Build Coastguard Worker
1956*9880d681SAndroid Build Coastguard Worker unsigned Opcode = 0;
1957*9880d681SAndroid Build Coastguard Worker EVT EltVT = ValVT.getVectorElementType();
1958*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ValVT.getVectorNumElements();
1959*9880d681SAndroid Build Coastguard Worker
1960*9880d681SAndroid Build Coastguard Worker // Since StoreV2 is a target node, we cannot rely on DAG type legalization.
1961*9880d681SAndroid Build Coastguard Worker // Therefore, we must ensure the type is legal. For i1 and i8, we set the
1962*9880d681SAndroid Build Coastguard Worker // stored type to i16 and propagate the "real" type as the memory type.
1963*9880d681SAndroid Build Coastguard Worker bool NeedExt = false;
1964*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() < 16)
1965*9880d681SAndroid Build Coastguard Worker NeedExt = true;
1966*9880d681SAndroid Build Coastguard Worker
1967*9880d681SAndroid Build Coastguard Worker switch (NumElts) {
1968*9880d681SAndroid Build Coastguard Worker default:
1969*9880d681SAndroid Build Coastguard Worker return SDValue();
1970*9880d681SAndroid Build Coastguard Worker case 2:
1971*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::StoreV2;
1972*9880d681SAndroid Build Coastguard Worker break;
1973*9880d681SAndroid Build Coastguard Worker case 4: {
1974*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::StoreV4;
1975*9880d681SAndroid Build Coastguard Worker break;
1976*9880d681SAndroid Build Coastguard Worker }
1977*9880d681SAndroid Build Coastguard Worker }
1978*9880d681SAndroid Build Coastguard Worker
1979*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
1980*9880d681SAndroid Build Coastguard Worker
1981*9880d681SAndroid Build Coastguard Worker // First is the chain
1982*9880d681SAndroid Build Coastguard Worker Ops.push_back(N->getOperand(0));
1983*9880d681SAndroid Build Coastguard Worker
1984*9880d681SAndroid Build Coastguard Worker // Then the split values
1985*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; ++i) {
1986*9880d681SAndroid Build Coastguard Worker SDValue ExtVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Val,
1987*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(i, DL));
1988*9880d681SAndroid Build Coastguard Worker if (NeedExt)
1989*9880d681SAndroid Build Coastguard Worker ExtVal = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i16, ExtVal);
1990*9880d681SAndroid Build Coastguard Worker Ops.push_back(ExtVal);
1991*9880d681SAndroid Build Coastguard Worker }
1992*9880d681SAndroid Build Coastguard Worker
1993*9880d681SAndroid Build Coastguard Worker // Then any remaining arguments
1994*9880d681SAndroid Build Coastguard Worker Ops.append(N->op_begin() + 2, N->op_end());
1995*9880d681SAndroid Build Coastguard Worker
1996*9880d681SAndroid Build Coastguard Worker SDValue NewSt = DAG.getMemIntrinsicNode(
1997*9880d681SAndroid Build Coastguard Worker Opcode, DL, DAG.getVTList(MVT::Other), Ops,
1998*9880d681SAndroid Build Coastguard Worker MemSD->getMemoryVT(), MemSD->getMemOperand());
1999*9880d681SAndroid Build Coastguard Worker
2000*9880d681SAndroid Build Coastguard Worker //return DCI.CombineTo(N, NewSt, true);
2001*9880d681SAndroid Build Coastguard Worker return NewSt;
2002*9880d681SAndroid Build Coastguard Worker }
2003*9880d681SAndroid Build Coastguard Worker
2004*9880d681SAndroid Build Coastguard Worker return SDValue();
2005*9880d681SAndroid Build Coastguard Worker }
2006*9880d681SAndroid Build Coastguard Worker
2007*9880d681SAndroid Build Coastguard Worker // st i1 v, addr
2008*9880d681SAndroid Build Coastguard Worker // =>
2009*9880d681SAndroid Build Coastguard Worker // v1 = zxt v to i16
2010*9880d681SAndroid Build Coastguard Worker // st.u8 i16, addr
LowerSTOREi1(SDValue Op,SelectionDAG & DAG) const2011*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const {
2012*9880d681SAndroid Build Coastguard Worker SDNode *Node = Op.getNode();
2013*9880d681SAndroid Build Coastguard Worker SDLoc dl(Node);
2014*9880d681SAndroid Build Coastguard Worker StoreSDNode *ST = cast<StoreSDNode>(Node);
2015*9880d681SAndroid Build Coastguard Worker SDValue Tmp1 = ST->getChain();
2016*9880d681SAndroid Build Coastguard Worker SDValue Tmp2 = ST->getBasePtr();
2017*9880d681SAndroid Build Coastguard Worker SDValue Tmp3 = ST->getValue();
2018*9880d681SAndroid Build Coastguard Worker assert(Tmp3.getValueType() == MVT::i1 && "Custom lowering for i1 store only");
2019*9880d681SAndroid Build Coastguard Worker unsigned Alignment = ST->getAlignment();
2020*9880d681SAndroid Build Coastguard Worker bool isVolatile = ST->isVolatile();
2021*9880d681SAndroid Build Coastguard Worker bool isNonTemporal = ST->isNonTemporal();
2022*9880d681SAndroid Build Coastguard Worker Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Tmp3);
2023*9880d681SAndroid Build Coastguard Worker SDValue Result = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2,
2024*9880d681SAndroid Build Coastguard Worker ST->getPointerInfo(), MVT::i8, isNonTemporal,
2025*9880d681SAndroid Build Coastguard Worker isVolatile, Alignment);
2026*9880d681SAndroid Build Coastguard Worker return Result;
2027*9880d681SAndroid Build Coastguard Worker }
2028*9880d681SAndroid Build Coastguard Worker
2029*9880d681SAndroid Build Coastguard Worker SDValue
getParamSymbol(SelectionDAG & DAG,int idx,EVT v) const2030*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::getParamSymbol(SelectionDAG &DAG, int idx, EVT v) const {
2031*9880d681SAndroid Build Coastguard Worker std::string ParamSym;
2032*9880d681SAndroid Build Coastguard Worker raw_string_ostream ParamStr(ParamSym);
2033*9880d681SAndroid Build Coastguard Worker
2034*9880d681SAndroid Build Coastguard Worker ParamStr << DAG.getMachineFunction().getName() << "_param_" << idx;
2035*9880d681SAndroid Build Coastguard Worker ParamStr.flush();
2036*9880d681SAndroid Build Coastguard Worker
2037*9880d681SAndroid Build Coastguard Worker std::string *SavedStr =
2038*9880d681SAndroid Build Coastguard Worker nvTM->getManagedStrPool()->getManagedString(ParamSym.c_str());
2039*9880d681SAndroid Build Coastguard Worker return DAG.getTargetExternalSymbol(SavedStr->c_str(), v);
2040*9880d681SAndroid Build Coastguard Worker }
2041*9880d681SAndroid Build Coastguard Worker
2042*9880d681SAndroid Build Coastguard Worker // Check to see if the kernel argument is image*_t or sampler_t
2043*9880d681SAndroid Build Coastguard Worker
isImageOrSamplerVal(const Value * arg,const Module * context)2044*9880d681SAndroid Build Coastguard Worker static bool isImageOrSamplerVal(const Value *arg, const Module *context) {
2045*9880d681SAndroid Build Coastguard Worker static const char *const specialTypes[] = { "struct._image2d_t",
2046*9880d681SAndroid Build Coastguard Worker "struct._image3d_t",
2047*9880d681SAndroid Build Coastguard Worker "struct._sampler_t" };
2048*9880d681SAndroid Build Coastguard Worker
2049*9880d681SAndroid Build Coastguard Worker Type *Ty = arg->getType();
2050*9880d681SAndroid Build Coastguard Worker auto *PTy = dyn_cast<PointerType>(Ty);
2051*9880d681SAndroid Build Coastguard Worker
2052*9880d681SAndroid Build Coastguard Worker if (!PTy)
2053*9880d681SAndroid Build Coastguard Worker return false;
2054*9880d681SAndroid Build Coastguard Worker
2055*9880d681SAndroid Build Coastguard Worker if (!context)
2056*9880d681SAndroid Build Coastguard Worker return false;
2057*9880d681SAndroid Build Coastguard Worker
2058*9880d681SAndroid Build Coastguard Worker auto *STy = dyn_cast<StructType>(PTy->getElementType());
2059*9880d681SAndroid Build Coastguard Worker if (!STy || STy->isLiteral())
2060*9880d681SAndroid Build Coastguard Worker return false;
2061*9880d681SAndroid Build Coastguard Worker
2062*9880d681SAndroid Build Coastguard Worker return std::find(std::begin(specialTypes), std::end(specialTypes),
2063*9880d681SAndroid Build Coastguard Worker STy->getName()) != std::end(specialTypes);
2064*9880d681SAndroid Build Coastguard Worker }
2065*9880d681SAndroid Build Coastguard Worker
LowerFormalArguments(SDValue Chain,CallingConv::ID CallConv,bool isVarArg,const SmallVectorImpl<ISD::InputArg> & Ins,const SDLoc & dl,SelectionDAG & DAG,SmallVectorImpl<SDValue> & InVals) const2066*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::LowerFormalArguments(
2067*9880d681SAndroid Build Coastguard Worker SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
2068*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
2069*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
2070*9880d681SAndroid Build Coastguard Worker MachineFunction &MF = DAG.getMachineFunction();
2071*9880d681SAndroid Build Coastguard Worker const DataLayout &DL = DAG.getDataLayout();
2072*9880d681SAndroid Build Coastguard Worker auto PtrVT = getPointerTy(DAG.getDataLayout());
2073*9880d681SAndroid Build Coastguard Worker
2074*9880d681SAndroid Build Coastguard Worker const Function *F = MF.getFunction();
2075*9880d681SAndroid Build Coastguard Worker const AttributeSet &PAL = F->getAttributes();
2076*9880d681SAndroid Build Coastguard Worker const TargetLowering *TLI = STI.getTargetLowering();
2077*9880d681SAndroid Build Coastguard Worker
2078*9880d681SAndroid Build Coastguard Worker SDValue Root = DAG.getRoot();
2079*9880d681SAndroid Build Coastguard Worker std::vector<SDValue> OutChains;
2080*9880d681SAndroid Build Coastguard Worker
2081*9880d681SAndroid Build Coastguard Worker bool isKernel = llvm::isKernelFunction(*F);
2082*9880d681SAndroid Build Coastguard Worker bool isABI = (STI.getSmVersion() >= 20);
2083*9880d681SAndroid Build Coastguard Worker assert(isABI && "Non-ABI compilation is not supported");
2084*9880d681SAndroid Build Coastguard Worker if (!isABI)
2085*9880d681SAndroid Build Coastguard Worker return Chain;
2086*9880d681SAndroid Build Coastguard Worker
2087*9880d681SAndroid Build Coastguard Worker std::vector<Type *> argTypes;
2088*9880d681SAndroid Build Coastguard Worker std::vector<const Argument *> theArgs;
2089*9880d681SAndroid Build Coastguard Worker for (const Argument &I : F->args()) {
2090*9880d681SAndroid Build Coastguard Worker theArgs.push_back(&I);
2091*9880d681SAndroid Build Coastguard Worker argTypes.push_back(I.getType());
2092*9880d681SAndroid Build Coastguard Worker }
2093*9880d681SAndroid Build Coastguard Worker // argTypes.size() (or theArgs.size()) and Ins.size() need not match.
2094*9880d681SAndroid Build Coastguard Worker // Ins.size() will be larger
2095*9880d681SAndroid Build Coastguard Worker // * if there is an aggregate argument with multiple fields (each field
2096*9880d681SAndroid Build Coastguard Worker // showing up separately in Ins)
2097*9880d681SAndroid Build Coastguard Worker // * if there is a vector argument with more than typical vector-length
2098*9880d681SAndroid Build Coastguard Worker // elements (generally if more than 4) where each vector element is
2099*9880d681SAndroid Build Coastguard Worker // individually present in Ins.
2100*9880d681SAndroid Build Coastguard Worker // So a different index should be used for indexing into Ins.
2101*9880d681SAndroid Build Coastguard Worker // See similar issue in LowerCall.
2102*9880d681SAndroid Build Coastguard Worker unsigned InsIdx = 0;
2103*9880d681SAndroid Build Coastguard Worker
2104*9880d681SAndroid Build Coastguard Worker int idx = 0;
2105*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = theArgs.size(); i != e; ++i, ++idx, ++InsIdx) {
2106*9880d681SAndroid Build Coastguard Worker Type *Ty = argTypes[i];
2107*9880d681SAndroid Build Coastguard Worker
2108*9880d681SAndroid Build Coastguard Worker // If the kernel argument is image*_t or sampler_t, convert it to
2109*9880d681SAndroid Build Coastguard Worker // a i32 constant holding the parameter position. This can later
2110*9880d681SAndroid Build Coastguard Worker // matched in the AsmPrinter to output the correct mangled name.
2111*9880d681SAndroid Build Coastguard Worker if (isImageOrSamplerVal(
2112*9880d681SAndroid Build Coastguard Worker theArgs[i],
2113*9880d681SAndroid Build Coastguard Worker (theArgs[i]->getParent() ? theArgs[i]->getParent()->getParent()
2114*9880d681SAndroid Build Coastguard Worker : nullptr))) {
2115*9880d681SAndroid Build Coastguard Worker assert(isKernel && "Only kernels can have image/sampler params");
2116*9880d681SAndroid Build Coastguard Worker InVals.push_back(DAG.getConstant(i + 1, dl, MVT::i32));
2117*9880d681SAndroid Build Coastguard Worker continue;
2118*9880d681SAndroid Build Coastguard Worker }
2119*9880d681SAndroid Build Coastguard Worker
2120*9880d681SAndroid Build Coastguard Worker if (theArgs[i]->use_empty()) {
2121*9880d681SAndroid Build Coastguard Worker // argument is dead
2122*9880d681SAndroid Build Coastguard Worker if (Ty->isAggregateType()) {
2123*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> vtparts;
2124*9880d681SAndroid Build Coastguard Worker
2125*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), Ty, vtparts);
2126*9880d681SAndroid Build Coastguard Worker assert(vtparts.size() > 0 && "empty aggregate type not expected");
2127*9880d681SAndroid Build Coastguard Worker for (unsigned parti = 0, parte = vtparts.size(); parti != parte;
2128*9880d681SAndroid Build Coastguard Worker ++parti) {
2129*9880d681SAndroid Build Coastguard Worker InVals.push_back(DAG.getNode(ISD::UNDEF, dl, Ins[InsIdx].VT));
2130*9880d681SAndroid Build Coastguard Worker ++InsIdx;
2131*9880d681SAndroid Build Coastguard Worker }
2132*9880d681SAndroid Build Coastguard Worker if (vtparts.size() > 0)
2133*9880d681SAndroid Build Coastguard Worker --InsIdx;
2134*9880d681SAndroid Build Coastguard Worker continue;
2135*9880d681SAndroid Build Coastguard Worker }
2136*9880d681SAndroid Build Coastguard Worker if (Ty->isVectorTy()) {
2137*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, Ty);
2138*9880d681SAndroid Build Coastguard Worker unsigned NumRegs = TLI->getNumRegisters(F->getContext(), ObjectVT);
2139*9880d681SAndroid Build Coastguard Worker for (unsigned parti = 0; parti < NumRegs; ++parti) {
2140*9880d681SAndroid Build Coastguard Worker InVals.push_back(DAG.getNode(ISD::UNDEF, dl, Ins[InsIdx].VT));
2141*9880d681SAndroid Build Coastguard Worker ++InsIdx;
2142*9880d681SAndroid Build Coastguard Worker }
2143*9880d681SAndroid Build Coastguard Worker if (NumRegs > 0)
2144*9880d681SAndroid Build Coastguard Worker --InsIdx;
2145*9880d681SAndroid Build Coastguard Worker continue;
2146*9880d681SAndroid Build Coastguard Worker }
2147*9880d681SAndroid Build Coastguard Worker InVals.push_back(DAG.getNode(ISD::UNDEF, dl, Ins[InsIdx].VT));
2148*9880d681SAndroid Build Coastguard Worker continue;
2149*9880d681SAndroid Build Coastguard Worker }
2150*9880d681SAndroid Build Coastguard Worker
2151*9880d681SAndroid Build Coastguard Worker // In the following cases, assign a node order of "idx+1"
2152*9880d681SAndroid Build Coastguard Worker // to newly created nodes. The SDNodes for params have to
2153*9880d681SAndroid Build Coastguard Worker // appear in the same order as their order of appearance
2154*9880d681SAndroid Build Coastguard Worker // in the original function. "idx+1" holds that order.
2155*9880d681SAndroid Build Coastguard Worker if (!PAL.hasAttribute(i + 1, Attribute::ByVal)) {
2156*9880d681SAndroid Build Coastguard Worker if (Ty->isAggregateType()) {
2157*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> vtparts;
2158*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> offsets;
2159*9880d681SAndroid Build Coastguard Worker
2160*9880d681SAndroid Build Coastguard Worker // NOTE: Here, we lose the ability to issue vector loads for vectors
2161*9880d681SAndroid Build Coastguard Worker // that are a part of a struct. This should be investigated in the
2162*9880d681SAndroid Build Coastguard Worker // future.
2163*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), Ty, vtparts, &offsets,
2164*9880d681SAndroid Build Coastguard Worker 0);
2165*9880d681SAndroid Build Coastguard Worker assert(vtparts.size() > 0 && "empty aggregate type not expected");
2166*9880d681SAndroid Build Coastguard Worker bool aggregateIsPacked = false;
2167*9880d681SAndroid Build Coastguard Worker if (StructType *STy = llvm::dyn_cast<StructType>(Ty))
2168*9880d681SAndroid Build Coastguard Worker aggregateIsPacked = STy->isPacked();
2169*9880d681SAndroid Build Coastguard Worker
2170*9880d681SAndroid Build Coastguard Worker SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2171*9880d681SAndroid Build Coastguard Worker for (unsigned parti = 0, parte = vtparts.size(); parti != parte;
2172*9880d681SAndroid Build Coastguard Worker ++parti) {
2173*9880d681SAndroid Build Coastguard Worker EVT partVT = vtparts[parti];
2174*9880d681SAndroid Build Coastguard Worker Value *srcValue = Constant::getNullValue(
2175*9880d681SAndroid Build Coastguard Worker PointerType::get(partVT.getTypeForEVT(F->getContext()),
2176*9880d681SAndroid Build Coastguard Worker llvm::ADDRESS_SPACE_PARAM));
2177*9880d681SAndroid Build Coastguard Worker SDValue srcAddr =
2178*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ADD, dl, PtrVT, Arg,
2179*9880d681SAndroid Build Coastguard Worker DAG.getConstant(offsets[parti], dl, PtrVT));
2180*9880d681SAndroid Build Coastguard Worker unsigned partAlign = aggregateIsPacked
2181*9880d681SAndroid Build Coastguard Worker ? 1
2182*9880d681SAndroid Build Coastguard Worker : DL.getABITypeAlignment(
2183*9880d681SAndroid Build Coastguard Worker partVT.getTypeForEVT(F->getContext()));
2184*9880d681SAndroid Build Coastguard Worker SDValue p;
2185*9880d681SAndroid Build Coastguard Worker if (Ins[InsIdx].VT.getSizeInBits() > partVT.getSizeInBits()) {
2186*9880d681SAndroid Build Coastguard Worker ISD::LoadExtType ExtOp = Ins[InsIdx].Flags.isSExt() ?
2187*9880d681SAndroid Build Coastguard Worker ISD::SEXTLOAD : ISD::ZEXTLOAD;
2188*9880d681SAndroid Build Coastguard Worker p = DAG.getExtLoad(ExtOp, dl, Ins[InsIdx].VT, Root, srcAddr,
2189*9880d681SAndroid Build Coastguard Worker MachinePointerInfo(srcValue), partVT, false,
2190*9880d681SAndroid Build Coastguard Worker false, false, partAlign);
2191*9880d681SAndroid Build Coastguard Worker } else {
2192*9880d681SAndroid Build Coastguard Worker p = DAG.getLoad(partVT, dl, Root, srcAddr,
2193*9880d681SAndroid Build Coastguard Worker MachinePointerInfo(srcValue), false, false, false,
2194*9880d681SAndroid Build Coastguard Worker partAlign);
2195*9880d681SAndroid Build Coastguard Worker }
2196*9880d681SAndroid Build Coastguard Worker if (p.getNode())
2197*9880d681SAndroid Build Coastguard Worker p.getNode()->setIROrder(idx + 1);
2198*9880d681SAndroid Build Coastguard Worker InVals.push_back(p);
2199*9880d681SAndroid Build Coastguard Worker ++InsIdx;
2200*9880d681SAndroid Build Coastguard Worker }
2201*9880d681SAndroid Build Coastguard Worker if (vtparts.size() > 0)
2202*9880d681SAndroid Build Coastguard Worker --InsIdx;
2203*9880d681SAndroid Build Coastguard Worker continue;
2204*9880d681SAndroid Build Coastguard Worker }
2205*9880d681SAndroid Build Coastguard Worker if (Ty->isVectorTy()) {
2206*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, Ty);
2207*9880d681SAndroid Build Coastguard Worker SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2208*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ObjectVT.getVectorNumElements();
2209*9880d681SAndroid Build Coastguard Worker assert(TLI->getNumRegisters(F->getContext(), ObjectVT) == NumElts &&
2210*9880d681SAndroid Build Coastguard Worker "Vector was not scalarized");
2211*9880d681SAndroid Build Coastguard Worker EVT EltVT = ObjectVT.getVectorElementType();
2212*9880d681SAndroid Build Coastguard Worker
2213*9880d681SAndroid Build Coastguard Worker // V1 load
2214*9880d681SAndroid Build Coastguard Worker // f32 = load ...
2215*9880d681SAndroid Build Coastguard Worker if (NumElts == 1) {
2216*9880d681SAndroid Build Coastguard Worker // We only have one element, so just directly load it
2217*9880d681SAndroid Build Coastguard Worker Value *SrcValue = Constant::getNullValue(PointerType::get(
2218*9880d681SAndroid Build Coastguard Worker EltVT.getTypeForEVT(F->getContext()), llvm::ADDRESS_SPACE_PARAM));
2219*9880d681SAndroid Build Coastguard Worker SDValue P = DAG.getLoad(
2220*9880d681SAndroid Build Coastguard Worker EltVT, dl, Root, Arg, MachinePointerInfo(SrcValue), false, false,
2221*9880d681SAndroid Build Coastguard Worker true,
2222*9880d681SAndroid Build Coastguard Worker DL.getABITypeAlignment(EltVT.getTypeForEVT(F->getContext())));
2223*9880d681SAndroid Build Coastguard Worker if (P.getNode())
2224*9880d681SAndroid Build Coastguard Worker P.getNode()->setIROrder(idx + 1);
2225*9880d681SAndroid Build Coastguard Worker
2226*9880d681SAndroid Build Coastguard Worker if (Ins[InsIdx].VT.getSizeInBits() > EltVT.getSizeInBits())
2227*9880d681SAndroid Build Coastguard Worker P = DAG.getNode(ISD::ANY_EXTEND, dl, Ins[InsIdx].VT, P);
2228*9880d681SAndroid Build Coastguard Worker InVals.push_back(P);
2229*9880d681SAndroid Build Coastguard Worker ++InsIdx;
2230*9880d681SAndroid Build Coastguard Worker } else if (NumElts == 2) {
2231*9880d681SAndroid Build Coastguard Worker // V2 load
2232*9880d681SAndroid Build Coastguard Worker // f32,f32 = load ...
2233*9880d681SAndroid Build Coastguard Worker EVT VecVT = EVT::getVectorVT(F->getContext(), EltVT, 2);
2234*9880d681SAndroid Build Coastguard Worker Value *SrcValue = Constant::getNullValue(PointerType::get(
2235*9880d681SAndroid Build Coastguard Worker VecVT.getTypeForEVT(F->getContext()), llvm::ADDRESS_SPACE_PARAM));
2236*9880d681SAndroid Build Coastguard Worker SDValue P = DAG.getLoad(
2237*9880d681SAndroid Build Coastguard Worker VecVT, dl, Root, Arg, MachinePointerInfo(SrcValue), false, false,
2238*9880d681SAndroid Build Coastguard Worker true,
2239*9880d681SAndroid Build Coastguard Worker DL.getABITypeAlignment(VecVT.getTypeForEVT(F->getContext())));
2240*9880d681SAndroid Build Coastguard Worker if (P.getNode())
2241*9880d681SAndroid Build Coastguard Worker P.getNode()->setIROrder(idx + 1);
2242*9880d681SAndroid Build Coastguard Worker
2243*9880d681SAndroid Build Coastguard Worker SDValue Elt0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, P,
2244*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(0, dl));
2245*9880d681SAndroid Build Coastguard Worker SDValue Elt1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, P,
2246*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(1, dl));
2247*9880d681SAndroid Build Coastguard Worker
2248*9880d681SAndroid Build Coastguard Worker if (Ins[InsIdx].VT.getSizeInBits() > EltVT.getSizeInBits()) {
2249*9880d681SAndroid Build Coastguard Worker Elt0 = DAG.getNode(ISD::ANY_EXTEND, dl, Ins[InsIdx].VT, Elt0);
2250*9880d681SAndroid Build Coastguard Worker Elt1 = DAG.getNode(ISD::ANY_EXTEND, dl, Ins[InsIdx].VT, Elt1);
2251*9880d681SAndroid Build Coastguard Worker }
2252*9880d681SAndroid Build Coastguard Worker
2253*9880d681SAndroid Build Coastguard Worker InVals.push_back(Elt0);
2254*9880d681SAndroid Build Coastguard Worker InVals.push_back(Elt1);
2255*9880d681SAndroid Build Coastguard Worker InsIdx += 2;
2256*9880d681SAndroid Build Coastguard Worker } else {
2257*9880d681SAndroid Build Coastguard Worker // V4 loads
2258*9880d681SAndroid Build Coastguard Worker // We have at least 4 elements (<3 x Ty> expands to 4 elements) and
2259*9880d681SAndroid Build Coastguard Worker // the
2260*9880d681SAndroid Build Coastguard Worker // vector will be expanded to a power of 2 elements, so we know we can
2261*9880d681SAndroid Build Coastguard Worker // always round up to the next multiple of 4 when creating the vector
2262*9880d681SAndroid Build Coastguard Worker // loads.
2263*9880d681SAndroid Build Coastguard Worker // e.g. 4 elem => 1 ld.v4
2264*9880d681SAndroid Build Coastguard Worker // 6 elem => 2 ld.v4
2265*9880d681SAndroid Build Coastguard Worker // 8 elem => 2 ld.v4
2266*9880d681SAndroid Build Coastguard Worker // 11 elem => 3 ld.v4
2267*9880d681SAndroid Build Coastguard Worker unsigned VecSize = 4;
2268*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() == 64) {
2269*9880d681SAndroid Build Coastguard Worker VecSize = 2;
2270*9880d681SAndroid Build Coastguard Worker }
2271*9880d681SAndroid Build Coastguard Worker EVT VecVT = EVT::getVectorVT(F->getContext(), EltVT, VecSize);
2272*9880d681SAndroid Build Coastguard Worker unsigned Ofst = 0;
2273*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; i += VecSize) {
2274*9880d681SAndroid Build Coastguard Worker Value *SrcValue = Constant::getNullValue(
2275*9880d681SAndroid Build Coastguard Worker PointerType::get(VecVT.getTypeForEVT(F->getContext()),
2276*9880d681SAndroid Build Coastguard Worker llvm::ADDRESS_SPACE_PARAM));
2277*9880d681SAndroid Build Coastguard Worker SDValue SrcAddr = DAG.getNode(ISD::ADD, dl, PtrVT, Arg,
2278*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Ofst, dl, PtrVT));
2279*9880d681SAndroid Build Coastguard Worker SDValue P = DAG.getLoad(
2280*9880d681SAndroid Build Coastguard Worker VecVT, dl, Root, SrcAddr, MachinePointerInfo(SrcValue), false,
2281*9880d681SAndroid Build Coastguard Worker false, true,
2282*9880d681SAndroid Build Coastguard Worker DL.getABITypeAlignment(VecVT.getTypeForEVT(F->getContext())));
2283*9880d681SAndroid Build Coastguard Worker if (P.getNode())
2284*9880d681SAndroid Build Coastguard Worker P.getNode()->setIROrder(idx + 1);
2285*9880d681SAndroid Build Coastguard Worker
2286*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0; j < VecSize; ++j) {
2287*9880d681SAndroid Build Coastguard Worker if (i + j >= NumElts)
2288*9880d681SAndroid Build Coastguard Worker break;
2289*9880d681SAndroid Build Coastguard Worker SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, P,
2290*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(j, dl));
2291*9880d681SAndroid Build Coastguard Worker if (Ins[InsIdx].VT.getSizeInBits() > EltVT.getSizeInBits())
2292*9880d681SAndroid Build Coastguard Worker Elt = DAG.getNode(ISD::ANY_EXTEND, dl, Ins[InsIdx].VT, Elt);
2293*9880d681SAndroid Build Coastguard Worker InVals.push_back(Elt);
2294*9880d681SAndroid Build Coastguard Worker }
2295*9880d681SAndroid Build Coastguard Worker Ofst += DL.getTypeAllocSize(VecVT.getTypeForEVT(F->getContext()));
2296*9880d681SAndroid Build Coastguard Worker }
2297*9880d681SAndroid Build Coastguard Worker InsIdx += NumElts;
2298*9880d681SAndroid Build Coastguard Worker }
2299*9880d681SAndroid Build Coastguard Worker
2300*9880d681SAndroid Build Coastguard Worker if (NumElts > 0)
2301*9880d681SAndroid Build Coastguard Worker --InsIdx;
2302*9880d681SAndroid Build Coastguard Worker continue;
2303*9880d681SAndroid Build Coastguard Worker }
2304*9880d681SAndroid Build Coastguard Worker // A plain scalar.
2305*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, Ty);
2306*9880d681SAndroid Build Coastguard Worker // If ABI, load from the param symbol
2307*9880d681SAndroid Build Coastguard Worker SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2308*9880d681SAndroid Build Coastguard Worker Value *srcValue = Constant::getNullValue(PointerType::get(
2309*9880d681SAndroid Build Coastguard Worker ObjectVT.getTypeForEVT(F->getContext()), llvm::ADDRESS_SPACE_PARAM));
2310*9880d681SAndroid Build Coastguard Worker SDValue p;
2311*9880d681SAndroid Build Coastguard Worker if (ObjectVT.getSizeInBits() < Ins[InsIdx].VT.getSizeInBits()) {
2312*9880d681SAndroid Build Coastguard Worker ISD::LoadExtType ExtOp = Ins[InsIdx].Flags.isSExt() ?
2313*9880d681SAndroid Build Coastguard Worker ISD::SEXTLOAD : ISD::ZEXTLOAD;
2314*9880d681SAndroid Build Coastguard Worker p = DAG.getExtLoad(
2315*9880d681SAndroid Build Coastguard Worker ExtOp, dl, Ins[InsIdx].VT, Root, Arg, MachinePointerInfo(srcValue),
2316*9880d681SAndroid Build Coastguard Worker ObjectVT, false, false, false,
2317*9880d681SAndroid Build Coastguard Worker DL.getABITypeAlignment(ObjectVT.getTypeForEVT(F->getContext())));
2318*9880d681SAndroid Build Coastguard Worker } else {
2319*9880d681SAndroid Build Coastguard Worker p = DAG.getLoad(
2320*9880d681SAndroid Build Coastguard Worker Ins[InsIdx].VT, dl, Root, Arg, MachinePointerInfo(srcValue), false,
2321*9880d681SAndroid Build Coastguard Worker false, false,
2322*9880d681SAndroid Build Coastguard Worker DL.getABITypeAlignment(ObjectVT.getTypeForEVT(F->getContext())));
2323*9880d681SAndroid Build Coastguard Worker }
2324*9880d681SAndroid Build Coastguard Worker if (p.getNode())
2325*9880d681SAndroid Build Coastguard Worker p.getNode()->setIROrder(idx + 1);
2326*9880d681SAndroid Build Coastguard Worker InVals.push_back(p);
2327*9880d681SAndroid Build Coastguard Worker continue;
2328*9880d681SAndroid Build Coastguard Worker }
2329*9880d681SAndroid Build Coastguard Worker
2330*9880d681SAndroid Build Coastguard Worker // Param has ByVal attribute
2331*9880d681SAndroid Build Coastguard Worker // Return MoveParam(param symbol).
2332*9880d681SAndroid Build Coastguard Worker // Ideally, the param symbol can be returned directly,
2333*9880d681SAndroid Build Coastguard Worker // but when SDNode builder decides to use it in a CopyToReg(),
2334*9880d681SAndroid Build Coastguard Worker // machine instruction fails because TargetExternalSymbol
2335*9880d681SAndroid Build Coastguard Worker // (not lowered) is target dependent, and CopyToReg assumes
2336*9880d681SAndroid Build Coastguard Worker // the source is lowered.
2337*9880d681SAndroid Build Coastguard Worker EVT ObjectVT = getValueType(DL, Ty);
2338*9880d681SAndroid Build Coastguard Worker assert(ObjectVT == Ins[InsIdx].VT &&
2339*9880d681SAndroid Build Coastguard Worker "Ins type did not match function type");
2340*9880d681SAndroid Build Coastguard Worker SDValue Arg = getParamSymbol(DAG, idx, PtrVT);
2341*9880d681SAndroid Build Coastguard Worker SDValue p = DAG.getNode(NVPTXISD::MoveParam, dl, ObjectVT, Arg);
2342*9880d681SAndroid Build Coastguard Worker if (p.getNode())
2343*9880d681SAndroid Build Coastguard Worker p.getNode()->setIROrder(idx + 1);
2344*9880d681SAndroid Build Coastguard Worker if (isKernel)
2345*9880d681SAndroid Build Coastguard Worker InVals.push_back(p);
2346*9880d681SAndroid Build Coastguard Worker else {
2347*9880d681SAndroid Build Coastguard Worker SDValue p2 = DAG.getNode(
2348*9880d681SAndroid Build Coastguard Worker ISD::INTRINSIC_WO_CHAIN, dl, ObjectVT,
2349*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Intrinsic::nvvm_ptr_local_to_gen, dl, MVT::i32), p);
2350*9880d681SAndroid Build Coastguard Worker InVals.push_back(p2);
2351*9880d681SAndroid Build Coastguard Worker }
2352*9880d681SAndroid Build Coastguard Worker }
2353*9880d681SAndroid Build Coastguard Worker
2354*9880d681SAndroid Build Coastguard Worker // Clang will check explicit VarArg and issue error if any. However, Clang
2355*9880d681SAndroid Build Coastguard Worker // will let code with
2356*9880d681SAndroid Build Coastguard Worker // implicit var arg like f() pass. See bug 617733.
2357*9880d681SAndroid Build Coastguard Worker // We treat this case as if the arg list is empty.
2358*9880d681SAndroid Build Coastguard Worker // if (F.isVarArg()) {
2359*9880d681SAndroid Build Coastguard Worker // assert(0 && "VarArg not supported yet!");
2360*9880d681SAndroid Build Coastguard Worker //}
2361*9880d681SAndroid Build Coastguard Worker
2362*9880d681SAndroid Build Coastguard Worker if (!OutChains.empty())
2363*9880d681SAndroid Build Coastguard Worker DAG.setRoot(DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains));
2364*9880d681SAndroid Build Coastguard Worker
2365*9880d681SAndroid Build Coastguard Worker return Chain;
2366*9880d681SAndroid Build Coastguard Worker }
2367*9880d681SAndroid Build Coastguard Worker
2368*9880d681SAndroid Build Coastguard Worker SDValue
LowerReturn(SDValue Chain,CallingConv::ID CallConv,bool isVarArg,const SmallVectorImpl<ISD::OutputArg> & Outs,const SmallVectorImpl<SDValue> & OutVals,const SDLoc & dl,SelectionDAG & DAG) const2369*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
2370*9880d681SAndroid Build Coastguard Worker bool isVarArg,
2371*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<ISD::OutputArg> &Outs,
2372*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<SDValue> &OutVals,
2373*9880d681SAndroid Build Coastguard Worker const SDLoc &dl, SelectionDAG &DAG) const {
2374*9880d681SAndroid Build Coastguard Worker MachineFunction &MF = DAG.getMachineFunction();
2375*9880d681SAndroid Build Coastguard Worker const Function *F = MF.getFunction();
2376*9880d681SAndroid Build Coastguard Worker Type *RetTy = F->getReturnType();
2377*9880d681SAndroid Build Coastguard Worker const DataLayout &TD = DAG.getDataLayout();
2378*9880d681SAndroid Build Coastguard Worker
2379*9880d681SAndroid Build Coastguard Worker bool isABI = (STI.getSmVersion() >= 20);
2380*9880d681SAndroid Build Coastguard Worker assert(isABI && "Non-ABI compilation is not supported");
2381*9880d681SAndroid Build Coastguard Worker if (!isABI)
2382*9880d681SAndroid Build Coastguard Worker return Chain;
2383*9880d681SAndroid Build Coastguard Worker
2384*9880d681SAndroid Build Coastguard Worker if (VectorType *VTy = dyn_cast<VectorType>(RetTy)) {
2385*9880d681SAndroid Build Coastguard Worker // If we have a vector type, the OutVals array will be the scalarized
2386*9880d681SAndroid Build Coastguard Worker // components and we have combine them into 1 or more vector stores.
2387*9880d681SAndroid Build Coastguard Worker unsigned NumElts = VTy->getNumElements();
2388*9880d681SAndroid Build Coastguard Worker assert(NumElts == Outs.size() && "Bad scalarization of return value");
2389*9880d681SAndroid Build Coastguard Worker
2390*9880d681SAndroid Build Coastguard Worker // const_cast can be removed in later LLVM versions
2391*9880d681SAndroid Build Coastguard Worker EVT EltVT = getValueType(TD, RetTy).getVectorElementType();
2392*9880d681SAndroid Build Coastguard Worker bool NeedExtend = false;
2393*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() < 16)
2394*9880d681SAndroid Build Coastguard Worker NeedExtend = true;
2395*9880d681SAndroid Build Coastguard Worker
2396*9880d681SAndroid Build Coastguard Worker // V1 store
2397*9880d681SAndroid Build Coastguard Worker if (NumElts == 1) {
2398*9880d681SAndroid Build Coastguard Worker SDValue StoreVal = OutVals[0];
2399*9880d681SAndroid Build Coastguard Worker // We only have one element, so just directly store it
2400*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
2401*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal);
2402*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { Chain, DAG.getConstant(0, dl, MVT::i32), StoreVal };
2403*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreRetval, dl,
2404*9880d681SAndroid Build Coastguard Worker DAG.getVTList(MVT::Other), Ops,
2405*9880d681SAndroid Build Coastguard Worker EltVT, MachinePointerInfo());
2406*9880d681SAndroid Build Coastguard Worker
2407*9880d681SAndroid Build Coastguard Worker } else if (NumElts == 2) {
2408*9880d681SAndroid Build Coastguard Worker // V2 store
2409*9880d681SAndroid Build Coastguard Worker SDValue StoreVal0 = OutVals[0];
2410*9880d681SAndroid Build Coastguard Worker SDValue StoreVal1 = OutVals[1];
2411*9880d681SAndroid Build Coastguard Worker
2412*9880d681SAndroid Build Coastguard Worker if (NeedExtend) {
2413*9880d681SAndroid Build Coastguard Worker StoreVal0 = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal0);
2414*9880d681SAndroid Build Coastguard Worker StoreVal1 = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, StoreVal1);
2415*9880d681SAndroid Build Coastguard Worker }
2416*9880d681SAndroid Build Coastguard Worker
2417*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = { Chain, DAG.getConstant(0, dl, MVT::i32), StoreVal0,
2418*9880d681SAndroid Build Coastguard Worker StoreVal1 };
2419*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreRetvalV2, dl,
2420*9880d681SAndroid Build Coastguard Worker DAG.getVTList(MVT::Other), Ops,
2421*9880d681SAndroid Build Coastguard Worker EltVT, MachinePointerInfo());
2422*9880d681SAndroid Build Coastguard Worker } else {
2423*9880d681SAndroid Build Coastguard Worker // V4 stores
2424*9880d681SAndroid Build Coastguard Worker // We have at least 4 elements (<3 x Ty> expands to 4 elements) and the
2425*9880d681SAndroid Build Coastguard Worker // vector will be expanded to a power of 2 elements, so we know we can
2426*9880d681SAndroid Build Coastguard Worker // always round up to the next multiple of 4 when creating the vector
2427*9880d681SAndroid Build Coastguard Worker // stores.
2428*9880d681SAndroid Build Coastguard Worker // e.g. 4 elem => 1 st.v4
2429*9880d681SAndroid Build Coastguard Worker // 6 elem => 2 st.v4
2430*9880d681SAndroid Build Coastguard Worker // 8 elem => 2 st.v4
2431*9880d681SAndroid Build Coastguard Worker // 11 elem => 3 st.v4
2432*9880d681SAndroid Build Coastguard Worker
2433*9880d681SAndroid Build Coastguard Worker unsigned VecSize = 4;
2434*9880d681SAndroid Build Coastguard Worker if (OutVals[0].getValueType().getSizeInBits() == 64)
2435*9880d681SAndroid Build Coastguard Worker VecSize = 2;
2436*9880d681SAndroid Build Coastguard Worker
2437*9880d681SAndroid Build Coastguard Worker unsigned Offset = 0;
2438*9880d681SAndroid Build Coastguard Worker
2439*9880d681SAndroid Build Coastguard Worker EVT VecVT =
2440*9880d681SAndroid Build Coastguard Worker EVT::getVectorVT(F->getContext(), EltVT, VecSize);
2441*9880d681SAndroid Build Coastguard Worker unsigned PerStoreOffset =
2442*9880d681SAndroid Build Coastguard Worker TD.getTypeAllocSize(VecVT.getTypeForEVT(F->getContext()));
2443*9880d681SAndroid Build Coastguard Worker
2444*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; i += VecSize) {
2445*9880d681SAndroid Build Coastguard Worker // Get values
2446*9880d681SAndroid Build Coastguard Worker SDValue StoreVal;
2447*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> Ops;
2448*9880d681SAndroid Build Coastguard Worker Ops.push_back(Chain);
2449*9880d681SAndroid Build Coastguard Worker Ops.push_back(DAG.getConstant(Offset, dl, MVT::i32));
2450*9880d681SAndroid Build Coastguard Worker unsigned Opc = NVPTXISD::StoreRetvalV2;
2451*9880d681SAndroid Build Coastguard Worker EVT ExtendedVT = (NeedExtend) ? MVT::i16 : OutVals[0].getValueType();
2452*9880d681SAndroid Build Coastguard Worker
2453*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[i];
2454*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
2455*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getNode(ISD::ZERO_EXTEND, dl, ExtendedVT, StoreVal);
2456*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
2457*9880d681SAndroid Build Coastguard Worker
2458*9880d681SAndroid Build Coastguard Worker if (i + 1 < NumElts) {
2459*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[i + 1];
2460*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
2461*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getNode(ISD::ZERO_EXTEND, dl, ExtendedVT, StoreVal);
2462*9880d681SAndroid Build Coastguard Worker } else {
2463*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(ExtendedVT);
2464*9880d681SAndroid Build Coastguard Worker }
2465*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
2466*9880d681SAndroid Build Coastguard Worker
2467*9880d681SAndroid Build Coastguard Worker if (VecSize == 4) {
2468*9880d681SAndroid Build Coastguard Worker Opc = NVPTXISD::StoreRetvalV4;
2469*9880d681SAndroid Build Coastguard Worker if (i + 2 < NumElts) {
2470*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[i + 2];
2471*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
2472*9880d681SAndroid Build Coastguard Worker StoreVal =
2473*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ZERO_EXTEND, dl, ExtendedVT, StoreVal);
2474*9880d681SAndroid Build Coastguard Worker } else {
2475*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(ExtendedVT);
2476*9880d681SAndroid Build Coastguard Worker }
2477*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
2478*9880d681SAndroid Build Coastguard Worker
2479*9880d681SAndroid Build Coastguard Worker if (i + 3 < NumElts) {
2480*9880d681SAndroid Build Coastguard Worker StoreVal = OutVals[i + 3];
2481*9880d681SAndroid Build Coastguard Worker if (NeedExtend)
2482*9880d681SAndroid Build Coastguard Worker StoreVal =
2483*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::ZERO_EXTEND, dl, ExtendedVT, StoreVal);
2484*9880d681SAndroid Build Coastguard Worker } else {
2485*9880d681SAndroid Build Coastguard Worker StoreVal = DAG.getUNDEF(ExtendedVT);
2486*9880d681SAndroid Build Coastguard Worker }
2487*9880d681SAndroid Build Coastguard Worker Ops.push_back(StoreVal);
2488*9880d681SAndroid Build Coastguard Worker }
2489*9880d681SAndroid Build Coastguard Worker
2490*9880d681SAndroid Build Coastguard Worker // Chain = DAG.getNode(Opc, dl, MVT::Other, &Ops[0], Ops.size());
2491*9880d681SAndroid Build Coastguard Worker Chain =
2492*9880d681SAndroid Build Coastguard Worker DAG.getMemIntrinsicNode(Opc, dl, DAG.getVTList(MVT::Other), Ops,
2493*9880d681SAndroid Build Coastguard Worker EltVT, MachinePointerInfo());
2494*9880d681SAndroid Build Coastguard Worker Offset += PerStoreOffset;
2495*9880d681SAndroid Build Coastguard Worker }
2496*9880d681SAndroid Build Coastguard Worker }
2497*9880d681SAndroid Build Coastguard Worker } else {
2498*9880d681SAndroid Build Coastguard Worker SmallVector<EVT, 16> ValVTs;
2499*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 16> Offsets;
2500*9880d681SAndroid Build Coastguard Worker ComputePTXValueVTs(*this, DAG.getDataLayout(), RetTy, ValVTs, &Offsets, 0);
2501*9880d681SAndroid Build Coastguard Worker assert(ValVTs.size() == OutVals.size() && "Bad return value decomposition");
2502*9880d681SAndroid Build Coastguard Worker
2503*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
2504*9880d681SAndroid Build Coastguard Worker SDValue theVal = OutVals[i];
2505*9880d681SAndroid Build Coastguard Worker EVT TheValType = theVal.getValueType();
2506*9880d681SAndroid Build Coastguard Worker unsigned numElems = 1;
2507*9880d681SAndroid Build Coastguard Worker if (TheValType.isVector())
2508*9880d681SAndroid Build Coastguard Worker numElems = TheValType.getVectorNumElements();
2509*9880d681SAndroid Build Coastguard Worker for (unsigned j = 0, je = numElems; j != je; ++j) {
2510*9880d681SAndroid Build Coastguard Worker SDValue TmpVal = theVal;
2511*9880d681SAndroid Build Coastguard Worker if (TheValType.isVector())
2512*9880d681SAndroid Build Coastguard Worker TmpVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
2513*9880d681SAndroid Build Coastguard Worker TheValType.getVectorElementType(), TmpVal,
2514*9880d681SAndroid Build Coastguard Worker DAG.getIntPtrConstant(j, dl));
2515*9880d681SAndroid Build Coastguard Worker EVT TheStoreType = ValVTs[i];
2516*9880d681SAndroid Build Coastguard Worker if (RetTy->isIntegerTy() && TD.getTypeAllocSizeInBits(RetTy) < 32) {
2517*9880d681SAndroid Build Coastguard Worker // The following zero-extension is for integer types only, and
2518*9880d681SAndroid Build Coastguard Worker // specifically not for aggregates.
2519*9880d681SAndroid Build Coastguard Worker TmpVal = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, TmpVal);
2520*9880d681SAndroid Build Coastguard Worker TheStoreType = MVT::i32;
2521*9880d681SAndroid Build Coastguard Worker }
2522*9880d681SAndroid Build Coastguard Worker else if (TmpVal.getValueType().getSizeInBits() < 16)
2523*9880d681SAndroid Build Coastguard Worker TmpVal = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i16, TmpVal);
2524*9880d681SAndroid Build Coastguard Worker
2525*9880d681SAndroid Build Coastguard Worker SDValue Ops[] = {
2526*9880d681SAndroid Build Coastguard Worker Chain,
2527*9880d681SAndroid Build Coastguard Worker DAG.getConstant(Offsets[i], dl, MVT::i32),
2528*9880d681SAndroid Build Coastguard Worker TmpVal };
2529*9880d681SAndroid Build Coastguard Worker Chain = DAG.getMemIntrinsicNode(NVPTXISD::StoreRetval, dl,
2530*9880d681SAndroid Build Coastguard Worker DAG.getVTList(MVT::Other), Ops,
2531*9880d681SAndroid Build Coastguard Worker TheStoreType,
2532*9880d681SAndroid Build Coastguard Worker MachinePointerInfo());
2533*9880d681SAndroid Build Coastguard Worker }
2534*9880d681SAndroid Build Coastguard Worker }
2535*9880d681SAndroid Build Coastguard Worker }
2536*9880d681SAndroid Build Coastguard Worker
2537*9880d681SAndroid Build Coastguard Worker return DAG.getNode(NVPTXISD::RET_FLAG, dl, MVT::Other, Chain);
2538*9880d681SAndroid Build Coastguard Worker }
2539*9880d681SAndroid Build Coastguard Worker
2540*9880d681SAndroid Build Coastguard Worker
LowerAsmOperandForConstraint(SDValue Op,std::string & Constraint,std::vector<SDValue> & Ops,SelectionDAG & DAG) const2541*9880d681SAndroid Build Coastguard Worker void NVPTXTargetLowering::LowerAsmOperandForConstraint(
2542*9880d681SAndroid Build Coastguard Worker SDValue Op, std::string &Constraint, std::vector<SDValue> &Ops,
2543*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG) const {
2544*9880d681SAndroid Build Coastguard Worker if (Constraint.length() > 1)
2545*9880d681SAndroid Build Coastguard Worker return;
2546*9880d681SAndroid Build Coastguard Worker else
2547*9880d681SAndroid Build Coastguard Worker TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
2548*9880d681SAndroid Build Coastguard Worker }
2549*9880d681SAndroid Build Coastguard Worker
getOpcForTextureInstr(unsigned Intrinsic)2550*9880d681SAndroid Build Coastguard Worker static unsigned getOpcForTextureInstr(unsigned Intrinsic) {
2551*9880d681SAndroid Build Coastguard Worker switch (Intrinsic) {
2552*9880d681SAndroid Build Coastguard Worker default:
2553*9880d681SAndroid Build Coastguard Worker return 0;
2554*9880d681SAndroid Build Coastguard Worker
2555*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4f32_s32:
2556*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DFloatS32;
2557*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4f32_f32:
2558*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DFloatFloat;
2559*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4f32_f32:
2560*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DFloatFloatLevel;
2561*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4f32_f32:
2562*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DFloatFloatGrad;
2563*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4s32_s32:
2564*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DS32S32;
2565*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4s32_f32:
2566*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DS32Float;
2567*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4s32_f32:
2568*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DS32FloatLevel;
2569*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4s32_f32:
2570*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DS32FloatGrad;
2571*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4u32_s32:
2572*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DU32S32;
2573*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4u32_f32:
2574*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DU32Float;
2575*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4u32_f32:
2576*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DU32FloatLevel;
2577*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4u32_f32:
2578*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DU32FloatGrad;
2579*9880d681SAndroid Build Coastguard Worker
2580*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4f32_s32:
2581*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayFloatS32;
2582*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4f32_f32:
2583*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayFloatFloat;
2584*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4f32_f32:
2585*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayFloatFloatLevel;
2586*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4f32_f32:
2587*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayFloatFloatGrad;
2588*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4s32_s32:
2589*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayS32S32;
2590*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4s32_f32:
2591*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayS32Float;
2592*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4s32_f32:
2593*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayS32FloatLevel;
2594*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4s32_f32:
2595*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayS32FloatGrad;
2596*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4u32_s32:
2597*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayU32S32;
2598*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4u32_f32:
2599*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayU32Float;
2600*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4u32_f32:
2601*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayU32FloatLevel;
2602*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4u32_f32:
2603*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex1DArrayU32FloatGrad;
2604*9880d681SAndroid Build Coastguard Worker
2605*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4f32_s32:
2606*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DFloatS32;
2607*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4f32_f32:
2608*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DFloatFloat;
2609*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4f32_f32:
2610*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DFloatFloatLevel;
2611*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4f32_f32:
2612*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DFloatFloatGrad;
2613*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4s32_s32:
2614*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DS32S32;
2615*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4s32_f32:
2616*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DS32Float;
2617*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4s32_f32:
2618*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DS32FloatLevel;
2619*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4s32_f32:
2620*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DS32FloatGrad;
2621*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4u32_s32:
2622*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DU32S32;
2623*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4u32_f32:
2624*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DU32Float;
2625*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4u32_f32:
2626*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DU32FloatLevel;
2627*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4u32_f32:
2628*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DU32FloatGrad;
2629*9880d681SAndroid Build Coastguard Worker
2630*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4f32_s32:
2631*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayFloatS32;
2632*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4f32_f32:
2633*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayFloatFloat;
2634*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4f32_f32:
2635*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayFloatFloatLevel;
2636*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4f32_f32:
2637*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayFloatFloatGrad;
2638*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4s32_s32:
2639*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayS32S32;
2640*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4s32_f32:
2641*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayS32Float;
2642*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4s32_f32:
2643*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayS32FloatLevel;
2644*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4s32_f32:
2645*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayS32FloatGrad;
2646*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4u32_s32:
2647*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayU32S32;
2648*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4u32_f32:
2649*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayU32Float;
2650*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4u32_f32:
2651*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayU32FloatLevel;
2652*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4u32_f32:
2653*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex2DArrayU32FloatGrad;
2654*9880d681SAndroid Build Coastguard Worker
2655*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4f32_s32:
2656*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DFloatS32;
2657*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4f32_f32:
2658*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DFloatFloat;
2659*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4f32_f32:
2660*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DFloatFloatLevel;
2661*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4f32_f32:
2662*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DFloatFloatGrad;
2663*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4s32_s32:
2664*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DS32S32;
2665*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4s32_f32:
2666*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DS32Float;
2667*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4s32_f32:
2668*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DS32FloatLevel;
2669*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4s32_f32:
2670*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DS32FloatGrad;
2671*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4u32_s32:
2672*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DU32S32;
2673*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4u32_f32:
2674*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DU32Float;
2675*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4u32_f32:
2676*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DU32FloatLevel;
2677*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4u32_f32:
2678*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tex3DU32FloatGrad;
2679*9880d681SAndroid Build Coastguard Worker
2680*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4f32_f32:
2681*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeFloatFloat;
2682*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4f32_f32:
2683*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeFloatFloatLevel;
2684*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4s32_f32:
2685*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeS32Float;
2686*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4s32_f32:
2687*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeS32FloatLevel;
2688*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4u32_f32:
2689*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeU32Float;
2690*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4u32_f32:
2691*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeU32FloatLevel;
2692*9880d681SAndroid Build Coastguard Worker
2693*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4f32_f32:
2694*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayFloatFloat;
2695*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4f32_f32:
2696*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayFloatFloatLevel;
2697*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4s32_f32:
2698*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayS32Float;
2699*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4s32_f32:
2700*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayS32FloatLevel;
2701*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4u32_f32:
2702*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayU32Float;
2703*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4u32_f32:
2704*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexCubeArrayU32FloatLevel;
2705*9880d681SAndroid Build Coastguard Worker
2706*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4f32_f32:
2707*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4R2DFloatFloat;
2708*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4f32_f32:
2709*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4G2DFloatFloat;
2710*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4f32_f32:
2711*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4B2DFloatFloat;
2712*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4f32_f32:
2713*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4A2DFloatFloat;
2714*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4s32_f32:
2715*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4R2DS64Float;
2716*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4s32_f32:
2717*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4G2DS64Float;
2718*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4s32_f32:
2719*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4B2DS64Float;
2720*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4s32_f32:
2721*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4A2DS64Float;
2722*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4u32_f32:
2723*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4R2DU64Float;
2724*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4u32_f32:
2725*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4G2DU64Float;
2726*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4u32_f32:
2727*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4B2DU64Float;
2728*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4u32_f32:
2729*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4A2DU64Float;
2730*9880d681SAndroid Build Coastguard Worker
2731*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4f32_s32:
2732*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DFloatS32;
2733*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4f32_f32:
2734*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DFloatFloat;
2735*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4f32_f32:
2736*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DFloatFloatLevel;
2737*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4f32_f32:
2738*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DFloatFloatGrad;
2739*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4s32_s32:
2740*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DS32S32;
2741*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4s32_f32:
2742*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DS32Float;
2743*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4s32_f32:
2744*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DS32FloatLevel;
2745*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4s32_f32:
2746*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DS32FloatGrad;
2747*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4u32_s32:
2748*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DU32S32;
2749*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4u32_f32:
2750*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DU32Float;
2751*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4u32_f32:
2752*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DU32FloatLevel;
2753*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4u32_f32:
2754*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DU32FloatGrad;
2755*9880d681SAndroid Build Coastguard Worker
2756*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4f32_s32:
2757*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayFloatS32;
2758*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4f32_f32:
2759*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayFloatFloat;
2760*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4f32_f32:
2761*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayFloatFloatLevel;
2762*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4f32_f32:
2763*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayFloatFloatGrad;
2764*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4s32_s32:
2765*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayS32S32;
2766*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4s32_f32:
2767*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayS32Float;
2768*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4s32_f32:
2769*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayS32FloatLevel;
2770*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4s32_f32:
2771*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayS32FloatGrad;
2772*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4u32_s32:
2773*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayU32S32;
2774*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4u32_f32:
2775*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayU32Float;
2776*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4u32_f32:
2777*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayU32FloatLevel;
2778*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4u32_f32:
2779*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified1DArrayU32FloatGrad;
2780*9880d681SAndroid Build Coastguard Worker
2781*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4f32_s32:
2782*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DFloatS32;
2783*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4f32_f32:
2784*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DFloatFloat;
2785*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4f32_f32:
2786*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DFloatFloatLevel;
2787*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4f32_f32:
2788*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DFloatFloatGrad;
2789*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4s32_s32:
2790*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DS32S32;
2791*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4s32_f32:
2792*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DS32Float;
2793*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4s32_f32:
2794*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DS32FloatLevel;
2795*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4s32_f32:
2796*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DS32FloatGrad;
2797*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4u32_s32:
2798*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DU32S32;
2799*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4u32_f32:
2800*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DU32Float;
2801*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4u32_f32:
2802*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DU32FloatLevel;
2803*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4u32_f32:
2804*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DU32FloatGrad;
2805*9880d681SAndroid Build Coastguard Worker
2806*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4f32_s32:
2807*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayFloatS32;
2808*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4f32_f32:
2809*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayFloatFloat;
2810*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4f32_f32:
2811*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayFloatFloatLevel;
2812*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4f32_f32:
2813*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayFloatFloatGrad;
2814*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4s32_s32:
2815*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayS32S32;
2816*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4s32_f32:
2817*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayS32Float;
2818*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4s32_f32:
2819*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayS32FloatLevel;
2820*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4s32_f32:
2821*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayS32FloatGrad;
2822*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4u32_s32:
2823*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayU32S32;
2824*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4u32_f32:
2825*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayU32Float;
2826*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4u32_f32:
2827*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayU32FloatLevel;
2828*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4u32_f32:
2829*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified2DArrayU32FloatGrad;
2830*9880d681SAndroid Build Coastguard Worker
2831*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4f32_s32:
2832*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DFloatS32;
2833*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4f32_f32:
2834*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DFloatFloat;
2835*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4f32_f32:
2836*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DFloatFloatLevel;
2837*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4f32_f32:
2838*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DFloatFloatGrad;
2839*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4s32_s32:
2840*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DS32S32;
2841*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4s32_f32:
2842*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DS32Float;
2843*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4s32_f32:
2844*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DS32FloatLevel;
2845*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4s32_f32:
2846*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DS32FloatGrad;
2847*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4u32_s32:
2848*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DU32S32;
2849*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4u32_f32:
2850*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DU32Float;
2851*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4u32_f32:
2852*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DU32FloatLevel;
2853*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4u32_f32:
2854*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnified3DU32FloatGrad;
2855*9880d681SAndroid Build Coastguard Worker
2856*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4f32_f32:
2857*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeFloatFloat;
2858*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4f32_f32:
2859*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeFloatFloatLevel;
2860*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4s32_f32:
2861*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeS32Float;
2862*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4s32_f32:
2863*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeS32FloatLevel;
2864*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4u32_f32:
2865*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeU32Float;
2866*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4u32_f32:
2867*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeU32FloatLevel;
2868*9880d681SAndroid Build Coastguard Worker
2869*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4f32_f32:
2870*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayFloatFloat;
2871*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4f32_f32:
2872*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayFloatFloatLevel;
2873*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4s32_f32:
2874*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayS32Float;
2875*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4s32_f32:
2876*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayS32FloatLevel;
2877*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4u32_f32:
2878*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayU32Float;
2879*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4u32_f32:
2880*9880d681SAndroid Build Coastguard Worker return NVPTXISD::TexUnifiedCubeArrayU32FloatLevel;
2881*9880d681SAndroid Build Coastguard Worker
2882*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4f32_f32:
2883*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedR2DFloatFloat;
2884*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4f32_f32:
2885*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedG2DFloatFloat;
2886*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4f32_f32:
2887*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedB2DFloatFloat;
2888*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4f32_f32:
2889*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedA2DFloatFloat;
2890*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4s32_f32:
2891*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedR2DS64Float;
2892*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4s32_f32:
2893*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedG2DS64Float;
2894*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4s32_f32:
2895*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedB2DS64Float;
2896*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4s32_f32:
2897*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedA2DS64Float;
2898*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4u32_f32:
2899*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedR2DU64Float;
2900*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4u32_f32:
2901*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedG2DU64Float;
2902*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4u32_f32:
2903*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedB2DU64Float;
2904*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4u32_f32:
2905*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Tld4UnifiedA2DU64Float;
2906*9880d681SAndroid Build Coastguard Worker }
2907*9880d681SAndroid Build Coastguard Worker }
2908*9880d681SAndroid Build Coastguard Worker
getOpcForSurfaceInstr(unsigned Intrinsic)2909*9880d681SAndroid Build Coastguard Worker static unsigned getOpcForSurfaceInstr(unsigned Intrinsic) {
2910*9880d681SAndroid Build Coastguard Worker switch (Intrinsic) {
2911*9880d681SAndroid Build Coastguard Worker default:
2912*9880d681SAndroid Build Coastguard Worker return 0;
2913*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_clamp:
2914*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI8Clamp;
2915*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_clamp:
2916*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI16Clamp;
2917*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_clamp:
2918*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI32Clamp;
2919*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_clamp:
2920*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI64Clamp;
2921*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_clamp:
2922*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I8Clamp;
2923*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_clamp:
2924*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I16Clamp;
2925*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_clamp:
2926*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I32Clamp;
2927*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_clamp:
2928*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I64Clamp;
2929*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_clamp:
2930*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I8Clamp;
2931*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_clamp:
2932*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I16Clamp;
2933*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_clamp:
2934*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I32Clamp;
2935*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_clamp:
2936*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI8Clamp;
2937*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_clamp:
2938*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI16Clamp;
2939*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_clamp:
2940*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI32Clamp;
2941*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_clamp:
2942*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI64Clamp;
2943*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_clamp:
2944*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I8Clamp;
2945*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_clamp:
2946*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I16Clamp;
2947*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_clamp:
2948*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I32Clamp;
2949*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_clamp:
2950*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I64Clamp;
2951*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_clamp:
2952*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I8Clamp;
2953*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_clamp:
2954*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I16Clamp;
2955*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_clamp:
2956*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I32Clamp;
2957*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_clamp:
2958*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI8Clamp;
2959*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_clamp:
2960*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI16Clamp;
2961*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_clamp:
2962*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI32Clamp;
2963*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_clamp:
2964*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI64Clamp;
2965*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_clamp:
2966*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I8Clamp;
2967*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_clamp:
2968*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I16Clamp;
2969*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_clamp:
2970*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I32Clamp;
2971*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_clamp:
2972*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I64Clamp;
2973*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_clamp:
2974*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I8Clamp;
2975*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_clamp:
2976*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I16Clamp;
2977*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_clamp:
2978*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I32Clamp;
2979*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_clamp:
2980*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI8Clamp;
2981*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_clamp:
2982*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI16Clamp;
2983*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_clamp:
2984*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI32Clamp;
2985*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_clamp:
2986*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI64Clamp;
2987*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_clamp:
2988*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I8Clamp;
2989*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_clamp:
2990*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I16Clamp;
2991*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_clamp:
2992*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I32Clamp;
2993*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_clamp:
2994*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I64Clamp;
2995*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_clamp:
2996*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I8Clamp;
2997*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_clamp:
2998*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I16Clamp;
2999*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_clamp:
3000*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I32Clamp;
3001*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_clamp:
3002*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI8Clamp;
3003*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_clamp:
3004*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI16Clamp;
3005*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_clamp:
3006*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI32Clamp;
3007*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_clamp:
3008*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI64Clamp;
3009*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_clamp:
3010*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I8Clamp;
3011*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_clamp:
3012*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I16Clamp;
3013*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_clamp:
3014*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I32Clamp;
3015*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_clamp:
3016*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I64Clamp;
3017*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_clamp:
3018*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I8Clamp;
3019*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_clamp:
3020*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I16Clamp;
3021*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_clamp:
3022*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I32Clamp;
3023*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_trap:
3024*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI8Trap;
3025*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_trap:
3026*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI16Trap;
3027*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_trap:
3028*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI32Trap;
3029*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_trap:
3030*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI64Trap;
3031*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_trap:
3032*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I8Trap;
3033*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_trap:
3034*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I16Trap;
3035*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_trap:
3036*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I32Trap;
3037*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_trap:
3038*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I64Trap;
3039*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_trap:
3040*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I8Trap;
3041*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_trap:
3042*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I16Trap;
3043*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_trap:
3044*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I32Trap;
3045*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_trap:
3046*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI8Trap;
3047*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_trap:
3048*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI16Trap;
3049*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_trap:
3050*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI32Trap;
3051*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_trap:
3052*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI64Trap;
3053*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_trap:
3054*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I8Trap;
3055*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_trap:
3056*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I16Trap;
3057*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_trap:
3058*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I32Trap;
3059*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_trap:
3060*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I64Trap;
3061*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_trap:
3062*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I8Trap;
3063*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_trap:
3064*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I16Trap;
3065*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_trap:
3066*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I32Trap;
3067*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_trap:
3068*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI8Trap;
3069*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_trap:
3070*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI16Trap;
3071*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_trap:
3072*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI32Trap;
3073*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_trap:
3074*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI64Trap;
3075*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_trap:
3076*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I8Trap;
3077*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_trap:
3078*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I16Trap;
3079*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_trap:
3080*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I32Trap;
3081*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_trap:
3082*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I64Trap;
3083*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_trap:
3084*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I8Trap;
3085*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_trap:
3086*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I16Trap;
3087*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_trap:
3088*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I32Trap;
3089*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_trap:
3090*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI8Trap;
3091*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_trap:
3092*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI16Trap;
3093*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_trap:
3094*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI32Trap;
3095*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_trap:
3096*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI64Trap;
3097*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_trap:
3098*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I8Trap;
3099*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_trap:
3100*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I16Trap;
3101*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_trap:
3102*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I32Trap;
3103*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_trap:
3104*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I64Trap;
3105*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_trap:
3106*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I8Trap;
3107*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_trap:
3108*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I16Trap;
3109*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_trap:
3110*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I32Trap;
3111*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_trap:
3112*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI8Trap;
3113*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_trap:
3114*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI16Trap;
3115*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_trap:
3116*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI32Trap;
3117*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_trap:
3118*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI64Trap;
3119*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_trap:
3120*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I8Trap;
3121*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_trap:
3122*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I16Trap;
3123*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_trap:
3124*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I32Trap;
3125*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_trap:
3126*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I64Trap;
3127*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_trap:
3128*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I8Trap;
3129*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_trap:
3130*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I16Trap;
3131*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_trap:
3132*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I32Trap;
3133*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_zero:
3134*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI8Zero;
3135*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_zero:
3136*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI16Zero;
3137*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_zero:
3138*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI32Zero;
3139*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_zero:
3140*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DI64Zero;
3141*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_zero:
3142*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I8Zero;
3143*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_zero:
3144*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I16Zero;
3145*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_zero:
3146*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I32Zero;
3147*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_zero:
3148*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV2I64Zero;
3149*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_zero:
3150*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I8Zero;
3151*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_zero:
3152*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I16Zero;
3153*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_zero:
3154*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DV4I32Zero;
3155*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_zero:
3156*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI8Zero;
3157*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_zero:
3158*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI16Zero;
3159*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_zero:
3160*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI32Zero;
3161*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_zero:
3162*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayI64Zero;
3163*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_zero:
3164*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I8Zero;
3165*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_zero:
3166*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I16Zero;
3167*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_zero:
3168*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I32Zero;
3169*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_zero:
3170*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV2I64Zero;
3171*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_zero:
3172*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I8Zero;
3173*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_zero:
3174*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I16Zero;
3175*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_zero:
3176*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld1DArrayV4I32Zero;
3177*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_zero:
3178*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI8Zero;
3179*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_zero:
3180*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI16Zero;
3181*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_zero:
3182*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI32Zero;
3183*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_zero:
3184*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DI64Zero;
3185*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_zero:
3186*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I8Zero;
3187*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_zero:
3188*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I16Zero;
3189*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_zero:
3190*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I32Zero;
3191*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_zero:
3192*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV2I64Zero;
3193*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_zero:
3194*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I8Zero;
3195*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_zero:
3196*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I16Zero;
3197*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_zero:
3198*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DV4I32Zero;
3199*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_zero:
3200*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI8Zero;
3201*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_zero:
3202*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI16Zero;
3203*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_zero:
3204*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI32Zero;
3205*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_zero:
3206*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayI64Zero;
3207*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_zero:
3208*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I8Zero;
3209*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_zero:
3210*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I16Zero;
3211*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_zero:
3212*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I32Zero;
3213*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_zero:
3214*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV2I64Zero;
3215*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_zero:
3216*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I8Zero;
3217*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_zero:
3218*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I16Zero;
3219*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_zero:
3220*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld2DArrayV4I32Zero;
3221*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_zero:
3222*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI8Zero;
3223*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_zero:
3224*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI16Zero;
3225*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_zero:
3226*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI32Zero;
3227*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_zero:
3228*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DI64Zero;
3229*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_zero:
3230*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I8Zero;
3231*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_zero:
3232*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I16Zero;
3233*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_zero:
3234*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I32Zero;
3235*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_zero:
3236*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV2I64Zero;
3237*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_zero:
3238*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I8Zero;
3239*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_zero:
3240*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I16Zero;
3241*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_zero:
3242*9880d681SAndroid Build Coastguard Worker return NVPTXISD::Suld3DV4I32Zero;
3243*9880d681SAndroid Build Coastguard Worker }
3244*9880d681SAndroid Build Coastguard Worker }
3245*9880d681SAndroid Build Coastguard Worker
3246*9880d681SAndroid Build Coastguard Worker // llvm.ptx.memcpy.const and llvm.ptx.memmove.const need to be modeled as
3247*9880d681SAndroid Build Coastguard Worker // TgtMemIntrinsic
3248*9880d681SAndroid Build Coastguard Worker // because we need the information that is only available in the "Value" type
3249*9880d681SAndroid Build Coastguard Worker // of destination
3250*9880d681SAndroid Build Coastguard Worker // pointer. In particular, the address space information.
getTgtMemIntrinsic(IntrinsicInfo & Info,const CallInst & I,unsigned Intrinsic) const3251*9880d681SAndroid Build Coastguard Worker bool NVPTXTargetLowering::getTgtMemIntrinsic(
3252*9880d681SAndroid Build Coastguard Worker IntrinsicInfo &Info, const CallInst &I, unsigned Intrinsic) const {
3253*9880d681SAndroid Build Coastguard Worker switch (Intrinsic) {
3254*9880d681SAndroid Build Coastguard Worker default:
3255*9880d681SAndroid Build Coastguard Worker return false;
3256*9880d681SAndroid Build Coastguard Worker
3257*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_atomic_load_add_f32:
3258*9880d681SAndroid Build Coastguard Worker Info.opc = ISD::INTRINSIC_W_CHAIN;
3259*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::f32;
3260*9880d681SAndroid Build Coastguard Worker Info.ptrVal = I.getArgOperand(0);
3261*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3262*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3263*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3264*9880d681SAndroid Build Coastguard Worker Info.writeMem = true;
3265*9880d681SAndroid Build Coastguard Worker Info.align = 0;
3266*9880d681SAndroid Build Coastguard Worker return true;
3267*9880d681SAndroid Build Coastguard Worker
3268*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_atomic_load_inc_32:
3269*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_atomic_load_dec_32:
3270*9880d681SAndroid Build Coastguard Worker Info.opc = ISD::INTRINSIC_W_CHAIN;
3271*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::i32;
3272*9880d681SAndroid Build Coastguard Worker Info.ptrVal = I.getArgOperand(0);
3273*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3274*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3275*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3276*9880d681SAndroid Build Coastguard Worker Info.writeMem = true;
3277*9880d681SAndroid Build Coastguard Worker Info.align = 0;
3278*9880d681SAndroid Build Coastguard Worker return true;
3279*9880d681SAndroid Build Coastguard Worker
3280*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
3281*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
3282*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p: {
3283*9880d681SAndroid Build Coastguard Worker auto &DL = I.getModule()->getDataLayout();
3284*9880d681SAndroid Build Coastguard Worker Info.opc = ISD::INTRINSIC_W_CHAIN;
3285*9880d681SAndroid Build Coastguard Worker if (Intrinsic == Intrinsic::nvvm_ldu_global_i)
3286*9880d681SAndroid Build Coastguard Worker Info.memVT = getValueType(DL, I.getType());
3287*9880d681SAndroid Build Coastguard Worker else if(Intrinsic == Intrinsic::nvvm_ldu_global_p)
3288*9880d681SAndroid Build Coastguard Worker Info.memVT = getPointerTy(DL);
3289*9880d681SAndroid Build Coastguard Worker else
3290*9880d681SAndroid Build Coastguard Worker Info.memVT = getValueType(DL, I.getType());
3291*9880d681SAndroid Build Coastguard Worker Info.ptrVal = I.getArgOperand(0);
3292*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3293*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3294*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3295*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3296*9880d681SAndroid Build Coastguard Worker Info.align = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
3297*9880d681SAndroid Build Coastguard Worker
3298*9880d681SAndroid Build Coastguard Worker return true;
3299*9880d681SAndroid Build Coastguard Worker }
3300*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
3301*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
3302*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p: {
3303*9880d681SAndroid Build Coastguard Worker auto &DL = I.getModule()->getDataLayout();
3304*9880d681SAndroid Build Coastguard Worker
3305*9880d681SAndroid Build Coastguard Worker Info.opc = ISD::INTRINSIC_W_CHAIN;
3306*9880d681SAndroid Build Coastguard Worker if (Intrinsic == Intrinsic::nvvm_ldg_global_i)
3307*9880d681SAndroid Build Coastguard Worker Info.memVT = getValueType(DL, I.getType());
3308*9880d681SAndroid Build Coastguard Worker else if(Intrinsic == Intrinsic::nvvm_ldg_global_p)
3309*9880d681SAndroid Build Coastguard Worker Info.memVT = getPointerTy(DL);
3310*9880d681SAndroid Build Coastguard Worker else
3311*9880d681SAndroid Build Coastguard Worker Info.memVT = getValueType(DL, I.getType());
3312*9880d681SAndroid Build Coastguard Worker Info.ptrVal = I.getArgOperand(0);
3313*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3314*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3315*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3316*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3317*9880d681SAndroid Build Coastguard Worker Info.align = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
3318*9880d681SAndroid Build Coastguard Worker
3319*9880d681SAndroid Build Coastguard Worker return true;
3320*9880d681SAndroid Build Coastguard Worker }
3321*9880d681SAndroid Build Coastguard Worker
3322*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4f32_s32:
3323*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4f32_f32:
3324*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4f32_f32:
3325*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4f32_f32:
3326*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4f32_s32:
3327*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4f32_f32:
3328*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4f32_f32:
3329*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4f32_f32:
3330*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4f32_s32:
3331*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4f32_f32:
3332*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4f32_f32:
3333*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4f32_f32:
3334*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4f32_s32:
3335*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4f32_f32:
3336*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4f32_f32:
3337*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4f32_f32:
3338*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4f32_s32:
3339*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4f32_f32:
3340*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4f32_f32:
3341*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4f32_f32:
3342*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4f32_f32:
3343*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4f32_f32:
3344*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4f32_f32:
3345*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4f32_f32:
3346*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4f32_f32:
3347*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4f32_f32:
3348*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4f32_f32:
3349*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4f32_f32:
3350*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4f32_s32:
3351*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4f32_f32:
3352*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4f32_f32:
3353*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4f32_f32:
3354*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4f32_s32:
3355*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4f32_f32:
3356*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4f32_f32:
3357*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4f32_f32:
3358*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4f32_s32:
3359*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4f32_f32:
3360*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4f32_f32:
3361*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4f32_f32:
3362*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4f32_s32:
3363*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4f32_f32:
3364*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4f32_f32:
3365*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4f32_f32:
3366*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4f32_s32:
3367*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4f32_f32:
3368*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4f32_f32:
3369*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4f32_f32:
3370*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4f32_f32:
3371*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4f32_f32:
3372*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4f32_f32:
3373*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4f32_f32:
3374*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4f32_f32:
3375*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4f32_f32:
3376*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4f32_f32:
3377*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4f32_f32: {
3378*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForTextureInstr(Intrinsic);
3379*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::v4f32;
3380*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3381*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3382*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3383*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3384*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3385*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3386*9880d681SAndroid Build Coastguard Worker return true;
3387*9880d681SAndroid Build Coastguard Worker }
3388*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4s32_s32:
3389*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4s32_f32:
3390*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4s32_f32:
3391*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4s32_f32:
3392*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4s32_s32:
3393*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4s32_f32:
3394*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4s32_f32:
3395*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4s32_f32:
3396*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4s32_s32:
3397*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4s32_f32:
3398*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4s32_f32:
3399*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4s32_f32:
3400*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4s32_s32:
3401*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4s32_f32:
3402*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4s32_f32:
3403*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4s32_f32:
3404*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4s32_s32:
3405*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4s32_f32:
3406*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4s32_f32:
3407*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4s32_f32:
3408*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4s32_f32:
3409*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4s32_f32:
3410*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4s32_f32:
3411*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4s32_f32:
3412*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_v4u32_f32:
3413*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_level_v4u32_f32:
3414*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_v4u32_f32:
3415*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_cube_array_level_v4u32_f32:
3416*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4u32_s32:
3417*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_v4u32_f32:
3418*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_level_v4u32_f32:
3419*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_grad_v4u32_f32:
3420*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4u32_s32:
3421*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_v4u32_f32:
3422*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_level_v4u32_f32:
3423*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_1d_array_grad_v4u32_f32:
3424*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4u32_s32:
3425*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_v4u32_f32:
3426*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_level_v4u32_f32:
3427*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_grad_v4u32_f32:
3428*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4u32_s32:
3429*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_v4u32_f32:
3430*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_level_v4u32_f32:
3431*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_2d_array_grad_v4u32_f32:
3432*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4u32_s32:
3433*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_v4u32_f32:
3434*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_level_v4u32_f32:
3435*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_3d_grad_v4u32_f32:
3436*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4s32_f32:
3437*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4s32_f32:
3438*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4s32_f32:
3439*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4s32_f32:
3440*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_r_2d_v4u32_f32:
3441*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_g_2d_v4u32_f32:
3442*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_b_2d_v4u32_f32:
3443*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_a_2d_v4u32_f32:
3444*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4s32_s32:
3445*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4s32_f32:
3446*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4s32_f32:
3447*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4s32_f32:
3448*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4s32_s32:
3449*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4s32_f32:
3450*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4s32_f32:
3451*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4s32_f32:
3452*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4s32_s32:
3453*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4s32_f32:
3454*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4s32_f32:
3455*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4s32_f32:
3456*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4s32_s32:
3457*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4s32_f32:
3458*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4s32_f32:
3459*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4s32_f32:
3460*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4s32_s32:
3461*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4s32_f32:
3462*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4s32_f32:
3463*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4s32_f32:
3464*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4u32_s32:
3465*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_v4u32_f32:
3466*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_level_v4u32_f32:
3467*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_grad_v4u32_f32:
3468*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4u32_s32:
3469*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_v4u32_f32:
3470*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_level_v4u32_f32:
3471*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_1d_array_grad_v4u32_f32:
3472*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4u32_s32:
3473*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_v4u32_f32:
3474*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_level_v4u32_f32:
3475*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_grad_v4u32_f32:
3476*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4u32_s32:
3477*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_v4u32_f32:
3478*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_level_v4u32_f32:
3479*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_2d_array_grad_v4u32_f32:
3480*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4u32_s32:
3481*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_v4u32_f32:
3482*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_level_v4u32_f32:
3483*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_3d_grad_v4u32_f32:
3484*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4s32_f32:
3485*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4s32_f32:
3486*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4s32_f32:
3487*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4s32_f32:
3488*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_v4u32_f32:
3489*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_level_v4u32_f32:
3490*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_v4u32_f32:
3491*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tex_unified_cube_array_level_v4u32_f32:
3492*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4s32_f32:
3493*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4s32_f32:
3494*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4s32_f32:
3495*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4s32_f32:
3496*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_r_2d_v4u32_f32:
3497*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_g_2d_v4u32_f32:
3498*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_b_2d_v4u32_f32:
3499*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_tld4_unified_a_2d_v4u32_f32: {
3500*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForTextureInstr(Intrinsic);
3501*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::v4i32;
3502*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3503*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3504*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3505*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3506*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3507*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3508*9880d681SAndroid Build Coastguard Worker return true;
3509*9880d681SAndroid Build Coastguard Worker }
3510*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_clamp:
3511*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_clamp:
3512*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_clamp:
3513*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_clamp:
3514*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_clamp:
3515*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_clamp:
3516*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_clamp:
3517*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_clamp:
3518*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_clamp:
3519*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_clamp:
3520*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_clamp:
3521*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_clamp:
3522*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_clamp:
3523*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_clamp:
3524*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_clamp:
3525*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_trap:
3526*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_trap:
3527*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_trap:
3528*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_trap:
3529*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_trap:
3530*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_trap:
3531*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_trap:
3532*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_trap:
3533*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_trap:
3534*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_trap:
3535*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_trap:
3536*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_trap:
3537*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_trap:
3538*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_trap:
3539*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_trap:
3540*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i8_zero:
3541*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i8_zero:
3542*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i8_zero:
3543*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i8_zero:
3544*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i8_zero:
3545*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i8_zero:
3546*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i8_zero:
3547*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i8_zero:
3548*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i8_zero:
3549*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i8_zero:
3550*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i8_zero:
3551*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i8_zero:
3552*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i8_zero:
3553*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i8_zero:
3554*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i8_zero: {
3555*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForSurfaceInstr(Intrinsic);
3556*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::i8;
3557*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3558*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3559*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3560*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3561*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3562*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3563*9880d681SAndroid Build Coastguard Worker return true;
3564*9880d681SAndroid Build Coastguard Worker }
3565*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_clamp:
3566*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_clamp:
3567*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_clamp:
3568*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_clamp:
3569*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_clamp:
3570*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_clamp:
3571*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_clamp:
3572*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_clamp:
3573*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_clamp:
3574*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_clamp:
3575*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_clamp:
3576*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_clamp:
3577*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_clamp:
3578*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_clamp:
3579*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_clamp:
3580*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_trap:
3581*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_trap:
3582*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_trap:
3583*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_trap:
3584*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_trap:
3585*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_trap:
3586*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_trap:
3587*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_trap:
3588*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_trap:
3589*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_trap:
3590*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_trap:
3591*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_trap:
3592*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_trap:
3593*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_trap:
3594*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_trap:
3595*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i16_zero:
3596*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i16_zero:
3597*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i16_zero:
3598*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i16_zero:
3599*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i16_zero:
3600*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i16_zero:
3601*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i16_zero:
3602*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i16_zero:
3603*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i16_zero:
3604*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i16_zero:
3605*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i16_zero:
3606*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i16_zero:
3607*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i16_zero:
3608*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i16_zero:
3609*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i16_zero: {
3610*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForSurfaceInstr(Intrinsic);
3611*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::i16;
3612*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3613*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3614*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3615*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3616*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3617*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3618*9880d681SAndroid Build Coastguard Worker return true;
3619*9880d681SAndroid Build Coastguard Worker }
3620*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_clamp:
3621*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_clamp:
3622*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_clamp:
3623*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_clamp:
3624*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_clamp:
3625*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_clamp:
3626*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_clamp:
3627*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_clamp:
3628*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_clamp:
3629*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_clamp:
3630*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_clamp:
3631*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_clamp:
3632*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_clamp:
3633*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_clamp:
3634*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_clamp:
3635*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_trap:
3636*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_trap:
3637*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_trap:
3638*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_trap:
3639*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_trap:
3640*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_trap:
3641*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_trap:
3642*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_trap:
3643*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_trap:
3644*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_trap:
3645*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_trap:
3646*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_trap:
3647*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_trap:
3648*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_trap:
3649*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_trap:
3650*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i32_zero:
3651*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i32_zero:
3652*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v4i32_zero:
3653*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i32_zero:
3654*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i32_zero:
3655*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v4i32_zero:
3656*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i32_zero:
3657*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i32_zero:
3658*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v4i32_zero:
3659*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i32_zero:
3660*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i32_zero:
3661*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v4i32_zero:
3662*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i32_zero:
3663*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i32_zero:
3664*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v4i32_zero: {
3665*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForSurfaceInstr(Intrinsic);
3666*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::i32;
3667*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3668*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3669*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3670*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3671*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3672*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3673*9880d681SAndroid Build Coastguard Worker return true;
3674*9880d681SAndroid Build Coastguard Worker }
3675*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_clamp:
3676*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_clamp:
3677*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_clamp:
3678*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_clamp:
3679*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_clamp:
3680*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_clamp:
3681*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_clamp:
3682*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_clamp:
3683*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_clamp:
3684*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_clamp:
3685*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_trap:
3686*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_trap:
3687*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_trap:
3688*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_trap:
3689*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_trap:
3690*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_trap:
3691*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_trap:
3692*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_trap:
3693*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_trap:
3694*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_trap:
3695*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_i64_zero:
3696*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_v2i64_zero:
3697*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_i64_zero:
3698*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_1d_array_v2i64_zero:
3699*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_i64_zero:
3700*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_v2i64_zero:
3701*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_i64_zero:
3702*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_2d_array_v2i64_zero:
3703*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_i64_zero:
3704*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_suld_3d_v2i64_zero: {
3705*9880d681SAndroid Build Coastguard Worker Info.opc = getOpcForSurfaceInstr(Intrinsic);
3706*9880d681SAndroid Build Coastguard Worker Info.memVT = MVT::i64;
3707*9880d681SAndroid Build Coastguard Worker Info.ptrVal = nullptr;
3708*9880d681SAndroid Build Coastguard Worker Info.offset = 0;
3709*9880d681SAndroid Build Coastguard Worker Info.vol = 0;
3710*9880d681SAndroid Build Coastguard Worker Info.readMem = true;
3711*9880d681SAndroid Build Coastguard Worker Info.writeMem = false;
3712*9880d681SAndroid Build Coastguard Worker Info.align = 16;
3713*9880d681SAndroid Build Coastguard Worker return true;
3714*9880d681SAndroid Build Coastguard Worker }
3715*9880d681SAndroid Build Coastguard Worker }
3716*9880d681SAndroid Build Coastguard Worker return false;
3717*9880d681SAndroid Build Coastguard Worker }
3718*9880d681SAndroid Build Coastguard Worker
3719*9880d681SAndroid Build Coastguard Worker /// isLegalAddressingMode - Return true if the addressing mode represented
3720*9880d681SAndroid Build Coastguard Worker /// by AM is legal for this target, for a load/store of the specified type.
3721*9880d681SAndroid Build Coastguard Worker /// Used to guide target specific optimizations, like loop strength reduction
3722*9880d681SAndroid Build Coastguard Worker /// (LoopStrengthReduce.cpp) and memory optimization for address mode
3723*9880d681SAndroid Build Coastguard Worker /// (CodeGenPrepare.cpp)
isLegalAddressingMode(const DataLayout & DL,const AddrMode & AM,Type * Ty,unsigned AS) const3724*9880d681SAndroid Build Coastguard Worker bool NVPTXTargetLowering::isLegalAddressingMode(const DataLayout &DL,
3725*9880d681SAndroid Build Coastguard Worker const AddrMode &AM, Type *Ty,
3726*9880d681SAndroid Build Coastguard Worker unsigned AS) const {
3727*9880d681SAndroid Build Coastguard Worker
3728*9880d681SAndroid Build Coastguard Worker // AddrMode - This represents an addressing mode of:
3729*9880d681SAndroid Build Coastguard Worker // BaseGV + BaseOffs + BaseReg + Scale*ScaleReg
3730*9880d681SAndroid Build Coastguard Worker //
3731*9880d681SAndroid Build Coastguard Worker // The legal address modes are
3732*9880d681SAndroid Build Coastguard Worker // - [avar]
3733*9880d681SAndroid Build Coastguard Worker // - [areg]
3734*9880d681SAndroid Build Coastguard Worker // - [areg+immoff]
3735*9880d681SAndroid Build Coastguard Worker // - [immAddr]
3736*9880d681SAndroid Build Coastguard Worker
3737*9880d681SAndroid Build Coastguard Worker if (AM.BaseGV) {
3738*9880d681SAndroid Build Coastguard Worker return !AM.BaseOffs && !AM.HasBaseReg && !AM.Scale;
3739*9880d681SAndroid Build Coastguard Worker }
3740*9880d681SAndroid Build Coastguard Worker
3741*9880d681SAndroid Build Coastguard Worker switch (AM.Scale) {
3742*9880d681SAndroid Build Coastguard Worker case 0: // "r", "r+i" or "i" is allowed
3743*9880d681SAndroid Build Coastguard Worker break;
3744*9880d681SAndroid Build Coastguard Worker case 1:
3745*9880d681SAndroid Build Coastguard Worker if (AM.HasBaseReg) // "r+r+i" or "r+r" is not allowed.
3746*9880d681SAndroid Build Coastguard Worker return false;
3747*9880d681SAndroid Build Coastguard Worker // Otherwise we have r+i.
3748*9880d681SAndroid Build Coastguard Worker break;
3749*9880d681SAndroid Build Coastguard Worker default:
3750*9880d681SAndroid Build Coastguard Worker // No scale > 1 is allowed
3751*9880d681SAndroid Build Coastguard Worker return false;
3752*9880d681SAndroid Build Coastguard Worker }
3753*9880d681SAndroid Build Coastguard Worker return true;
3754*9880d681SAndroid Build Coastguard Worker }
3755*9880d681SAndroid Build Coastguard Worker
3756*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
3757*9880d681SAndroid Build Coastguard Worker // NVPTX Inline Assembly Support
3758*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
3759*9880d681SAndroid Build Coastguard Worker
3760*9880d681SAndroid Build Coastguard Worker /// getConstraintType - Given a constraint letter, return the type of
3761*9880d681SAndroid Build Coastguard Worker /// constraint it is for this target.
3762*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::ConstraintType
getConstraintType(StringRef Constraint) const3763*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::getConstraintType(StringRef Constraint) const {
3764*9880d681SAndroid Build Coastguard Worker if (Constraint.size() == 1) {
3765*9880d681SAndroid Build Coastguard Worker switch (Constraint[0]) {
3766*9880d681SAndroid Build Coastguard Worker default:
3767*9880d681SAndroid Build Coastguard Worker break;
3768*9880d681SAndroid Build Coastguard Worker case 'b':
3769*9880d681SAndroid Build Coastguard Worker case 'r':
3770*9880d681SAndroid Build Coastguard Worker case 'h':
3771*9880d681SAndroid Build Coastguard Worker case 'c':
3772*9880d681SAndroid Build Coastguard Worker case 'l':
3773*9880d681SAndroid Build Coastguard Worker case 'f':
3774*9880d681SAndroid Build Coastguard Worker case 'd':
3775*9880d681SAndroid Build Coastguard Worker case '0':
3776*9880d681SAndroid Build Coastguard Worker case 'N':
3777*9880d681SAndroid Build Coastguard Worker return C_RegisterClass;
3778*9880d681SAndroid Build Coastguard Worker }
3779*9880d681SAndroid Build Coastguard Worker }
3780*9880d681SAndroid Build Coastguard Worker return TargetLowering::getConstraintType(Constraint);
3781*9880d681SAndroid Build Coastguard Worker }
3782*9880d681SAndroid Build Coastguard Worker
3783*9880d681SAndroid Build Coastguard Worker std::pair<unsigned, const TargetRegisterClass *>
getRegForInlineAsmConstraint(const TargetRegisterInfo * TRI,StringRef Constraint,MVT VT) const3784*9880d681SAndroid Build Coastguard Worker NVPTXTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
3785*9880d681SAndroid Build Coastguard Worker StringRef Constraint,
3786*9880d681SAndroid Build Coastguard Worker MVT VT) const {
3787*9880d681SAndroid Build Coastguard Worker if (Constraint.size() == 1) {
3788*9880d681SAndroid Build Coastguard Worker switch (Constraint[0]) {
3789*9880d681SAndroid Build Coastguard Worker case 'b':
3790*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Int1RegsRegClass);
3791*9880d681SAndroid Build Coastguard Worker case 'c':
3792*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Int16RegsRegClass);
3793*9880d681SAndroid Build Coastguard Worker case 'h':
3794*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Int16RegsRegClass);
3795*9880d681SAndroid Build Coastguard Worker case 'r':
3796*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Int32RegsRegClass);
3797*9880d681SAndroid Build Coastguard Worker case 'l':
3798*9880d681SAndroid Build Coastguard Worker case 'N':
3799*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Int64RegsRegClass);
3800*9880d681SAndroid Build Coastguard Worker case 'f':
3801*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Float32RegsRegClass);
3802*9880d681SAndroid Build Coastguard Worker case 'd':
3803*9880d681SAndroid Build Coastguard Worker return std::make_pair(0U, &NVPTX::Float64RegsRegClass);
3804*9880d681SAndroid Build Coastguard Worker }
3805*9880d681SAndroid Build Coastguard Worker }
3806*9880d681SAndroid Build Coastguard Worker return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
3807*9880d681SAndroid Build Coastguard Worker }
3808*9880d681SAndroid Build Coastguard Worker
3809*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
3810*9880d681SAndroid Build Coastguard Worker // NVPTX DAG Combining
3811*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
3812*9880d681SAndroid Build Coastguard Worker
allowFMA(MachineFunction & MF,CodeGenOpt::Level OptLevel) const3813*9880d681SAndroid Build Coastguard Worker bool NVPTXTargetLowering::allowFMA(MachineFunction &MF,
3814*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel) const {
3815*9880d681SAndroid Build Coastguard Worker const Function *F = MF.getFunction();
3816*9880d681SAndroid Build Coastguard Worker const TargetOptions &TO = MF.getTarget().Options;
3817*9880d681SAndroid Build Coastguard Worker
3818*9880d681SAndroid Build Coastguard Worker // Always honor command-line argument
3819*9880d681SAndroid Build Coastguard Worker if (FMAContractLevelOpt.getNumOccurrences() > 0) {
3820*9880d681SAndroid Build Coastguard Worker return FMAContractLevelOpt > 0;
3821*9880d681SAndroid Build Coastguard Worker } else if (OptLevel == 0) {
3822*9880d681SAndroid Build Coastguard Worker // Do not contract if we're not optimizing the code
3823*9880d681SAndroid Build Coastguard Worker return false;
3824*9880d681SAndroid Build Coastguard Worker } else if (TO.AllowFPOpFusion == FPOpFusion::Fast || TO.UnsafeFPMath) {
3825*9880d681SAndroid Build Coastguard Worker // Honor TargetOptions flags that explicitly say fusion is okay
3826*9880d681SAndroid Build Coastguard Worker return true;
3827*9880d681SAndroid Build Coastguard Worker } else if (F->hasFnAttribute("unsafe-fp-math")) {
3828*9880d681SAndroid Build Coastguard Worker // Check for unsafe-fp-math=true coming from Clang
3829*9880d681SAndroid Build Coastguard Worker Attribute Attr = F->getFnAttribute("unsafe-fp-math");
3830*9880d681SAndroid Build Coastguard Worker StringRef Val = Attr.getValueAsString();
3831*9880d681SAndroid Build Coastguard Worker if (Val == "true")
3832*9880d681SAndroid Build Coastguard Worker return true;
3833*9880d681SAndroid Build Coastguard Worker }
3834*9880d681SAndroid Build Coastguard Worker
3835*9880d681SAndroid Build Coastguard Worker // We did not have a clear indication that fusion is allowed, so assume not
3836*9880d681SAndroid Build Coastguard Worker return false;
3837*9880d681SAndroid Build Coastguard Worker }
3838*9880d681SAndroid Build Coastguard Worker
3839*9880d681SAndroid Build Coastguard Worker /// PerformADDCombineWithOperands - Try DAG combinations for an ADD with
3840*9880d681SAndroid Build Coastguard Worker /// operands N0 and N1. This is a helper for PerformADDCombine that is
3841*9880d681SAndroid Build Coastguard Worker /// called with the default operands, and if that fails, with commuted
3842*9880d681SAndroid Build Coastguard Worker /// operands.
PerformADDCombineWithOperands(SDNode * N,SDValue N0,SDValue N1,TargetLowering::DAGCombinerInfo & DCI,const NVPTXSubtarget & Subtarget,CodeGenOpt::Level OptLevel)3843*9880d681SAndroid Build Coastguard Worker static SDValue PerformADDCombineWithOperands(SDNode *N, SDValue N0, SDValue N1,
3844*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI,
3845*9880d681SAndroid Build Coastguard Worker const NVPTXSubtarget &Subtarget,
3846*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel) {
3847*9880d681SAndroid Build Coastguard Worker SelectionDAG &DAG = DCI.DAG;
3848*9880d681SAndroid Build Coastguard Worker // Skip non-integer, non-scalar case
3849*9880d681SAndroid Build Coastguard Worker EVT VT=N0.getValueType();
3850*9880d681SAndroid Build Coastguard Worker if (VT.isVector())
3851*9880d681SAndroid Build Coastguard Worker return SDValue();
3852*9880d681SAndroid Build Coastguard Worker
3853*9880d681SAndroid Build Coastguard Worker // fold (add (mul a, b), c) -> (mad a, b, c)
3854*9880d681SAndroid Build Coastguard Worker //
3855*9880d681SAndroid Build Coastguard Worker if (N0.getOpcode() == ISD::MUL) {
3856*9880d681SAndroid Build Coastguard Worker assert (VT.isInteger());
3857*9880d681SAndroid Build Coastguard Worker // For integer:
3858*9880d681SAndroid Build Coastguard Worker // Since integer multiply-add costs the same as integer multiply
3859*9880d681SAndroid Build Coastguard Worker // but is more costly than integer add, do the fusion only when
3860*9880d681SAndroid Build Coastguard Worker // the mul is only used in the add.
3861*9880d681SAndroid Build Coastguard Worker if (OptLevel==CodeGenOpt::None || VT != MVT::i32 ||
3862*9880d681SAndroid Build Coastguard Worker !N0.getNode()->hasOneUse())
3863*9880d681SAndroid Build Coastguard Worker return SDValue();
3864*9880d681SAndroid Build Coastguard Worker
3865*9880d681SAndroid Build Coastguard Worker // Do the folding
3866*9880d681SAndroid Build Coastguard Worker return DAG.getNode(NVPTXISD::IMAD, SDLoc(N), VT,
3867*9880d681SAndroid Build Coastguard Worker N0.getOperand(0), N0.getOperand(1), N1);
3868*9880d681SAndroid Build Coastguard Worker }
3869*9880d681SAndroid Build Coastguard Worker else if (N0.getOpcode() == ISD::FMUL) {
3870*9880d681SAndroid Build Coastguard Worker if (VT == MVT::f32 || VT == MVT::f64) {
3871*9880d681SAndroid Build Coastguard Worker const auto *TLI = static_cast<const NVPTXTargetLowering *>(
3872*9880d681SAndroid Build Coastguard Worker &DAG.getTargetLoweringInfo());
3873*9880d681SAndroid Build Coastguard Worker if (!TLI->allowFMA(DAG.getMachineFunction(), OptLevel))
3874*9880d681SAndroid Build Coastguard Worker return SDValue();
3875*9880d681SAndroid Build Coastguard Worker
3876*9880d681SAndroid Build Coastguard Worker // For floating point:
3877*9880d681SAndroid Build Coastguard Worker // Do the fusion only when the mul has less than 5 uses and all
3878*9880d681SAndroid Build Coastguard Worker // are add.
3879*9880d681SAndroid Build Coastguard Worker // The heuristic is that if a use is not an add, then that use
3880*9880d681SAndroid Build Coastguard Worker // cannot be fused into fma, therefore mul is still needed anyway.
3881*9880d681SAndroid Build Coastguard Worker // If there are more than 4 uses, even if they are all add, fusing
3882*9880d681SAndroid Build Coastguard Worker // them will increase register pressue.
3883*9880d681SAndroid Build Coastguard Worker //
3884*9880d681SAndroid Build Coastguard Worker int numUses = 0;
3885*9880d681SAndroid Build Coastguard Worker int nonAddCount = 0;
3886*9880d681SAndroid Build Coastguard Worker for (SDNode::use_iterator UI = N0.getNode()->use_begin(),
3887*9880d681SAndroid Build Coastguard Worker UE = N0.getNode()->use_end();
3888*9880d681SAndroid Build Coastguard Worker UI != UE; ++UI) {
3889*9880d681SAndroid Build Coastguard Worker numUses++;
3890*9880d681SAndroid Build Coastguard Worker SDNode *User = *UI;
3891*9880d681SAndroid Build Coastguard Worker if (User->getOpcode() != ISD::FADD)
3892*9880d681SAndroid Build Coastguard Worker ++nonAddCount;
3893*9880d681SAndroid Build Coastguard Worker }
3894*9880d681SAndroid Build Coastguard Worker if (numUses >= 5)
3895*9880d681SAndroid Build Coastguard Worker return SDValue();
3896*9880d681SAndroid Build Coastguard Worker if (nonAddCount) {
3897*9880d681SAndroid Build Coastguard Worker int orderNo = N->getIROrder();
3898*9880d681SAndroid Build Coastguard Worker int orderNo2 = N0.getNode()->getIROrder();
3899*9880d681SAndroid Build Coastguard Worker // simple heuristics here for considering potential register
3900*9880d681SAndroid Build Coastguard Worker // pressure, the logics here is that the differnce are used
3901*9880d681SAndroid Build Coastguard Worker // to measure the distance between def and use, the longer distance
3902*9880d681SAndroid Build Coastguard Worker // more likely cause register pressure.
3903*9880d681SAndroid Build Coastguard Worker if (orderNo - orderNo2 < 500)
3904*9880d681SAndroid Build Coastguard Worker return SDValue();
3905*9880d681SAndroid Build Coastguard Worker
3906*9880d681SAndroid Build Coastguard Worker // Now, check if at least one of the FMUL's operands is live beyond the node N,
3907*9880d681SAndroid Build Coastguard Worker // which guarantees that the FMA will not increase register pressure at node N.
3908*9880d681SAndroid Build Coastguard Worker bool opIsLive = false;
3909*9880d681SAndroid Build Coastguard Worker const SDNode *left = N0.getOperand(0).getNode();
3910*9880d681SAndroid Build Coastguard Worker const SDNode *right = N0.getOperand(1).getNode();
3911*9880d681SAndroid Build Coastguard Worker
3912*9880d681SAndroid Build Coastguard Worker if (isa<ConstantSDNode>(left) || isa<ConstantSDNode>(right))
3913*9880d681SAndroid Build Coastguard Worker opIsLive = true;
3914*9880d681SAndroid Build Coastguard Worker
3915*9880d681SAndroid Build Coastguard Worker if (!opIsLive)
3916*9880d681SAndroid Build Coastguard Worker for (SDNode::use_iterator UI = left->use_begin(), UE = left->use_end(); UI != UE; ++UI) {
3917*9880d681SAndroid Build Coastguard Worker SDNode *User = *UI;
3918*9880d681SAndroid Build Coastguard Worker int orderNo3 = User->getIROrder();
3919*9880d681SAndroid Build Coastguard Worker if (orderNo3 > orderNo) {
3920*9880d681SAndroid Build Coastguard Worker opIsLive = true;
3921*9880d681SAndroid Build Coastguard Worker break;
3922*9880d681SAndroid Build Coastguard Worker }
3923*9880d681SAndroid Build Coastguard Worker }
3924*9880d681SAndroid Build Coastguard Worker
3925*9880d681SAndroid Build Coastguard Worker if (!opIsLive)
3926*9880d681SAndroid Build Coastguard Worker for (SDNode::use_iterator UI = right->use_begin(), UE = right->use_end(); UI != UE; ++UI) {
3927*9880d681SAndroid Build Coastguard Worker SDNode *User = *UI;
3928*9880d681SAndroid Build Coastguard Worker int orderNo3 = User->getIROrder();
3929*9880d681SAndroid Build Coastguard Worker if (orderNo3 > orderNo) {
3930*9880d681SAndroid Build Coastguard Worker opIsLive = true;
3931*9880d681SAndroid Build Coastguard Worker break;
3932*9880d681SAndroid Build Coastguard Worker }
3933*9880d681SAndroid Build Coastguard Worker }
3934*9880d681SAndroid Build Coastguard Worker
3935*9880d681SAndroid Build Coastguard Worker if (!opIsLive)
3936*9880d681SAndroid Build Coastguard Worker return SDValue();
3937*9880d681SAndroid Build Coastguard Worker }
3938*9880d681SAndroid Build Coastguard Worker
3939*9880d681SAndroid Build Coastguard Worker return DAG.getNode(ISD::FMA, SDLoc(N), VT,
3940*9880d681SAndroid Build Coastguard Worker N0.getOperand(0), N0.getOperand(1), N1);
3941*9880d681SAndroid Build Coastguard Worker }
3942*9880d681SAndroid Build Coastguard Worker }
3943*9880d681SAndroid Build Coastguard Worker
3944*9880d681SAndroid Build Coastguard Worker return SDValue();
3945*9880d681SAndroid Build Coastguard Worker }
3946*9880d681SAndroid Build Coastguard Worker
3947*9880d681SAndroid Build Coastguard Worker /// PerformADDCombine - Target-specific dag combine xforms for ISD::ADD.
3948*9880d681SAndroid Build Coastguard Worker ///
PerformADDCombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI,const NVPTXSubtarget & Subtarget,CodeGenOpt::Level OptLevel)3949*9880d681SAndroid Build Coastguard Worker static SDValue PerformADDCombine(SDNode *N,
3950*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI,
3951*9880d681SAndroid Build Coastguard Worker const NVPTXSubtarget &Subtarget,
3952*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel) {
3953*9880d681SAndroid Build Coastguard Worker SDValue N0 = N->getOperand(0);
3954*9880d681SAndroid Build Coastguard Worker SDValue N1 = N->getOperand(1);
3955*9880d681SAndroid Build Coastguard Worker
3956*9880d681SAndroid Build Coastguard Worker // First try with the default operand order.
3957*9880d681SAndroid Build Coastguard Worker if (SDValue Result =
3958*9880d681SAndroid Build Coastguard Worker PerformADDCombineWithOperands(N, N0, N1, DCI, Subtarget, OptLevel))
3959*9880d681SAndroid Build Coastguard Worker return Result;
3960*9880d681SAndroid Build Coastguard Worker
3961*9880d681SAndroid Build Coastguard Worker // If that didn't work, try again with the operands commuted.
3962*9880d681SAndroid Build Coastguard Worker return PerformADDCombineWithOperands(N, N1, N0, DCI, Subtarget, OptLevel);
3963*9880d681SAndroid Build Coastguard Worker }
3964*9880d681SAndroid Build Coastguard Worker
PerformANDCombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI)3965*9880d681SAndroid Build Coastguard Worker static SDValue PerformANDCombine(SDNode *N,
3966*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI) {
3967*9880d681SAndroid Build Coastguard Worker // The type legalizer turns a vector load of i8 values into a zextload to i16
3968*9880d681SAndroid Build Coastguard Worker // registers, optionally ANY_EXTENDs it (if target type is integer),
3969*9880d681SAndroid Build Coastguard Worker // and ANDs off the high 8 bits. Since we turn this load into a
3970*9880d681SAndroid Build Coastguard Worker // target-specific DAG node, the DAG combiner fails to eliminate these AND
3971*9880d681SAndroid Build Coastguard Worker // nodes. Do that here.
3972*9880d681SAndroid Build Coastguard Worker SDValue Val = N->getOperand(0);
3973*9880d681SAndroid Build Coastguard Worker SDValue Mask = N->getOperand(1);
3974*9880d681SAndroid Build Coastguard Worker
3975*9880d681SAndroid Build Coastguard Worker if (isa<ConstantSDNode>(Val)) {
3976*9880d681SAndroid Build Coastguard Worker std::swap(Val, Mask);
3977*9880d681SAndroid Build Coastguard Worker }
3978*9880d681SAndroid Build Coastguard Worker
3979*9880d681SAndroid Build Coastguard Worker SDValue AExt;
3980*9880d681SAndroid Build Coastguard Worker // Generally, we will see zextload -> IMOV16rr -> ANY_EXTEND -> and
3981*9880d681SAndroid Build Coastguard Worker if (Val.getOpcode() == ISD::ANY_EXTEND) {
3982*9880d681SAndroid Build Coastguard Worker AExt = Val;
3983*9880d681SAndroid Build Coastguard Worker Val = Val->getOperand(0);
3984*9880d681SAndroid Build Coastguard Worker }
3985*9880d681SAndroid Build Coastguard Worker
3986*9880d681SAndroid Build Coastguard Worker if (Val->isMachineOpcode() && Val->getMachineOpcode() == NVPTX::IMOV16rr) {
3987*9880d681SAndroid Build Coastguard Worker Val = Val->getOperand(0);
3988*9880d681SAndroid Build Coastguard Worker }
3989*9880d681SAndroid Build Coastguard Worker
3990*9880d681SAndroid Build Coastguard Worker if (Val->getOpcode() == NVPTXISD::LoadV2 ||
3991*9880d681SAndroid Build Coastguard Worker Val->getOpcode() == NVPTXISD::LoadV4) {
3992*9880d681SAndroid Build Coastguard Worker ConstantSDNode *MaskCnst = dyn_cast<ConstantSDNode>(Mask);
3993*9880d681SAndroid Build Coastguard Worker if (!MaskCnst) {
3994*9880d681SAndroid Build Coastguard Worker // Not an AND with a constant
3995*9880d681SAndroid Build Coastguard Worker return SDValue();
3996*9880d681SAndroid Build Coastguard Worker }
3997*9880d681SAndroid Build Coastguard Worker
3998*9880d681SAndroid Build Coastguard Worker uint64_t MaskVal = MaskCnst->getZExtValue();
3999*9880d681SAndroid Build Coastguard Worker if (MaskVal != 0xff) {
4000*9880d681SAndroid Build Coastguard Worker // Not an AND that chops off top 8 bits
4001*9880d681SAndroid Build Coastguard Worker return SDValue();
4002*9880d681SAndroid Build Coastguard Worker }
4003*9880d681SAndroid Build Coastguard Worker
4004*9880d681SAndroid Build Coastguard Worker MemSDNode *Mem = dyn_cast<MemSDNode>(Val);
4005*9880d681SAndroid Build Coastguard Worker if (!Mem) {
4006*9880d681SAndroid Build Coastguard Worker // Not a MemSDNode?!?
4007*9880d681SAndroid Build Coastguard Worker return SDValue();
4008*9880d681SAndroid Build Coastguard Worker }
4009*9880d681SAndroid Build Coastguard Worker
4010*9880d681SAndroid Build Coastguard Worker EVT MemVT = Mem->getMemoryVT();
4011*9880d681SAndroid Build Coastguard Worker if (MemVT != MVT::v2i8 && MemVT != MVT::v4i8) {
4012*9880d681SAndroid Build Coastguard Worker // We only handle the i8 case
4013*9880d681SAndroid Build Coastguard Worker return SDValue();
4014*9880d681SAndroid Build Coastguard Worker }
4015*9880d681SAndroid Build Coastguard Worker
4016*9880d681SAndroid Build Coastguard Worker unsigned ExtType =
4017*9880d681SAndroid Build Coastguard Worker cast<ConstantSDNode>(Val->getOperand(Val->getNumOperands()-1))->
4018*9880d681SAndroid Build Coastguard Worker getZExtValue();
4019*9880d681SAndroid Build Coastguard Worker if (ExtType == ISD::SEXTLOAD) {
4020*9880d681SAndroid Build Coastguard Worker // If for some reason the load is a sextload, the and is needed to zero
4021*9880d681SAndroid Build Coastguard Worker // out the high 8 bits
4022*9880d681SAndroid Build Coastguard Worker return SDValue();
4023*9880d681SAndroid Build Coastguard Worker }
4024*9880d681SAndroid Build Coastguard Worker
4025*9880d681SAndroid Build Coastguard Worker bool AddTo = false;
4026*9880d681SAndroid Build Coastguard Worker if (AExt.getNode() != 0) {
4027*9880d681SAndroid Build Coastguard Worker // Re-insert the ext as a zext.
4028*9880d681SAndroid Build Coastguard Worker Val = DCI.DAG.getNode(ISD::ZERO_EXTEND, SDLoc(N),
4029*9880d681SAndroid Build Coastguard Worker AExt.getValueType(), Val);
4030*9880d681SAndroid Build Coastguard Worker AddTo = true;
4031*9880d681SAndroid Build Coastguard Worker }
4032*9880d681SAndroid Build Coastguard Worker
4033*9880d681SAndroid Build Coastguard Worker // If we get here, the AND is unnecessary. Just replace it with the load
4034*9880d681SAndroid Build Coastguard Worker DCI.CombineTo(N, Val, AddTo);
4035*9880d681SAndroid Build Coastguard Worker }
4036*9880d681SAndroid Build Coastguard Worker
4037*9880d681SAndroid Build Coastguard Worker return SDValue();
4038*9880d681SAndroid Build Coastguard Worker }
4039*9880d681SAndroid Build Coastguard Worker
PerformSELECTCombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI)4040*9880d681SAndroid Build Coastguard Worker static SDValue PerformSELECTCombine(SDNode *N,
4041*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI) {
4042*9880d681SAndroid Build Coastguard Worker // Currently this detects patterns for integer min and max and
4043*9880d681SAndroid Build Coastguard Worker // lowers them to PTX-specific intrinsics that enable hardware
4044*9880d681SAndroid Build Coastguard Worker // support.
4045*9880d681SAndroid Build Coastguard Worker
4046*9880d681SAndroid Build Coastguard Worker const SDValue Cond = N->getOperand(0);
4047*9880d681SAndroid Build Coastguard Worker if (Cond.getOpcode() != ISD::SETCC) return SDValue();
4048*9880d681SAndroid Build Coastguard Worker
4049*9880d681SAndroid Build Coastguard Worker const SDValue LHS = Cond.getOperand(0);
4050*9880d681SAndroid Build Coastguard Worker const SDValue RHS = Cond.getOperand(1);
4051*9880d681SAndroid Build Coastguard Worker const SDValue True = N->getOperand(1);
4052*9880d681SAndroid Build Coastguard Worker const SDValue False = N->getOperand(2);
4053*9880d681SAndroid Build Coastguard Worker if (!(LHS == True && RHS == False) && !(LHS == False && RHS == True))
4054*9880d681SAndroid Build Coastguard Worker return SDValue();
4055*9880d681SAndroid Build Coastguard Worker
4056*9880d681SAndroid Build Coastguard Worker const EVT VT = N->getValueType(0);
4057*9880d681SAndroid Build Coastguard Worker if (VT != MVT::i32 && VT != MVT::i64) return SDValue();
4058*9880d681SAndroid Build Coastguard Worker
4059*9880d681SAndroid Build Coastguard Worker const ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
4060*9880d681SAndroid Build Coastguard Worker SDValue Larger; // The larger of LHS and RHS when condition is true.
4061*9880d681SAndroid Build Coastguard Worker switch (CC) {
4062*9880d681SAndroid Build Coastguard Worker case ISD::SETULT:
4063*9880d681SAndroid Build Coastguard Worker case ISD::SETULE:
4064*9880d681SAndroid Build Coastguard Worker case ISD::SETLT:
4065*9880d681SAndroid Build Coastguard Worker case ISD::SETLE:
4066*9880d681SAndroid Build Coastguard Worker Larger = RHS;
4067*9880d681SAndroid Build Coastguard Worker break;
4068*9880d681SAndroid Build Coastguard Worker
4069*9880d681SAndroid Build Coastguard Worker case ISD::SETGT:
4070*9880d681SAndroid Build Coastguard Worker case ISD::SETGE:
4071*9880d681SAndroid Build Coastguard Worker case ISD::SETUGT:
4072*9880d681SAndroid Build Coastguard Worker case ISD::SETUGE:
4073*9880d681SAndroid Build Coastguard Worker Larger = LHS;
4074*9880d681SAndroid Build Coastguard Worker break;
4075*9880d681SAndroid Build Coastguard Worker
4076*9880d681SAndroid Build Coastguard Worker default:
4077*9880d681SAndroid Build Coastguard Worker return SDValue();
4078*9880d681SAndroid Build Coastguard Worker }
4079*9880d681SAndroid Build Coastguard Worker const bool IsMax = (Larger == True);
4080*9880d681SAndroid Build Coastguard Worker const bool IsSigned = ISD::isSignedIntSetCC(CC);
4081*9880d681SAndroid Build Coastguard Worker
4082*9880d681SAndroid Build Coastguard Worker unsigned IntrinsicId;
4083*9880d681SAndroid Build Coastguard Worker if (VT == MVT::i32) {
4084*9880d681SAndroid Build Coastguard Worker if (IsSigned)
4085*9880d681SAndroid Build Coastguard Worker IntrinsicId = IsMax ? Intrinsic::nvvm_max_i : Intrinsic::nvvm_min_i;
4086*9880d681SAndroid Build Coastguard Worker else
4087*9880d681SAndroid Build Coastguard Worker IntrinsicId = IsMax ? Intrinsic::nvvm_max_ui : Intrinsic::nvvm_min_ui;
4088*9880d681SAndroid Build Coastguard Worker } else {
4089*9880d681SAndroid Build Coastguard Worker assert(VT == MVT::i64);
4090*9880d681SAndroid Build Coastguard Worker if (IsSigned)
4091*9880d681SAndroid Build Coastguard Worker IntrinsicId = IsMax ? Intrinsic::nvvm_max_ll : Intrinsic::nvvm_min_ll;
4092*9880d681SAndroid Build Coastguard Worker else
4093*9880d681SAndroid Build Coastguard Worker IntrinsicId = IsMax ? Intrinsic::nvvm_max_ull : Intrinsic::nvvm_min_ull;
4094*9880d681SAndroid Build Coastguard Worker }
4095*9880d681SAndroid Build Coastguard Worker
4096*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
4097*9880d681SAndroid Build Coastguard Worker return DCI.DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
4098*9880d681SAndroid Build Coastguard Worker DCI.DAG.getConstant(IntrinsicId, DL, VT), LHS, RHS);
4099*9880d681SAndroid Build Coastguard Worker }
4100*9880d681SAndroid Build Coastguard Worker
4101*9880d681SAndroid Build Coastguard Worker enum OperandSignedness {
4102*9880d681SAndroid Build Coastguard Worker Signed = 0,
4103*9880d681SAndroid Build Coastguard Worker Unsigned,
4104*9880d681SAndroid Build Coastguard Worker Unknown
4105*9880d681SAndroid Build Coastguard Worker };
4106*9880d681SAndroid Build Coastguard Worker
4107*9880d681SAndroid Build Coastguard Worker /// IsMulWideOperandDemotable - Checks if the provided DAG node is an operand
4108*9880d681SAndroid Build Coastguard Worker /// that can be demoted to \p OptSize bits without loss of information. The
4109*9880d681SAndroid Build Coastguard Worker /// signedness of the operand, if determinable, is placed in \p S.
IsMulWideOperandDemotable(SDValue Op,unsigned OptSize,OperandSignedness & S)4110*9880d681SAndroid Build Coastguard Worker static bool IsMulWideOperandDemotable(SDValue Op,
4111*9880d681SAndroid Build Coastguard Worker unsigned OptSize,
4112*9880d681SAndroid Build Coastguard Worker OperandSignedness &S) {
4113*9880d681SAndroid Build Coastguard Worker S = Unknown;
4114*9880d681SAndroid Build Coastguard Worker
4115*9880d681SAndroid Build Coastguard Worker if (Op.getOpcode() == ISD::SIGN_EXTEND ||
4116*9880d681SAndroid Build Coastguard Worker Op.getOpcode() == ISD::SIGN_EXTEND_INREG) {
4117*9880d681SAndroid Build Coastguard Worker EVT OrigVT = Op.getOperand(0).getValueType();
4118*9880d681SAndroid Build Coastguard Worker if (OrigVT.getSizeInBits() <= OptSize) {
4119*9880d681SAndroid Build Coastguard Worker S = Signed;
4120*9880d681SAndroid Build Coastguard Worker return true;
4121*9880d681SAndroid Build Coastguard Worker }
4122*9880d681SAndroid Build Coastguard Worker } else if (Op.getOpcode() == ISD::ZERO_EXTEND) {
4123*9880d681SAndroid Build Coastguard Worker EVT OrigVT = Op.getOperand(0).getValueType();
4124*9880d681SAndroid Build Coastguard Worker if (OrigVT.getSizeInBits() <= OptSize) {
4125*9880d681SAndroid Build Coastguard Worker S = Unsigned;
4126*9880d681SAndroid Build Coastguard Worker return true;
4127*9880d681SAndroid Build Coastguard Worker }
4128*9880d681SAndroid Build Coastguard Worker }
4129*9880d681SAndroid Build Coastguard Worker
4130*9880d681SAndroid Build Coastguard Worker return false;
4131*9880d681SAndroid Build Coastguard Worker }
4132*9880d681SAndroid Build Coastguard Worker
4133*9880d681SAndroid Build Coastguard Worker /// AreMulWideOperandsDemotable - Checks if the given LHS and RHS operands can
4134*9880d681SAndroid Build Coastguard Worker /// be demoted to \p OptSize bits without loss of information. If the operands
4135*9880d681SAndroid Build Coastguard Worker /// contain a constant, it should appear as the RHS operand. The signedness of
4136*9880d681SAndroid Build Coastguard Worker /// the operands is placed in \p IsSigned.
AreMulWideOperandsDemotable(SDValue LHS,SDValue RHS,unsigned OptSize,bool & IsSigned)4137*9880d681SAndroid Build Coastguard Worker static bool AreMulWideOperandsDemotable(SDValue LHS, SDValue RHS,
4138*9880d681SAndroid Build Coastguard Worker unsigned OptSize,
4139*9880d681SAndroid Build Coastguard Worker bool &IsSigned) {
4140*9880d681SAndroid Build Coastguard Worker
4141*9880d681SAndroid Build Coastguard Worker OperandSignedness LHSSign;
4142*9880d681SAndroid Build Coastguard Worker
4143*9880d681SAndroid Build Coastguard Worker // The LHS operand must be a demotable op
4144*9880d681SAndroid Build Coastguard Worker if (!IsMulWideOperandDemotable(LHS, OptSize, LHSSign))
4145*9880d681SAndroid Build Coastguard Worker return false;
4146*9880d681SAndroid Build Coastguard Worker
4147*9880d681SAndroid Build Coastguard Worker // We should have been able to determine the signedness from the LHS
4148*9880d681SAndroid Build Coastguard Worker if (LHSSign == Unknown)
4149*9880d681SAndroid Build Coastguard Worker return false;
4150*9880d681SAndroid Build Coastguard Worker
4151*9880d681SAndroid Build Coastguard Worker IsSigned = (LHSSign == Signed);
4152*9880d681SAndroid Build Coastguard Worker
4153*9880d681SAndroid Build Coastguard Worker // The RHS can be a demotable op or a constant
4154*9880d681SAndroid Build Coastguard Worker if (ConstantSDNode *CI = dyn_cast<ConstantSDNode>(RHS)) {
4155*9880d681SAndroid Build Coastguard Worker const APInt &Val = CI->getAPIntValue();
4156*9880d681SAndroid Build Coastguard Worker if (LHSSign == Unsigned) {
4157*9880d681SAndroid Build Coastguard Worker return Val.isIntN(OptSize);
4158*9880d681SAndroid Build Coastguard Worker } else {
4159*9880d681SAndroid Build Coastguard Worker return Val.isSignedIntN(OptSize);
4160*9880d681SAndroid Build Coastguard Worker }
4161*9880d681SAndroid Build Coastguard Worker } else {
4162*9880d681SAndroid Build Coastguard Worker OperandSignedness RHSSign;
4163*9880d681SAndroid Build Coastguard Worker if (!IsMulWideOperandDemotable(RHS, OptSize, RHSSign))
4164*9880d681SAndroid Build Coastguard Worker return false;
4165*9880d681SAndroid Build Coastguard Worker
4166*9880d681SAndroid Build Coastguard Worker return LHSSign == RHSSign;
4167*9880d681SAndroid Build Coastguard Worker }
4168*9880d681SAndroid Build Coastguard Worker }
4169*9880d681SAndroid Build Coastguard Worker
4170*9880d681SAndroid Build Coastguard Worker /// TryMULWIDECombine - Attempt to replace a multiply of M bits with a multiply
4171*9880d681SAndroid Build Coastguard Worker /// of M/2 bits that produces an M-bit result (i.e. mul.wide). This transform
4172*9880d681SAndroid Build Coastguard Worker /// works on both multiply DAG nodes and SHL DAG nodes with a constant shift
4173*9880d681SAndroid Build Coastguard Worker /// amount.
TryMULWIDECombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI)4174*9880d681SAndroid Build Coastguard Worker static SDValue TryMULWIDECombine(SDNode *N,
4175*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI) {
4176*9880d681SAndroid Build Coastguard Worker EVT MulType = N->getValueType(0);
4177*9880d681SAndroid Build Coastguard Worker if (MulType != MVT::i32 && MulType != MVT::i64) {
4178*9880d681SAndroid Build Coastguard Worker return SDValue();
4179*9880d681SAndroid Build Coastguard Worker }
4180*9880d681SAndroid Build Coastguard Worker
4181*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
4182*9880d681SAndroid Build Coastguard Worker unsigned OptSize = MulType.getSizeInBits() >> 1;
4183*9880d681SAndroid Build Coastguard Worker SDValue LHS = N->getOperand(0);
4184*9880d681SAndroid Build Coastguard Worker SDValue RHS = N->getOperand(1);
4185*9880d681SAndroid Build Coastguard Worker
4186*9880d681SAndroid Build Coastguard Worker // Canonicalize the multiply so the constant (if any) is on the right
4187*9880d681SAndroid Build Coastguard Worker if (N->getOpcode() == ISD::MUL) {
4188*9880d681SAndroid Build Coastguard Worker if (isa<ConstantSDNode>(LHS)) {
4189*9880d681SAndroid Build Coastguard Worker std::swap(LHS, RHS);
4190*9880d681SAndroid Build Coastguard Worker }
4191*9880d681SAndroid Build Coastguard Worker }
4192*9880d681SAndroid Build Coastguard Worker
4193*9880d681SAndroid Build Coastguard Worker // If we have a SHL, determine the actual multiply amount
4194*9880d681SAndroid Build Coastguard Worker if (N->getOpcode() == ISD::SHL) {
4195*9880d681SAndroid Build Coastguard Worker ConstantSDNode *ShlRHS = dyn_cast<ConstantSDNode>(RHS);
4196*9880d681SAndroid Build Coastguard Worker if (!ShlRHS) {
4197*9880d681SAndroid Build Coastguard Worker return SDValue();
4198*9880d681SAndroid Build Coastguard Worker }
4199*9880d681SAndroid Build Coastguard Worker
4200*9880d681SAndroid Build Coastguard Worker APInt ShiftAmt = ShlRHS->getAPIntValue();
4201*9880d681SAndroid Build Coastguard Worker unsigned BitWidth = MulType.getSizeInBits();
4202*9880d681SAndroid Build Coastguard Worker if (ShiftAmt.sge(0) && ShiftAmt.slt(BitWidth)) {
4203*9880d681SAndroid Build Coastguard Worker APInt MulVal = APInt(BitWidth, 1) << ShiftAmt;
4204*9880d681SAndroid Build Coastguard Worker RHS = DCI.DAG.getConstant(MulVal, DL, MulType);
4205*9880d681SAndroid Build Coastguard Worker } else {
4206*9880d681SAndroid Build Coastguard Worker return SDValue();
4207*9880d681SAndroid Build Coastguard Worker }
4208*9880d681SAndroid Build Coastguard Worker }
4209*9880d681SAndroid Build Coastguard Worker
4210*9880d681SAndroid Build Coastguard Worker bool Signed;
4211*9880d681SAndroid Build Coastguard Worker // Verify that our operands are demotable
4212*9880d681SAndroid Build Coastguard Worker if (!AreMulWideOperandsDemotable(LHS, RHS, OptSize, Signed)) {
4213*9880d681SAndroid Build Coastguard Worker return SDValue();
4214*9880d681SAndroid Build Coastguard Worker }
4215*9880d681SAndroid Build Coastguard Worker
4216*9880d681SAndroid Build Coastguard Worker EVT DemotedVT;
4217*9880d681SAndroid Build Coastguard Worker if (MulType == MVT::i32) {
4218*9880d681SAndroid Build Coastguard Worker DemotedVT = MVT::i16;
4219*9880d681SAndroid Build Coastguard Worker } else {
4220*9880d681SAndroid Build Coastguard Worker DemotedVT = MVT::i32;
4221*9880d681SAndroid Build Coastguard Worker }
4222*9880d681SAndroid Build Coastguard Worker
4223*9880d681SAndroid Build Coastguard Worker // Truncate the operands to the correct size. Note that these are just for
4224*9880d681SAndroid Build Coastguard Worker // type consistency and will (likely) be eliminated in later phases.
4225*9880d681SAndroid Build Coastguard Worker SDValue TruncLHS =
4226*9880d681SAndroid Build Coastguard Worker DCI.DAG.getNode(ISD::TRUNCATE, DL, DemotedVT, LHS);
4227*9880d681SAndroid Build Coastguard Worker SDValue TruncRHS =
4228*9880d681SAndroid Build Coastguard Worker DCI.DAG.getNode(ISD::TRUNCATE, DL, DemotedVT, RHS);
4229*9880d681SAndroid Build Coastguard Worker
4230*9880d681SAndroid Build Coastguard Worker unsigned Opc;
4231*9880d681SAndroid Build Coastguard Worker if (Signed) {
4232*9880d681SAndroid Build Coastguard Worker Opc = NVPTXISD::MUL_WIDE_SIGNED;
4233*9880d681SAndroid Build Coastguard Worker } else {
4234*9880d681SAndroid Build Coastguard Worker Opc = NVPTXISD::MUL_WIDE_UNSIGNED;
4235*9880d681SAndroid Build Coastguard Worker }
4236*9880d681SAndroid Build Coastguard Worker
4237*9880d681SAndroid Build Coastguard Worker return DCI.DAG.getNode(Opc, DL, MulType, TruncLHS, TruncRHS);
4238*9880d681SAndroid Build Coastguard Worker }
4239*9880d681SAndroid Build Coastguard Worker
4240*9880d681SAndroid Build Coastguard Worker /// PerformMULCombine - Runs PTX-specific DAG combine patterns on MUL nodes.
PerformMULCombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI,CodeGenOpt::Level OptLevel)4241*9880d681SAndroid Build Coastguard Worker static SDValue PerformMULCombine(SDNode *N,
4242*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI,
4243*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel) {
4244*9880d681SAndroid Build Coastguard Worker if (OptLevel > 0) {
4245*9880d681SAndroid Build Coastguard Worker // Try mul.wide combining at OptLevel > 0
4246*9880d681SAndroid Build Coastguard Worker if (SDValue Ret = TryMULWIDECombine(N, DCI))
4247*9880d681SAndroid Build Coastguard Worker return Ret;
4248*9880d681SAndroid Build Coastguard Worker }
4249*9880d681SAndroid Build Coastguard Worker
4250*9880d681SAndroid Build Coastguard Worker return SDValue();
4251*9880d681SAndroid Build Coastguard Worker }
4252*9880d681SAndroid Build Coastguard Worker
4253*9880d681SAndroid Build Coastguard Worker /// PerformSHLCombine - Runs PTX-specific DAG combine patterns on SHL nodes.
PerformSHLCombine(SDNode * N,TargetLowering::DAGCombinerInfo & DCI,CodeGenOpt::Level OptLevel)4254*9880d681SAndroid Build Coastguard Worker static SDValue PerformSHLCombine(SDNode *N,
4255*9880d681SAndroid Build Coastguard Worker TargetLowering::DAGCombinerInfo &DCI,
4256*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel) {
4257*9880d681SAndroid Build Coastguard Worker if (OptLevel > 0) {
4258*9880d681SAndroid Build Coastguard Worker // Try mul.wide combining at OptLevel > 0
4259*9880d681SAndroid Build Coastguard Worker if (SDValue Ret = TryMULWIDECombine(N, DCI))
4260*9880d681SAndroid Build Coastguard Worker return Ret;
4261*9880d681SAndroid Build Coastguard Worker }
4262*9880d681SAndroid Build Coastguard Worker
4263*9880d681SAndroid Build Coastguard Worker return SDValue();
4264*9880d681SAndroid Build Coastguard Worker }
4265*9880d681SAndroid Build Coastguard Worker
PerformDAGCombine(SDNode * N,DAGCombinerInfo & DCI) const4266*9880d681SAndroid Build Coastguard Worker SDValue NVPTXTargetLowering::PerformDAGCombine(SDNode *N,
4267*9880d681SAndroid Build Coastguard Worker DAGCombinerInfo &DCI) const {
4268*9880d681SAndroid Build Coastguard Worker CodeGenOpt::Level OptLevel = getTargetMachine().getOptLevel();
4269*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
4270*9880d681SAndroid Build Coastguard Worker default: break;
4271*9880d681SAndroid Build Coastguard Worker case ISD::ADD:
4272*9880d681SAndroid Build Coastguard Worker case ISD::FADD:
4273*9880d681SAndroid Build Coastguard Worker return PerformADDCombine(N, DCI, STI, OptLevel);
4274*9880d681SAndroid Build Coastguard Worker case ISD::MUL:
4275*9880d681SAndroid Build Coastguard Worker return PerformMULCombine(N, DCI, OptLevel);
4276*9880d681SAndroid Build Coastguard Worker case ISD::SHL:
4277*9880d681SAndroid Build Coastguard Worker return PerformSHLCombine(N, DCI, OptLevel);
4278*9880d681SAndroid Build Coastguard Worker case ISD::AND:
4279*9880d681SAndroid Build Coastguard Worker return PerformANDCombine(N, DCI);
4280*9880d681SAndroid Build Coastguard Worker case ISD::SELECT:
4281*9880d681SAndroid Build Coastguard Worker return PerformSELECTCombine(N, DCI);
4282*9880d681SAndroid Build Coastguard Worker }
4283*9880d681SAndroid Build Coastguard Worker return SDValue();
4284*9880d681SAndroid Build Coastguard Worker }
4285*9880d681SAndroid Build Coastguard Worker
4286*9880d681SAndroid Build Coastguard Worker /// ReplaceVectorLoad - Convert vector loads into multi-output scalar loads.
ReplaceLoadVector(SDNode * N,SelectionDAG & DAG,SmallVectorImpl<SDValue> & Results)4287*9880d681SAndroid Build Coastguard Worker static void ReplaceLoadVector(SDNode *N, SelectionDAG &DAG,
4288*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &Results) {
4289*9880d681SAndroid Build Coastguard Worker EVT ResVT = N->getValueType(0);
4290*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
4291*9880d681SAndroid Build Coastguard Worker
4292*9880d681SAndroid Build Coastguard Worker assert(ResVT.isVector() && "Vector load must have vector type");
4293*9880d681SAndroid Build Coastguard Worker
4294*9880d681SAndroid Build Coastguard Worker // We only handle "native" vector sizes for now, e.g. <4 x double> is not
4295*9880d681SAndroid Build Coastguard Worker // legal. We can (and should) split that into 2 loads of <2 x double> here
4296*9880d681SAndroid Build Coastguard Worker // but I'm leaving that as a TODO for now.
4297*9880d681SAndroid Build Coastguard Worker assert(ResVT.isSimple() && "Can only handle simple types");
4298*9880d681SAndroid Build Coastguard Worker switch (ResVT.getSimpleVT().SimpleTy) {
4299*9880d681SAndroid Build Coastguard Worker default:
4300*9880d681SAndroid Build Coastguard Worker return;
4301*9880d681SAndroid Build Coastguard Worker case MVT::v2i8:
4302*9880d681SAndroid Build Coastguard Worker case MVT::v2i16:
4303*9880d681SAndroid Build Coastguard Worker case MVT::v2i32:
4304*9880d681SAndroid Build Coastguard Worker case MVT::v2i64:
4305*9880d681SAndroid Build Coastguard Worker case MVT::v2f32:
4306*9880d681SAndroid Build Coastguard Worker case MVT::v2f64:
4307*9880d681SAndroid Build Coastguard Worker case MVT::v4i8:
4308*9880d681SAndroid Build Coastguard Worker case MVT::v4i16:
4309*9880d681SAndroid Build Coastguard Worker case MVT::v4i32:
4310*9880d681SAndroid Build Coastguard Worker case MVT::v4f32:
4311*9880d681SAndroid Build Coastguard Worker // This is a "native" vector type
4312*9880d681SAndroid Build Coastguard Worker break;
4313*9880d681SAndroid Build Coastguard Worker }
4314*9880d681SAndroid Build Coastguard Worker
4315*9880d681SAndroid Build Coastguard Worker LoadSDNode *LD = cast<LoadSDNode>(N);
4316*9880d681SAndroid Build Coastguard Worker
4317*9880d681SAndroid Build Coastguard Worker unsigned Align = LD->getAlignment();
4318*9880d681SAndroid Build Coastguard Worker auto &TD = DAG.getDataLayout();
4319*9880d681SAndroid Build Coastguard Worker unsigned PrefAlign =
4320*9880d681SAndroid Build Coastguard Worker TD.getPrefTypeAlignment(ResVT.getTypeForEVT(*DAG.getContext()));
4321*9880d681SAndroid Build Coastguard Worker if (Align < PrefAlign) {
4322*9880d681SAndroid Build Coastguard Worker // This load is not sufficiently aligned, so bail out and let this vector
4323*9880d681SAndroid Build Coastguard Worker // load be scalarized. Note that we may still be able to emit smaller
4324*9880d681SAndroid Build Coastguard Worker // vector loads. For example, if we are loading a <4 x float> with an
4325*9880d681SAndroid Build Coastguard Worker // alignment of 8, this check will fail but the legalizer will try again
4326*9880d681SAndroid Build Coastguard Worker // with 2 x <2 x float>, which will succeed with an alignment of 8.
4327*9880d681SAndroid Build Coastguard Worker return;
4328*9880d681SAndroid Build Coastguard Worker }
4329*9880d681SAndroid Build Coastguard Worker
4330*9880d681SAndroid Build Coastguard Worker EVT EltVT = ResVT.getVectorElementType();
4331*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ResVT.getVectorNumElements();
4332*9880d681SAndroid Build Coastguard Worker
4333*9880d681SAndroid Build Coastguard Worker // Since LoadV2 is a target node, we cannot rely on DAG type legalization.
4334*9880d681SAndroid Build Coastguard Worker // Therefore, we must ensure the type is legal. For i1 and i8, we set the
4335*9880d681SAndroid Build Coastguard Worker // loaded type to i16 and propagate the "real" type as the memory type.
4336*9880d681SAndroid Build Coastguard Worker bool NeedTrunc = false;
4337*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() < 16) {
4338*9880d681SAndroid Build Coastguard Worker EltVT = MVT::i16;
4339*9880d681SAndroid Build Coastguard Worker NeedTrunc = true;
4340*9880d681SAndroid Build Coastguard Worker }
4341*9880d681SAndroid Build Coastguard Worker
4342*9880d681SAndroid Build Coastguard Worker unsigned Opcode = 0;
4343*9880d681SAndroid Build Coastguard Worker SDVTList LdResVTs;
4344*9880d681SAndroid Build Coastguard Worker
4345*9880d681SAndroid Build Coastguard Worker switch (NumElts) {
4346*9880d681SAndroid Build Coastguard Worker default:
4347*9880d681SAndroid Build Coastguard Worker return;
4348*9880d681SAndroid Build Coastguard Worker case 2:
4349*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LoadV2;
4350*9880d681SAndroid Build Coastguard Worker LdResVTs = DAG.getVTList(EltVT, EltVT, MVT::Other);
4351*9880d681SAndroid Build Coastguard Worker break;
4352*9880d681SAndroid Build Coastguard Worker case 4: {
4353*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LoadV4;
4354*9880d681SAndroid Build Coastguard Worker EVT ListVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other };
4355*9880d681SAndroid Build Coastguard Worker LdResVTs = DAG.getVTList(ListVTs);
4356*9880d681SAndroid Build Coastguard Worker break;
4357*9880d681SAndroid Build Coastguard Worker }
4358*9880d681SAndroid Build Coastguard Worker }
4359*9880d681SAndroid Build Coastguard Worker
4360*9880d681SAndroid Build Coastguard Worker // Copy regular operands
4361*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> OtherOps(N->op_begin(), N->op_end());
4362*9880d681SAndroid Build Coastguard Worker
4363*9880d681SAndroid Build Coastguard Worker // The select routine does not have access to the LoadSDNode instance, so
4364*9880d681SAndroid Build Coastguard Worker // pass along the extension information
4365*9880d681SAndroid Build Coastguard Worker OtherOps.push_back(DAG.getIntPtrConstant(LD->getExtensionType(), DL));
4366*9880d681SAndroid Build Coastguard Worker
4367*9880d681SAndroid Build Coastguard Worker SDValue NewLD = DAG.getMemIntrinsicNode(Opcode, DL, LdResVTs, OtherOps,
4368*9880d681SAndroid Build Coastguard Worker LD->getMemoryVT(),
4369*9880d681SAndroid Build Coastguard Worker LD->getMemOperand());
4370*9880d681SAndroid Build Coastguard Worker
4371*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 4> ScalarRes;
4372*9880d681SAndroid Build Coastguard Worker
4373*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; ++i) {
4374*9880d681SAndroid Build Coastguard Worker SDValue Res = NewLD.getValue(i);
4375*9880d681SAndroid Build Coastguard Worker if (NeedTrunc)
4376*9880d681SAndroid Build Coastguard Worker Res = DAG.getNode(ISD::TRUNCATE, DL, ResVT.getVectorElementType(), Res);
4377*9880d681SAndroid Build Coastguard Worker ScalarRes.push_back(Res);
4378*9880d681SAndroid Build Coastguard Worker }
4379*9880d681SAndroid Build Coastguard Worker
4380*9880d681SAndroid Build Coastguard Worker SDValue LoadChain = NewLD.getValue(NumElts);
4381*9880d681SAndroid Build Coastguard Worker
4382*9880d681SAndroid Build Coastguard Worker SDValue BuildVec = DAG.getBuildVector(ResVT, DL, ScalarRes);
4383*9880d681SAndroid Build Coastguard Worker
4384*9880d681SAndroid Build Coastguard Worker Results.push_back(BuildVec);
4385*9880d681SAndroid Build Coastguard Worker Results.push_back(LoadChain);
4386*9880d681SAndroid Build Coastguard Worker }
4387*9880d681SAndroid Build Coastguard Worker
ReplaceINTRINSIC_W_CHAIN(SDNode * N,SelectionDAG & DAG,SmallVectorImpl<SDValue> & Results)4388*9880d681SAndroid Build Coastguard Worker static void ReplaceINTRINSIC_W_CHAIN(SDNode *N, SelectionDAG &DAG,
4389*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<SDValue> &Results) {
4390*9880d681SAndroid Build Coastguard Worker SDValue Chain = N->getOperand(0);
4391*9880d681SAndroid Build Coastguard Worker SDValue Intrin = N->getOperand(1);
4392*9880d681SAndroid Build Coastguard Worker SDLoc DL(N);
4393*9880d681SAndroid Build Coastguard Worker
4394*9880d681SAndroid Build Coastguard Worker // Get the intrinsic ID
4395*9880d681SAndroid Build Coastguard Worker unsigned IntrinNo = cast<ConstantSDNode>(Intrin.getNode())->getZExtValue();
4396*9880d681SAndroid Build Coastguard Worker switch (IntrinNo) {
4397*9880d681SAndroid Build Coastguard Worker default:
4398*9880d681SAndroid Build Coastguard Worker return;
4399*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
4400*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
4401*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p:
4402*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
4403*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
4404*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p: {
4405*9880d681SAndroid Build Coastguard Worker EVT ResVT = N->getValueType(0);
4406*9880d681SAndroid Build Coastguard Worker
4407*9880d681SAndroid Build Coastguard Worker if (ResVT.isVector()) {
4408*9880d681SAndroid Build Coastguard Worker // Vector LDG/LDU
4409*9880d681SAndroid Build Coastguard Worker
4410*9880d681SAndroid Build Coastguard Worker unsigned NumElts = ResVT.getVectorNumElements();
4411*9880d681SAndroid Build Coastguard Worker EVT EltVT = ResVT.getVectorElementType();
4412*9880d681SAndroid Build Coastguard Worker
4413*9880d681SAndroid Build Coastguard Worker // Since LDU/LDG are target nodes, we cannot rely on DAG type
4414*9880d681SAndroid Build Coastguard Worker // legalization.
4415*9880d681SAndroid Build Coastguard Worker // Therefore, we must ensure the type is legal. For i1 and i8, we set the
4416*9880d681SAndroid Build Coastguard Worker // loaded type to i16 and propagate the "real" type as the memory type.
4417*9880d681SAndroid Build Coastguard Worker bool NeedTrunc = false;
4418*9880d681SAndroid Build Coastguard Worker if (EltVT.getSizeInBits() < 16) {
4419*9880d681SAndroid Build Coastguard Worker EltVT = MVT::i16;
4420*9880d681SAndroid Build Coastguard Worker NeedTrunc = true;
4421*9880d681SAndroid Build Coastguard Worker }
4422*9880d681SAndroid Build Coastguard Worker
4423*9880d681SAndroid Build Coastguard Worker unsigned Opcode = 0;
4424*9880d681SAndroid Build Coastguard Worker SDVTList LdResVTs;
4425*9880d681SAndroid Build Coastguard Worker
4426*9880d681SAndroid Build Coastguard Worker switch (NumElts) {
4427*9880d681SAndroid Build Coastguard Worker default:
4428*9880d681SAndroid Build Coastguard Worker return;
4429*9880d681SAndroid Build Coastguard Worker case 2:
4430*9880d681SAndroid Build Coastguard Worker switch (IntrinNo) {
4431*9880d681SAndroid Build Coastguard Worker default:
4432*9880d681SAndroid Build Coastguard Worker return;
4433*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
4434*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
4435*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p:
4436*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LDGV2;
4437*9880d681SAndroid Build Coastguard Worker break;
4438*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
4439*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
4440*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p:
4441*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LDUV2;
4442*9880d681SAndroid Build Coastguard Worker break;
4443*9880d681SAndroid Build Coastguard Worker }
4444*9880d681SAndroid Build Coastguard Worker LdResVTs = DAG.getVTList(EltVT, EltVT, MVT::Other);
4445*9880d681SAndroid Build Coastguard Worker break;
4446*9880d681SAndroid Build Coastguard Worker case 4: {
4447*9880d681SAndroid Build Coastguard Worker switch (IntrinNo) {
4448*9880d681SAndroid Build Coastguard Worker default:
4449*9880d681SAndroid Build Coastguard Worker return;
4450*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_i:
4451*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_f:
4452*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldg_global_p:
4453*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LDGV4;
4454*9880d681SAndroid Build Coastguard Worker break;
4455*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_i:
4456*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_f:
4457*9880d681SAndroid Build Coastguard Worker case Intrinsic::nvvm_ldu_global_p:
4458*9880d681SAndroid Build Coastguard Worker Opcode = NVPTXISD::LDUV4;
4459*9880d681SAndroid Build Coastguard Worker break;
4460*9880d681SAndroid Build Coastguard Worker }
4461*9880d681SAndroid Build Coastguard Worker EVT ListVTs[] = { EltVT, EltVT, EltVT, EltVT, MVT::Other };
4462*9880d681SAndroid Build Coastguard Worker LdResVTs = DAG.getVTList(ListVTs);
4463*9880d681SAndroid Build Coastguard Worker break;
4464*9880d681SAndroid Build Coastguard Worker }
4465*9880d681SAndroid Build Coastguard Worker }
4466*9880d681SAndroid Build Coastguard Worker
4467*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 8> OtherOps;
4468*9880d681SAndroid Build Coastguard Worker
4469*9880d681SAndroid Build Coastguard Worker // Copy regular operands
4470*9880d681SAndroid Build Coastguard Worker
4471*9880d681SAndroid Build Coastguard Worker OtherOps.push_back(Chain); // Chain
4472*9880d681SAndroid Build Coastguard Worker // Skip operand 1 (intrinsic ID)
4473*9880d681SAndroid Build Coastguard Worker // Others
4474*9880d681SAndroid Build Coastguard Worker OtherOps.append(N->op_begin() + 2, N->op_end());
4475*9880d681SAndroid Build Coastguard Worker
4476*9880d681SAndroid Build Coastguard Worker MemIntrinsicSDNode *MemSD = cast<MemIntrinsicSDNode>(N);
4477*9880d681SAndroid Build Coastguard Worker
4478*9880d681SAndroid Build Coastguard Worker SDValue NewLD = DAG.getMemIntrinsicNode(Opcode, DL, LdResVTs, OtherOps,
4479*9880d681SAndroid Build Coastguard Worker MemSD->getMemoryVT(),
4480*9880d681SAndroid Build Coastguard Worker MemSD->getMemOperand());
4481*9880d681SAndroid Build Coastguard Worker
4482*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 4> ScalarRes;
4483*9880d681SAndroid Build Coastguard Worker
4484*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < NumElts; ++i) {
4485*9880d681SAndroid Build Coastguard Worker SDValue Res = NewLD.getValue(i);
4486*9880d681SAndroid Build Coastguard Worker if (NeedTrunc)
4487*9880d681SAndroid Build Coastguard Worker Res =
4488*9880d681SAndroid Build Coastguard Worker DAG.getNode(ISD::TRUNCATE, DL, ResVT.getVectorElementType(), Res);
4489*9880d681SAndroid Build Coastguard Worker ScalarRes.push_back(Res);
4490*9880d681SAndroid Build Coastguard Worker }
4491*9880d681SAndroid Build Coastguard Worker
4492*9880d681SAndroid Build Coastguard Worker SDValue LoadChain = NewLD.getValue(NumElts);
4493*9880d681SAndroid Build Coastguard Worker
4494*9880d681SAndroid Build Coastguard Worker SDValue BuildVec =
4495*9880d681SAndroid Build Coastguard Worker DAG.getBuildVector(ResVT, DL, ScalarRes);
4496*9880d681SAndroid Build Coastguard Worker
4497*9880d681SAndroid Build Coastguard Worker Results.push_back(BuildVec);
4498*9880d681SAndroid Build Coastguard Worker Results.push_back(LoadChain);
4499*9880d681SAndroid Build Coastguard Worker } else {
4500*9880d681SAndroid Build Coastguard Worker // i8 LDG/LDU
4501*9880d681SAndroid Build Coastguard Worker assert(ResVT.isSimple() && ResVT.getSimpleVT().SimpleTy == MVT::i8 &&
4502*9880d681SAndroid Build Coastguard Worker "Custom handling of non-i8 ldu/ldg?");
4503*9880d681SAndroid Build Coastguard Worker
4504*9880d681SAndroid Build Coastguard Worker // Just copy all operands as-is
4505*9880d681SAndroid Build Coastguard Worker SmallVector<SDValue, 4> Ops(N->op_begin(), N->op_end());
4506*9880d681SAndroid Build Coastguard Worker
4507*9880d681SAndroid Build Coastguard Worker // Force output to i16
4508*9880d681SAndroid Build Coastguard Worker SDVTList LdResVTs = DAG.getVTList(MVT::i16, MVT::Other);
4509*9880d681SAndroid Build Coastguard Worker
4510*9880d681SAndroid Build Coastguard Worker MemIntrinsicSDNode *MemSD = cast<MemIntrinsicSDNode>(N);
4511*9880d681SAndroid Build Coastguard Worker
4512*9880d681SAndroid Build Coastguard Worker // We make sure the memory type is i8, which will be used during isel
4513*9880d681SAndroid Build Coastguard Worker // to select the proper instruction.
4514*9880d681SAndroid Build Coastguard Worker SDValue NewLD =
4515*9880d681SAndroid Build Coastguard Worker DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, DL, LdResVTs, Ops,
4516*9880d681SAndroid Build Coastguard Worker MVT::i8, MemSD->getMemOperand());
4517*9880d681SAndroid Build Coastguard Worker
4518*9880d681SAndroid Build Coastguard Worker Results.push_back(DAG.getNode(ISD::TRUNCATE, DL, MVT::i8,
4519*9880d681SAndroid Build Coastguard Worker NewLD.getValue(0)));
4520*9880d681SAndroid Build Coastguard Worker Results.push_back(NewLD.getValue(1));
4521*9880d681SAndroid Build Coastguard Worker }
4522*9880d681SAndroid Build Coastguard Worker }
4523*9880d681SAndroid Build Coastguard Worker }
4524*9880d681SAndroid Build Coastguard Worker }
4525*9880d681SAndroid Build Coastguard Worker
ReplaceNodeResults(SDNode * N,SmallVectorImpl<SDValue> & Results,SelectionDAG & DAG) const4526*9880d681SAndroid Build Coastguard Worker void NVPTXTargetLowering::ReplaceNodeResults(
4527*9880d681SAndroid Build Coastguard Worker SDNode *N, SmallVectorImpl<SDValue> &Results, SelectionDAG &DAG) const {
4528*9880d681SAndroid Build Coastguard Worker switch (N->getOpcode()) {
4529*9880d681SAndroid Build Coastguard Worker default:
4530*9880d681SAndroid Build Coastguard Worker report_fatal_error("Unhandled custom legalization");
4531*9880d681SAndroid Build Coastguard Worker case ISD::LOAD:
4532*9880d681SAndroid Build Coastguard Worker ReplaceLoadVector(N, DAG, Results);
4533*9880d681SAndroid Build Coastguard Worker return;
4534*9880d681SAndroid Build Coastguard Worker case ISD::INTRINSIC_W_CHAIN:
4535*9880d681SAndroid Build Coastguard Worker ReplaceINTRINSIC_W_CHAIN(N, DAG, Results);
4536*9880d681SAndroid Build Coastguard Worker return;
4537*9880d681SAndroid Build Coastguard Worker }
4538*9880d681SAndroid Build Coastguard Worker }
4539*9880d681SAndroid Build Coastguard Worker
4540*9880d681SAndroid Build Coastguard Worker // Pin NVPTXSection's and NVPTXTargetObjectFile's vtables to this file.
anchor()4541*9880d681SAndroid Build Coastguard Worker void NVPTXSection::anchor() {}
4542*9880d681SAndroid Build Coastguard Worker
~NVPTXTargetObjectFile()4543*9880d681SAndroid Build Coastguard Worker NVPTXTargetObjectFile::~NVPTXTargetObjectFile() {
4544*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(TextSection);
4545*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DataSection);
4546*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(BSSSection);
4547*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(ReadOnlySection);
4548*9880d681SAndroid Build Coastguard Worker
4549*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(StaticCtorSection);
4550*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(StaticDtorSection);
4551*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(LSDASection);
4552*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(EHFrameSection);
4553*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfAbbrevSection);
4554*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfInfoSection);
4555*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfLineSection);
4556*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfFrameSection);
4557*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfPubTypesSection);
4558*9880d681SAndroid Build Coastguard Worker delete static_cast<const NVPTXSection *>(DwarfDebugInlineSection);
4559*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfStrSection);
4560*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfLocSection);
4561*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfARangesSection);
4562*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfRangesSection);
4563*9880d681SAndroid Build Coastguard Worker delete static_cast<NVPTXSection *>(DwarfMacinfoSection);
4564*9880d681SAndroid Build Coastguard Worker }
4565*9880d681SAndroid Build Coastguard Worker
4566*9880d681SAndroid Build Coastguard Worker MCSection *
SelectSectionForGlobal(const GlobalValue * GV,SectionKind Kind,Mangler & Mang,const TargetMachine & TM) const4567*9880d681SAndroid Build Coastguard Worker NVPTXTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
4568*9880d681SAndroid Build Coastguard Worker SectionKind Kind, Mangler &Mang,
4569*9880d681SAndroid Build Coastguard Worker const TargetMachine &TM) const {
4570*9880d681SAndroid Build Coastguard Worker return getDataSection();
4571*9880d681SAndroid Build Coastguard Worker }
4572