@@ -2557,6 +2557,8 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
25572557 const Pointer &LHS = S.Stk .pop <Pointer>();
25582558 const Pointer &Dst = S.Stk .peek <Pointer>();
25592559 PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2560+ bool DestUnsigned =
2561+ VT->getElementType ()->isUnsignedIntegerOrEnumerationType ();
25602562 unsigned NumElems = VT->getNumElements ();
25612563 for (unsigned I = 0 ; I != NumElems; ++I) {
25622564 APSInt Elem1;
@@ -2590,6 +2592,34 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
25902592 Result = APSInt (llvm::APIntOps::mulhs (Elem1, Elem2),
25912593 /* isUnsigned=*/ false );
25922594 break ;
2595+ case clang::X86::BI__builtin_ia32_psllv2di:
2596+ case clang::X86::BI__builtin_ia32_psllv4di:
2597+ case clang::X86::BI__builtin_ia32_psllv4si:
2598+ case clang::X86::BI__builtin_ia32_psllv8si:
2599+ if (Elem2.uge (Elem2.getBitWidth ())) {
2600+ Result = APSInt (APInt::getZero (Elem2.getBitWidth ()), DestUnsigned);
2601+ break ;
2602+ }
2603+ Result = APSInt (Elem1.shl (Elem2.getZExtValue ()), DestUnsigned);
2604+ break ;
2605+ case clang::X86::BI__builtin_ia32_psrav4si:
2606+ case clang::X86::BI__builtin_ia32_psrav8si:
2607+ if (Elem2.uge (Elem2.getBitWidth ())) {
2608+ Result = APSInt (Elem1.ashr (Elem2.getBitWidth () - 1 ), DestUnsigned);
2609+ break ;
2610+ }
2611+ Result = APSInt (Elem1.ashr (Elem2.getZExtValue ()), DestUnsigned);
2612+ break ;
2613+ case clang::X86::BI__builtin_ia32_psrlv2di:
2614+ case clang::X86::BI__builtin_ia32_psrlv4di:
2615+ case clang::X86::BI__builtin_ia32_psrlv4si:
2616+ case clang::X86::BI__builtin_ia32_psrlv8si:
2617+ if (Elem2.uge (Elem2.getBitWidth ())) {
2618+ Result = APSInt (APInt::getZero (Elem2.getBitWidth ()), DestUnsigned);
2619+ break ;
2620+ }
2621+ Result = APSInt (Elem1.lshr (Elem2.getZExtValue ()), DestUnsigned);
2622+ break ;
25932623 default :
25942624 llvm_unreachable (" Wrong builtin ID" );
25952625 }
@@ -3236,6 +3266,16 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32363266 case clang::X86::BI__builtin_ia32_pmulhw128:
32373267 case clang::X86::BI__builtin_ia32_pmulhw256:
32383268 case clang::X86::BI__builtin_ia32_pmulhw512:
3269+ case clang::X86::BI__builtin_ia32_psllv2di:
3270+ case clang::X86::BI__builtin_ia32_psllv4di:
3271+ case clang::X86::BI__builtin_ia32_psllv4si:
3272+ case clang::X86::BI__builtin_ia32_psllv8si:
3273+ case clang::X86::BI__builtin_ia32_psrav4si:
3274+ case clang::X86::BI__builtin_ia32_psrav8si:
3275+ case clang::X86::BI__builtin_ia32_psrlv2di:
3276+ case clang::X86::BI__builtin_ia32_psrlv4di:
3277+ case clang::X86::BI__builtin_ia32_psrlv4si:
3278+ case clang::X86::BI__builtin_ia32_psrlv8si:
32393279 return interp__builtin_elementwise_sat (S, OpPC, Call, BuiltinID);
32403280
32413281 case Builtin::BI__builtin_elementwise_max:
0 commit comments