[clang] [Headers][X86] Enable constexpr handling for MMX/SSE/AVX/AVX512 PMADDWD/PMADDUBSW intrinsics (PR #161563)
Bhasawut Singhaphan via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 7 08:09:15 PDT 2025
================
@@ -2598,6 +2598,67 @@ static bool interp__builtin_elementwise_maxmin(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_ia32_pmadd(InterpState &S, CodePtr OpPC,
+ const CallExpr *Call,
+ unsigned BuiltinID) {
+ assert(Call->getArg(0)->getType()->isVectorType() &&
+ Call->getArg(1)->getType()->isVectorType());
+ const Pointer &RHS = S.Stk.pop<Pointer>();
+ const Pointer &LHS = S.Stk.pop<Pointer>();
+ const Pointer &Dst = S.Stk.peek<Pointer>();
+
+ const auto *VT = Call->getArg(0)->getType()->castAs<VectorType>();
+ PrimType ElemT = *S.getContext().classify(VT->getElementType());
+ unsigned NumElems = VT->getNumElements();
+
+ PrimType DstElemT = *S.getContext().classify(
+ Call->getType()->castAs<VectorType>()->getElementType());
+ unsigned DstElem = 0;
+ for (unsigned I = 0; I < NumElems; I += 2) {
+ APInt U_LHS0;
+ APInt U_LHS1;
+ APSInt LHS0;
+ APSInt LHS1;
+ APSInt RHS0;
+ APSInt RHS1;
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+ U_LHS0 = LHS.elem<T>(I).toAPSInt();
+ U_LHS1 = LHS.elem<T>(I + 1).toAPSInt();
+ LHS0 = LHS.elem<T>(I).toAPSInt();
+ LHS1 = LHS.elem<T>(I + 1).toAPSInt();
+ RHS0 = RHS.elem<T>(I).toAPSInt();
+ RHS1 = RHS.elem<T>(I + 1).toAPSInt();
+ });
+
+ APSInt Mul0;
+ APSInt Mul1;
+ APSInt Result;
+ unsigned BitWidth = LHS0.getBitWidth();
+ switch (BuiltinID) {
+ case clang::X86::BI__builtin_ia32_pmaddubsw128:
+ case clang::X86::BI__builtin_ia32_pmaddubsw256:
+ case clang::X86::BI__builtin_ia32_pmaddubsw512:
+ Mul0 = APSInt(U_LHS0.zext(BitWidth) * RHS0.sext(BitWidth));
+ Mul1 = APSInt(U_LHS1.zext(BitWidth) * RHS1.sext(BitWidth));
+ Result = APSInt(Mul0.sadd_sat(Mul1));
+ break;
+ case clang::X86::BI__builtin_ia32_pmaddwd128:
+ case clang::X86::BI__builtin_ia32_pmaddwd256:
+ case clang::X86::BI__builtin_ia32_pmaddwd512:
+ Mul0 = APSInt(LHS0.sext(BitWidth) * RHS0.sext(BitWidth));
+ Mul1 = APSInt(LHS1.sext(BitWidth) * RHS1.sext(BitWidth));
+ Result = APSInt(Mul0 + Mul1);
----------------
markbhasawut wrote:
Done.
https://github.com/llvm/llvm-project/pull/161563
More information about the cfe-commits
mailing list