Skip to content

Commit ed60cd2

Browse files
[HLSL] Implement ddx/ddy_coarse intrinsics (#164831)
Closes #99097 Closes #99100 As ddx and ddy are near identical implementations I've combined them in this PR. This aims to unblock #161378 --------- Co-authored-by: Alexander Johnston <[email protected]>
1 parent 1fcfd5c commit ed60cd2

26 files changed

+713
-8
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5253,6 +5253,18 @@ def HLSLF16ToF32 : LangBuiltin<"HLSL_LANG"> {
52535253
let Prototype = "void(...)";
52545254
}
52555255

5256+
def HLSLDdxCoarse : LangBuiltin<"HLSL_LANG"> {
5257+
let Spellings = ["__builtin_hlsl_elementwise_ddx_coarse"];
5258+
let Attributes = [NoThrow, Const, CustomTypeChecking];
5259+
let Prototype = "void(...)";
5260+
}
5261+
5262+
def HLSLDdyCoarse : LangBuiltin<"HLSL_LANG"> {
5263+
let Spellings = ["__builtin_hlsl_elementwise_ddy_coarse"];
5264+
let Attributes = [NoThrow, Const, CustomTypeChecking];
5265+
let Prototype = "void(...)";
5266+
}
5267+
52565268
// Builtins for XRay.
52575269
def XRayCustomEvent : Builtin {
52585270
let Spellings = ["__xray_customevent"];

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,24 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
924924
return EmitRuntimeCall(
925925
Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID));
926926
}
927+
case Builtin::BI__builtin_hlsl_elementwise_ddx_coarse: {
928+
Value *Op0 = EmitScalarExpr(E->getArg(0));
929+
if (!E->getArg(0)->getType()->hasFloatingRepresentation())
930+
llvm_unreachable("ddx_coarse operand must have a float representation");
931+
Intrinsic::ID ID = CGM.getHLSLRuntime().getDdxCoarseIntrinsic();
932+
return Builder.CreateIntrinsic(/*ReturnType=*/Op0->getType(), ID,
933+
ArrayRef<Value *>{Op0}, nullptr,
934+
"hlsl.ddx.coarse");
935+
}
936+
case Builtin::BI__builtin_hlsl_elementwise_ddy_coarse: {
937+
Value *Op0 = EmitScalarExpr(E->getArg(0));
938+
if (!E->getArg(0)->getType()->hasFloatingRepresentation())
939+
llvm_unreachable("ddy_coarse operand must have a float representation");
940+
Intrinsic::ID ID = CGM.getHLSLRuntime().getDdyCoarseIntrinsic();
941+
return Builder.CreateIntrinsic(/*ReturnType=*/Op0->getType(), ID,
942+
ArrayRef<Value *>{Op0}, nullptr,
943+
"hlsl.ddy.coarse");
944+
}
927945
case Builtin::BI__builtin_get_spirv_spec_constant_bool:
928946
case Builtin::BI__builtin_get_spirv_spec_constant_short:
929947
case Builtin::BI__builtin_get_spirv_spec_constant_ushort:

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ class CGHLSLRuntime {
163163
GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync,
164164
group_memory_barrier_with_group_sync)
165165
GENERATE_HLSL_INTRINSIC_FUNCTION(GetDimensionsX, resource_getdimensions_x)
166+
GENERATE_HLSL_INTRINSIC_FUNCTION(DdxCoarse, ddx_coarse)
167+
GENERATE_HLSL_INTRINSIC_FUNCTION(DdyCoarse, ddy_coarse)
166168

167169
//===----------------------------------------------------------------------===//
168170
// End of reserved area for HLSL intrinsic getters.

clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2946,5 +2946,73 @@ float4 radians(float4);
29462946
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_group_memory_barrier_with_group_sync)
29472947
__attribute__((convergent)) void GroupMemoryBarrierWithGroupSync(void);
29482948

