@@ -437,7 +437,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
437
437
| "simd_fmax"
438
438
| "simd_fmin"
439
439
| "simd_saturating_add"
440
- | "simd_saturating_sub" => {
440
+ | "simd_saturating_sub"
441
+ | "simd_arith_offset" => {
441
442
use mir:: BinOp ;
442
443
443
444
let & [ ref left, ref right] = check_arg_count ( args) ?;
@@ -453,6 +454,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
453
454
SaturatingOp ( BinOp ) ,
454
455
FMax ,
455
456
FMin ,
457
+ WrappingOffset ,
456
458
}
457
459
let which = match intrinsic_name {
458
460
"simd_add" => Op :: MirOp ( BinOp :: Add ) ,
@@ -475,6 +477,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
475
477
"simd_fmin" => Op :: FMin ,
476
478
"simd_saturating_add" => Op :: SaturatingOp ( BinOp :: Add ) ,
477
479
"simd_saturating_sub" => Op :: SaturatingOp ( BinOp :: Sub ) ,
480
+ "simd_arith_offset" => Op :: WrappingOffset ,
478
481
_ => unreachable ! ( ) ,
479
482
} ;
480
483
@@ -504,15 +507,25 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
504
507
val
505
508
}
506
509
}
510
+ Op :: SaturatingOp ( mir_op) => {
511
+ this. saturating_arith ( mir_op, & left, & right) ?
512
+ }
513
+ Op :: WrappingOffset => {
514
+ let ptr = this. scalar_to_ptr ( left. to_scalar ( ) ?) ?;
515
+ let offset_count = right. to_scalar ( ) ?. to_machine_isize ( this) ?;
516
+ let pointee_ty = left. layout . ty . builtin_deref ( true ) . unwrap ( ) . ty ;
517
+
518
+ let pointee_size = i64:: try_from ( this. layout_of ( pointee_ty) ?. size . bytes ( ) ) . unwrap ( ) ;
519
+ let offset_bytes = offset_count. wrapping_mul ( pointee_size) ;
520
+ let offset_ptr = ptr. wrapping_signed_offset ( offset_bytes, this) ;
521
+ Scalar :: from_maybe_pointer ( offset_ptr, this)
522
+ }
507
523
Op :: FMax => {
508
524
fmax_op ( & left, & right) ?
509
525
}
510
526
Op :: FMin => {
511
527
fmin_op ( & left, & right) ?
512
528
}
513
- Op :: SaturatingOp ( mir_op) => {
514
- this. saturating_arith ( mir_op, & left, & right) ?
515
- }
516
529
} ;
517
530
this. write_scalar ( val, & dest. into ( ) ) ?;
518
531
}
0 commit comments