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