Skip to content

Commit dd17c64

Browse files
authored
[HLSL] Implement min and max overloads using templates (#131666)
Replace min and max overload implementation using macros with one using templates. Enable overloads of the forms: vector<T,N> min/max(vector<T,N> p0, T p1) vector<T,N> min/max(T p0, vector<T,N> p1) Add new tests. Closes #131170
1 parent 5475834 commit dd17c64

File tree

4 files changed

+51
-39
lines changed

4 files changed

+51
-39
lines changed

clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,6 @@ namespace hlsl {
3535
#define _HLSL_16BIT_AVAILABILITY_STAGE(environment, version, stage)
3636
#endif
3737

38-
#define GEN_VEC_SCALAR_OVERLOADS(FUNC_NAME, BASE_TYPE, AVAIL) \
39-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##2, AVAIL) \
40-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##3, AVAIL) \
41-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##4, AVAIL)
42-
43-
#define GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, VECTOR_TYPE, AVAIL) \
44-
IF_TRUE_##AVAIL( \
45-
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
46-
FUNC_NAME(VECTOR_TYPE p0, BASE_TYPE p1) { \
47-
return __builtin_elementwise_##FUNC_NAME(p0, (VECTOR_TYPE)p1); \
48-
} \
49-
IF_TRUE_##AVAIL( \
50-
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
51-
FUNC_NAME(BASE_TYPE p0, VECTOR_TYPE p1) { \
52-
return __builtin_elementwise_##FUNC_NAME((VECTOR_TYPE)p0, p1); \
53-
}
54-
55-
#define IF_TRUE_0(EXPR)
56-
#define IF_TRUE_1(EXPR) EXPR
57-
5838
//===----------------------------------------------------------------------===//
5939
// abs builtins
6040
//===----------------------------------------------------------------------===//
@@ -1563,7 +1543,6 @@ half3 max(half3, half3);
15631543
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
15641544
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15651545
half4 max(half4, half4);
1566-
GEN_VEC_SCALAR_OVERLOADS(max, half, 1)
15671546

15681547
#ifdef __HLSL_ENABLE_16_BIT
15691548
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1578,7 +1557,6 @@ int16_t3 max(int16_t3, int16_t3);
15781557
_HLSL_AVAILABILITY(shadermodel, 6.2)
15791558
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15801559
int16_t4 max(int16_t4, int16_t4);
1581-
GEN_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
15821560

15831561
_HLSL_AVAILABILITY(shadermodel, 6.2)
15841562
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1592,7 +1570,6 @@ uint16_t3 max(uint16_t3, uint16_t3);
15921570
_HLSL_AVAILABILITY(shadermodel, 6.2)
15931571
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15941572
uint16_t4 max(uint16_t4, uint16_t4);
1595-
GEN_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
15961573
#endif
15971574

15981575
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1603,7 +1580,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16031580
int3 max(int3, int3);
16041581
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16051582
int4 max(int4, int4);
1606-
GEN_VEC_SCALAR_OVERLOADS(max, int, 0)
16071583

16081584
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16091585
uint max(uint, uint);
@@ -1613,7 +1589,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16131589
uint3 max(uint3, uint3);
16141590
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16151591
uint4 max(uint4, uint4);
1616-
GEN_VEC_SCALAR_OVERLOADS(max, uint, 0)
16171592

16181593
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16191594
int64_t max(int64_t, int64_t);
@@ -1623,7 +1598,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16231598
int64_t3 max(int64_t3, int64_t3);
16241599
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16251600
int64_t4 max(int64_t4, int64_t4);
1626-
GEN_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
16271601

16281602
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16291603
uint64_t max(uint64_t, uint64_t);
@@ -1633,7 +1607,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16331607
uint64_t3 max(uint64_t3, uint64_t3);
16341608
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16351609
uint64_t4 max(uint64_t4, uint64_t4);
1636-
GEN_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
16371610

16381611
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16391612
float max(float, float);
@@ -1643,7 +1616,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16431616
float3 max(float3, float3);
16441617
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16451618
float4 max(float4, float4);
1646-
GEN_VEC_SCALAR_OVERLOADS(max, float, 0)
16471619

16481620
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16491621
double max(double, double);
@@ -1653,7 +1625,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16531625
double3 max(double3, double3);
16541626
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16551627
double4 max(double4, double4);
1656-
GEN_VEC_SCALAR_OVERLOADS(max, double, 0)
16571628

16581629
//===----------------------------------------------------------------------===//
16591630
// min builtins
@@ -1676,7 +1647,6 @@ half3 min(half3, half3);
16761647
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
16771648
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
16781649
half4 min(half4, half4);
1679-
GEN_VEC_SCALAR_OVERLOADS(min, half, 1)
16801650

16811651
#ifdef __HLSL_ENABLE_16_BIT
16821652
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1691,7 +1661,6 @@ int16_t3 min(int16_t3, int16_t3);
16911661
_HLSL_AVAILABILITY(shadermodel, 6.2)
16921662
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
16931663
int16_t4 min(int16_t4, int16_t4);
1694-
GEN_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
16951664

16961665
_HLSL_AVAILABILITY(shadermodel, 6.2)
16971666
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1705,7 +1674,6 @@ uint16_t3 min(uint16_t3, uint16_t3);
17051674
_HLSL_AVAILABILITY(shadermodel, 6.2)
17061675
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17071676
uint16_t4 min(uint16_t4, uint16_t4);
1708-
GEN_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
17091677
#endif
17101678

17111679
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1716,7 +1684,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17161684
int3 min(int3, int3);
17171685
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17181686
int4 min(int4, int4);
1719-
GEN_VEC_SCALAR_OVERLOADS(min, int, 0)
17201687

17211688
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17221689
uint min(uint, uint);
@@ -1726,7 +1693,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17261693
uint3 min(uint3, uint3);
17271694
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17281695
uint4 min(uint4, uint4);
1729-
GEN_VEC_SCALAR_OVERLOADS(min, uint, 0)
17301696

17311697
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17321698
float min(float, float);
@@ -1736,7 +1702,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17361702
float3 min(float3, float3);
17371703
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17381704
float4 min(float4, float4);
1739-
GEN_VEC_SCALAR_OVERLOADS(min, float, 0)
17401705

17411706
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17421707
int64_t min(int64_t, int64_t);
@@ -1746,7 +1711,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17461711
int64_t3 min(int64_t3, int64_t3);
17471712
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17481713
int64_t4 min(int64_t4, int64_t4);
1749-
GEN_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
17501714

17511715
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17521716
uint64_t min(uint64_t, uint64_t);
@@ -1756,7 +1720,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17561720
uint64_t3 min(uint64_t3, uint64_t3);
17571721
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17581722
uint64_t4 min(uint64_t4, uint64_t4);
1759-
GEN_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
17601723

17611724
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17621725
double min(double, double);
@@ -1766,7 +1729,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17661729
double3 min(double3, double3);
17671730
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17681731
double4 min(double4, double4);
1769-
GEN_VEC_SCALAR_OVERLOADS(min, double, 0)
17701732

17711733
//===----------------------------------------------------------------------===//
17721734
// normalize builtins

clang/lib/Headers/hlsl/hlsl_compat_overloads.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- hlsl_compat_overloads.h - Extra HLSL overloads for intrinsics --===//
1+
//===--- hlsl_compat_overloads.h - Extra HLSL overloads for intrinsics ----===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
@@ -38,5 +38,37 @@ clamp(vector<T, N> p0, T p1, T p2) {
3838
return clamp(p0, (vector<T, N>)p1, (vector<T, N>)p2);
3939
}
4040

41+
//===----------------------------------------------------------------------===//
42+
// max builtin overloads
43+
//===----------------------------------------------------------------------===//
44+
45+
template <typename T, uint N>
46+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
47+
max(vector<T, N> p0, T p1) {
48+
return max(p0, (vector<T, N>)p1);
49+
}
50+
51+
template <typename T, uint N>
52+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
53+
max(T p0, vector<T, N> p1) {
54+
return max((vector<T, N>)p0, p1);
55+
}
56+
57+
//===----------------------------------------------------------------------===//
58+
// min builtin overloads
59+
//===----------------------------------------------------------------------===//
60+
61+
template <typename T, uint N>
62+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
63+
min(vector<T, N> p0, T p1) {
64+
return min(p0, (vector<T, N>)p1);
65+
}
66+
67+
template <typename T, uint N>
68+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
69+
min(T p0, vector<T, N> p1) {
70+
return min((vector<T, N>)p0, p1);
71+
}
72+
4173
} // namespace hlsl
4274
#endif // _HLSL_COMPAT_OVERLOADS_H_
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half
2+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t
3+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t
4+
5+
// check we error on 16 bit type if shader model is too old
6+
// CHECK: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl202x' and shader model is '6.0'
7+
vector<TEST_TYPE,3> test_error(vector<TEST_TYPE,3> p0, TEST_TYPE p1) {
8+
return max(p0, p1);
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half
2+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t
3+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t
4+
5+
// check we error on 16 bit type if shader model is too old
6+
// CHECK: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl202x' and shader model is '6.0'
7+
vector<TEST_TYPE,3> test_error(vector<TEST_TYPE,3> p0, TEST_TYPE p1) {
8+
return min(p0, p1);
9+
}

0 commit comments

Comments
 (0)