25 case SPIRV::BI__builtin_spirv_distance: {
30 "Distance operands must have a float representation");
33 "Distance operands must be a vector");
35 X->getType()->getScalarType(), Intrinsic::spv_distance,
38 case SPIRV::BI__builtin_spirv_length: {
41 "length operand must have a float representation");
43 "length operand must be a vector");
45 X->getType()->getScalarType(), Intrinsic::spv_length,
48 case SPIRV::BI__builtin_spirv_reflect: {
53 "Reflect operands must have a float representation");
56 "Reflect operands must be a vector");
58 I->
getType(), Intrinsic::spv_reflect,
61 case SPIRV::BI__builtin_spirv_refract: {
68 "refract operands must have a float representation");
70 I->
getType(), Intrinsic::spv_refract,
73 case SPIRV::BI__builtin_spirv_smoothstep: {
80 "SmoothStep operands must have a float representation");
82 Min->getType(), Intrinsic::spv_smoothstep,
86 case SPIRV::BI__builtin_spirv_faceforward: {
93 "FaceForward operands must have a float representation");
95 N->
getType(), Intrinsic::spv_faceforward,
98 case SPIRV::BI__builtin_spirv_generic_cast_to_ptr_explicit: {
102 "GenericCastToPtrExplicit takes a pointer and an int");
104 assert(Res->isPointerTy() &&
105 "GenericCastToPtrExplicit doesn't return a pointer");
107 Res, Intrinsic::spv_generic_cast_to_ptr_explicit,
109 Call->addRetAttr(llvm::Attribute::AttrKind::NoUndef);
112 case SPIRV::BI__builtin_spirv_subgroup_shuffle: {
116 return Builder.CreateIntrinsic(
118 Intrinsic::spv_wave_readlane, {X, Y},
nullptr,
"spv.shuffle");
120 case SPIRV::BI__builtin_spirv_num_workgroups:
121 return Builder.CreateIntrinsic(
123 Intrinsic::spv_num_workgroups,
125 "spv.num.workgroups");
126 case SPIRV::BI__builtin_spirv_workgroup_size:
127 return Builder.CreateIntrinsic(
129 Intrinsic::spv_workgroup_size,
131 "spv.workgroup.size");
132 case SPIRV::BI__builtin_spirv_workgroup_id:
133 return Builder.CreateIntrinsic(
135 Intrinsic::spv_group_id,
138 case SPIRV::BI__builtin_spirv_local_invocation_id:
139 return Builder.CreateIntrinsic(
141 Intrinsic::spv_thread_id_in_group,
143 "spv.thread.id.in.group");
144 case SPIRV::BI__builtin_spirv_global_invocation_id:
145 return Builder.CreateIntrinsic(
147 Intrinsic::spv_thread_id,
150 case SPIRV::BI__builtin_spirv_global_size:
151 return Builder.CreateIntrinsic(
153 Intrinsic::spv_global_size,
155 "spv.num.workgroups");
156 case SPIRV::BI__builtin_spirv_global_offset:
157 return Builder.CreateIntrinsic(
159 Intrinsic::spv_global_offset,
161 "spv.global.offset");
162 case SPIRV::BI__builtin_spirv_ddx:
163 return Builder.CreateIntrinsic(
166 case SPIRV::BI__builtin_spirv_ddy:
167 return Builder.CreateIntrinsic(
170 case SPIRV::BI__builtin_spirv_fwidth:
171 return Builder.CreateIntrinsic(
174 nullptr,
"spv.fwidth");