[clang] [clang][bytecode] Implement ia32_select* builtins (PR #154758)

via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 11 11:50:10 PDT 2025


================
@@ -2778,6 +2778,40 @@ static bool interp__builtin_elementwise_fma(InterpState &S, CodePtr OpPC,
   return true;
 }
 
+/// AVX512 predicated move: "Result = Mask[] ? LHS[] : RHS[]".
+static bool interp__builtin_select(InterpState &S, CodePtr OpPC,
+                                   const CallExpr *Call) {
+  const Pointer &RHS = S.Stk.pop<Pointer>();
+  const Pointer &LHS = S.Stk.pop<Pointer>();
+  PrimType MaskT = *S.getContext().classify(Call->getArg(0));
+  APSInt Mask = popToAPSInt(S.Stk, MaskT);
+  const Pointer &Dst = S.Stk.peek<Pointer>();
+
+  assert(LHS.getNumElems() == RHS.getNumElems());
+  assert(LHS.getNumElems() == Dst.getNumElems());
+  unsigned NumElems = LHS.getNumElems();
+  PrimType ElemT = LHS.getFieldDesc()->getPrimType();
+  PrimType DstElemT = Dst.getFieldDesc()->getPrimType();
+
+  for (unsigned I = 0; I != NumElems; ++I) {
+    if (ElemT == PT_Float) {
+      assert(DstElemT == PT_Float);
+      Dst.elem<Floating>(I) =
+          Mask[I] ? LHS.elem<Floating>(I) : RHS.elem<Floating>(I);
+    } else {
+      APSInt Elem;
+      INT_TYPE_SWITCH(ElemT, {
----------------
brandonxin wrote:

Hello, I am new to LLVM/Clang. I want to ask why there is an `INT_TYPE_SWITCH` and then another `INT_TYPE_SWITCH_NO_BOOL`. Is it possible that `ElemT` is `PT_Bool`? I checked `BuiltinsX86.td` and all these `select` buitins require vectors of integers as their parameters.

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


More information about the cfe-commits mailing list