[clang] [HLSL] add extra scalar vector overloads for clamp (PR #129939)
Sarah Spall via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 5 16:33:04 PST 2025
================
@@ -35,25 +35,48 @@ namespace hlsl {
#define _HLSL_16BIT_AVAILABILITY_STAGE(environment, version, stage)
#endif
-#define GEN_VEC_SCALAR_OVERLOADS(FUNC_NAME, BASE_TYPE, AVAIL) \
- GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##2, AVAIL) \
- GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##3, AVAIL) \
- GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##4, AVAIL)
-
-#define GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, VECTOR_TYPE, AVAIL) \
- IF_TRUE_##AVAIL( \
- _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
- FUNC_NAME(VECTOR_TYPE p0, BASE_TYPE p1) { \
- return __builtin_elementwise_##FUNC_NAME(p0, (VECTOR_TYPE)p1); \
+#define _HLSL_CAT(a, b) a##b
+#define _HLSL_VEC_SCALAR_OVERLOADS(NAME, BASE_T, AVAIL) \
+ _HLSL_ALL_OVERLOADS(NAME, BASE_T, AVAIL, _HLSL_CAT(_HLSL_NUM_ARGS_, NAME))
+
+#define _HLSL_ALL_OVERLOADS(NAME, BASE_T, AVAIL, NUM_ARGS) \
+ _HLSL_CAT(_HLSL_BOTH_OVERLOADS_, NUM_ARGS) \
+ (NAME, BASE_T, _HLSL_CAT(BASE_T, 2), AVAIL) \
+ _HLSL_CAT(_HLSL_BOTH_OVERLOADS_, NUM_ARGS)(NAME, BASE_T, \
+ _HLSL_CAT(BASE_T, 3), AVAIL) \
+ _HLSL_CAT(_HLSL_BOTH_OVERLOADS_, \
+ NUM_ARGS)(NAME, BASE_T, _HLSL_CAT(BASE_T, 4), AVAIL)
+
+#define _HLSL_BOTH_OVERLOADS_2(NAME, BASE_T, VECTOR_T, AVAIL) \
+ _HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
+ (_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
+ VECTOR_T p0, BASE_T p1) { \
+ return _HLSL_CAT(__builtin_elementwise_, NAME)(p0, (VECTOR_T)p1); \
} \
- IF_TRUE_##AVAIL( \
- _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
- FUNC_NAME(BASE_TYPE p0, VECTOR_TYPE p1) { \
- return __builtin_elementwise_##FUNC_NAME((VECTOR_TYPE)p0, p1); \
+ _HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
+ (_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
+ BASE_T p0, VECTOR_T p1) { \
+ return _HLSL_CAT(__builtin_elementwise_, NAME)((VECTOR_T)p0, p1); \
}
-#define IF_TRUE_0(EXPR)
-#define IF_TRUE_1(EXPR) EXPR
+#define _HLSL_BOTH_OVERLOADS_3(NAME, BASE_T, VECTOR_T, AVAIL) \
+ _HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
+ (_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
+ VECTOR_T p0, VECTOR_T p1, BASE_T p2) { \
+ return _HLSL_CAT(__builtin_hlsl_elementwise_, NAME)(p0, p1, (VECTOR_T)p2); \
+ } \
+ _HLSL_CAT(_HLSL_IF_TRUE_, AVAIL) \
+ (_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_T NAME( \
+ VECTOR_T p0, BASE_T p1, VECTOR_T p2) { \
+ return _HLSL_CAT(__builtin_hlsl_elementwise_, NAME)(p0, (VECTOR_T)p1, p2); \
----------------
spall wrote:
> Also, a thought: Would we also need to do further possibilities such as if arg 1 and 3 are the base type, or 2 and 3? Or do we only want overloads when exactly one argument is the base type?
Yes to the last question. There should already be an overload, for clamp and min and max, where args 2 and 3 are the base type.
https://github.com/llvm/llvm-project/pull/129939
More information about the cfe-commits
mailing list