@@ -2875,39 +2875,6 @@ static bool interp__builtin_select_scalar(InterpState &S,
28752875 return true ;
28762876}
28772877
2878- static bool interp__builtin_blend (InterpState &S, CodePtr OpPC,
2879- const CallExpr *Call) {
2880- APSInt Mask = popToAPSInt (S, Call->getArg (2 ));
2881- const Pointer &TrueVec = S.Stk .pop <Pointer>();
2882- const Pointer &FalseVec = S.Stk .pop <Pointer>();
2883- const Pointer &Dst = S.Stk .peek <Pointer>();
2884-
2885- assert (FalseVec.getNumElems () == TrueVec.getNumElems ());
2886- assert (FalseVec.getNumElems () == Dst.getNumElems ());
2887- unsigned NumElems = FalseVec.getNumElems ();
2888- PrimType ElemT = FalseVec.getFieldDesc ()->getPrimType ();
2889- PrimType DstElemT = Dst.getFieldDesc ()->getPrimType ();
2890-
2891- for (unsigned I = 0 ; I != NumElems; ++I) {
2892- bool MaskBit = Mask[I % 8 ];
2893- if (ElemT == PT_Float) {
2894- assert (DstElemT == PT_Float);
2895- Dst.elem <Floating>(I) =
2896- MaskBit ? TrueVec.elem <Floating>(I) : FalseVec.elem <Floating>(I);
2897- } else {
2898- assert (DstElemT == ElemT);
2899- INT_TYPE_SWITCH_NO_BOOL (DstElemT, {
2900- Dst.elem <T>(I) =
2901- static_cast <T>(MaskBit ? TrueVec.elem <T>(I).toAPSInt ()
2902- : FalseVec.elem <T>(I).toAPSInt ());
2903- });
2904- }
2905- }
2906- Dst.initializeAllElements ();
2907-
2908- return true ;
2909- }
2910-
29112878static bool interp__builtin_ia32_test_op (
29122879 InterpState &S, CodePtr OpPC, const CallExpr *Call,
29132880 llvm::function_ref<bool (const APInt &A, const APInt &B)> Fn) {
@@ -4796,7 +4763,15 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
47964763 case clang::X86::BI__builtin_ia32_pblendw256:
47974764 case clang::X86::BI__builtin_ia32_pblendd128:
47984765 case clang::X86::BI__builtin_ia32_pblendd256:
4799- return interp__builtin_blend (S, OpPC, Call);
4766+ return interp__builtin_ia32_shuffle_generic (
4767+ S, OpPC, Call, [](unsigned DstIdx, unsigned ShuffleMask) {
4768+ // Bit index for mask.
4769+ unsigned MaskBit = (ShuffleMask >> (DstIdx % 8 )) & 0x1 ;
4770+ unsigned SrcVecIdx = MaskBit ? 1 : 0 ; // 1 = TrueVec, 0 = FalseVec
4771+ return std::pair<unsigned , int >{SrcVecIdx, static_cast <int >(DstIdx)};
4772+ });
4773+
4774+
48004775
48014776 case clang::X86::BI__builtin_ia32_blendvpd:
48024777 case clang::X86::BI__builtin_ia32_blendvpd256:
0 commit comments