https://github.com/metkarpoonam created https://github.com/llvm/llvm-project/pull/127899
None >From 3ac4882e65c804c434bf6184559bdc6d9588683f Mon Sep 17 00:00:00 2001 From: Poonam Vilas Metkar <poonammet...@microsoft.com> Date: Wed, 19 Feb 2025 13:16:16 -0800 Subject: [PATCH] Added HLSL or intrinsic function with respective semantic checks --- clang/include/clang/Basic/Builtins.td | 8 +++++++- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 19 +++++++++++++++++++ clang/lib/Sema/SemaHLSL.cpp | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 29939242596ba..d71d17d9e3e01 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -98,7 +98,7 @@ def AcoshF128 : Builtin { } def AsinF16F128 : Builtin, F16F128MathTemplate { - let Spellings = ["__builtin_asin"]; + let Spellings = ["__builtin_asin"]; let Attributes = [FunctionWithBuiltinPrefix, NoThrow, ConstIgnoringErrnoAndExceptions]; let Prototype = "T(T)"; @@ -1238,6 +1238,7 @@ def NondetermenisticValue : Builtin { let Prototype = "void(...)"; } + def ElementwiseAbs : Builtin { let Spellings = ["__builtin_elementwise_abs"]; let Attributes = [NoThrow, Const, CustomTypeChecking]; @@ -4968,6 +4969,11 @@ def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { let Attributes = [NoThrow, Const]; let Prototype = "void()"; } +def HLSLOr : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_or"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} // Builtins for XRay. def XRayCustomEvent : Builtin { diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index d1f5fdff8b600..a3238c806262b 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -37,6 +37,25 @@ namespace hlsl { #define _HLSL_16BIT_AVAILABILITY_STAGE(environment, version, stage) #endif +//===----------------------------------------------------------------------===// +// or builtins +//===----------------------------------------------------------------------===// + +/// \fn T or(T x, T y) +/// \brief Returns the bitwise OR of the two input values, \a x and \a y. +/// \param x The first input value and y The second input value. +/// +/// \returns The bitwise OR of the two input values. + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool or (bool, bool); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool2 or (bool2, bool2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool3 or (bool3, bool3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_or) +bool4 or (bool4, bool4); + //===----------------------------------------------------------------------===// // abs builtins //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 4abd870ad6aaa..28e121ae2b8cb 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2558,6 +2558,29 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { } break; } + + case Builtin::BI__builtin_hlsl_or: { + if (SemaRef.checkArgCount(TheCall, 2)) + return true; + if (CheckVectorElementCallArgs(&SemaRef, TheCall)) + return true; + + //Ensure input parameter type is bool + ExprResult A = TheCall->getArg(0); + QualType ArgTyA = A.get()->getType(); + ExprResult B = TheCall->getArg(1); + QualType ArgTyB = B.get()->getType(); + if (!ArgTyA->isBooleanType() || !ArgTyB->isBooleanType()) { + SemaRef.Diag(TheCall->getArg(0)->getBeginLoc(), + diag::err_typecheck_convert_incompatible) + << ArgTyA << SemaRef.Context.BoolTy << 1 << 0 << 0; + return true; + } + // Ensure input expr type is a scalar/vector and the same as the return type + if (CheckAnyScalarOrVector(&SemaRef, TheCall, 0)) + return true; + break; + } } return false; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits