Skip to content

Commit f2e9ef8

Browse files
committed
implement simd_add
1 parent 1593f38 commit f2e9ef8

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/shims/intrinsics.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,24 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
305305
this.write_scalar(res, dest)?;
306306
}
307307

308+
// SIMD operations
309+
"simd_add" => {
310+
let &[ref left, ref right] = check_arg_count(args)?;
311+
let (left, left_len) = this.operand_to_simd(left)?;
312+
let (right, right_len) = this.operand_to_simd(right)?;
313+
let (dest, dest_len) = this.place_to_simd(dest)?;
314+
315+
assert_eq!(dest_len, left_len);
316+
assert_eq!(dest_len, right_len);
317+
318+
for i in 0..dest_len {
319+
let left = this.read_immediate(&this.mplace_index(&left, i)?.into())?;
320+
let right = this.read_immediate(&this.mplace_index(&right, i)?.into())?;
321+
let dest = this.mplace_index(&dest, i)?.into();
322+
this.binop_ignore_overflow(mir::BinOp::Add, &left, &right, &dest)?;
323+
}
324+
}
325+
308326
// Atomic operations
309327
"atomic_load" => this.atomic_load(args, dest, AtomicReadOp::SeqCst)?,
310328
"atomic_load_relaxed" => this.atomic_load(args, dest, AtomicReadOp::Relaxed)?,

tests/run-pass/portable-simd.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#![feature(portable_simd)]
2+
use std::simd::*;
3+
4+
fn main() {
5+
let a = f32x4::splat(10.0);
6+
let b = f32x4::from_array([1.0, 2.0, 3.0, 4.0]);
7+
assert_eq!(a + b, f32x4::from_array([11.0, 12.0, 13.0, 14.0]));
8+
}

0 commit comments

Comments
 (0)