466 case Builtin::BI__builtin_hlsl_adduint64: {
472 "AddUint64 operand types must match");
474 "AddUint64 operands must have an integer representation");
475 assert((NumElements == 2 || NumElements == 4) &&
476 "AddUint64 operands must have 2 or 4 elements");
484 if (NumElements == 2) {
485 LowA =
Builder.CreateExtractElement(OpA, (uint64_t)0,
"LowA");
486 HighA =
Builder.CreateExtractElement(OpA, (uint64_t)1,
"HighA");
487 LowB =
Builder.CreateExtractElement(OpB, (uint64_t)0,
"LowB");
488 HighB =
Builder.CreateExtractElement(OpB, (uint64_t)1,
"HighB");
490 LowA =
Builder.CreateShuffleVector(OpA, {0, 2},
"LowA");
491 HighA =
Builder.CreateShuffleVector(OpA, {1, 3},
"HighA");
492 LowB =
Builder.CreateShuffleVector(OpB, {0, 2},
"LowB");
493 HighB =
Builder.CreateShuffleVector(OpB, {1, 3},
"HighB");
500 *
this, Intrinsic::uadd_with_overflow, LowA, LowB, Carry);
501 llvm::Value *ZExtCarry =
502 Builder.CreateZExt(Carry, HighA->getType(),
"CarryZExt");
505 llvm::Value *HighSum =
Builder.CreateAdd(HighA, HighB,
"HighSum");
506 llvm::Value *HighSumPlusCarry =
507 Builder.CreateAdd(HighSum, ZExtCarry,
"HighSumPlusCarry");
509 if (NumElements == 4) {
510 return Builder.CreateShuffleVector(LowSum, HighSumPlusCarry, {0, 2, 1, 3},
516 "hlsl.AddUint64.upto0");
521 case Builtin::BI__builtin_hlsl_resource_getpointer:
522 case Builtin::BI__builtin_hlsl_resource_getpointer_typed: {
527 return Builder.CreateIntrinsic(
528 RetTy,
CGM.getHLSLRuntime().getCreateResourceGetPointerIntrinsic(),
531 case Builtin::BI__builtin_hlsl_resource_sample: {
537 Args.push_back(HandleOp);
538 Args.push_back(SamplerOp);
539 Args.push_back(CoordOp);
544 return Builder.CreateIntrinsic(
545 RetTy,
CGM.getHLSLRuntime().getSampleIntrinsic(), Args);
549 return Builder.CreateIntrinsic(
550 RetTy,
CGM.getHLSLRuntime().getSampleClampIntrinsic(), Args);
552 case Builtin::BI__builtin_hlsl_resource_sample_bias: {
561 Args.push_back(HandleOp);
562 Args.push_back(SamplerOp);
563 Args.push_back(CoordOp);
564 Args.push_back(BiasOp);
569 return Builder.CreateIntrinsic(
570 RetTy,
CGM.getHLSLRuntime().getSampleBiasIntrinsic(), Args);
573 return Builder.CreateIntrinsic(
574 RetTy,
CGM.getHLSLRuntime().getSampleBiasClampIntrinsic(), Args);
576 case Builtin::BI__builtin_hlsl_resource_sample_grad: {
584 Args.push_back(HandleOp);
585 Args.push_back(SamplerOp);
586 Args.push_back(CoordOp);
587 Args.push_back(DDXOp);
588 Args.push_back(DDYOp);
594 return Builder.CreateIntrinsic(
595 RetTy,
CGM.getHLSLRuntime().getSampleGradIntrinsic(), Args);
599 return Builder.CreateIntrinsic(
600 RetTy,
CGM.getHLSLRuntime().getSampleGradClampIntrinsic(), Args);
602 case Builtin::BI__builtin_hlsl_resource_sample_level: {
611 Args.push_back(HandleOp);
612 Args.push_back(SamplerOp);
613 Args.push_back(CoordOp);
614 Args.push_back(LODOp);
618 return Builder.CreateIntrinsic(
619 RetTy,
CGM.getHLSLRuntime().getSampleLevelIntrinsic(), Args);
621 case Builtin::BI__builtin_hlsl_resource_sample_cmp: {
630 Args.push_back(HandleOp);
631 Args.push_back(SamplerOp);
632 Args.push_back(CoordOp);
633 Args.push_back(CmpOp);
638 return Builder.CreateIntrinsic(
639 RetTy,
CGM.getHLSLRuntime().getSampleCmpIntrinsic(), Args);
643 return Builder.CreateIntrinsic(
644 RetTy,
CGM.getHLSLRuntime().getSampleCmpClampIntrinsic(), Args);
646 case Builtin::BI__builtin_hlsl_resource_sample_cmp_level_zero: {
655 Args.push_back(HandleOp);
656 Args.push_back(SamplerOp);
657 Args.push_back(CoordOp);
658 Args.push_back(CmpOp);
663 return Builder.CreateIntrinsic(
664 RetTy,
CGM.getHLSLRuntime().getSampleCmpLevelZeroIntrinsic(), Args);
666 case Builtin::BI__builtin_hlsl_resource_gather: {
672 ComponentOp =
Builder.CreateIntCast(ComponentOp,
Builder.getInt32Ty(),
676 Args.push_back(HandleOp);
677 Args.push_back(SamplerOp);
678 Args.push_back(CoordOp);
679 Args.push_back(ComponentOp);
683 return Builder.CreateIntrinsic(
684 RetTy,
CGM.getHLSLRuntime().getGatherIntrinsic(), Args);
686 case Builtin::BI__builtin_hlsl_resource_gather_cmp: {
692 CompareOp =
Builder.CreateFPCast(CompareOp,
Builder.getFloatTy());
695 Args.push_back(HandleOp);
696 Args.push_back(SamplerOp);
697 Args.push_back(CoordOp);
698 Args.push_back(CompareOp);
700 if (
CGM.getTarget().getTriple().isDXIL()) {
703 ComponentOp =
Builder.CreateIntCast(ComponentOp,
Builder.getInt32Ty(),
705 Args.push_back(ComponentOp);
711 return Builder.CreateIntrinsic(
712 RetTy,
CGM.getHLSLRuntime().getGatherCmpIntrinsic(), Args);
714 case Builtin::BI__builtin_hlsl_resource_load_with_status:
715 case Builtin::BI__builtin_hlsl_resource_load_with_status_typed: {
724 const HLSLAttributedResourceType *RT =
725 HandleTy->
getAs<HLSLAttributedResourceType>();
726 assert(
CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil &&
727 "Only DXIL currently implements load with status");
729 Intrinsic::ID IntrID = RT->getAttrs().RawBuffer
730 ? llvm::Intrinsic::dx_resource_load_rawbuffer
731 : llvm::Intrinsic::dx_resource_load_typedbuffer;
734 llvm::Type *RetTy = llvm::StructType::get(
Builder.getContext(),
735 {DataTy, Builder.getInt1Ty()});
738 Args.push_back(HandleOp);
739 Args.push_back(IndexOp);
744 if (!RT->isStructured())
745 Offset = llvm::PoisonValue::get(
Builder.getInt32Ty());
746 Args.push_back(Offset);
752 Builder.CreateIntrinsic(RetTy, IntrID, Args, {},
"ld.struct");
753 Value *LoadedValue =
Builder.CreateExtractValue(ResRet, {0},
"ld.value");
754 Value *StatusBit =
Builder.CreateExtractValue(ResRet, {1},
"ld.status");
755 Value *ExtendedStatus =
756 Builder.CreateZExt(StatusBit,
Builder.getInt32Ty(),
"ld.status.ext");
757 Builder.CreateStore(ExtendedStatus, StatusAddr);
761 case Builtin::BI__builtin_hlsl_resource_uninitializedhandle: {
762 llvm::Type *HandleTy =
CGM.getTypes().ConvertType(E->
getType());
763 return llvm::PoisonValue::get(HandleTy);
765 case Builtin::BI__builtin_hlsl_resource_handlefrombinding: {
766 llvm::Type *HandleTy =
CGM.getTypes().ConvertType(E->
getType());
772 llvm::Intrinsic::ID IntrinsicID =
773 CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
775 return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args);
777 case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: {
778 llvm::Type *HandleTy =
CGM.getTypes().ConvertType(E->
getType());
784 llvm::Intrinsic::ID IntrinsicID =
785 CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
787 return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args);
789 case Builtin::BI__builtin_hlsl_resource_counterhandlefromimplicitbinding: {
791 if (!
CGM.getTriple().isSPIRV())
794 llvm::Type *HandleTy =
CGM.getTypes().ConvertType(E->
getType());
797 llvm::Intrinsic::ID IntrinsicID =
798 llvm::Intrinsic::spv_resource_counterhandlefromimplicitbinding;
800 return Builder.CreateIntrinsic(HandleTy, IntrinsicID, Args);
802 case Builtin::BI__builtin_hlsl_resource_nonuniformindex: {
805 return Builder.CreateIntrinsic(
806 RetTy,
CGM.getHLSLRuntime().getNonUniformResourceIndexIntrinsic(),
809 case Builtin::BI__builtin_hlsl_resource_getdimensions_x: {
814 RetTy,
CGM.getHLSLRuntime().getGetDimensionsXIntrinsic(),
816 return Builder.CreateStore(DimValue,
Dim.getAddress());
818 case Builtin::BI__builtin_hlsl_resource_getstride: {
822 case Builtin::BI__builtin_hlsl_all: {
824 return Builder.CreateIntrinsic(
829 case Builtin::BI__builtin_hlsl_and: {
832 return Builder.CreateAnd(Op0, Op1,
"hlsl.and");
834 case Builtin::BI__builtin_hlsl_or: {
837 return Builder.CreateOr(Op0, Op1,
"hlsl.or");
839 case Builtin::BI__builtin_hlsl_any: {
841 return Builder.CreateIntrinsic(
846 case Builtin::BI__builtin_hlsl_asdouble:
848 case Builtin::BI__builtin_hlsl_elementwise_clamp: {
855 Ty = VecTy->getElementType();
859 Intr =
CGM.getHLSLRuntime().getNClampIntrinsic();
861 Intr =
CGM.getHLSLRuntime().getUClampIntrinsic();
864 Intr =
CGM.getHLSLRuntime().getSClampIntrinsic();
866 return Builder.CreateIntrinsic(
870 case Builtin::BI__builtin_hlsl_crossf16:
871 case Builtin::BI__builtin_hlsl_crossf32: {
876 "cross operands must have a float representation");
881 "input vectors must have 3 elements each");
882 return Builder.CreateIntrinsic(
883 Op0->
getType(),
CGM.getHLSLRuntime().getCrossIntrinsic(),
886 case Builtin::BI__builtin_hlsl_dot: {
889 llvm::Type *T0 = Op0->
getType();
890 llvm::Type *T1 = Op1->
getType();
893 if (!T0->isVectorTy() && !T1->isVectorTy()) {
894 if (T0->isFloatingPointTy())
895 return Builder.CreateFMul(Op0, Op1,
"hlsl.dot");
897 if (T0->isIntegerTy())
898 return Builder.CreateMul(Op0, Op1,
"hlsl.dot");
901 "Scalar dot product is only supported on ints and floats.");
906 "Dot product operands must have the same type.");
909 assert(VecTy0 &&
"Dot product argument must be a vector.");
911 return Builder.CreateIntrinsic(
916 case Builtin::BI__builtin_hlsl_dot4add_i8packed: {
921 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDot4AddI8PackedIntrinsic();
924 return Builder.CreateIntrinsic(
926 nullptr,
"hlsl.dot4add.i8packed");
928 case Builtin::BI__builtin_hlsl_dot4add_u8packed: {
933 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDot4AddU8PackedIntrinsic();
936 return Builder.CreateIntrinsic(
938 nullptr,
"hlsl.dot4add.u8packed");
940 case Builtin::BI__builtin_hlsl_elementwise_firstbithigh: {
943 return Builder.CreateIntrinsic(
948 case Builtin::BI__builtin_hlsl_elementwise_firstbitlow: {
951 return Builder.CreateIntrinsic(
954 nullptr,
"hlsl.firstbitlow");
956 case Builtin::BI__builtin_hlsl_lerp: {
961 llvm_unreachable(
"lerp operand must have a float representation");
962 return Builder.CreateIntrinsic(
963 X->getType(),
CGM.getHLSLRuntime().getLerpIntrinsic(),
966 case Builtin::BI__builtin_hlsl_normalize: {
970 "normalize operand must have a float representation");
972 return Builder.CreateIntrinsic(
975 nullptr,
"hlsl.normalize");
977 case Builtin::BI__builtin_hlsl_elementwise_degrees: {
981 "degree operand must have a float representation");
983 return Builder.CreateIntrinsic(
984 X->getType(),
CGM.getHLSLRuntime().getDegreesIntrinsic(),
987 case Builtin::BI__builtin_hlsl_elementwise_f16tof32: {
990 case Builtin::BI__builtin_hlsl_elementwise_f32tof16: {
993 case Builtin::BI__builtin_hlsl_elementwise_frac: {
996 llvm_unreachable(
"frac operand must have a float representation");
997 return Builder.CreateIntrinsic(
998 Op0->
getType(),
CGM.getHLSLRuntime().getFracIntrinsic(),
1001 case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1003 llvm::Type *Xty = Op0->
getType();
1004 llvm::Type *retType = llvm::Type::getInt1Ty(this->
getLLVMContext());
1005 if (Xty->isVectorTy()) {
1007 retType = llvm::VectorType::get(
1008 retType, ElementCount::getFixed(XVecTy->getNumElements()));
1011 llvm_unreachable(
"isinf operand must have a float representation");
1012 return Builder.CreateIntrinsic(
1013 retType,
CGM.getHLSLRuntime().getIsInfIntrinsic(),
1016 case Builtin::BI__builtin_hlsl_elementwise_isnan: {
1018 llvm::Type *Xty = Op0->
getType();
1019 llvm::Type *retType = llvm::Type::getInt1Ty(this->
getLLVMContext());
1020 if (Xty->isVectorTy()) {
1022 retType = llvm::VectorType::get(
1023 retType, ElementCount::getFixed(XVecTy->getNumElements()));
1026 llvm_unreachable(
"isnan operand must have a float representation");
1027 return Builder.CreateIntrinsic(
1028 retType,
CGM.getHLSLRuntime().getIsNaNIntrinsic(),
1031 case Builtin::BI__builtin_hlsl_mad: {
1036 return Builder.CreateIntrinsic(
1037 M->
getType(), Intrinsic::fmuladd,
1041 if (
CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil)
1042 return Builder.CreateIntrinsic(
1043 M->
getType(), Intrinsic::dx_imad,
1047 return Builder.CreateNSWAdd(Mul, B);
1050 if (
CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil)
1051 return Builder.CreateIntrinsic(
1052 M->
getType(), Intrinsic::dx_umad,
1056 return Builder.CreateNUWAdd(Mul, B);
1058 case Builtin::BI__builtin_hlsl_mul: {
1069 llvm::MatrixBuilder MB(
Builder);
1070 if (IsVec0 && IsMat1) {
1074 return MB.CreateMatrixMultiply(Op0, Op1, 1, N, M,
"hlsl.mul");
1076 if (IsMat0 && IsVec1) {
1079 unsigned Cols = MatTy->getNumColumns();
1080 return MB.CreateMatrixMultiply(Op0, Op1, Rows, Cols, 1,
"hlsl.mul");
1082 assert(IsMat0 && IsMat1);
1085 return MB.CreateMatrixMultiply(Op0, Op1, MatTy0->getNumRows(),
1086 MatTy0->getNumColumns(),
1089 case Builtin::BI__builtin_hlsl_elementwise_rcp: {
1092 llvm_unreachable(
"rcp operand must have a float representation");
1093 llvm::Type *Ty = Op0->
getType();
1094 llvm::Type *EltTy = Ty->getScalarType();
1095 Constant *One = Ty->isVectorTy()
1096 ? ConstantVector::getSplat(
1097 ElementCount::getFixed(
1099 ConstantFP::get(EltTy, 1.0))
1100 : ConstantFP::get(EltTy, 1.0);
1101 return Builder.CreateFDiv(One, Op0,
"hlsl.rcp");
1103 case Builtin::BI__builtin_hlsl_elementwise_rsqrt: {
1106 llvm_unreachable(
"rsqrt operand must have a float representation");
1107 return Builder.CreateIntrinsic(
1108 Op0->
getType(),
CGM.getHLSLRuntime().getRsqrtIntrinsic(),
1111 case Builtin::BI__builtin_hlsl_elementwise_saturate: {
1114 "saturate operand must have a float representation");
1115 return Builder.CreateIntrinsic(
1118 nullptr,
"hlsl.saturate");
1120 case Builtin::BI__builtin_hlsl_wave_prefix_count_bits: {
1122 assert(Op->
getType()->isIntegerTy(1) &&
1123 "WavePrefixBitCount operand must be a boolean type");
1129 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), IID),
ArrayRef{Op},
1130 "hlsl.wave.prefix.bit.count");
1132 case Builtin::BI__builtin_hlsl_select: {
1145 if (!OpTrue->
getType()->isVectorTy())
1147 Builder.CreateVectorSplat(VTy->getNumElements(), OpTrue,
"splat");
1148 if (!OpFalse->
getType()->isVectorTy())
1150 Builder.CreateVectorSplat(VTy->getNumElements(), OpFalse,
"splat");
1154 Builder.CreateSelect(OpCond, OpTrue, OpFalse,
"hlsl.select");
1161 case Builtin::BI__builtin_hlsl_step: {
1166 "step operands must have a float representation");
1167 return Builder.CreateIntrinsic(
1168 Op0->
getType(),
CGM.getHLSLRuntime().getStepIntrinsic(),
1171 case Builtin::BI__builtin_hlsl_wave_active_all_equal: {
1174 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveActiveAllEqualIntrinsic();
1176 &
CGM.getModule(), ID, {Op->getType()}),
1179 case Builtin::BI__builtin_hlsl_wave_active_all_true: {
1181 assert(Op->
getType()->isIntegerTy(1) &&
1182 "Intrinsic WaveActiveAllTrue operand must be a bool");
1184 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveActiveAllTrueIntrinsic();
1186 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID), {Op});
1188 case Builtin::BI__builtin_hlsl_wave_active_any_true: {
1190 assert(Op->
getType()->isIntegerTy(1) &&
1191 "Intrinsic WaveActiveAnyTrue operand must be a bool");
1193 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveActiveAnyTrueIntrinsic();
1195 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID), {Op});
1197 case Builtin::BI__builtin_hlsl_wave_active_ballot: {
1199 assert(Op->
getType()->isIntegerTy(1) &&
1200 "Intrinsic WaveActiveBallot operand must be a bool");
1204 case Builtin::BI__builtin_hlsl_wave_active_count_bits: {
1206 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveActiveCountBitsIntrinsic();
1208 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID),
1211 case Builtin::BI__builtin_hlsl_wave_active_sum: {
1215 getTarget().getTriple().getArch(),
CGM.getHLSLRuntime(),
1219 &
CGM.getModule(), IID, {OpExpr->getType()}),
1220 ArrayRef{OpExpr},
"hlsl.wave.active.sum");
1222 case Builtin::BI__builtin_hlsl_wave_active_max: {
1228 IID =
CGM.getHLSLRuntime().getWaveActiveUMaxIntrinsic();
1230 IID =
CGM.getHLSLRuntime().getWaveActiveMaxIntrinsic();
1233 &
CGM.getModule(), IID, {OpExpr->getType()}),
1234 ArrayRef{OpExpr},
"hlsl.wave.active.max");
1236 case Builtin::BI__builtin_hlsl_wave_active_min: {
1242 IID =
CGM.getHLSLRuntime().getWaveActiveUMinIntrinsic();
1244 IID =
CGM.getHLSLRuntime().getWaveActiveMinIntrinsic();
1247 &
CGM.getModule(), IID, {OpExpr->getType()}),
1248 ArrayRef{OpExpr},
"hlsl.wave.active.min");
1250 case Builtin::BI__builtin_hlsl_wave_get_lane_index: {
1254 switch (
CGM.getTarget().getTriple().getArch()) {
1255 case llvm::Triple::dxil:
1257 &
CGM.getModule(), Intrinsic::dx_wave_getlaneindex));
1258 case llvm::Triple::spirv:
1260 llvm::FunctionType::get(
IntTy, {},
false),
1261 "__hlsl_wave_get_lane_index", {},
false,
true));
1264 "Intrinsic WaveGetLaneIndex not supported by target architecture");
1267 case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
1268 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveIsFirstLaneIntrinsic();
1270 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID));
1272 case Builtin::BI__builtin_hlsl_wave_get_lane_count: {
1273 Intrinsic::ID ID =
CGM.getHLSLRuntime().getWaveGetLaneCountIntrinsic();
1275 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID));
1277 case Builtin::BI__builtin_hlsl_wave_read_lane_at: {
1283 Intrinsic::getOrInsertDeclaration(
1284 &
CGM.getModule(),
CGM.getHLSLRuntime().getWaveReadLaneAtIntrinsic(),
1285 {OpExpr->getType()}),
1286 ArrayRef{OpExpr, OpIndex},
"hlsl.wave.readlane");
1288 case Builtin::BI__builtin_hlsl_wave_prefix_sum: {
1293 &
CGM.getModule(), IID, {OpExpr->getType()}),
1294 ArrayRef{OpExpr},
"hlsl.wave.prefix.sum");
1296 case Builtin::BI__builtin_hlsl_wave_prefix_product: {
1301 &
CGM.getModule(), IID, {OpExpr->getType()}),
1302 ArrayRef{OpExpr},
"hlsl.wave.prefix.product");
1304 case Builtin::BI__builtin_hlsl_elementwise_sign: {
1305 auto *Arg0 = E->
getArg(0);
1307 llvm::Type *Xty = Op0->
getType();
1308 llvm::Type *retType = llvm::Type::getInt32Ty(this->
getLLVMContext());
1309 if (Xty->isVectorTy()) {
1310 auto *XVecTy = Arg0->getType()->castAs<
VectorType>();
1311 retType = llvm::VectorType::get(
1312 retType, ElementCount::getFixed(XVecTy->getNumElements()));
1314 assert((Arg0->getType()->hasFloatingRepresentation() ||
1315 Arg0->getType()->hasIntegerRepresentation()) &&
1316 "sign operand must have a float or int representation");
1318 if (Arg0->getType()->hasUnsignedIntegerRepresentation()) {
1320 return Builder.CreateSelect(
Cmp, ConstantInt::get(retType, 0),
1321 ConstantInt::get(retType, 1),
"hlsl.sign");
1324 return Builder.CreateIntrinsic(
1325 retType,
CGM.getHLSLRuntime().getSignIntrinsic(),
1328 case Builtin::BI__builtin_hlsl_elementwise_radians: {
1331 "radians operand must have a float representation");
1332 return Builder.CreateIntrinsic(
1335 nullptr,
"hlsl.radians");
1337 case Builtin::BI__builtin_hlsl_buffer_update_counter: {
1341 return Builder.CreateIntrinsic(
1343 CGM.getHLSLRuntime().getBufferUpdateCounterIntrinsic(),
1346 case Builtin::BI__builtin_hlsl_elementwise_splitdouble: {
1351 "asuint operands types mismatch");
1354 case Builtin::BI__builtin_hlsl_elementwise_clip:
1356 "clip operands types mismatch");
1358 case Builtin::BI__builtin_hlsl_group_memory_barrier_with_group_sync: {
1360 CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic();
1362 Intrinsic::getOrInsertDeclaration(&
CGM.getModule(), ID));
1364 case Builtin::BI__builtin_hlsl_elementwise_ddx_coarse: {
1367 llvm_unreachable(
"ddx_coarse operand must have a float representation");
1368 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDdxCoarseIntrinsic();
1373 case Builtin::BI__builtin_hlsl_elementwise_ddy_coarse: {
1376 llvm_unreachable(
"ddy_coarse operand must have a float representation");
1377 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDdyCoarseIntrinsic();
1382 case Builtin::BI__builtin_hlsl_elementwise_ddx_fine: {
1385 llvm_unreachable(
"ddx_fine operand must have a float representation");
1386 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDdxFineIntrinsic();
1391 case Builtin::BI__builtin_hlsl_elementwise_ddy_fine: {
1394 llvm_unreachable(
"ddy_fine operand must have a float representation");
1395 Intrinsic::ID ID =
CGM.getHLSLRuntime().getDdyFineIntrinsic();
1400 case Builtin::BI__builtin_get_spirv_spec_constant_bool:
1401 case Builtin::BI__builtin_get_spirv_spec_constant_short:
1402 case Builtin::BI__builtin_get_spirv_spec_constant_ushort:
1403 case Builtin::BI__builtin_get_spirv_spec_constant_int:
1404 case Builtin::BI__builtin_get_spirv_spec_constant_uint:
1405 case Builtin::BI__builtin_get_spirv_spec_constant_longlong:
1406 case Builtin::BI__builtin_get_spirv_spec_constant_ulonglong:
1407 case Builtin::BI__builtin_get_spirv_spec_constant_half:
1408 case Builtin::BI__builtin_get_spirv_spec_constant_float:
1409 case Builtin::BI__builtin_get_spirv_spec_constant_double: {
1413 llvm::Value *Args[] = {SpecId, DefaultVal};
1414 return Builder.CreateCall(SpecConstantFn, Args);