[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 17:44:00 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:

Do you mean where 2 and 3 are the base type but the first is a vector? I'm not sure if that is meant to be allowed.

https://github.com/llvm/llvm-project/pull/129939


More information about the cfe-commits mailing list