@@ -2514,9 +2514,9 @@ static bool interp__builtin_is_within_lifetime(InterpState &S, CodePtr OpPC,
2514
2514
return true ;
2515
2515
}
2516
2516
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) {
2520
2520
assert (Call->getNumArgs () == 2 );
2521
2521
2522
2522
// Single integer case.
@@ -2553,6 +2553,8 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
2553
2553
const Pointer &LHS = S.Stk .pop <Pointer>();
2554
2554
const Pointer &Dst = S.Stk .peek <Pointer>();
2555
2555
PrimType ElemT = *S.getContext ().classify (VT->getElementType ());
2556
+ bool DestUnsigned =
2557
+ VT->getElementType ()->isUnsignedIntegerOrEnumerationType ();
2556
2558
unsigned NumElems = VT->getNumElements ();
2557
2559
for (unsigned I = 0 ; I != NumElems; ++I) {
2558
2560
APSInt Elem1;
@@ -2586,6 +2588,34 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
2586
2588
Result = APSInt (llvm::APIntOps::mulhs (Elem1, Elem2),
2587
2589
/* isUnsigned=*/ false );
2588
2590
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 ;
2589
2619
default :
2590
2620
llvm_unreachable (" Wrong builtin ID" );
2591
2621
}
@@ -3232,7 +3262,17 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
3232
3262
case clang::X86::BI__builtin_ia32_pmulhw128:
3233
3263
case clang::X86::BI__builtin_ia32_pmulhw256:
3234
3264
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);
3236
3276
3237
3277
case Builtin::BI__builtin_elementwise_max:
3238
3278
case Builtin::BI__builtin_elementwise_min:
0 commit comments