summaryrefslogtreecommitdiff
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorMuhammad Abdul <alilo.ghazali@gmail.com>2025-11-22 18:53:34 +0700
committerGitHub <noreply@github.com>2025-11-22 11:53:34 +0000
commit7305b6eb5458b5cea62b3ab70da95b790cf988f3 (patch)
tree1634ba3233bdf64674258ebf265e2be23da3fccc /clang/lib/AST/ExprConstant.cpp
parent4128b213ee93750766c57b5b37d239be53b80c26 (diff)
[clang][X86] Allow VALIGND/Q element-shift intrinsics in constexpr evaluation (#168206)
Fixes #167681
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r--clang/lib/AST/ExprConstant.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index ce5301f17b3e..bc885f4c8902 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -13627,6 +13627,28 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
return false;
return Success(R, E);
}
+ case X86::BI__builtin_ia32_alignd128:
+ case X86::BI__builtin_ia32_alignd256:
+ case X86::BI__builtin_ia32_alignd512:
+ case X86::BI__builtin_ia32_alignq128:
+ case X86::BI__builtin_ia32_alignq256:
+ case X86::BI__builtin_ia32_alignq512: {
+ APValue R;
+ unsigned NumElems = E->getType()->castAs<VectorType>()->getNumElements();
+ if (!evalShuffleGeneric(Info, E, R,
+ [NumElems](unsigned DstIdx, unsigned Shift) {
+ unsigned Imm = Shift & 0xFF;
+ unsigned EffectiveShift = Imm & (NumElems - 1);
+ unsigned SourcePos = DstIdx + EffectiveShift;
+ unsigned VecIdx = SourcePos < NumElems ? 1 : 0;
+ unsigned ElemIdx = SourcePos & (NumElems - 1);
+
+ return std::pair<unsigned, int>{
+ VecIdx, static_cast<int>(ElemIdx)};
+ }))
+ return false;
+ return Success(R, E);
+ }
case X86::BI__builtin_ia32_permvarsi256:
case X86::BI__builtin_ia32_permvarsf256:
case X86::BI__builtin_ia32_permvardf512: