     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

    //! 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 coresimd::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));
        }
    }

# Help

## Keyboard Shortcuts

`?`
  Show this help dialog
`S`
  Focus the search field
`↑`
  Move up in search results
`↓`
  Move down in search results
`↹`
  Switch tab
`⏎`
  Go to active search result
`+`
  Expand all sections
`-`
  Collapse all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g., `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g., `vec -> usize` or `* -> vec`)

Search multiple things at once by splitting your query with comma (e.g., `str,u8` or `String,struct:Vec,test`)