2949+
//===----------------------------------------------------------------------===//
2950+
// ddx_coarse builtin
2951+
//===----------------------------------------------------------------------===//
2952+
2953+
/// \fn T ddx_coarse(T value)
2954+
/// \brief Computes a low precision partial derivative with respect to the
2955+
/// screen-space x-coordinate.
2956+
/// \param value The input value.
2957+
///
2958+
/// The return value is a floating point scalar or vector containing the low
2959+
/// prevision partial derivative of the input value.
2960+
2961+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2962+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2963+
half ddx_coarse(half);
2964+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2965+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2966+
half2 ddx_coarse(half2);
2967+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2968+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2969+
half3 ddx_coarse(half3);
2970+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2971+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2972+
half4 ddx_coarse(half4);
2973+
2974+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2975+
float ddx_coarse(float);
2976+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2977+
float2 ddx_coarse(float2);
2978+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2979+
float3 ddx_coarse(float3);
2980+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddx_coarse)
2981+
float4 ddx_coarse(float4);
2982+
2983+
//===----------------------------------------------------------------------===//
2984+
// ddy_coarse builtin
2985+
//===----------------------------------------------------------------------===//
2986+
2987+
/// \fn T ddy_coarse(T value)
2988+
/// \brief Computes a low precision partial derivative with respect to the
2989+
/// screen-space y-coordinate.
2990+
/// \param value The input value.
2991+
///
2992+
/// The return value is a floating point scalar or vector containing the low
2993+
/// prevision partial derivative of the input value.
2994+
2995+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2996+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
2997+
half ddy_coarse(half);
2998+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
2999+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3000+
half2 ddy_coarse(half2);
3001+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
3002+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3003+
half3 ddy_coarse(half3);
3004+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
3005+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3006+
half4 ddy_coarse(half4);
3007+
3008+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3009+
float ddy_coarse(float);
3010+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3011+
float2 ddy_coarse(float2);
3012+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3013+
float3 ddy_coarse(float3);
3014+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_ddy_coarse)
3015+
float4 ddy_coarse(float4);
3016+
29493017
} // namespace hlsl
29503018
#endif //_HLSL_HLSL_ALIAS_INTRINSICS_H_

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3239,7 +3239,9 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
32393239
case Builtin::BI__builtin_hlsl_elementwise_degrees:
32403240
case Builtin::BI__builtin_hlsl_elementwise_radians:
32413241
case Builtin::BI__builtin_hlsl_elementwise_rsqrt:
3242-
case Builtin::BI__builtin_hlsl_elementwise_frac: {
3242+
case Builtin::BI__builtin_hlsl_elementwise_frac:
3243+
case Builtin::BI__builtin_hlsl_elementwise_ddx_coarse:
3244+
case Builtin::BI__builtin_hlsl_elementwise_ddy_coarse: {
32433245
if (SemaRef.checkArgCount(TheCall, 1))
32443246
return true;
32453247
if (CheckAllArgTypesAreCorrect(&SemaRef, TheCall,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s \
2+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
3+
// RUN: FileCheck %s --check-prefixes=CHECK
4+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-pc-vulkan-compute %s \
5+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
6+
// RUN: FileCheck %s --check-prefixes=CHECK-SPIRV
7+
8+
// CHECK-LABEL: half @_Z19test_f16_ddx_coarseDh
9+
// CHECK: %hlsl.ddx.coarse = call {{.*}} half @llvm.dx.ddx.coarse.f16(half %{{.*}})
10+
// CHECK: ret half %hlsl.ddx.coarse
11+
// CHECK-LABEL-SPIRV: half @_Z19test_f16_ddx_coarseDh
12+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} half @llvm.spv.ddx.coarse.f16(half %{{.*}})
13+
// CHECK-SPIRV: ret half %hlsl.ddx.coarse
14+
half test_f16_ddx_coarse(half val) {
15+
return __builtin_hlsl_elementwise_ddx_coarse(val);
16+
}
17+
18+
// CHECK-LABEL: float @_Z19test_f32_ddx_coarsef
19+
// CHECK: %hlsl.ddx.coarse = call {{.*}} float @llvm.dx.ddx.coarse.f32(float %{{.*}})
20+
// CHECK: ret float %hlsl.ddx.coarse
21+
// CHECK-LABEL-SPIRV: float @_Z19test_f32_ddx_coarsef
22+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} float @llvm.spv.ddx.coarse.f32(float %{{.*}})
23+
// CHECK-SPIRV: ret float %hlsl.ddx.coarse
24+
float test_f32_ddx_coarse(float val) {
25+
return __builtin_hlsl_elementwise_ddx_coarse(val);
26+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s \
2+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
3+
// RUN: FileCheck %s --check-prefixes=CHECK
4+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-pc-vulkan-compute %s \
5+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
6+
// RUN: FileCheck %s --check-prefixes=CHECK-SPIRV
7+
8+
// CHECK-LABEL: half @_Z19test_f16_ddx_coarseDh
9+
// CHECK: %hlsl.ddx.coarse = call {{.*}} half @llvm.dx.ddx.coarse.f16(half %{{.*}})
10+
// CHECK: ret half %hlsl.ddx.coarse
11+
// CHECK-LABEL-SPIRV: half @_Z19test_f16_ddx_coarseDh
12+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} half @llvm.spv.ddx.coarse.f16(half %{{.*}})
13+
// CHECK-SPIRV: ret half %hlsl.ddx.coarse
14+
half test_f16_ddx_coarse(half val) {
15+
return ddx_coarse(val);
16+
}
17+
18+
// CHECK-LABEL: <2 x half> @_Z20test_f16_ddx_coarse2Dv2_Dh
19+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <2 x half> @llvm.dx.ddx.coarse.v2f16(<2 x half> %{{.*}})
20+
// CHECK: ret <2 x half> %hlsl.ddx.coarse
21+
// CHECK-LABEL-SPIRV: <2 x half> @_Z20test_f16_ddx_coarse2Dv2_Dh
22+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <2 x half> @llvm.spv.ddx.coarse.v2f16(<2 x half> %{{.*}})
23+
// CHECK-SPIRV: ret <2 x half> %hlsl.ddx.coarse
24+
half2 test_f16_ddx_coarse2(half2 val) {
25+
return ddx_coarse(val);
26+
}
27+
28+
// CHECK-LABEL: <3 x half> @_Z20test_f16_ddx_coarse3Dv3_Dh
29+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <3 x half> @llvm.dx.ddx.coarse.v3f16(<3 x half> %{{.*}})
30+
// CHECK: ret <3 x half> %hlsl.ddx.coarse
31+
// CHECK-LABEL-SPIRV: <3 x half> @_Z20test_f16_ddx_coarse3Dv3_Dh
32+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <3 x half> @llvm.spv.ddx.coarse.v3f16(<3 x half> %{{.*}})
33+
// CHECK-SPIRV: ret <3 x half> %hlsl.ddx.coarse
34+
half3 test_f16_ddx_coarse3(half3 val) {
35+
return ddx_coarse(val);
36+
}
37+
38+
// CHECK-LABEL: <4 x half> @_Z20test_f16_ddx_coarse4Dv4_Dh
39+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <4 x half> @llvm.dx.ddx.coarse.v4f16(<4 x half> %{{.*}})
40+
// CHECK: ret <4 x half> %hlsl.ddx.coarse
41+
// CHECK-LABEL-SPIRV: <4 x half> @_Z20test_f16_ddx_coarse4Dv4_Dh
42+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <4 x half> @llvm.spv.ddx.coarse.v4f16(<4 x half> %{{.*}})
43+
// CHECK-SPIRV: ret <4 x half> %hlsl.ddx.coarse
44+
half4 test_f16_ddx_coarse4(half4 val) {
45+
return ddx_coarse(val);
46+
}
47+
48+
// CHECK-LABEL: float @_Z19test_f32_ddx_coarsef
49+
// CHECK: %hlsl.ddx.coarse = call {{.*}} float @llvm.dx.ddx.coarse.f32(float %{{.*}})
50+
// CHECK: ret float %hlsl.ddx.coarse
51+
// CHECK-LABEL-SPIRV: float @_Z19test_f32_ddx_coarsef
52+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} float @llvm.spv.ddx.coarse.f32(float %{{.*}})
53+
// CHECK-SPIRV: ret float %hlsl.ddx.coarse
54+
float test_f32_ddx_coarse(float val) {
55+
return ddx_coarse(val);
56+
}
57+
58+
// CHECK-LABEL: <2 x float> @_Z20test_f32_ddx_coarse2Dv2_f
59+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <2 x float> @llvm.dx.ddx.coarse.v2f32(<2 x float> %{{.*}})
60+
// CHECK: ret <2 x float> %hlsl.ddx.coarse
61+
// CHECK-LABEL-SPIRV: <2 x float> @_Z20test_f32_ddx_coarse2Dv2_f
62+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <2 x float> @llvm.spv.ddx.coarse.v2f32(<2 x float> %{{.*}})
63+
// CHECK-SPIRV: ret <2 x float> %hlsl.ddx.coarse
64+
float2 test_f32_ddx_coarse2(float2 val) {
65+
return ddx_coarse(val);
66+
}
67+
68+
// CHECK-LABEL: <3 x float> @_Z20test_f32_ddx_coarse3Dv3_f
69+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <3 x float> @llvm.dx.ddx.coarse.v3f32(<3 x float> %{{.*}})
70+
// CHECK: ret <3 x float> %hlsl.ddx.coarse
71+
// CHECK-LABEL-SPIRV: <3 x float> @_Z20test_f32_ddx_coarse3Dv3_f
72+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <3 x float> @llvm.spv.ddx.coarse.v3f32(<3 x float> %{{.*}})
73+
// CHECK-SPIRV: ret <3 x float> %hlsl.ddx.coarse
74+
float3 test_f32_ddx_coarse3(float3 val) {
75+
return ddx_coarse(val);
76+
}
77+
78+
// CHECK-LABEL: <4 x float> @_Z20test_f32_ddx_coarse4Dv4_f
79+
// CHECK: %hlsl.ddx.coarse = call {{.*}} <4 x float> @llvm.dx.ddx.coarse.v4f32(<4 x float> %{{.*}})
80+
// CHECK: ret <4 x float> %hlsl.ddx.coarse
81+
// CHECK-LABEL-SPIRV: <4 x float> @_Z20test_f32_ddx_coarse4Dv4_f
82+
// CHECK-SPIRV: %hlsl.ddx.coarse = call {{.*}} <4 x float> @llvm.spv.ddx.coarse.v4f32(<4 x float> %{{.*}})
83+
// CHECK-SPIRV: ret <4 x float> %hlsl.ddx.coarse
84+
float4 test_f32_ddx_coarse4(float4 val) {
85+
return ddx_coarse(val);
86+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s \
2+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
3+
// RUN: FileCheck %s --check-prefixes=CHECK
4+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-pc-vulkan-compute %s \
5+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
6+
// RUN: FileCheck %s --check-prefixes=CHECK-SPIRV
7+
8+
// CHECK-LABEL: half @_Z19test_f16_ddy_coarseDh
9+
// CHECK: %hlsl.ddy.coarse = call {{.*}} half @llvm.dx.ddy.coarse.f16(half %{{.*}})
10+
// CHECK: ret half %hlsl.ddy.coarse
11+
// CHECK-LABEL-SPIRV: half @_Z19test_f16_ddy_coarseDh
12+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} half @llvm.spv.ddy.coarse.f16(half %{{.*}})
13+
// CHECK-SPIRV: ret half %hlsl.ddy.coarse
14+
half test_f16_ddy_coarse(half val) {
15+
return __builtin_hlsl_elementwise_ddy_coarse(val);
16+
}
17+
18+
// CHECK-LABEL: float @_Z19test_f32_ddy_coarsef
19+
// CHECK: %hlsl.ddy.coarse = call {{.*}} float @llvm.dx.ddy.coarse.f32(float %{{.*}})
20+
// CHECK: ret float %hlsl.ddy.coarse
21+
// CHECK-LABEL-SPIRV: float @_Z19test_f32_ddy_coarsef
22+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} float @llvm.spv.ddy.coarse.f32(float %{{.*}})
23+
// CHECK-SPIRV: ret float %hlsl.ddy.coarse
24+
float test_f32_ddy_coarse(float val) {
25+
return __builtin_hlsl_elementwise_ddy_coarse(val);
26+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s \
2+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
3+
// RUN: FileCheck %s --check-prefixes=CHECK
4+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-pc-vulkan-compute %s \
5+
// RUN: -emit-llvm -disable-llvm-passes -fnative-half-type -o - | \
6+
// RUN: FileCheck %s --check-prefixes=CHECK-SPIRV
7+
8+
// CHECK-LABEL: half @_Z19test_f16_ddy_coarseDh
9+
// CHECK: %hlsl.ddy.coarse = call {{.*}} half @llvm.dx.ddy.coarse.f16(half %{{.*}})
10+
// CHECK: ret half %hlsl.ddy.coarse
11+
// CHECK-LABEL-SPIRV: half @_Z19test_f16_ddy_coarseDh
12+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} half @llvm.spv.ddy.coarse.f16(half %{{.*}})
13+
// CHECK-SPIRV: ret half %hlsl.ddy.coarse
14+
half test_f16_ddy_coarse(half val) {
15+
return ddy_coarse(val);
16+
}
17+
18+
// CHECK-LABEL: <2 x half> @_Z20test_f16_ddy_coarse2Dv2_Dh
19+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <2 x half> @llvm.dx.ddy.coarse.v2f16(<2 x half> %{{.*}})
20+
// CHECK: ret <2 x half> %hlsl.ddy.coarse
21+
// CHECK-LABEL-SPIRV: <2 x half> @_Z20test_f16_ddy_coarse2Dv2_Dh
22+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <2 x half> @llvm.spv.ddy.coarse.v2f16(<2 x half> %{{.*}})
23+
// CHECK-SPIRV: ret <2 x half> %hlsl.ddy.coarse
24+
half2 test_f16_ddy_coarse2(half2 val) {
25+
return ddy_coarse(val);
26+
}
27+
28+
// CHECK-LABEL: <3 x half> @_Z20test_f16_ddy_coarse3Dv3_Dh
29+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <3 x half> @llvm.dx.ddy.coarse.v3f16(<3 x half> %{{.*}})
30+
// CHECK: ret <3 x half> %hlsl.ddy.coarse
31+
// CHECK-LABEL-SPIRV: <3 x half> @_Z20test_f16_ddy_coarse3Dv3_Dh
32+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <3 x half> @llvm.spv.ddy.coarse.v3f16(<3 x half> %{{.*}})
33+
// CHECK-SPIRV: ret <3 x half> %hlsl.ddy.coarse
34+
half3 test_f16_ddy_coarse3(half3 val) {
35+
return ddy_coarse(val);
36+
}
37+
38+
// CHECK-LABEL: <4 x half> @_Z20test_f16_ddy_coarse4Dv4_Dh
39+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <4 x half> @llvm.dx.ddy.coarse.v4f16(<4 x half> %{{.*}})
40+
// CHECK: ret <4 x half> %hlsl.ddy.coarse
41+
// CHECK-LABEL-SPIRV: <4 x half> @_Z20test_f16_ddy_coarse4Dv4_Dh
42+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <4 x half> @llvm.spv.ddy.coarse.v4f16(<4 x half> %{{.*}})
43+
// CHECK-SPIRV: ret <4 x half> %hlsl.ddy.coarse
44+
half4 test_f16_ddy_coarse4(half4 val) {
45+
return ddy_coarse(val);
46+
}
47+
48+
// CHECK-LABEL: float @_Z19test_f32_ddy_coarsef
49+
// CHECK: %hlsl.ddy.coarse = call {{.*}} float @llvm.dx.ddy.coarse.f32(float %{{.*}})
50+
// CHECK: ret float %hlsl.ddy.coarse
51+
// CHECK-LABEL-SPIRV: float @_Z19test_f32_ddy_coarsef
52+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} float @llvm.spv.ddy.coarse.f32(float %{{.*}})
53+
// CHECK-SPIRV: ret float %hlsl.ddy.coarse
54+
float test_f32_ddy_coarse(float val) {
55+
return ddy_coarse(val);
56+
}
57+
58+
// CHECK-LABEL: <2 x float> @_Z20test_f32_ddy_coarse2Dv2_f
59+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <2 x float> @llvm.dx.ddy.coarse.v2f32(<2 x float> %{{.*}})
60+
// CHECK: ret <2 x float> %hlsl.ddy.coarse
61+
// CHECK-LABEL-SPIRV: <2 x float> @_Z20test_f32_ddy_coarse2Dv2_f
62+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <2 x float> @llvm.spv.ddy.coarse.v2f32(<2 x float> %{{.*}})
63+
// CHECK-SPIRV: ret <2 x float> %hlsl.ddy.coarse
64+
float2 test_f32_ddy_coarse2(float2 val) {
65+
return ddy_coarse(val);
66+
}
67+
68+
// CHECK-LABEL: <3 x float> @_Z20test_f32_ddy_coarse3Dv3_f
69+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <3 x float> @llvm.dx.ddy.coarse.v3f32(<3 x float> %{{.*}})
70+
// CHECK: ret <3 x float> %hlsl.ddy.coarse
71+
// CHECK-LABEL-SPIRV: <3 x float> @_Z20test_f32_ddy_coarse3Dv3_f
72+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <3 x float> @llvm.spv.ddy.coarse.v3f32(<3 x float> %{{.*}})
73+
// CHECK-SPIRV: ret <3 x float> %hlsl.ddy.coarse
74+
float3 test_f32_ddy_coarse3(float3 val) {
75+
return ddy_coarse(val);
76+
}
77+
78+
// CHECK-LABEL: <4 x float> @_Z20test_f32_ddy_coarse4Dv4_f
79+
// CHECK: %hlsl.ddy.coarse = call {{.*}} <4 x float> @llvm.dx.ddy.coarse.v4f32(<4 x float> %{{.*}})
80+
// CHECK: ret <4 x float> %hlsl.ddy.coarse
81+
// CHECK-LABEL-SPIRV: <4 x float> @_Z20test_f32_ddy_coarse4Dv4_f
82+
// CHECK-SPIRV: %hlsl.ddy.coarse = call {{.*}} <4 x float> @llvm.spv.ddy.coarse.v4f32(<4 x float> %{{.*}})
83+
// CHECK-SPIRV: ret <4 x float> %hlsl.ddy.coarse
84+
float4 test_f32_ddy_coarse4(float4 val) {
85+
return ddy_coarse(val);
86+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -verify
2+
// RUN: %clang_cc1 -triple spirv-unknown-vulkan1.3-library %s -fnative-half-type -verify
3+
4+
float no_arg() {
5+
return __builtin_hlsl_elementwise_ddx_coarse();
6+
// expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
7+
}
8+
9+
float too_many_args(float val) {
10+
return __builtin_hlsl_elementwise_ddx_coarse(val, val);
11+
// expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
12+
}
13+
14+
float test_integer_scalar_input(int val) {
15+
return __builtin_hlsl_elementwise_ddx_coarse(val);
16+
// expected-error@-1 {{1st argument must be a scalar or vector of 16 or 32 bit floating-point types (was 'int')}}
17+
}
18+
19+
double test_double_scalar_input(double val) {
20+
return __builtin_hlsl_elementwise_ddx_coarse(val);
21+
// expected-error@-1 {{1st argument must be a scalar or vector of 16 or 32 bit floating-point types (was 'double')}}
22+
}

0 commit comments

Comments
 (0)