@@ -2514,9 +2514,9 @@ static bool interp__builtin_is_within_lifetime(InterpState &S, CodePtr OpPC,
25142514 return true ;
25152515}
25162516
2517- static bool interp__builtin_elementwise_sat (InterpState &S, CodePtr OpPC,
2518- const CallExpr *Call,
2519- unsigned BuiltinID) {
2517+ static bool interp__builtin_elementwise_int_binop (InterpState &S, CodePtr OpPC,
2518+ const CallExpr *Call,
2519+ unsigned BuiltinID) {
25202520 assert (Call->getNumArgs () == 2 );
25212521
25222522 // Single integer case.
@@ -2553,6 +2553,8 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
25532553 const Pointer &LHS = S.Stk .pop <Pointer>();
25542554 const Pointer &Dst = S.Stk .peek <Pointer>();
25552555 PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2556+ bool DestUnsigned =
2557+ VT->getElementType ()->isUnsignedIntegerOrEnumerationType ();
25562558 unsigned NumElems = VT->getNumElements ();
25572559 for (unsigned I = 0 ; I != NumElems; ++I) {
25582560 APSInt Elem1;
@@ -2586,6 +2588,34 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
25862588 Result = APSInt (llvm::APIntOps::mulhs (Elem1, Elem2),
25872589 /* isUnsigned=*/ false );
25882590 break ;
2591+ case clang::X86::BI__builtin_ia32_psllv2di:
2592+ case clang::X86::BI__builtin_ia32_psllv4di:
2593+ case clang::X86::BI__builtin_ia32_psllv4si:
2594+ case clang::X86::BI__builtin_ia32_psllv8si:
2595+ if (Elem2.uge (Elem2.getBitWidth ())) {
2596+ Result = APSInt (APInt::getZero (Elem2.getBitWidth ()), DestUnsigned);
2597+ break ;
2598+ }
2599+ Result = APSInt (Elem1.shl (Elem2.getZExtValue ()), DestUnsigned);
2600+ break ;
2601+ case clang::X86::BI__builtin_ia32_psrav4si:
2602+ case clang::X86::BI__builtin_ia32_psrav8si:
2603+ if (Elem2.uge (Elem2.getBitWidth ())) {
2604+ Result = APSInt (Elem1.ashr (Elem2.getBitWidth () - 1 ), DestUnsigned);
2605+ break ;
2606+ }
2607+ Result = APSInt (Elem1.ashr (Elem2.getZExtValue ()), DestUnsigned);
2608+ break ;
2609+ case clang::X86::BI__builtin_ia32_psrlv2di:
2610+ case clang::X86::BI__builtin_ia32_psrlv4di:
2611+ case clang::X86::BI__builtin_ia32_psrlv4si:
2612+ case clang::X86::BI__builtin_ia32_psrlv8si:
2613+ if (Elem2.uge (Elem2.getBitWidth ())) {
2614+ Result = APSInt (APInt::getZero (Elem2.getBitWidth ()), DestUnsigned);
2615+ break ;
2616+ }
2617+ Result = APSInt (Elem1.lshr (Elem2.getZExtValue ()), DestUnsigned);
2618+ break ;
25892619 default :
25902620 llvm_unreachable (" Wrong builtin ID" );
25912621 }
@@ -3232,7 +3262,17 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32323262 case clang::X86::BI__builtin_ia32_pmulhw128:
32333263 case clang::X86::BI__builtin_ia32_pmulhw256:
32343264 case clang::X86::BI__builtin_ia32_pmulhw512:
3235- return interp__builtin_elementwise_sat (S, OpPC, Call, BuiltinID);
3265+ case clang::X86::BI__builtin_ia32_psllv2di:
3266+ case clang::X86::BI__builtin_ia32_psllv4di:
3267+ case clang::X86::BI__builtin_ia32_psllv4si:
3268+ case clang::X86::BI__builtin_ia32_psllv8si:
3269+ case clang::X86::BI__builtin_ia32_psrav4si:
3270+ case clang::X86::BI__builtin_ia32_psrav8si:
3271+ case clang::X86::BI__builtin_ia32_psrlv2di:
3272+ case clang::X86::BI__builtin_ia32_psrlv4di:
3273+ case clang::X86::BI__builtin_ia32_psrlv4si:
3274+ case clang::X86::BI__builtin_ia32_psrlv8si:
3275+ return interp__builtin_elementwise_int_binop (S, OpPC, Call, BuiltinID);
32363276
32373277 case Builtin::BI__builtin_elementwise_max:
32383278 case Builtin::BI__builtin_elementwise_min:
0 commit comments