diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2025-09-05 21:14:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-05 20:14:29 +0000 |
commit | 13d50c24a083a04355b37d45aae6b4ba9fc294af (patch) | |
tree | 2ab073f530ca7f18b086504d62bda58d1dbec319 /clang/lib/AST/ExprConstant.cpp | |
parent | 719b92dfb14cceb9e17eadda301bfb759d0778d7 (diff) | |
download | llvm-13d50c24a083a04355b37d45aae6b4ba9fc294af.zip llvm-13d50c24a083a04355b37d45aae6b4ba9fc294af.tar.gz llvm-13d50c24a083a04355b37d45aae6b4ba9fc294af.tar.bz2 |
[X86][bytecode] Allow SSE/AVX BLENDVPD/PD intrinsics to be used in constexpr (#157126)
BLENDV intrinsics use the signbit of the condition mask to select
between the LHS (false) and RHS (true) operands
Fixes #157066
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 100e944..90dff96 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11995,6 +11995,10 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { return Success(APValue(ResultElements.data(), ResultElements.size()), E); } + case X86::BI__builtin_ia32_blendvpd: + case X86::BI__builtin_ia32_blendvpd256: + case X86::BI__builtin_ia32_blendvps: + case X86::BI__builtin_ia32_blendvps256: case X86::BI__builtin_ia32_pblendvb128: case X86::BI__builtin_ia32_pblendvb256: { // SSE blendv by mask signbit: "Result = C[] < 0 ? T[] : F[]". @@ -12011,8 +12015,9 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { for (unsigned EltNum = 0; EltNum < SourceLen; ++EltNum) { const APValue &F = SourceF.getVectorElt(EltNum); const APValue &T = SourceT.getVectorElt(EltNum); - APInt C = SourceC.getVectorElt(EltNum).getInt(); - ResultElements.push_back(C.isNegative() ? T : F); + const APValue &C = SourceC.getVectorElt(EltNum); + APInt M = C.isInt() ? (APInt)C.getInt() : C.getFloat().bitcastToAPInt(); + ResultElements.push_back(M.isNegative() ? T : F); } return Success(APValue(ResultElements.data(), ResultElements.size()), E); |