blob: 0299ee7c5141dd8ae04fee668c4f0a2175de0b2b [file] [log] [blame]
//! MIPS SIMD Architecture intrinsics
//!
//! The reference is [MIPS Architecture for Programmers Volume IV-j: The
//! MIPS32 SIMD Architecture Module Revision 1.12][msa_ref].
//!
//! [msa_ref]: http://cdn2.imgtec.com/documentation/MD00866-2B-MSA32-AFP-01.12.pdf
#[cfg(test)]
use stdsimd_test::assert_instr;
types! {
/// MIPS-specific 128-bit wide vector of 16 packed `i8`.
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;
}
/// Vector Add Absolute Values.
///
/// Adds the absolute values of the elements in `a` and `b` into the result
/// vector.
#[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 crate::core_arch::mips64::msa;
use crate::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));
}
}