[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