Skip to content

Commit 41ffce1

Browse files
committed
implement simd_scatter
1 parent 576e2bb commit 41ffce1

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

Diff for: src/shims/intrinsics.rs

+22-4
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
570570
let no = this.read_immediate(&this.mplace_index(&no, i)?.into())?;
571571
let dest = this.mplace_index(&dest, i)?;
572572

573-
let mask = simd_element_to_bool(mask)?;
574-
let val = if mask { yes } else { no };
573+
let val = if simd_element_to_bool(mask)? { yes } else { no };
575574
this.write_immediate(*val, &dest.into())?;
576575
}
577576
}
@@ -670,8 +669,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
670669
let mask = this.read_immediate(&this.mplace_index(&mask, i)?.into())?;
671670
let dest = this.mplace_index(&dest, i)?;
672671

673-
let mask = simd_element_to_bool(mask)?;
674-
let val = if mask {
672+
let val = if simd_element_to_bool(mask)? {
675673
let place = this.deref_operand(&ptr.into())?;
676674
this.read_immediate(&place.into())?
677675
} else {
@@ -680,6 +678,26 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
680678
this.write_immediate(*val, &dest.into())?;
681679
}
682680
}
681+
"simd_scatter" => {
682+
let &[ref value, ref ptrs, ref mask] = check_arg_count(args)?;
683+
let (value, value_len) = this.operand_to_simd(value)?;
684+
let (ptrs, ptrs_len) = this.operand_to_simd(ptrs)?;
685+
let (mask, mask_len) = this.operand_to_simd(mask)?;
686+
687+
assert_eq!(ptrs_len, value_len);
688+
assert_eq!(ptrs_len, mask_len);
689+
690+
for i in 0..ptrs_len {
691+
let value = this.read_immediate(&this.mplace_index(&value, i)?.into())?;
692+
let ptr = this.read_immediate(&this.mplace_index(&ptrs, i)?.into())?;
693+
let mask = this.read_immediate(&this.mplace_index(&mask, i)?.into())?;
694+
695+
if simd_element_to_bool(mask)? {
696+
let place = this.deref_operand(&ptr.into())?;
697+
this.write_immediate(*value, &place.into())?;
698+
}
699+
}
700+
}
683701

684702
// Atomic operations
685703
"atomic_load" => this.atomic_load(args, dest, AtomicReadOp::SeqCst)?,

Diff for: tests/compile-fail/intrinsics/simd-gather.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// error-pattern: out-of-bounds
1+
// error-pattern: pointer to 1 byte starting at offset 9 is out-of-bounds
22
#![feature(portable_simd)]
33
use std::simd::*;
44

55
fn main() { unsafe {
6-
let vec: &[i16] = &[10, 11, 12, 13, 14, 15, 16, 17, 18];
6+
let vec: &[i8] = &[10, 11, 12, 13, 14, 15, 16, 17, 18];
77
let idxs = Simd::from_array([9, 3, 0, 17]);
88
let _result = Simd::gather_select_unchecked(&vec, Mask::splat(true), idxs, Simd::splat(0));
99
} }

Diff for: tests/compile-fail/intrinsics/simd-scatter.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// error-pattern: pointer to 1 byte starting at offset 9 is out-of-bounds
2+
#![feature(portable_simd)]
3+
use std::simd::*;
4+
5+
fn main() { unsafe {
6+
let mut vec: Vec<i8> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
7+
let idxs = Simd::from_array([9, 3, 0, 17]);
8+
Simd::from_array([-27, 82, -41, 124]).scatter_select_unchecked(&mut vec, Mask::splat(true), idxs);
9+
} }

Diff for: tests/run-pass/portable-simd.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,14 @@ fn simd_swizzle() {
250250
}
251251

252252
fn simd_gather_scatter() {
253-
let vec: &[i16] = &[10, 11, 12, 13, 14, 15, 16, 17, 18];
253+
let mut vec: Vec<i16> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
254254
let idxs = Simd::from_array([9, 3, 0, 17]);
255255
let result = Simd::gather_or_default(&vec, idxs); // Note the lane that is out-of-bounds.
256256
assert_eq!(result, Simd::from_array([0, 13, 10, 0]));
257+
258+
let idxs = Simd::from_array([9, 3, 0, 0]);
259+
Simd::from_array([-27, 82, -41, 124]).scatter(&mut vec, idxs);
260+
assert_eq!(vec, vec![124, 11, 12, 82, 14, 15, 16, 17, 18]);
257261
}
258262

259263
fn simd_intrinsics() {

0 commit comments

Comments
 (0)