1extern crate ssimd;
5use ssimd::{f32x4, f32x8};
6
7#[inline(never)]
8pub fn axpy(z: &mut [f32], a: f32, x: &[f32], y: &[f32]) {
9 assert_eq!(x.len(), y.len());
10 assert_eq!(x.len(), z.len());
11
12 let len = std::cmp::min(std::cmp::min(x.len(), y.len()), z.len());
13
14 let mut i = 0;
15 while i < len & !3 {
16 let x = f32x4::load(x, i);
17 let y = f32x4::load(y, i);
18 (f32x4::splat(a) * x + y).store(z, i);
19 i += 4
20 }
21}
22
23#[inline(never)]
24pub fn axpy8(z: &mut [f32], a: f32, x: &[f32], y: &[f32]) {
25 assert_eq!(x.len(), y.len());
26 assert_eq!(x.len(), z.len());
27
28 let len = std::cmp::min(std::cmp::min(x.len(), y.len()), z.len());
29
30 let mut i = 0;
31 while i < len & !7 {
32 let x = f32x8::load(x, i);
33 let y = f32x8::load(y, i);
34 (f32x8::splat(a) * x + y).store(z, i);
35 i += 8
36 }
37}
38
39fn main() {
40 let mut z = vec![0.; 4];
41 axpy(&mut z, 2., &[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0]);
42 println!("{:?}", z);
43 let mut z = vec![0.; 8];
44 axpy(&mut z, 3., &[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0],
45 &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0]);
46 println!("{:?}", z);
47
48 let mut z = vec![0.; 4];
49 axpy8(&mut z, 2., &[1.0, 3.0, 5.0, 7.0], &[2.0, 4.0, 6.0, 8.0]);
50 println!("{:?}", z);
51 let mut z = vec![0.; 8];
52 axpy8(&mut z, 3., &[1.0, 3.0, 6.0, 7.0, 10.0, 6.0, 3.0, 2.0],
53 &[2.0, 4.0, 6.0, 8.0, 2.0, 4.0, 6.0, 8.0]);
54 println!("{:?}", z);
55}