Skip to content

Commit ac260e6

Browse files
committed
implement clamp overloads with templates instead of macros
1 parent 44a41cc commit ac260e6

File tree

4 files changed

+90
-66
lines changed

4 files changed

+90
-66
lines changed

clang/lib/Headers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ set(hlsl_h
8787
set(hlsl_subdir_files
8888
hlsl/hlsl_basic_types.h
8989
hlsl/hlsl_alias_intrinsics.h
90+
hlsl/hlsl_compat_overloads.h
9091
hlsl/hlsl_intrinsic_helpers.h
9192
hlsl/hlsl_intrinsics.h
9293
hlsl/hlsl_detail.h

clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h

Lines changed: 35 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#ifndef _HLSL_HLSL_ALIAS_INTRINSICS_H_
1010
#define _HLSL_HLSL_ALIAS_INTRINSICS_H_
1111

12+
#include "hlsl_compat_overloads.h"
13+
1214
namespace hlsl {
1315

1416
// Note: Functions in this file are sorted alphabetically, then grouped by base
@@ -35,48 +37,25 @@ namespace hlsl {
3537
#define _HLSL_16BIT_AVAILABILITY_STAGE(environment, version, stage)
3638
#endif
3739

38-
#define _HLSL_CAT(a, b) a##b
39-
#define _HLSL_VEC_SCALAR_OVERLOADS(NAME, BASE_T, AVAIL) \
40-
_HLSL_ALL_OVERLOADS(NAME, BASE_T, AVAIL, _HLSL_CAT(_HLSL_NUM_ARGS_, NAME))
41-
42-
#define _HLSL_ALL_OVERLOADS(NAME, BASE_T, AVAIL, NUM_ARGS) \
43-
_HLSL_CAT(_HLSL_BOTH_OVERLOADS_, NUM_ARGS) \
44-
(NAME, BASE_T, _HLSL_CAT(BASE_T, 2), AVAIL) \
45-
_HLSL_CAT(_HLSL_BOTH_OVERLOADS_, NUM_ARGS)(NAME, BASE_T, \
46-
_HLSL_CAT(BASE_T, 3), AVAIL) \
47-
_HLSL_CAT(_HLSL_BOTH_OVERLOADS_, \
48-
NUM_ARGS)(NAME, BASE_T, _HLSL_CAT(BASE_T, 4), AVAIL)
49-
50-
#define _HLSL_BOTH_OVERLOADS_2(NAME, BASE_T, VECTOR_T, AVAIL) \
51-
_HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
52-
(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
53-
VECTOR_T p0, BASE_T p1) { \
54-
return _HLSL_CAT(__builtin_elementwise_, NAME)(p0, (VECTOR_T)p1); \
55-
} \
56-
_HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
57-
(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
58-
BASE_T p0, VECTOR_T p1) { \
59-
return _HLSL_CAT(__builtin_elementwise_, NAME)((VECTOR_T)p0, p1); \
60-
}
40+
#define GEN_VEC_SCALAR_OVERLOADS(FUNC_NAME, BASE_TYPE, AVAIL) \
41+
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##2, AVAIL) \
42+
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##3, AVAIL) \
43+
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##4, AVAIL)
6144

62-
#define _HLSL_BOTH_OVERLOADS_3(NAME, BASE_T, VECTOR_T, AVAIL) \
63-
_HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
64-
(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
65-
VECTOR_T p0, VECTOR_T p1, BASE_T p2) { \
66-
return _HLSL_CAT(__builtin_hlsl_elementwise_, NAME)(p0, p1, (VECTOR_T)p2); \
45+
#define GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, VECTOR_TYPE, AVAIL) \
46+
IF_TRUE_##AVAIL( \
47+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
48+
FUNC_NAME(VECTOR_TYPE p0, BASE_TYPE p1) { \
49+
return __builtin_elementwise_##FUNC_NAME(p0, (VECTOR_TYPE)p1); \
6750
} \
68-
_HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
69-
(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
70-
VECTOR_T p0, BASE_T p1, VECTOR_T p2) { \
71-
return _HLSL_CAT(__builtin_hlsl_elementwise_, NAME)(p0, (VECTOR_T)p1, p2); \
51+
IF_TRUE_##AVAIL( \
52+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
53+
FUNC_NAME(BASE_TYPE p0, VECTOR_TYPE p1) { \
54+
return __builtin_elementwise_##FUNC_NAME((VECTOR_TYPE)p0, p1); \
7255
}
7356

74-
#define _HLSL_IF_TRUE_0(EXPR)
75-
#define _HLSL_IF_TRUE_1(EXPR) EXPR
76-
77-
#define _HLSL_NUM_ARGS_min 2
78-
#define _HLSL_NUM_ARGS_max 2
79-
#define _HLSL_NUM_ARGS_clamp 3
57+
#define IF_TRUE_0(EXPR)
58+
#define IF_TRUE_1(EXPR) EXPR
8059

8160
//===----------------------------------------------------------------------===//
8261
// abs builtins
@@ -626,7 +605,6 @@ half3 clamp(half3, half3, half3);
626605
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
627606
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
628607
half4 clamp(half4, half4, half4);
629-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, half, 1)
630608

631609
#ifdef __HLSL_ENABLE_16_BIT
632610
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -641,7 +619,6 @@ int16_t3 clamp(int16_t3, int16_t3, int16_t3);
641619
_HLSL_AVAILABILITY(shadermodel, 6.2)
642620
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
643621
int16_t4 clamp(int16_t4, int16_t4, int16_t4);
644-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int16_t, 1)
645622

646623
_HLSL_AVAILABILITY(shadermodel, 6.2)
647624
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
@@ -655,7 +632,6 @@ uint16_t3 clamp(uint16_t3, uint16_t3, uint16_t3);
655632
_HLSL_AVAILABILITY(shadermodel, 6.2)
656633
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
657634
uint16_t4 clamp(uint16_t4, uint16_t4, uint16_t4);
658-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint16_t, 1)
659635
#endif
660636

661637
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
@@ -666,7 +642,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
666642
int3 clamp(int3, int3, int3);
667643
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
668644
int4 clamp(int4, int4, int4);
669-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int, 0)
670645

671646
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
672647
uint clamp(uint, uint, uint);
@@ -676,7 +651,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
676651
uint3 clamp(uint3, uint3, uint3);
677652
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
678653
uint4 clamp(uint4, uint4, uint4);
679-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint, 0)
680654

681655
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
682656
int64_t clamp(int64_t, int64_t, int64_t);
@@ -686,7 +660,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
686660
int64_t3 clamp(int64_t3, int64_t3, int64_t3);
687661
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
688662
int64_t4 clamp(int64_t4, int64_t4, int64_t4);
689-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int64_t, 0)
690663

691664
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
692665
uint64_t clamp(uint64_t, uint64_t, uint64_t);
@@ -696,7 +669,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
696669
uint64_t3 clamp(uint64_t3, uint64_t3, uint64_t3);
697670
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
698671
uint64_t4 clamp(uint64_t4, uint64_t4, uint64_t4);
699-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint64_t, 0)
700672

701673
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
702674
float clamp(float, float, float);
@@ -706,7 +678,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
706678
float3 clamp(float3, float3, float3);
707679
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
708680
float4 clamp(float4, float4, float4);
709-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, float, 0)
710681

711682
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
712683
double clamp(double, double, double);
@@ -716,7 +687,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
716687
double3 clamp(double3, double3, double3);
717688
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
718689
double4 clamp(double4, double4, double4);
719-
_HLSL_VEC_SCALAR_OVERLOADS(clamp, double, 0)
720690

721691
//===----------------------------------------------------------------------===//
722692
// clip builtins
@@ -1629,7 +1599,7 @@ half3 max(half3, half3);
16291599
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
16301600
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16311601
half4 max(half4, half4);
1632-
_HLSL_VEC_SCALAR_OVERLOADS(max, half, 1)
1602+
GEN_VEC_SCALAR_OVERLOADS(max, half, 1)
16331603

16341604
#ifdef __HLSL_ENABLE_16_BIT
16351605
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1644,7 +1614,7 @@ int16_t3 max(int16_t3, int16_t3);
16441614
_HLSL_AVAILABILITY(shadermodel, 6.2)
16451615
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16461616
int16_t4 max(int16_t4, int16_t4);
1647-
_HLSL_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
1617+
GEN_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
16481618

16491619
_HLSL_AVAILABILITY(shadermodel, 6.2)
16501620
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1658,7 +1628,7 @@ uint16_t3 max(uint16_t3, uint16_t3);
16581628
_HLSL_AVAILABILITY(shadermodel, 6.2)
16591629
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16601630
uint16_t4 max(uint16_t4, uint16_t4);
1661-
_HLSL_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
1631+
GEN_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
16621632
#endif
16631633

16641634
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1669,7 +1639,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16691639
int3 max(int3, int3);
16701640
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16711641
int4 max(int4, int4);
1672-
_HLSL_VEC_SCALAR_OVERLOADS(max, int, 0)
1642+
GEN_VEC_SCALAR_OVERLOADS(max, int, 0)
16731643

