<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/155392>155392</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] VectorExprEvaluator::VisitCallExpr - add MMX/SSE/AVX/AVX512 PMADDWD/PMADDUBSW intrinsics to be used in constexpr
</td>
</tr>
<tr>
<th>Labels</th>
<td>
good first issue,
backend:X86,
clang:frontend,
constexpr
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
The PMADDWD/PMADDUBSW intrinsics can all be used in constexpr with suitable handling of the __builtin_ia32_pmadd* builtins inside VectorExprEvaluator::VisitCallExpr similar to https://github.com/llvm/llvm-project/pull/152540
```
_mm_madd_pi16
_mm_madd_epi16 _mm256_madd_epi16 _mm512_madd_epi16
_mm_mask_madd_epi16 _mm256_mask_madd_epi16 _mm512_mask_madd_epi16
_mm_maskz_madd_epi16 _mm256_maskz_madd_epi16 _mm512_maskz_madd_epi16
_mm_maddubs_pi16
_mm_maddubs_epi16 _mm256_maddubs_epi16 _mm512_maddubs_epi16
_mm_mask_maddubs_epi16 _mm256_mask_maddubs_epi16 _mm512_mask_maddubs_epi16
_mm_maskz_maddubs_epi16 _mm256_maskz_maddubs_epi16 _mm512_maskz_maddubs_epi16
```
The constant folding doesn't map to an APInt operation - you should handle it locally, plus its a horizontal pairwise addition so that will need handling as well:
```
// Split Lo/Hi elements pairs, extend and add together.
// PMADDWD(X,Y) =
// add(mul(sext(lhs[0]),sext(rhs[0])),mul(sext(lhs[1]),sext(rhs[1])))
// PMADDUBSW(X,Y) =
// sadd_sat(mul(zext(lhs[0]),sext(rhs[0])),mul(zext(lhs[1]),sext(rhs[1])))
```
We might need to consider adjusting the PMADDUBSW builtins to take an unsigned lhs argument as well.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVd1vq7gT_WvMy6gRDCUJDzzQpNHvp91KV9vdtvsUGeyAb42N7KEf-etXpk1K2tz9uFI-zzCHM8zxDPdeNUbKgmVXLFtHfKDWuuK3X25VZ01UWfFa_N5K-HZTrtf3a4ab8dcfV7f3oAw5ZbyqPdTcANcaKgmDlwKUgdoaT_Kld_CsqAU_KOKVltByI7QyDdgdUCthu60GpUmZreIpbvuOC8GwhHfUQ7iFkHAna7Lu-qV3109cD5ysY2nJ0vJOeUUrrnWIgVed0twBWWiJeh-uwQ3DTaOoHapZbTuGG62fDl8XvbPfZU0MN_2gNcNNkmF2GbO4ZPP4_RWX267bBmnbXiXz6X8ZANh2HWbzT0iW4AQ5JvnHs5lf4Lf0E3jCsf8ByWf8wLI_pZmUMFT-c1UB-lLYCXio7Qh-Lu8MxbnISZHnyPY_ZjsTOq12yjdtZnD06E9uCHZWi-BHYaU3DBcEHe-Df7iB8tv_DYHtpeOkrIELeLUD-NYOWrw5WYIi0LbmWr8yXEGvBw-KPHBorVN7a4hr6Llyz8pL4EKokclboJYTPCutwUgpPg4G9_AstQ7OPZUN8GZluO21IvjVMtz8T4HUspOG_HgXH0TIF5JGAA9vIYBsI6mVbjblOJ7o5QPD1Z8Mc2DpenrFeBCX3aAZLr18IYZL3XqWXcUsWzPMGa7eYXcKh8iZtOR8WjJJy78oDJPmbzT64GnP6Sh0_3NC9z8hdNqaewmdalp6ayXZ0V5KSAdcfB88hb7SYY6O0_M438gC8UcZ7DaYcRoL0K0H7poh9PXgh1kkilTkac4jWSSLbI5xmi_zqC3qOs4v6xQTGaeLfCGRVzWXeVxXdTXHpIpUgTFm8RLnSYxzzGcixnxRL3apqKrlLlmwy1h2XOlZmIgz65pIeT_IIsmyNMdI80pqP-4IxMZaATvlPMF4EUNkuGKIFa8fpREsLR-W8yNaa24alpY7Z01w5UfgsCACkq0jV4zjuBoazy5jrTz5DzmkSI9LajXSZet_uw8uxhNwc_PAcHN7e81wU949vH1mCf7TXiN7dqVFg9PFf14v49Py44IZn-pTgX8FAAD__wTYaE8">