================ @@ -11599,6 +11599,89 @@ static bool handleVectorElementCast(EvalInfo &Info, const FPOptions FPO, return false; } +enum class PackKind { + SSWB, + USWB, + SSDW, + USDW +}; // 16→8 signed/unsigned; 32→16 signed/unsigned + +static bool evalPackBuiltin(const CallExpr *E, EvalInfo &Info, APValue &Result, + PackKind K) { + APValue L, R; + if (!EvaluateAsRValue(Info, E->getArg(0), L) || + !EvaluateAsRValue(Info, E->getArg(1), R)) + return false; + + unsigned SrcBits = (K == PackKind::SSWB || K == PackKind::USWB) ? 16 : 32; + unsigned DstBits = SrcBits / 2; + + unsigned NL = L.getVectorLength(); + unsigned NR = R.getVectorLength(); + if (NL == 0 || NR == 0 || NL != NR) + return false; + + // Bounds for saturation (extended to SrcBits for compares). + APInt Lo = (K == PackKind::USWB || K == PackKind::USDW) + ? APInt(SrcBits, 0) + : APInt::getSignedMinValue(DstBits).sext(SrcBits); + APInt Hi = (K == PackKind::USWB || K == PackKind::USDW) + ? APInt::getMaxValue(DstBits).zext(SrcBits) + : APInt::getSignedMaxValue(DstBits).sext(SrcBits); + + // Result element signedness follows the builtin's return vector element type. + QualType DestEltTy = E->getType()->castAs<VectorType>()->getElementType(); ---------------- shafik wrote:
Should we assert that `E->getType()` is actually a Vector or is that verified before we get here? https://github.com/llvm/llvm-project/pull/156003 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits