[clang] [Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - Allow AVX512 VPMULTISHIFTQB intrinsics to be used in constexpr (PR #168995)
Simon Pilgrim via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 26 11:13:50 PST 2025
================
@@ -13096,6 +13096,47 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
return Success(R, E);
}
+ case X86::BI__builtin_ia32_vpmultishiftqb128:
+ case X86::BI__builtin_ia32_vpmultishiftqb256:
+ case X86::BI__builtin_ia32_vpmultishiftqb512: {
+ assert(E->getNumArgs() == 2);
+
+ APValue A, B;
+ if (!Evaluate(A, Info, E->getArg(0)) || !Evaluate(B, Info, E->getArg(1)))
+ return false;
+
+ assert(A.getVectorLength() == B.getVectorLength());
+ unsigned NumBytesInQWord = 8;
+ unsigned NumBitsInByte = 8;
+ unsigned NumBytes = A.getVectorLength();
+ unsigned NumQWords = NumBytes / NumBytesInQWord;
+ SmallVector<APValue, 64> Result;
+ Result.reserve(NumBytes);
+
+ for (unsigned QWordId = 0; QWordId != NumQWords; ++QWordId) {
+ APInt BQWord(64, 0);
+ for (unsigned ByteIdx = 0; ByteIdx != NumBytesInQWord; ++ByteIdx) {
+ unsigned Idx = QWordId * NumBytesInQWord + ByteIdx;
+ uint64_t Byte = B.getVectorElt(Idx).getInt().getZExtValue();
+ BQWord.insertBits(APInt(8, Byte & 0xFF), ByteIdx * NumBitsInByte);
+ }
+
+ for (unsigned ByteIdx = 0; ByteIdx != NumBytesInQWord; ++ByteIdx) {
+ uint64_t Ctrl = A.getVectorElt(QWordId * NumBytesInQWord + ByteIdx)
----------------
RKSimon wrote:
Hoist `unsigned Idx = QWordId * NumBytesInQWord + ByteIdx;` - it should help with the clang-format line wrapping
https://github.com/llvm/llvm-project/pull/168995
More information about the cfe-commits
mailing list