1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
macro_rules! _mm256_set_dup_ps {
    ($x:expr) => (_mm256_set_ps($x, $x, $x, $x, $x, $x, $x, $x))
}
macro_rules! _mm256_set_dup_pd {
    ($x:expr) => (_mm256_set_pd($x, $x, $x, $x))
}

macro_rules! _mm256_set_slice_ps {
    ($xs:expr, $i:expr) => (
        _mm256_set_ps(
            $xs[7 * $i], $xs[6 * $i], $xs[5 * $i], $xs[4 * $i],
            $xs[3 * $i], $xs[2 * $i], $xs[$i], $xs[0]
        )
    )
}
macro_rules! _mm256_set_slice_pd {
    ($xs:expr, $i:expr) => (
        _mm256_set_pd(
            $xs[3 * $i], $xs[2 * $i], $xs[$i], $xs[0]
        )
    )
}

macro_rules! _mm256_get_ps {
    ($xs:expr, $i:expr, $src:expr) => (
        let values = &mut [0.0_f32; 8];
        _mm256_storeu_ps(values.as_mut_ptr(), $src);
        $xs[0] = values[0];
        if $i != 0 {
            $xs[$i] = values[1];
            $xs[2 * $i] = values[2];
            $xs[3 * $i] = values[3];
            $xs[4 * $i] = values[4];
            $xs[5 * $i] = values[5];
            $xs[6 * $i] = values[6];
            $xs[7 * $i] = values[7];
        }
    )
}
macro_rules! _mm256_get_pd {
    ($xs:expr, $i:expr, $src:expr) => (
        let values = &mut [0.0_f64; 4];
        _mm256_storeu_pd(values.as_mut_ptr(), $src);
        $xs[0] = values[0];
        if $i != 0 {
            $xs[$i] = values[1];
            $xs[2 * $i] = values[2];
            $xs[3 * $i] = values[3];
        }
    )
}