1 //! LLVM's platform intrinsics 2 #![allow(dead_code)] 3 4 use crate::sealed::Shuffle; 5 #[allow(unused_imports)] // FIXME: spurious warning? 6 use crate::sealed::Simd; 7 8 // Shuffle intrinsics: expanded in users' crates, therefore public. 9 extern "platform-intrinsic" { 10 // FIXME: Passing this intrinsics an `idx` array with an index that is 11 // out-of-bounds will produce a monomorphization-time error. 12 // https://github.com/rust-lang-nursery/packed_simd/issues/21 simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 2], Output = U>13 pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U 14 where 15 T: Simd, 16 <T as Simd>::Element: Shuffle<[u32; 2], Output = U>; 17 simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 4], Output = U>18 pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U 19 where 20 T: Simd, 21 <T as Simd>::Element: Shuffle<[u32; 4], Output = U>; 22 simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 8], Output = U>23 pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U 24 where 25 T: Simd, 26 <T as Simd>::Element: Shuffle<[u32; 8], Output = U>; 27 simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 16], Output = U>28 pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U 29 where 30 T: Simd, 31 <T as Simd>::Element: Shuffle<[u32; 16], Output = U>; 32 simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 32], Output = U>33 pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U 34 where 35 T: Simd, 36 <T as Simd>::Element: Shuffle<[u32; 32], Output = U>; 37 simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 64], Output = U>38 pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U 39 where 40 T: Simd, 41 <T as Simd>::Element: Shuffle<[u32; 64], Output = U>; 42 } 43 44 pub use self::simd_shuffle16 as __shuffle_vector16; 45 pub use self::simd_shuffle2 as __shuffle_vector2; 46 pub use self::simd_shuffle32 as __shuffle_vector32; 47 pub use self::simd_shuffle4 as __shuffle_vector4; 48 pub use self::simd_shuffle64 as __shuffle_vector64; 49 pub use self::simd_shuffle8 as __shuffle_vector8; 50 51 extern "platform-intrinsic" { simd_eq<T, U>(x: T, y: T) -> U52 crate fn simd_eq<T, U>(x: T, y: T) -> U; simd_ne<T, U>(x: T, y: T) -> U53 crate fn simd_ne<T, U>(x: T, y: T) -> U; simd_lt<T, U>(x: T, y: T) -> U54 crate fn simd_lt<T, U>(x: T, y: T) -> U; simd_le<T, U>(x: T, y: T) -> U55 crate fn simd_le<T, U>(x: T, y: T) -> U; simd_gt<T, U>(x: T, y: T) -> U56 crate fn simd_gt<T, U>(x: T, y: T) -> U; simd_ge<T, U>(x: T, y: T) -> U57 crate fn simd_ge<T, U>(x: T, y: T) -> U; 58 simd_insert<T, U>(x: T, idx: u32, val: U) -> T59 crate fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; simd_extract<T, U>(x: T, idx: u32) -> U60 crate fn simd_extract<T, U>(x: T, idx: u32) -> U; 61 simd_cast<T, U>(x: T) -> U62 crate fn simd_cast<T, U>(x: T) -> U; 63 simd_add<T>(x: T, y: T) -> T64 crate fn simd_add<T>(x: T, y: T) -> T; simd_sub<T>(x: T, y: T) -> T65 crate fn simd_sub<T>(x: T, y: T) -> T; simd_mul<T>(x: T, y: T) -> T66 crate fn simd_mul<T>(x: T, y: T) -> T; simd_div<T>(x: T, y: T) -> T67 crate fn simd_div<T>(x: T, y: T) -> T; simd_rem<T>(x: T, y: T) -> T68 crate fn simd_rem<T>(x: T, y: T) -> T; simd_shl<T>(x: T, y: T) -> T69 crate fn simd_shl<T>(x: T, y: T) -> T; simd_shr<T>(x: T, y: T) -> T70 crate fn simd_shr<T>(x: T, y: T) -> T; simd_and<T>(x: T, y: T) -> T71 crate fn simd_and<T>(x: T, y: T) -> T; simd_or<T>(x: T, y: T) -> T72 crate fn simd_or<T>(x: T, y: T) -> T; simd_xor<T>(x: T, y: T) -> T73 crate fn simd_xor<T>(x: T, y: T) -> T; 74 simd_reduce_add_unordered<T, U>(x: T) -> U75 crate fn simd_reduce_add_unordered<T, U>(x: T) -> U; simd_reduce_mul_unordered<T, U>(x: T) -> U76 crate fn simd_reduce_mul_unordered<T, U>(x: T) -> U; simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U77 crate fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U; simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U78 crate fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U; simd_reduce_min<T, U>(x: T) -> U79 crate fn simd_reduce_min<T, U>(x: T) -> U; simd_reduce_max<T, U>(x: T) -> U80 crate fn simd_reduce_max<T, U>(x: T) -> U; simd_reduce_min_nanless<T, U>(x: T) -> U81 crate fn simd_reduce_min_nanless<T, U>(x: T) -> U; simd_reduce_max_nanless<T, U>(x: T) -> U82 crate fn simd_reduce_max_nanless<T, U>(x: T) -> U; simd_reduce_and<T, U>(x: T) -> U83 crate fn simd_reduce_and<T, U>(x: T) -> U; simd_reduce_or<T, U>(x: T) -> U84 crate fn simd_reduce_or<T, U>(x: T) -> U; simd_reduce_xor<T, U>(x: T) -> U85 crate fn simd_reduce_xor<T, U>(x: T) -> U; simd_reduce_all<T>(x: T) -> bool86 crate fn simd_reduce_all<T>(x: T) -> bool; simd_reduce_any<T>(x: T) -> bool87 crate fn simd_reduce_any<T>(x: T) -> bool; 88 simd_select<M, T>(m: M, a: T, b: T) -> T89 crate fn simd_select<M, T>(m: M, a: T, b: T) -> T; 90 simd_fmin<T>(a: T, b: T) -> T91 crate fn simd_fmin<T>(a: T, b: T) -> T; simd_fmax<T>(a: T, b: T) -> T92 crate fn simd_fmax<T>(a: T, b: T) -> T; 93 simd_fsqrt<T>(a: T) -> T94 crate fn simd_fsqrt<T>(a: T) -> T; simd_fma<T>(a: T, b: T, c: T) -> T95 crate fn simd_fma<T>(a: T, b: T, c: T) -> T; 96 simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T97 crate fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; simd_scatter<T, P, M>(value: T, pointers: P, mask: M)98 crate fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); 99 simd_bitmask<T, U>(value: T) -> U100 crate fn simd_bitmask<T, U>(value: T) -> U; 101 } 102