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