@@ -2565,10 +2565,34 @@ static bool interp__builtin_elementwise_int_binop(
25652565 return true ;
25662566 }
25672567
2568+ const auto *VT = Call->getArg (0 )->getType ()->castAs <VectorType>();
2569+ assert (VT->getElementType ()->isIntegralOrEnumerationType ());
2570+ PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2571+ unsigned NumElems = VT->getNumElements ();
2572+ bool DestUnsigned = Call->getType ()->isUnsignedIntegerOrEnumerationType ();
2573+
2574+ // Vector + Scalar case.
2575+ if (!Call->getArg (1 )->getType ()->isVectorType ()) {
2576+ assert (Call->getArg (1 )->getType ()->isIntegralOrEnumerationType ());
2577+
2578+ APSInt RHS = popToAPSInt (
2579+ S.Stk , *S.getContext ().classify (Call->getArg (1 )->getType ()));
2580+ const Pointer &LHS = S.Stk .pop <Pointer>();
2581+ const Pointer &Dst = S.Stk .peek <Pointer>();
2582+
2583+ for (unsigned I = 0 ; I != NumElems; ++I) {
2584+ INT_TYPE_SWITCH_NO_BOOL (ElemT, {
2585+ Dst.elem <T>(I) = static_cast <T>(
2586+ APSInt (Fn (LHS.elem <T>(I).toAPSInt (), RHS), DestUnsigned));
2587+ });
2588+ }
2589+ Dst.initializeAllElements ();
2590+ return true ;
2591+ }
2592+
25682593 // Vector case.
25692594 assert (Call->getArg (0 )->getType ()->isVectorType () &&
25702595 Call->getArg (1 )->getType ()->isVectorType ());
2571- const auto *VT = Call->getArg (0 )->getType ()->castAs <VectorType>();
25722596 assert (VT->getElementType () ==
25732597 Call->getArg (1 )->getType ()->castAs <VectorType>()->getElementType ());
25742598 assert (VT->getNumElements () ==
@@ -2578,22 +2602,12 @@ static bool interp__builtin_elementwise_int_binop(
25782602 const Pointer &RHS = S.Stk .pop <Pointer>();
25792603 const Pointer &LHS = S.Stk .pop <Pointer>();
25802604 const Pointer &Dst = S.Stk .peek <Pointer>();
2581- PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2582- unsigned NumElems = VT->getNumElements ();
25832605 for (unsigned I = 0 ; I != NumElems; ++I) {
2584- APSInt Elem1;
2585- APSInt Elem2;
25862606 INT_TYPE_SWITCH_NO_BOOL (ElemT, {
2587- Elem1 = LHS.elem <T>(I).toAPSInt ();
2588- Elem2 = RHS.elem <T>(I).toAPSInt ();
2607+ APSInt Elem1 = LHS.elem <T>(I).toAPSInt ();
2608+ APSInt Elem2 = RHS.elem <T>(I).toAPSInt ();
2609+ Dst.elem <T>(I) = static_cast <T>(APSInt (Fn (Elem1, Elem2), DestUnsigned));
25892610 });
2590-
2591- APSInt Result =
2592- APSInt (Fn (Elem1, Elem2),
2593- Call->getType ()->isUnsignedIntegerOrEnumerationType ());
2594-
2595- INT_TYPE_SWITCH_NO_BOOL (ElemT,
2596- { Dst.elem <T>(I) = static_cast <T>(Result); });
25972611 }
25982612 Dst.initializeAllElements ();
25992613
@@ -3254,6 +3268,15 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32543268 case clang::X86::BI__builtin_ia32_psllv4di:
32553269 case clang::X86::BI__builtin_ia32_psllv4si:
32563270 case clang::X86::BI__builtin_ia32_psllv8si:
3271+ case clang::X86::BI__builtin_ia32_psllwi128:
3272+ case clang::X86::BI__builtin_ia32_psllwi256:
3273+ case clang::X86::BI__builtin_ia32_psllwi512:
3274+ case clang::X86::BI__builtin_ia32_pslldi128:
3275+ case clang::X86::BI__builtin_ia32_pslldi256:
3276+ case clang::X86::BI__builtin_ia32_pslldi512:
3277+ case clang::X86::BI__builtin_ia32_psllqi128:
3278+ case clang::X86::BI__builtin_ia32_psllqi256:
3279+ case clang::X86::BI__builtin_ia32_psllqi512:
32573280 return interp__builtin_elementwise_int_binop (
32583281 S, OpPC, Call, BuiltinID, [](const APSInt &LHS, const APSInt &RHS) {
32593282 if (RHS.uge (LHS.getBitWidth ())) {
@@ -3264,6 +3287,15 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32643287
32653288 case clang::X86::BI__builtin_ia32_psrav4si:
32663289 case clang::X86::BI__builtin_ia32_psrav8si:
3290+ case clang::X86::BI__builtin_ia32_psrawi128:
3291+ case clang::X86::BI__builtin_ia32_psrawi256:
3292+ case clang::X86::BI__builtin_ia32_psrawi512:
3293+ case clang::X86::BI__builtin_ia32_psradi128:
3294+ case clang::X86::BI__builtin_ia32_psradi256:
3295+ case clang::X86::BI__builtin_ia32_psradi512:
3296+ case clang::X86::BI__builtin_ia32_psraqi128:
3297+ case clang::X86::BI__builtin_ia32_psraqi256:
3298+ case clang::X86::BI__builtin_ia32_psraqi512:
32673299 return interp__builtin_elementwise_int_binop (
32683300 S, OpPC, Call, BuiltinID, [](const APSInt &LHS, const APSInt &RHS) {
32693301 if (RHS.uge (LHS.getBitWidth ())) {
@@ -3276,6 +3308,15 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
32763308 case clang::X86::BI__builtin_ia32_psrlv4di:
32773309 case clang::X86::BI__builtin_ia32_psrlv4si:
32783310 case clang::X86::BI__builtin_ia32_psrlv8si:
3311+ case clang::X86::BI__builtin_ia32_psrlwi128:
3312+ case clang::X86::BI__builtin_ia32_psrlwi256:
3313+ case clang::X86::BI__builtin_ia32_psrlwi512:
3314+ case clang::X86::BI__builtin_ia32_psrldi128:
3315+ case clang::X86::BI__builtin_ia32_psrldi256:
3316+ case clang::X86::BI__builtin_ia32_psrldi512:
3317+ case clang::X86::BI__builtin_ia32_psrlqi128:
3318+ case clang::X86::BI__builtin_ia32_psrlqi256:
3319+ case clang::X86::BI__builtin_ia32_psrlqi512:
32793320 return interp__builtin_elementwise_int_binop (
32803321 S, OpPC, Call, BuiltinID, [](const APSInt &LHS, const APSInt &RHS) {
32813322 if (RHS.uge (LHS.getBitWidth ())) {
0 commit comments