16741644
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16751645
uint max(uint, uint);
@@ -1679,7 +1649,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16791649
uint3 max(uint3, uint3);
16801650
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16811651
uint4 max(uint4, uint4);
1682-
_HLSL_VEC_SCALAR_OVERLOADS(max, uint, 0)
1652+
GEN_VEC_SCALAR_OVERLOADS(max, uint, 0)
16831653

16841654
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16851655
int64_t max(int64_t, int64_t);
@@ -1689,7 +1659,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16891659
int64_t3 max(int64_t3, int64_t3);
16901660
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16911661
int64_t4 max(int64_t4, int64_t4);
1692-
_HLSL_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
1662+
GEN_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
16931663

16941664
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16951665
uint64_t max(uint64_t, uint64_t);
@@ -1699,7 +1669,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16991669
uint64_t3 max(uint64_t3, uint64_t3);
17001670
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17011671
uint64_t4 max(uint64_t4, uint64_t4);
1702-
_HLSL_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
1672+
GEN_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
17031673

17041674
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17051675
float max(float, float);
@@ -1709,7 +1679,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17091679
float3 max(float3, float3);
17101680
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17111681
float4 max(float4, float4);
1712-
_HLSL_VEC_SCALAR_OVERLOADS(max, float, 0)
1682+
GEN_VEC_SCALAR_OVERLOADS(max, float, 0)
17131683

17141684
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17151685
double max(double, double);
@@ -1719,7 +1689,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17191689
double3 max(double3, double3);
17201690
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
17211691
double4 max(double4, double4);
1722-
_HLSL_VEC_SCALAR_OVERLOADS(max, double, 0)
1692+
GEN_VEC_SCALAR_OVERLOADS(max, double, 0)
17231693

17241694
//===----------------------------------------------------------------------===//
17251695
// min builtins
@@ -1742,7 +1712,7 @@ half3 min(half3, half3);
17421712
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
17431713
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17441714
half4 min(half4, half4);
1745-
_HLSL_VEC_SCALAR_OVERLOADS(min, half, 1)
1715+
GEN_VEC_SCALAR_OVERLOADS(min, half, 1)
17461716

17471717
#ifdef __HLSL_ENABLE_16_BIT
17481718
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1757,7 +1727,7 @@ int16_t3 min(int16_t3, int16_t3);
17571727
_HLSL_AVAILABILITY(shadermodel, 6.2)
17581728
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17591729
int16_t4 min(int16_t4, int16_t4);
1760-
_HLSL_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
1730+
GEN_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
17611731

17621732
_HLSL_AVAILABILITY(shadermodel, 6.2)
17631733
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1771,7 +1741,7 @@ uint16_t3 min(uint16_t3, uint16_t3);
17711741
_HLSL_AVAILABILITY(shadermodel, 6.2)
17721742
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17731743
uint16_t4 min(uint16_t4, uint16_t4);
1774-
_HLSL_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
1744+
GEN_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
17751745
#endif
17761746

17771747
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1782,7 +1752,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17821752
int3 min(int3, int3);
17831753
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17841754
int4 min(int4, int4);
1785-
_HLSL_VEC_SCALAR_OVERLOADS(min, int, 0)
1755+
GEN_VEC_SCALAR_OVERLOADS(min, int, 0)
17861756

17871757
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17881758
uint min(uint, uint);
@@ -1792,7 +1762,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17921762
uint3 min(uint3, uint3);
17931763
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17941764
uint4 min(uint4, uint4);
1795-
_HLSL_VEC_SCALAR_OVERLOADS(min, uint, 0)
1765+
GEN_VEC_SCALAR_OVERLOADS(min, uint, 0)
17961766

17971767
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17981768
float min(float, float);
@@ -1802,7 +1772,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18021772
float3 min(float3, float3);
18031773
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18041774
float4 min(float4, float4);
1805-
_HLSL_VEC_SCALAR_OVERLOADS(min, float, 0)
1775+
GEN_VEC_SCALAR_OVERLOADS(min, float, 0)
18061776

18071777
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18081778
int64_t min(int64_t, int64_t);
@@ -1812,7 +1782,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18121782
int64_t3 min(int64_t3, int64_t3);
18131783
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18141784
int64_t4 min(int64_t4, int64_t4);
1815-
_HLSL_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
1785+
GEN_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
18161786

18171787
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18181788
uint64_t min(uint64_t, uint64_t);
@@ -1822,7 +1792,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18221792
uint64_t3 min(uint64_t3, uint64_t3);
18231793
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18241794
uint64_t4 min(uint64_t4, uint64_t4);
1825-
_HLSL_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
1795+
GEN_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
18261796

