================
@@ -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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to