================
@@ -2446,37 +2376,41 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned 
BuiltinID, CallExpr *TheCall) {
   case Builtin::BI__builtin_hlsl_any: {
     if (SemaRef.checkArgCount(TheCall, 1))
       return true;
+    if (CheckAnyScalarOrVector(&SemaRef, TheCall, 0))
+      return true;
     break;
   }
   case Builtin::BI__builtin_hlsl_asdouble: {
     if (SemaRef.checkArgCount(TheCall, 2))
       return true;
-    if (CheckUnsignedIntRepresentation(&SemaRef, TheCall))
+    if (CheckScalarOrVector(&SemaRef, TheCall, SemaRef.Context.UnsignedIntTy,
+                            0)) // only check for uint
+      return true;
+    if (CheckScalarOrVector(&SemaRef, TheCall, SemaRef.Context.UnsignedIntTy,
+                            1)) // only check for uint
+      return true;
+    if (CheckAllArgsHaveSameType(&SemaRef, TheCall))
       return true;
 
     SetElementTypeAsReturnType(&SemaRef, TheCall, getASTContext().DoubleTy);
     break;
   }
   case Builtin::BI__builtin_hlsl_elementwise_clamp: {
-    if (SemaRef.checkArgCount(TheCall, 3))
-      return true;
-    if (CheckAnyScalarOrVector(&SemaRef, TheCall, 0) ||
-        CheckAllArgsHaveSameType(&SemaRef, TheCall))
-      return true;
     if (SemaRef.BuiltinElementwiseTernaryMath(
             TheCall, /*ArgTyRestr=*/
-            TheCall->getArg(0)->getType()->hasFloatingRepresentation()
-                ? Sema::EltwiseBuiltinArgTyRestriction::FloatTy
-                : Sema::EltwiseBuiltinArgTyRestriction::None))
+            Sema::EltwiseBuiltinArgTyRestriction::None))
       return true;
     break;
   }
   case Builtin::BI__builtin_hlsl_cross: {
     if (SemaRef.checkArgCount(TheCall, 2))
       return true;
-    if (CheckVectorElementCallArgs(&SemaRef, TheCall))
+
+    // ensure args are a half3 or float3
----------------
farzonl wrote:

This comment doesn not seem to match what `CheckAllArgTypesAreCorrect` does 
since there is no specific vec3 checking.  Now that I am seeing this. I don't 
think cross product should be handled in sema since we know it is only valid 
for vec3s we should probably just create a typed builtin like so

```
def HLSLCrossHalf: Builtin { 
  let Spellings = ["__builtin_hlsl_crossf16"];
  let Attributes = [NoThrow, Const];
   let Prototype = "_ExtVector<3, _Float16>(_ExtVector<3, _Float16>, 
_ExtVector<3, _Float16>)";
}
}

def HLSLCrossFloat: Builtin { 
  let Spellings = ["__builtin_hlsl_crossf];
  let Attributes = [NoThrow, Const];
  let Prototype = "_ExtVector<3, float>(_ExtVector<3, float>, _ExtVector<3, 
float>)";
}
```

or 
```
class HLSLFPMathTemplate : Template<["_Float16", "float"],  ["f16",    "f"]>;

def HLSLCross : Builtin, HLSLFPMathTemplate {
  let Spellings = ["__builtin_hlsl_cross"];
  let Attributes = [FunctionWithBuiltinPrefix, NoThrow,Const];
  let Prototype = "_ExtVector<3, T>(_ExtVector<3, T>, _ExtVector<3, T>)";
}
}
```

https://github.com/llvm/llvm-project/pull/138429
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to