[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