Skip to content

Commit 23debaf

Browse files
committed
extra scalar vector overloads for clamp
1 parent cf6a520 commit 23debaf

File tree

3 files changed

+96
-37
lines changed

3 files changed

+96
-37
lines changed

clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,44 @@ 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); \
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)(NAME, BASE_T, _HLSL_CAT(BASE_T,2), AVAIL) \
44+
_HLSL_CAT(_HLSL_BOTH_OVERLOADS_,NUM_ARGS)(NAME, BASE_T, _HLSL_CAT(BASE_T,3), AVAIL) \
45+
_HLSL_CAT(_HLSL_BOTH_OVERLOADS_,NUM_ARGS)(NAME, BASE_T, _HLSL_CAT(BASE_T,4), AVAIL)
46+
47+
#define _HLSL_BOTH_OVERLOADS_2(NAME, BASE_T, VECTOR_T, AVAIL) \
48+
_HLSL_CAT(_HLSL_IF_TRUE_,AVAIL)( \
49+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T \
50+
NAME(VECTOR_T p0, BASE_T p1) { \
51+
return _HLSL_CAT(__builtin_elementwise_,NAME)(p0, (VECTOR_T)p1); \
4852
} \
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+
_HLSL_CAT(_HLSL_IF_TRUE_,AVAIL)( \
54+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T \
55+
NAME(BASE_T p0, VECTOR_T p1) { \
56+
return _HLSL_CAT(__builtin_elementwise_,NAME)((VECTOR_T)p0, p1); \
5357
}
5458

55-
#define IF_TRUE_0(EXPR)
56-
#define IF_TRUE_1(EXPR) EXPR
59+
#define _HLSL_BOTH_OVERLOADS_3(NAME, BASE_T, VECTOR_T, AVAIL) \
60+
_HLSL_CAT(_HLSL_IF_TRUE_,AVAIL)(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) \
61+
constexpr VECTOR_T NAME(VECTOR_T p0, VECTOR_T p1, BASE_T p2) { \
62+
return _HLSL_CAT(__builtin_hlsl_elementwise_,NAME)(p0, p1, (VECTOR_T)p2); \
63+
} \
64+
_HLSL_CAT(_HLSL_IF_TRUE_,AVAIL)(_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) \
65+
constexpr VECTOR_T NAME(VECTOR_T p0, BASE_T p1, VECTOR_T p2) { \
66+
return _HLSL_CAT(__builtin_hlsl_elementwise_,NAME)(p0, (VECTOR_T)p1, p2); \
67+
}
68+
69+
#define _HLSL_IF_TRUE_0(EXPR)
70+
#define _HLSL_IF_TRUE_1(EXPR) EXPR
5771

72+
#define _HLSL_NUM_ARGS_min 2
73+
#define _HLSL_NUM_ARGS_max 2
74+
#define _HLSL_NUM_ARGS_clamp 3
75+
5876
//===----------------------------------------------------------------------===//
5977
// abs builtins
6078
//===----------------------------------------------------------------------===//
@@ -603,7 +621,8 @@ half3 clamp(half3, half3, half3);
603621
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
604622
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
605623
half4 clamp(half4, half4, half4);
606-
624+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, half, 1)
625+
607626
#ifdef __HLSL_ENABLE_16_BIT
608627
_HLSL_AVAILABILITY(shadermodel, 6.2)
609628
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
@@ -617,7 +636,8 @@ int16_t3 clamp(int16_t3, int16_t3, int16_t3);
617636
_HLSL_AVAILABILITY(shadermodel, 6.2)
618637
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
619638
int16_t4 clamp(int16_t4, int16_t4, int16_t4);
620-
639+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int16_t, 1)
640+
621641
_HLSL_AVAILABILITY(shadermodel, 6.2)
622642
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
623643
uint16_t clamp(uint16_t, uint16_t, uint16_t);
@@ -630,6 +650,7 @@ uint16_t3 clamp(uint16_t3, uint16_t3, uint16_t3);
630650
_HLSL_AVAILABILITY(shadermodel, 6.2)
631651
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
632652
uint16_t4 clamp(uint16_t4, uint16_t4, uint16_t4);
653+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint16_t, 1)
633654
#endif
634655

635656
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
@@ -640,6 +661,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
640661
int3 clamp(int3, int3, int3);
641662
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
642663
int4 clamp(int4, int4, int4);
664+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int, 0)
643665

644666
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
645667
uint clamp(uint, uint, uint);
@@ -649,6 +671,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
649671
uint3 clamp(uint3, uint3, uint3);
650672
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
651673
uint4 clamp(uint4, uint4, uint4);
674+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint, 0)
652675

653676
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
654677
int64_t clamp(int64_t, int64_t, int64_t);
@@ -658,6 +681,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
658681
int64_t3 clamp(int64_t3, int64_t3, int64_t3);
659682
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
660683
int64_t4 clamp(int64_t4, int64_t4, int64_t4);
684+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, int64_t, 0)
661685

662686
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
663687
uint64_t clamp(uint64_t, uint64_t, uint64_t);
@@ -667,6 +691,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
667691
uint64_t3 clamp(uint64_t3, uint64_t3, uint64_t3);
668692
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
669693
uint64_t4 clamp(uint64_t4, uint64_t4, uint64_t4);
694+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, uint64_t, 0)
670695

671696
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
672697
float clamp(float, float, float);
@@ -676,6 +701,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
676701
float3 clamp(float3, float3, float3);
677702
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
678703
float4 clamp(float4, float4, float4);
704+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, float, 0)
679705

680706
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
681707
double clamp(double, double, double);
@@ -685,6 +711,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
685711
double3 clamp(double3, double3, double3);
686712
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_clamp)
687713
double4 clamp(double4, double4, double4);
714+
_HLSL_VEC_SCALAR_OVERLOADS(clamp, double, 0)
688715

689716
//===----------------------------------------------------------------------===//
690717
// clip builtins
@@ -1597,7 +1624,7 @@ half3 max(half3, half3);
15971624
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
15981625
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15991626
half4 max(half4, half4);
1600-
GEN_VEC_SCALAR_OVERLOADS(max, half, 1)
1627+
_HLSL_VEC_SCALAR_OVERLOADS(max, half, 1)
16011628

16021629
#ifdef __HLSL_ENABLE_16_BIT
16031630
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1612,7 +1639,7 @@ int16_t3 max(int16_t3, int16_t3);
16121639
_HLSL_AVAILABILITY(shadermodel, 6.2)
16131640
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16141641
int16_t4 max(int16_t4, int16_t4);
1615-
GEN_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
1642+
_HLSL_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
16161643

16171644
_HLSL_AVAILABILITY(shadermodel, 6.2)
16181645
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1626,7 +1653,7 @@ uint16_t3 max(uint16_t3, uint16_t3);
16261653
_HLSL_AVAILABILITY(shadermodel, 6.2)
16271654
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16281655
uint16_t4 max(uint16_t4, uint16_t4);
1629-
GEN_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
1656+
_HLSL_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
16301657
#endif
16311658

16321659
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1637,7 +1664,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16371664
int3 max(int3, int3);
16381665
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16391666
int4 max(int4, int4);
1640-
GEN_VEC_SCALAR_OVERLOADS(max, int, 0)
1667+
_HLSL_VEC_SCALAR_OVERLOADS(max, int, 0)
16411668

16421669
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16431670
uint max(uint, uint);
@@ -1647,7 +1674,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16471674
uint3 max(uint3, uint3);
16481675
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16491676
uint4 max(uint4, uint4);
1650-
GEN_VEC_SCALAR_OVERLOADS(max, uint, 0)
1677+
_HLSL_VEC_SCALAR_OVERLOADS(max, uint, 0)
16511678

16521679
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16531680
int64_t max(int64_t, int64_t);
@@ -1657,7 +1684,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16571684
int64_t3 max(int64_t3, int64_t3);
16581685
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16591686
int64_t4 max(int64_t4, int64_t4);
1660-
GEN_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
1687+
_HLSL_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
16611688

16621689
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16631690
uint64_t max(uint64_t, uint64_t);
@@ -1667,7 +1694,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16671694
uint64_t3 max(uint64_t3, uint64_t3);
16681695
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16691696
uint64_t4 max(uint64_t4, uint64_t4);
1670-
GEN_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
1697+
_HLSL_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
16711698

16721699
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16731700
float max(float, float);
@@ -1677,7 +1704,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16771704
float3 max(float3, float3);
16781705
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16791706
float4 max(float4, float4);
1680-
GEN_VEC_SCALAR_OVERLOADS(max, float, 0)
1707+
_HLSL_VEC_SCALAR_OVERLOADS(max, float, 0)
16811708

16821709
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16831710
double max(double, double);
@@ -1687,7 +1714,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16871714
double3 max(double3, double3);
16881715
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16891716
double4 max(double4, double4);
1690-
GEN_VEC_SCALAR_OVERLOADS(max, double, 0)
1717+
_HLSL_VEC_SCALAR_OVERLOADS(max, double, 0)
16911718

