================ @@ -2817,6 +2817,81 @@ static bool interp__builtin_select(InterpState &S, CodePtr OpPC, return true; } +static bool interp__builtin_elementwise_fsh(InterpState &S, CodePtr OpPC, + const CallExpr *Call, + unsigned BuiltinID) { + assert(Call->getNumArgs() == 3); + + const QualType Arg0Type = Call->getArg(0)->getType(); + const QualType Arg1Type = Call->getArg(1)->getType(); + const QualType Arg2Type = Call->getArg(2)->getType(); + + // Non-vector integer types. + if (!Arg0Type->isVectorType()) { + assert(!Arg1Type->isVectorType()); + assert(!Arg2Type->isVectorType()); + const APSInt &Shift = popToAPSInt( + S.Stk, *S.getContext().classify(Arg2Type)); + const APSInt &Lo = popToAPSInt( + S.Stk, *S.getContext().classify(Arg1Type)); + const APSInt &Hi = popToAPSInt( + S.Stk, *S.getContext().classify(Arg0Type)); + APSInt Result; + if (BuiltinID == Builtin::BI__builtin_elementwise_fshl) + Result = APSInt(llvm::APIntOps::fshl(Hi, Lo, Shift), Hi.isUnsigned()); + else if (BuiltinID == Builtin::BI__builtin_elementwise_fshr) + Result = APSInt(llvm::APIntOps::fshr(Hi, Lo, Shift), Hi.isUnsigned()); + else + llvm_unreachable("Wrong builtin ID"); + pushInteger(S, Result, Call->getType()); + return true; + } + + // Vector type. + assert(Arg0Type->isVectorType() && Arg1Type->isVectorType() && + Arg2Type->isVectorType()); + + const auto *VecT = Arg0Type->castAs<VectorType>(); + const PrimType &ElemT = *S.getContext().classify(VecT->getElementType()); + unsigned NumElems = VecT->getNumElements(); + + assert(VecT->getElementType() == + Arg1Type->castAs<VectorType>()->getElementType() && + VecT->getElementType() == + Arg2Type->castAs<VectorType>()->getElementType()); + assert(NumElems == Arg1Type->castAs<VectorType>()->getNumElements() && + NumElems == Arg2Type->castAs<VectorType>()->getNumElements()); + assert(VecT->getElementType()->isIntegralOrEnumerationType()); + + const Pointer &VecShift = S.Stk.pop<Pointer>(); + const Pointer &VecLo = S.Stk.pop<Pointer>(); + const Pointer &VecHi = S.Stk.pop<Pointer>(); + const Pointer &Dst = S.Stk.peek<Pointer>(); + for (unsigned I = 0; I != NumElems; ++I) { + APSInt Hi; + APSInt Lo; + APSInt Shift; + INT_TYPE_SWITCH_NO_BOOL(ElemT, { + Hi = VecHi.elem<T>(I).toAPSInt(); + Lo = VecLo.elem<T>(I).toAPSInt(); + Shift = VecShift.elem<T>(I).toAPSInt(); + }); + APSInt Result; + if (BuiltinID == Builtin::BI__builtin_elementwise_fshl) { ---------------- tbaederr wrote:
```suggestion if (BuiltinID == Builtin::BI__builtin_elementwise_fshl) ``` https://github.com/llvm/llvm-project/pull/153572 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits