@@ -2851,6 +2851,39 @@ static bool interp__builtin_blend(InterpState &S, CodePtr OpPC,
28512851 return true ;
28522852}
28532853
2854+ static bool interp__builtin_ptestz (InterpState &S, CodePtr OpPC,
2855+ const CallExpr *Call) {
2856+ const Pointer &LHS = S.Stk .pop <Pointer>();
2857+ const Pointer &RHS = S.Stk .pop <Pointer>();
2858+
2859+ assert (LHS.getNumElems () == RHS.getNumElems ());
2860+ assert (LHS.getFieldDesc ()->isPrimitiveArray () &&
2861+ RHS.getFieldDesc ()->isPrimitiveArray ());
2862+
2863+ if (!S.getASTContext ().hasSameUnqualifiedType (getElemType (LHS),
2864+ getElemType (RHS)))
2865+ return false ;
2866+
2867+ unsigned SourceLen = LHS.getNumElems ();
2868+ const QualType ElemQT = getElemType (LHS);
2869+ const OptPrimType ElemPT = S.getContext ().classify (ElemQT);
2870+
2871+ bool Flag = true ;
2872+ INT_TYPE_SWITCH_NO_BOOL (*ElemPT, {
2873+ for (unsigned I = 0 ; I < SourceLen; ++I) {
2874+ const APSInt A = LHS.elem <T>(I).toAPSInt ();
2875+ const APSInt B = RHS.elem <T>(I).toAPSInt ();
2876+ if ( (A & B) != 0 ) {
2877+ Flag = false ;
2878+ break ;
2879+ }
2880+ }
2881+ });
2882+
2883+ pushInteger (S, Flag ? 1 : 0 , Call->getType ());
2884+ return true ;
2885+ }
2886+
28542887static bool interp__builtin_elementwise_triop (
28552888 InterpState &S, CodePtr OpPC, const CallExpr *Call,
28562889 llvm::function_ref<APInt(const APSInt &, const APSInt &, const APSInt &)>
@@ -3581,9 +3614,9 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
35813614 return ((APInt)C).isNegative () ? T : F;
35823615 });
35833616
3584- case X86::BI__builtin_ia32_ptestz128: {
3585- }
3586-
3617+ case X86::BI__builtin_ia32_ptestz128:
3618+ return interp__builtin_ptestz (S, OpPC, Call);
3619+
35873620 // case X86::BI__builtin_ia32_ptestz256:
35883621
35893622 // case X86::BI__builtin_ia32_ptestc128:
0 commit comments