Skip to content

Commit 273f08f

Browse files
committed
implement SIMD sub, mul, div; also test i32 binops
1 parent f2e9ef8 commit 273f08f

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

Diff for: src/shims/intrinsics.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
306306
}
307307

308308
// SIMD operations
309-
"simd_add" => {
309+
"simd_add" | "simd_sub" | "simd_mul" | "simd_div" => {
310310
let &[ref left, ref right] = check_arg_count(args)?;
311311
let (left, left_len) = this.operand_to_simd(left)?;
312312
let (right, right_len) = this.operand_to_simd(right)?;
@@ -315,11 +315,19 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
315315
assert_eq!(dest_len, left_len);
316316
assert_eq!(dest_len, right_len);
317317

318+
let op = match intrinsic_name {
319+
"simd_add" => mir::BinOp::Add,
320+
"simd_sub" => mir::BinOp::Sub,
321+
"simd_mul" => mir::BinOp::Mul,
322+
"simd_div" => mir::BinOp::Div,
323+
_ => unreachable!(),
324+
};
325+
318326
for i in 0..dest_len {
319327
let left = this.read_immediate(&this.mplace_index(&left, i)?.into())?;
320328
let right = this.read_immediate(&this.mplace_index(&right, i)?.into())?;
321329
let dest = this.mplace_index(&dest, i)?.into();
322-
this.binop_ignore_overflow(mir::BinOp::Add, &left, &right, &dest)?;
330+
this.binop_ignore_overflow(op, &left, &right, &dest)?;
323331
}
324332
}
325333

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

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
11
#![feature(portable_simd)]
22
use std::simd::*;
33

4-
fn main() {
4+
fn simd_ops_f32() {
55
let a = f32x4::splat(10.0);
66
let b = f32x4::from_array([1.0, 2.0, 3.0, 4.0]);
77
assert_eq!(a + b, f32x4::from_array([11.0, 12.0, 13.0, 14.0]));
8+
assert_eq!(a - b, f32x4::from_array([9.0, 8.0, 7.0, 6.0]));
9+
assert_eq!(a * b, f32x4::from_array([10.0, 20.0, 30.0, 40.0]));
10+
assert_eq!(b / a, f32x4::from_array([0.1, 0.2, 0.3, 0.4]));
11+
assert_eq!(a / 2.0, f32x4::splat(5.0));
12+
}
13+
14+
fn simd_ops_i32() {
15+
let a = i32x4::splat(10);
16+
let b = i32x4::from_array([1, 2, 3, 4]);
17+
assert_eq!(a + b, i32x4::from_array([11, 12, 13, 14]));
18+
assert_eq!(a - b, i32x4::from_array([9, 8, 7, 6]));
19+
assert_eq!(a * b, i32x4::from_array([10, 20, 30, 40]));
20+
assert_eq!(a / b, i32x4::from_array([10, 5, 3, 2]));
21+
assert_eq!(a / 2, i32x4::splat(5));
22+
}
23+
24+
fn main() {
25+
simd_ops_f32();
26+
simd_ops_i32();
827
}

0 commit comments

Comments
 (0)