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" {
simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U10     pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U;
simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U11     pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U;
simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U12     pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U;
simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U13     pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U;
simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U14     pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U;
simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U15     pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U;
16 }
17 
18 #[allow(clippy::missing_safety_doc)]
19 #[inline]
__shuffle_vector2<const IDX: [u32; 2], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 2], Output = U>,20 pub unsafe fn __shuffle_vector2<const IDX: [u32; 2], T, U>(x: T, y: T) -> U
21 where
22     T: Simd,
23     <T as Simd>::Element: Shuffle<[u32; 2], Output = U>,
24 {
25     simd_shuffle2(x, y, IDX)
26 }
27 
28 #[allow(clippy::missing_safety_doc)]
29 #[inline]
__shuffle_vector4<const IDX: [u32; 4], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 4], Output = U>,30 pub unsafe fn __shuffle_vector4<const IDX: [u32; 4], T, U>(x: T, y: T) -> U
31 where
32     T: Simd,
33     <T as Simd>::Element: Shuffle<[u32; 4], Output = U>,
34 {
35     simd_shuffle4(x, y, IDX)
36 }
37 
38 #[allow(clippy::missing_safety_doc)]
39 #[inline]
__shuffle_vector8<const IDX: [u32; 8], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 8], Output = U>,40 pub unsafe fn __shuffle_vector8<const IDX: [u32; 8], T, U>(x: T, y: T) -> U
41 where
42     T: Simd,
43     <T as Simd>::Element: Shuffle<[u32; 8], Output = U>,
44 {
45     simd_shuffle8(x, y, IDX)
46 }
47 
48 #[allow(clippy::missing_safety_doc)]
49 #[inline]
__shuffle_vector16<const IDX: [u32; 16], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 16], Output = U>,50 pub unsafe fn __shuffle_vector16<const IDX: [u32; 16], T, U>(x: T, y: T) -> U
51 where
52     T: Simd,
53     <T as Simd>::Element: Shuffle<[u32; 16], Output = U>,
54 {
55     simd_shuffle16(x, y, IDX)
56 }
57 
58 #[allow(clippy::missing_safety_doc)]
59 #[inline]
__shuffle_vector32<const IDX: [u32; 32], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 32], Output = U>,60 pub unsafe fn __shuffle_vector32<const IDX: [u32; 32], T, U>(x: T, y: T) -> U
61 where
62     T: Simd,
63     <T as Simd>::Element: Shuffle<[u32; 32], Output = U>,
64 {
65     simd_shuffle32(x, y, IDX)
66 }
67 
68 #[allow(clippy::missing_safety_doc)]
69 #[inline]
__shuffle_vector64<const IDX: [u32; 64], T, U>(x: T, y: T) -> U where T: Simd, <T as Simd>::Element: Shuffle<[u32; 64], Output = U>,70 pub unsafe fn __shuffle_vector64<const IDX: [u32; 64], T, U>(x: T, y: T) -> U
71 where
72     T: Simd,
73     <T as Simd>::Element: Shuffle<[u32; 64], Output = U>,
74 {
75     simd_shuffle64(x, y, IDX)
76 }
77 
78 extern "platform-intrinsic" {
simd_eq<T, U>(x: T, y: T) -> U79     crate fn simd_eq<T, U>(x: T, y: T) -> U;
simd_ne<T, U>(x: T, y: T) -> U80     crate fn simd_ne<T, U>(x: T, y: T) -> U;
simd_lt<T, U>(x: T, y: T) -> U81     crate fn simd_lt<T, U>(x: T, y: T) -> U;
simd_le<T, U>(x: T, y: T) -> U82     crate fn simd_le<T, U>(x: T, y: T) -> U;
simd_gt<T, U>(x: T, y: T) -> U83     crate fn simd_gt<T, U>(x: T, y: T) -> U;
simd_ge<T, U>(x: T, y: T) -> U84     crate fn simd_ge<T, U>(x: T, y: T) -> U;
85 
simd_insert<T, U>(x: T, idx: u32, val: U) -> T86     crate fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T;
simd_extract<T, U>(x: T, idx: u32) -> U87     crate fn simd_extract<T, U>(x: T, idx: u32) -> U;
88 
simd_cast<T, U>(x: T) -> U89     crate fn simd_cast<T, U>(x: T) -> U;
90 
simd_add<T>(x: T, y: T) -> T91     crate fn simd_add<T>(x: T, y: T) -> T;
simd_sub<T>(x: T, y: T) -> T92     crate fn simd_sub<T>(x: T, y: T) -> T;
simd_mul<T>(x: T, y: T) -> T93     crate fn simd_mul<T>(x: T, y: T) -> T;
simd_div<T>(x: T, y: T) -> T94     crate fn simd_div<T>(x: T, y: T) -> T;
simd_rem<T>(x: T, y: T) -> T95     crate fn simd_rem<T>(x: T, y: T) -> T;
simd_shl<T>(x: T, y: T) -> T96     crate fn simd_shl<T>(x: T, y: T) -> T;
simd_shr<T>(x: T, y: T) -> T97     crate fn simd_shr<T>(x: T, y: T) -> T;
simd_and<T>(x: T, y: T) -> T98     crate fn simd_and<T>(x: T, y: T) -> T;
simd_or<T>(x: T, y: T) -> T99     crate fn simd_or<T>(x: T, y: T) -> T;
simd_xor<T>(x: T, y: T) -> T100     crate fn simd_xor<T>(x: T, y: T) -> T;
101 
simd_reduce_add_unordered<T, U>(x: T) -> U102     crate fn simd_reduce_add_unordered<T, U>(x: T) -> U;
simd_reduce_mul_unordered<T, U>(x: T) -> U103     crate fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U104     crate fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U;
simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U105     crate fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U;
simd_reduce_min<T, U>(x: T) -> U106     crate fn simd_reduce_min<T, U>(x: T) -> U;
simd_reduce_max<T, U>(x: T) -> U107     crate fn simd_reduce_max<T, U>(x: T) -> U;
simd_reduce_min_nanless<T, U>(x: T) -> U108     crate fn simd_reduce_min_nanless<T, U>(x: T) -> U;
simd_reduce_max_nanless<T, U>(x: T) -> U109     crate fn simd_reduce_max_nanless<T, U>(x: T) -> U;
simd_reduce_and<T, U>(x: T) -> U110     crate fn simd_reduce_and<T, U>(x: T) -> U;
simd_reduce_or<T, U>(x: T) -> U111     crate fn simd_reduce_or<T, U>(x: T) -> U;
simd_reduce_xor<T, U>(x: T) -> U112     crate fn simd_reduce_xor<T, U>(x: T) -> U;
simd_reduce_all<T>(x: T) -> bool113     crate fn simd_reduce_all<T>(x: T) -> bool;
simd_reduce_any<T>(x: T) -> bool114     crate fn simd_reduce_any<T>(x: T) -> bool;
115 
simd_select<M, T>(m: M, a: T, b: T) -> T116     crate fn simd_select<M, T>(m: M, a: T, b: T) -> T;
117 
simd_fmin<T>(a: T, b: T) -> T118     crate fn simd_fmin<T>(a: T, b: T) -> T;
simd_fmax<T>(a: T, b: T) -> T119     crate fn simd_fmax<T>(a: T, b: T) -> T;
120 
simd_fsqrt<T>(a: T) -> T121     crate fn simd_fsqrt<T>(a: T) -> T;
simd_fma<T>(a: T, b: T, c: T) -> T122     crate fn simd_fma<T>(a: T, b: T, c: T) -> T;
123 
simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T124     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)125     crate fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M);
126 
simd_bitmask<T, U>(value: T) -> U127     crate fn simd_bitmask<T, U>(value: T) -> U;
128 }
129