[clang] [Headers][X86] VisitCallExpr constexpr immediate shifts (#154293) (PR #155542)

Simon Pilgrim via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 29 01:01:44 PDT 2025


================
@@ -2573,6 +2607,78 @@ static bool interp__builtin_elementwise_int_binop(InterpState &S, CodePtr OpPC,
     return true;
   }
 
+  // Case for (vector, scalar)
+  if (Call->getArg(0)->getType()->isVectorType() &&
+      interp__is_builtin_shift_vector_by_immediate(BuiltinID)) {
+    const auto *VT = Call->getArg(0)->getType()->castAs<VectorType>();
+    const APSInt RHS = popToAPSInt(
+        S.Stk, *S.getContext().classify(Call->getArg(1)->getType()));
+    const Pointer &LHS = S.Stk.pop<Pointer>();
+    const Pointer &Dst = S.Stk.peek<Pointer>();
+    PrimType ElemT = *S.getContext().classify(VT->getElementType());
+    const unsigned LaneBitWidth =
+        S.getContext().getBitWidth(VT->getElementType());
+    bool DestUnsigned =
+        VT->getElementType()->isUnsignedIntegerOrEnumerationType();
+    unsigned NumElems = VT->getNumElements();
+    const unsigned ShiftAmount = RHS.getZExtValue();
+    for (unsigned I = 0; I != NumElems; ++I) {
+      APSInt Elem1;
+      INT_TYPE_SWITCH_NO_BOOL(ElemT, { Elem1 = LHS.elem<T>(I).toAPSInt(); });
+      APSInt Result;
+      switch (BuiltinID) {
+      case clang::X86::BI__builtin_ia32_psllwi128:
+      case clang::X86::BI__builtin_ia32_psllwi256:
+      case clang::X86::BI__builtin_ia32_psllwi512:
+      case clang::X86::BI__builtin_ia32_pslldi128:
+      case clang::X86::BI__builtin_ia32_pslldi256:
+      case clang::X86::BI__builtin_ia32_pslldi512:
+      case clang::X86::BI__builtin_ia32_psllqi128:
+      case clang::X86::BI__builtin_ia32_psllqi256:
+      case clang::X86::BI__builtin_ia32_psllqi512:
+        if (ShiftAmount >= LaneBitWidth) {
+          Result = (APSInt(APInt::getZero(LaneBitWidth), DestUnsigned));
+        } else {
+          Result = APSInt(Elem1.shl(ShiftAmount), DestUnsigned);
+        }
+        break;
+      case clang::X86::BI__builtin_ia32_psrlwi128:
+      case clang::X86::BI__builtin_ia32_psrlwi256:
+      case clang::X86::BI__builtin_ia32_psrlwi512:
+      case clang::X86::BI__builtin_ia32_psrldi128:
+      case clang::X86::BI__builtin_ia32_psrldi256:
+      case clang::X86::BI__builtin_ia32_psrldi512:
+      case clang::X86::BI__builtin_ia32_psrlqi128:
+      case clang::X86::BI__builtin_ia32_psrlqi256:
+      case clang::X86::BI__builtin_ia32_psrlqi512:
+        if (ShiftAmount >= LaneBitWidth) {
+          Result = (APSInt(APInt::getZero(LaneBitWidth), DestUnsigned));
+        } else {
+          Result = APSInt(Elem1.lshr(ShiftAmount), DestUnsigned);
+        }
+        break;
+      case clang::X86::BI__builtin_ia32_psrawi128:
+      case clang::X86::BI__builtin_ia32_psrawi256:
+      case clang::X86::BI__builtin_ia32_psrawi512:
+      case clang::X86::BI__builtin_ia32_psradi128:
+      case clang::X86::BI__builtin_ia32_psradi256:
+      case clang::X86::BI__builtin_ia32_psradi512:
+      case clang::X86::BI__builtin_ia32_psraqi128:
+      case clang::X86::BI__builtin_ia32_psraqi256:
+      case clang::X86::BI__builtin_ia32_psraqi512:
+        Result = APSInt(Elem1.ashr(std::min(ShiftAmount, LaneBitWidth)),
----------------
RKSimon wrote:

LaneBitWidth - 1

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


More information about the cfe-commits mailing list