16921719
//===----------------------------------------------------------------------===//
16931720
// min builtins
@@ -1710,7 +1737,7 @@ half3 min(half3, half3);
17101737
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
17111738
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17121739
half4 min(half4, half4);
1713-
GEN_VEC_SCALAR_OVERLOADS(min, half, 1)
1740+
_HLSL_VEC_SCALAR_OVERLOADS(min, half, 1)
17141741

17151742
#ifdef __HLSL_ENABLE_16_BIT
17161743
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1725,7 +1752,7 @@ int16_t3 min(int16_t3, int16_t3);
17251752
_HLSL_AVAILABILITY(shadermodel, 6.2)
17261753
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17271754
int16_t4 min(int16_t4, int16_t4);
1728-
GEN_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
1755+
_HLSL_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
17291756

17301757
_HLSL_AVAILABILITY(shadermodel, 6.2)
17311758
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1739,7 +1766,7 @@ uint16_t3 min(uint16_t3, uint16_t3);
17391766
_HLSL_AVAILABILITY(shadermodel, 6.2)
17401767
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17411768
uint16_t4 min(uint16_t4, uint16_t4);
1742-
GEN_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
1769+
_HLSL_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
17431770
#endif
17441771

17451772
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1750,7 +1777,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17501777
int3 min(int3, int3);
17511778
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17521779
int4 min(int4, int4);
1753-
GEN_VEC_SCALAR_OVERLOADS(min, int, 0)
1780+
_HLSL_VEC_SCALAR_OVERLOADS(min, int, 0)
17541781

17551782
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17561783
uint min(uint, uint);
@@ -1760,7 +1787,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17601787
uint3 min(uint3, uint3);
17611788
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17621789
uint4 min(uint4, uint4);
1763-
GEN_VEC_SCALAR_OVERLOADS(min, uint, 0)
1790+
_HLSL_VEC_SCALAR_OVERLOADS(min, uint, 0)
17641791

17651792
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17661793
float min(float, float);
@@ -1770,7 +1797,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17701797
float3 min(float3, float3);
17711798
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17721799
float4 min(float4, float4);
1773-
GEN_VEC_SCALAR_OVERLOADS(min, float, 0)
1800+
_HLSL_VEC_SCALAR_OVERLOADS(min, float, 0)
17741801

17751802
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17761803
int64_t min(int64_t, int64_t);
@@ -1780,7 +1807,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17801807
int64_t3 min(int64_t3, int64_t3);
17811808
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17821809
int64_t4 min(int64_t4, int64_t4);
1783-
GEN_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
1810+
_HLSL_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
17841811

17851812
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17861813
uint64_t min(uint64_t, uint64_t);
@@ -1790,7 +1817,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17901817
uint64_t3 min(uint64_t3, uint64_t3);
17911818
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17921819
uint64_t4 min(uint64_t4, uint64_t4);
1793-
GEN_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
1820+
_HLSL_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
17941821

17951822
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17961823
double min(double, double);
@@ -1800,7 +1827,7 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18001827
double3 min(double3, double3);
18011828
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
18021829
double4 min(double4, double4);
1803-
GEN_VEC_SCALAR_OVERLOADS(min, double, 0)
1830+
_HLSL_VEC_SCALAR_OVERLOADS(min, double, 0)
18041831

18051832
//===----------------------------------------------------------------------===//
18061833
// normalize builtins

