================ @@ -2604,6 +2605,65 @@ static bool interp__builtin_elementwise_int_binop( return true; } +static bool interp__builtin_x86_pack( + InterpState &S, CodePtr, const CallExpr *E, bool IsUnsat, + llvm::function_ref<APSInt(const APSInt &X, unsigned, unsigned, bool)> + narrowElement) { + const auto *VT0 = E->getArg(0)->getType()->castAs<VectorType>(); + const auto *VT1 = E->getArg(1)->getType()->castAs<VectorType>(); + assert(VT0 && VT1 && "pack builtin VT0 and VT1 must be VectorType"); + assert(VT0->getElementType() == VT1->getElementType() && + VT0->getNumElements() == VT1->getNumElements() && + "pack builtin VT0 and VT1 ElementType must be same"); + + const Pointer &RHS = S.Stk.pop<Pointer>(); + const Pointer &LHS = S.Stk.pop<Pointer>(); + const Pointer &Dst = S.Stk.peek<Pointer>(); + + ASTContext &Ctx = S.getASTContext(); + const unsigned SrcBits = Ctx.getIntWidth(VT0->getElementType()); + const unsigned DstBits = SrcBits / 2; + const unsigned LHSVecLen = VT0->getNumElements(); + const unsigned VectorBits = LHSVecLen * SrcBits; + const unsigned srcPerLane = VectorBits >= 128 ? (128 / SrcBits) : LHSVecLen; + const unsigned lanes = VectorBits >= 128 ? (VectorBits / 128) : 1; + PrimType DstT = *S.getContext().classify(getElemType(Dst)); + + auto readSrc = [&](const Pointer &P, unsigned I) -> APSInt { + if (SrcBits == 16) { ---------------- RKSimon wrote:
Can't INT_TYPE_SWITCH_NO_BOOL do all this for you? 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