clang: lib/CodeGen/TargetBuiltins/SPIR.cpp Source File (original) (raw)
24 switch (BuiltinID) {
25 case SPIRV::BI__builtin_spirv_distance: {
30 "Distance operands must have a float representation");
33 "Distance operands must be a vector");
34 return Builder.CreateIntrinsic(
35 X->getType()->getScalarType(), Intrinsic::spv_distance,
37 }
38 case SPIRV::BI__builtin_spirv_length: {
41 "length operand must have a float representation");
43 "length operand must be a vector");
44 return Builder.CreateIntrinsic(
45 X->getType()->getScalarType(), Intrinsic::spv_length,
47 }
48 case SPIRV::BI__builtin_spirv_reflect: {
53 "Reflect operands must have a float representation");
56 "Reflect operands must be a vector");
57 return Builder.CreateIntrinsic(
58 I->getType(), Intrinsic::spv_reflect,
60 }
61 case SPIRV::BI__builtin_spirv_refract: {
68 "refract operands must have a float representation");
69 return Builder.CreateIntrinsic(
70 I->getType(), Intrinsic::spv_refract,
72 }
73 case SPIRV::BI__builtin_spirv_smoothstep: {
80 "SmoothStep operands must have a float representation");
81 return Builder.CreateIntrinsic(
82 Min->getType(), Intrinsic::spv_smoothstep,
84 "spv.smoothstep");
85 }
86 case SPIRV::BI__builtin_spirv_faceforward: {
93 "FaceForward operands must have a float representation");
94 return Builder.CreateIntrinsic(
95 N->getType(), Intrinsic::spv_faceforward,
96 ArrayRef<Value *>{N, I, Ng}, nullptr, "spv.faceforward");
97 }
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");
106 llvm::CallInst *Call = Builder.CreateIntrinsic(
107 Res, Intrinsic::spv_generic_cast_to_ptr_explicit,
109 Call->addRetAttr(llvm::Attribute::AttrKind::NoUndef);
111 }
112 case SPIRV::BI__builtin_spirv_num_workgroups:
113 return Builder.CreateIntrinsic(
115 Intrinsic::spv_num_workgroups,
117 "spv.num.workgroups");
118 case SPIRV::BI__builtin_spirv_workgroup_size:
119 return Builder.CreateIntrinsic(
121 Intrinsic::spv_workgroup_size,
123 "spv.workgroup.size");
124 case SPIRV::BI__builtin_spirv_workgroup_id:
125 return Builder.CreateIntrinsic(
127 Intrinsic::spv_group_id,
129 "spv.group.id");
130 case SPIRV::BI__builtin_spirv_local_invocation_id:
131 return Builder.CreateIntrinsic(
133 Intrinsic::spv_thread_id_in_group,
135 "spv.thread.id.in.group");
136 case SPIRV::BI__builtin_spirv_global_invocation_id:
137 return Builder.CreateIntrinsic(
139 Intrinsic::spv_thread_id,
141 "spv.thread.id");
142 case SPIRV::BI__builtin_spirv_global_size:
143 return Builder.CreateIntrinsic(
145 Intrinsic::spv_global_size,
147 "spv.num.workgroups");
148 case SPIRV::BI__builtin_spirv_global_offset:
149 return Builder.CreateIntrinsic(
151 Intrinsic::spv_global_offset,
153 "spv.global.offset");
154 case SPIRV::BI__builtin_spirv_ddx:
155 return Builder.CreateIntrinsic(
157 ArrayRef<Value *>{EmitScalarExpr(E->getArg(0))}, nullptr, "spv.ddx");
158 case SPIRV::BI__builtin_spirv_ddy:
159 return Builder.CreateIntrinsic(
161 ArrayRef<Value *>{EmitScalarExpr(E->getArg(0))}, nullptr, "spv.ddy");
162 case SPIRV::BI__builtin_spirv_fwidth:
163 return Builder.CreateIntrinsic(
165 Intrinsic::spv_fwidth, ArrayRef<Value *>{EmitScalarExpr(E->getArg(0))},
166 nullptr, "spv.fwidth");
167 }
168 return nullptr;
169}