clang/test/CodeGenHLSL/builtins/clamp.hlsl

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ int16_t3 test_clamp_short3(int16_t3 p0, int16_t3 p1) { return clamp(p0, p1,p1);
2828
// NATIVE_HALF: define [[FNATTRS]] <4 x i16> @_Z17test_clamp_short4
2929
// NATIVE_HALF: call <4 x i16> @llvm.[[TARGET]].sclamp.v4i16
3030
int16_t4 test_clamp_short4(int16_t4 p0, int16_t4 p1) { return clamp(p0, p1,p1); }
31+
// NATIVE_HALF: define [[FNATTRS]] <4 x i16> {{.*}}test_clamp_short4_mismatch
32+
// NATIVE_HALF: call <4 x i16> @llvm.[[TARGET]].sclamp.v4i16
33+
int16_t4 test_clamp_short4_mismatch(int16_t4 p0, int16_t p1) { return clamp(p0, p0,p1); }
3134

3235
// NATIVE_HALF: define [[FNATTRS]] i16 @_Z17test_clamp_ushort
3336
// NATIVE_HALF: call i16 @llvm.[[TARGET]].uclamp.i16(
@@ -41,6 +44,9 @@ uint16_t3 test_clamp_ushort3(uint16_t3 p0, uint16_t3 p1) { return clamp(p0, p1,p
4144
// NATIVE_HALF: define [[FNATTRS]] <4 x i16> @_Z18test_clamp_ushort4
4245
// NATIVE_HALF: call <4 x i16> @llvm.[[TARGET]].uclamp.v4i16
4346
uint16_t4 test_clamp_ushort4(uint16_t4 p0, uint16_t4 p1) { return clamp(p0, p1,p1); }
47+
// NATIVE_HALF: define [[FNATTRS]] <4 x i16> {{.*}}test_clamp_ushort4_mismatch
48+
// NATIVE_HALF: call <4 x i16> @llvm.[[TARGET]].uclamp.v4i16
49+
uint16_t4 test_clamp_ushort4_mismatch(uint16_t4 p0, uint16_t p1) { return clamp(p0, p0,p1); }
4450
#endif
4551

4652
// CHECK: define [[FNATTRS]] i32 @_Z14test_clamp_int
@@ -55,6 +61,9 @@ int3 test_clamp_int3(int3 p0, int3 p1) { return clamp(p0, p1,p1); }
5561
// CHECK: define [[FNATTRS]] <4 x i32> @_Z15test_clamp_int4
5662
// CHECK: call <4 x i32> @llvm.[[TARGET]].sclamp.v4i32
5763
int4 test_clamp_int4(int4 p0, int4 p1) { return clamp(p0, p1,p1); }
64+
// CHECK: define [[FNATTRS]] <4 x i32> {{.*}}test_clamp_int4_mismatch
65+
// CHECK: call <4 x i32> @llvm.[[TARGET]].sclamp.v4i32
66+
int4 test_clamp_int4_mismatch(int4 p0, int p1) { return clamp(p0, p0,p1); }
5867

5968
// CHECK: define [[FNATTRS]] i32 @_Z15test_clamp_uint
6069
// CHECK: call i32 @llvm.[[TARGET]].uclamp.i32(
@@ -68,6 +77,9 @@ uint3 test_clamp_uint3(uint3 p0, uint3 p1) { return clamp(p0, p1,p1); }
6877
// CHECK: define [[FNATTRS]] <4 x i32> @_Z16test_clamp_uint4
6978
// CHECK: call <4 x i32> @llvm.[[TARGET]].uclamp.v4i32
7079
uint4 test_clamp_uint4(uint4 p0, uint4 p1) { return clamp(p0, p1,p1); }
80+
// CHECK: define [[FNATTRS]] <4 x i32> {{.*}}test_clamp_uint4_mismatch
81+
// CHECK: call <4 x i32> @llvm.[[TARGET]].uclamp.v4i32
82+
uint4 test_clamp_uint4_mismatch(uint4 p0, uint p1) { return clamp(p0, p0,p1); }
7183

7284
// CHECK: define [[FNATTRS]] i64 @_Z15test_clamp_long
7385
// CHECK: call i64 @llvm.[[TARGET]].sclamp.i64(
@@ -81,6 +93,9 @@ int64_t3 test_clamp_long3(int64_t3 p0, int64_t3 p1) { return clamp(p0, p1,p1); }
8193
// CHECK: define [[FNATTRS]] <4 x i64> @_Z16test_clamp_long4
8294
// CHECK: call <4 x i64> @llvm.[[TARGET]].sclamp.v4i64
8395
int64_t4 test_clamp_long4(int64_t4 p0, int64_t4 p1) { return clamp(p0, p1,p1); }
96+
// CHECK: define [[FNATTRS]] <4 x i64> {{.*}}test_clamp_long4_mismatch
97+
// CHECK: call <4 x i64> @llvm.[[TARGET]].sclamp.v4i64
98+
int64_t4 test_clamp_long4_mismatch(int64_t4 p0, int64_t4 p1) { return clamp(p0, p0,p1); }
8499

85100
// CHECK: define [[FNATTRS]] i64 @_Z16test_clamp_ulong
86101
// CHECK: call i64 @llvm.[[TARGET]].uclamp.i64(
@@ -94,6 +109,9 @@ uint64_t3 test_clamp_ulong3(uint64_t3 p0, uint64_t3 p1) { return clamp(p0, p1,p1
94109
// CHECK: define [[FNATTRS]] <4 x i64> @_Z17test_clamp_ulong4
95110
// CHECK: call <4 x i64> @llvm.[[TARGET]].uclamp.v4i64
96111
uint64_t4 test_clamp_ulong4(uint64_t4 p0, uint64_t4 p1) { return clamp(p0, p1,p1); }
112+
// CHECK: define [[FNATTRS]] <4 x i64> {{.*}}test_clamp_ulong4_mismatch
113+
// CHECK: call <4 x i64> @llvm.[[TARGET]].uclamp.v4i64
114+
uint64_t4 test_clamp_ulong4_mismatch(uint64_t4 p0, uint64_t4 p1) { return clamp(p0, p0,p1); }
97115

98116
// NATIVE_HALF: define [[FNATTRS]] [[FFNATTRS]] half @_Z15test_clamp_half
99117
// NATIVE_HALF: call reassoc nnan ninf nsz arcp afn half @llvm.[[TARGET]].nclamp.f16(
@@ -115,6 +133,11 @@ half3 test_clamp_half3(half3 p0, half3 p1) { return clamp(p0, p1,p1); }
115133
// NO_HALF: define [[FNATTRS]] [[FFNATTRS]] <4 x float> @_Z16test_clamp_half4
116134
// NO_HALF: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.[[TARGET]].nclamp.v4f32(
117135
half4 test_clamp_half4(half4 p0, half4 p1) { return clamp(p0, p1,p1); }
136+
// NATIVE_HALF: define [[FNATTRS]] [[FFNATTRS]] <4 x half> {{.*}}test_clamp_half4_mismatch
137+
// NATIVE_HALF: call reassoc nnan ninf nsz arcp afn <4 x half> @llvm.[[TARGET]].nclamp.v4f16
138+
// NO_HALF: define [[FNATTRS]] [[FFNATTRS]] <4 x float> {{.*}}test_clamp_half4_mismatch
139+
// NO_HALF: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.[[TARGET]].nclamp.v4f32(
140+
half4 test_clamp_half4_mismatch(half4 p0, half p1) { return clamp(p0, p0,p1); }
118141

119142
// CHECK: define [[FNATTRS]] [[FFNATTRS]] float @_Z16test_clamp_float
120143
// CHECK: call reassoc nnan ninf nsz arcp afn float @llvm.[[TARGET]].nclamp.f32(
@@ -128,6 +151,9 @@ float3 test_clamp_float3(float3 p0, float3 p1) { return clamp(p0, p1,p1); }
128151
// CHECK: define [[FNATTRS]] [[FFNATTRS]] <4 x float> @_Z17test_clamp_float4
129152
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.[[TARGET]].nclamp.v4f32
130153
float4 test_clamp_float4(float4 p0, float4 p1) { return clamp(p0, p1,p1); }
154+
// CHECK: define [[FNATTRS]] [[FFNATTRS]] <4 x float> {{.*}}test_clamp_float4_mismatch
155+
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x float> @llvm.[[TARGET]].nclamp.v4f32
156+
float4 test_clamp_float4_mismatch(float4 p0, float p1) { return clamp(p0, p0,p1); }
131157

132158
// CHECK: define [[FNATTRS]] [[FFNATTRS]] double @_Z17test_clamp_double
133159
// CHECK: call reassoc nnan ninf nsz arcp afn double @llvm.[[TARGET]].nclamp.f64(
@@ -141,3 +167,9 @@ double3 test_clamp_double3(double3 p0, double3 p1) { return clamp(p0, p1,p1); }
141167
// CHECK: define [[FNATTRS]] [[FFNATTRS]] <4 x double> @_Z18test_clamp_double4
142168
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.[[TARGET]].nclamp.v4f64
143169
double4 test_clamp_double4(double4 p0, double4 p1) { return clamp(p0, p1,p1); }
170+
// CHECK: define [[FNATTRS]] [[FFNATTRS]] <4 x double> {{.*}}test_clamp_double4_mismatch
171+
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.[[TARGET]].nclamp.v4f64
172+
double4 test_clamp_double4_mismatch(double4 p0, double p1) { return clamp(p0, p0,p1); }
173+
// CHECK: define [[FNATTRS]] [[FFNATTRS]] <4 x double> {{.*}}test_clamp_double4_mismatch2
174+
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.[[TARGET]].nclamp.v4f64
175+
double4 test_clamp_double4_mismatch2(double4 p0, double p1) { return clamp(p0, p1,p0); }

clang/test/SemaHLSL/BuiltIns/clamp-errors.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ float2 test_clamp_no_second_arg(float2 p0) {
2222

2323
float2 test_clamp_vector_size_mismatch(float3 p0, float2 p1) {
2424
return clamp(p0, p0, p1);
25-
// expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}}
25+
// expected-error@-1 {{call to 'clamp' is ambiguous}}
2626
}
2727

2828
float2 test_clamp_builtin_vector_size_mismatch(float3 p0, float2 p1) {

0 commit comments

Comments
 (0)