18271797
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18281798
double min(double, double);
@@ -1832,7 +1802,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18321802
double3 min(double3, double3);
18331803
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18341804
double4 min(double4, double4);
1835-
_HLSL_VEC_SCALAR_OVERLOADS(min, double, 0)
1805+
GEN_VEC_SCALAR_OVERLOADS(min, double, 0)
18361806

18371807
//===----------------------------------------------------------------------===//
18381808
// normalize builtins
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//===--- hlsl_compat_overloads.h - Additional HLSL overload definitions for intrinsics --===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef _HLSL_COMPAT_OVERLOADS_H_
10+
#define _HLSl_COMPAT_OVERLOADS_H_
11+
12+
namespace hlsl {
13+
14+
// Note: Functions in this file are sorted alphabetically, then grouped by base
15+
// element type, and the element types are sorted by size, then singed integer,
16+
// unsigned integer and floating point. Keeping this ordering consistent will
17+
// help keep this file manageable as it grows.
18+
19+
//===----------------------------------------------------------------------===//
20+
// clamp builtins overloads
21+
//===----------------------------------------------------------------------===//
22+
23+
template<typename T, typename R, typename U, uint N>
24+
constexpr __detail::enable_if_t<__detail::is_arithmetic<U>::Value, vector<T,N>> clamp(vector<T,N> p0, vector<R,N> p1, U p2) {
25+
return __builtin_hlsl_elementwise_clamp(p0, (vector<T,N>)p1, (vector<T,N>)p2);
26+
}
27+
template<typename T, typename R, typename U, uint N>
28+
constexpr __detail::enable_if_t<__detail::is_arithmetic<U>::Value, vector<T,N>> clamp(vector<T,N> p0, U p1, vector<R,N> p2) {
29+
return __builtin_hlsl_elementwise_clamp(p0, (vector<T,N>)p1, (vector<T,N>)p2);
30+
}
31+
template<typename T, typename U, typename V, uint N>
32+
constexpr __detail::enable_if_t<__detail::is_arithmetic<U>::Value && __detail::is_arithmetic<V>::Value, vector<T,N>> clamp(vector<T,N> p0, U p1, V p2) {
33+
return __builtin_hlsl_elementwise_clamp(p0, (vector<T,N>)p1, (vector<T,N>)p2);
34+
}
35+
template<typename T, typename R, typename S, uint N>
36+
constexpr vector<T,N> clamp(vector<T,N> p0, vector<R,N> p1, vector<S,N> p2) {
37+
return __builtin_hlsl_elementwise_clamp(p0, (vector<T,N>)p1, (vector<T,N>)p2);
38+
}
39+
template<typename U, typename V, typename W>
40+
constexpr __detail::enable_if_t<__detail::is_arithmetic<U>::Value && __detail::is_arithmetic<V>::Value && __detail::is_arithmetic<W>::Value, U> clamp(U p0, V p1, W p2) {
41+
return __builtin_hlsl_elementwise_clamp(p0, (U) p1, (U) p2);
42+
}
43+
44+
} // namespace hlsl
45+
#endif // _HLSL_COMPAT_OVERLOADS_H_

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2392,8 +2392,16 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
23922392
case Builtin::BI__builtin_hlsl_elementwise_clamp: {
23932393
if (SemaRef.checkArgCount(TheCall, 3))
23942394
return true;
2395-
if (CheckVectorElementCallArgs(&SemaRef, TheCall))
2395+
if (CheckAnyScalarOrVector(&SemaRef, TheCall, 0) ||
2396+
!(SemaRef.Context.hasSameUnqualifiedType(TheCall->getArg(0)->getType(),
2397+
TheCall->getArg(1)->getType()) &&
2398+
SemaRef.Context.hasSameUnqualifiedType(TheCall->getArg(0)->getType(),
2399+
TheCall->getArg(2)->getType()))) {
2400+
SemaRef.Diag(TheCall->getBeginLoc(), diag::err_typecheck_call_different_arg_types)
2401+
<< TheCall->getArg(0)->getType() << TheCall->getArg(1)->getType()
2402+
<< TheCall->getBeginLoc() << TheCall->getBeginLoc();
23962403
return true;
2404+
}
23972405
if (SemaRef.BuiltinElementwiseTernaryMath(
23982406
TheCall, /*CheckForFloatArgs*/
23992407
TheCall->getArg(0)->getType()->hasFloatingRepresentation()))

0 commit comments

Comments
 (0)