Skip to content

Commit 1ef91e1

Browse files
committed
Auto merge of #2064 - RalfJung:rustup, r=RalfJung
rustup
2 parents 05bbfe8 + 0669b22 commit 1ef91e1

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

rust-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7af93292c27cd8b4a14f0f35bcb4c7e7ca9c287a
1+
c8422403f775126c40d558838d321c063554c822

src/shims/intrinsics.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

tests/run-pass/portable-simd.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// compile-flags: -Zmiri-strict-provenance
12
#![feature(portable_simd, platform_intrinsics)]
23
use std::simd::*;
34

0 commit comments

Comments
 (0)