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
52
53
54
55
56
57
58
59
60
61
62
#[cfg(test)]
use stdsimd_test::assert_instr;
types! {
pub struct i8x16(
i8, i8, i8, i8, i8, i8, i8, i8,
i8, i8, i8, i8, i8, i8, i8, i8,
);
}
#[allow(improper_ctypes)]
extern "C" {
#[link_name = "llvm.mips.add.a.b"]
fn msa_add_a_b(a: i8x16, b: i8x16) -> i8x16;
}
#[inline]
#[target_feature(enable = "msa")]
#[cfg_attr(test, assert_instr(add_a.b))]
pub unsafe fn __msa_add_a_b(a: i8x16, b: i8x16) -> i8x16 {
msa_add_a_b(a, b)
}
#[cfg(test)]
mod tests {
use core_arch::mips64::msa;
use simd::*;
use stdsimd_test::simd_test;
#[simd_test(enable = "msa")]
unsafe fn __msa_add_a_b() {
#[rustfmt::skip]
let a = i8x16(
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
);
#[rustfmt::skip]
let b = i8x16(
-4, -3, -2, -1,
-4, -3, -2, -1,
-4, -3, -2, -1,
-4, -3, -2, -1,
);
let r = i8x16(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5);
assert_eq!(r, msa::__msa_add_a_b(a, b));
}
}