[clang] [Headers][X86] Enable constexpr handling for MMX/SSE/AVX/AVX512 PMADDWD/PMADDUBSW intrinsics (PR #161563)

Simon Pilgrim via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 6 06:48:10 PDT 2025


================
@@ -11724,6 +11724,52 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
   case clang::X86::BI__builtin_ia32_pavgw512:
     return EvaluateBinOpExpr(llvm::APIntOps::avgCeilU);
 
+  case clang::X86::BI__builtin_ia32_pmaddubsw128:
+  case clang::X86::BI__builtin_ia32_pmaddubsw256:
+  case clang::X86::BI__builtin_ia32_pmaddubsw512:
+  case clang::X86::BI__builtin_ia32_pmaddwd128:
+  case clang::X86::BI__builtin_ia32_pmaddwd256:
+  case clang::X86::BI__builtin_ia32_pmaddwd512: {
+    APValue SourceLHS, SourceRHS;
+    if (!EvaluateAsRValue(Info, E->getArg(0), SourceLHS) ||
+        !EvaluateAsRValue(Info, E->getArg(1), SourceRHS))
+      return false;
+
+    unsigned SourceLen = SourceLHS.getVectorLength();
+    SmallVector<APValue, 4> ResultElements;
+    ResultElements.reserve(SourceLen / 2);
+
+    for (unsigned EltNum = 0; EltNum < SourceLen; EltNum += 2) {
+      APInt U_LHS0 = SourceLHS.getVectorElt(EltNum).getInt();
+      APInt U_LHS1 = SourceLHS.getVectorElt(EltNum + 1).getInt();
+      APSInt LHS0 = SourceLHS.getVectorElt(EltNum).getInt();
+      APSInt LHS1 = SourceLHS.getVectorElt(EltNum + 1).getInt();
+      APSInt RHS0 = SourceRHS.getVectorElt(EltNum).getInt();
+      APSInt RHS1 = SourceRHS.getVectorElt(EltNum + 1).getInt();
+      unsigned BitWidth = LHS0.getBitWidth();
+
+      switch (E->getBuiltinCallee()) {
+      case clang::X86::BI__builtin_ia32_pmaddubsw128:
+      case clang::X86::BI__builtin_ia32_pmaddubsw256:
+      case clang::X86::BI__builtin_ia32_pmaddubsw512:
+        ResultElements.push_back(APValue(
+            APSInt(APInt(U_LHS0.zext(BitWidth)) *
+                   RHS0.sext(BitWidth).sadd_sat(APInt(U_LHS1.zext(BitWidth)) *
+                                                RHS1.sext(BitWidth)))));
+        break;
+      case clang::X86::BI__builtin_ia32_pmaddwd128:
+      case clang::X86::BI__builtin_ia32_pmaddwd256:
+      case clang::X86::BI__builtin_ia32_pmaddwd512:
+        ResultElements.push_back(
+            APValue(APSInt(LHS0.sext(BitWidth) * RHS0.sext(BitWidth) +
+                           LHS1.sext(BitWidth) * RHS1.sext(BitWidth))));
----------------
RKSimon wrote:

Missing signedness control

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


More information about the cfe-commits mailing list