@@ -437,7 +437,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
437437 | "simd_fmax"
438438 | "simd_fmin"
439439 | "simd_saturating_add"
440- | "simd_saturating_sub" => {
440+ | "simd_saturating_sub"
441+ | "simd_arith_offset" => {
441442 use mir:: BinOp ;
442443
443444 let & [ ref left, ref right] = check_arg_count ( args) ?;
@@ -453,6 +454,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
453454 SaturatingOp ( BinOp ) ,
454455 FMax ,
455456 FMin ,
457+ WrappingOffset ,
456458 }
457459 let which = match intrinsic_name {
458460 "simd_add" => Op :: MirOp ( BinOp :: Add ) ,
@@ -475,6 +477,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
475477 "simd_fmin" => Op :: FMin ,
476478 "simd_saturating_add" => Op :: SaturatingOp ( BinOp :: Add ) ,
477479 "simd_saturating_sub" => Op :: SaturatingOp ( BinOp :: Sub ) ,
480+ "simd_arith_offset" => Op :: WrappingOffset ,
478481 _ => unreachable ! ( ) ,
479482 } ;
480483
@@ -504,15 +507,25 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
504507 val
505508 }
506509 }
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+ }
507523 Op :: FMax => {
508524 fmax_op ( & left, & right) ?
509525 }
510526 Op :: FMin => {
511527 fmin_op ( & left, & right) ?
512528 }
513- Op :: SaturatingOp ( mir_op) => {
514- this. saturating_arith ( mir_op, & left, & right) ?
515- }
516529 } ;
517530 this. write_scalar ( val, & dest. into ( ) ) ?;
518531 }
0 commit comments