[clang] [clang][X86] Allow VALIGND/Q element-shift intrinsics in constexpr evaluation (PR #168206)

Muhammad Abdul via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 18 18:49:25 PST 2025


================
@@ -4774,6 +4774,26 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
           return std::pair<unsigned, int>{VecIdx, ElemIdx};
         });
 
+  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: {
+    unsigned NumElems =
+        Call->getType()->castAs<VectorType>()->getNumElements();
+    return interp__builtin_ia32_shuffle_generic(
+        S, OpPC, Call, [NumElems](unsigned DstIdx, unsigned Shift) {
+          unsigned Imm = Shift & 0xFF;
+          unsigned EffectiveShift = Imm & (NumElems - 1);
+          unsigned SourcePos = DstIdx + EffectiveShift;
+          unsigned VecIdx = SourcePos < NumElems ? 1u : 0u;
+          unsigned ElemIdx =
+              SourcePos < NumElems ? SourcePos : SourcePos - NumElems;
----------------
0xzre wrote:

oh nice, fixed

https://github.com/llvm/llvm-project/pull/168206


More information about the cfe-commits mailing list