[clang] [X86][bytecode] Allow SSE/AVX BLEND imm intrinsics to be used in constexpr (PR #157776)

via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 10 19:52:22 PDT 2025


================
@@ -2831,6 +2831,44 @@ static bool interp__builtin_select(InterpState &S, CodePtr OpPC,
   return true;
 }
 
+static bool interp__builtin_blend(InterpState &S, CodePtr OpPC,
+                                  const CallExpr *Call, unsigned BuiltinID) {
+  PrimType MaskT = *S.getContext().classify(Call->getArg(2));
+  APSInt Mask = popToAPSInt(S.Stk, MaskT);
+  const Pointer &TrueElem = S.Stk.pop<Pointer>();
+  const Pointer &FalseElem = S.Stk.pop<Pointer>();
+  const Pointer &Dst = S.Stk.peek<Pointer>();
+
+  assert(FalseElem.getNumElems() == TrueElem.getNumElems());
+  assert(FalseElem.getNumElems() == Dst.getNumElems());
+  unsigned NumElems = FalseElem.getNumElems();
+  PrimType ElemT = FalseElem.getFieldDesc()->getPrimType();
+  PrimType DstElemT = Dst.getFieldDesc()->getPrimType();
+
+  auto BitIndex = BuiltinID == X86::BI__builtin_ia32_pblendw256
+                      ? [](unsigned I) { return I % 8; }
+                      : [](unsigned I) { return I; };
+  for (unsigned I = 0; I != NumElems; ++I) {
+    bool MaskBit = Mask[BitIndex(I)];
+    if (ElemT == PT_Float) {
+      assert(DstElemT == PT_Float);
+      Dst.elem<Floating>(I) =
+          MaskBit ? TrueElem.elem<Floating>(I) : FalseElem.elem<Floating>(I);
+    } else {
+      APSInt Elem;
+      INT_TYPE_SWITCH(ElemT, {
+        Elem = MaskBit ? TrueElem.elem<T>(I).toAPSInt()
+                       : FalseElem.elem<T>(I).toAPSInt();
+      });
+      INT_TYPE_SWITCH_NO_BOOL(DstElemT,
+                              { Dst.elem<T>(I) = static_cast<T>(Elem); });
----------------
brandonxin wrote:

Thanks for your advice. However, I just noticed that `assert` is not commonly used in `VectorExprEvaluator::VisitCallExpr`, and most builtins don't check operands' types explicitly. Should I just remove these assertions for better consistency?

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


More information about the cfe-commits mailing list