1 //! This module contains the LLVM intrinsics bindings that provide the functionality for this 2 //! crate. 3 //! 4 //! The LLVM assembly language is documented here: <https://llvm.org/docs/LangRef.html> 5 6 /// These intrinsics aren't linked directly from LLVM and are mostly undocumented, however they are 7 /// simply lowered to the matching LLVM instructions by the compiler. The associated instruction 8 /// is documented alongside each intrinsic. 9 extern "platform-intrinsic" { 10 /// add/fadd simd_add<T>(x: T, y: T) -> T11 pub(crate) fn simd_add<T>(x: T, y: T) -> T; 12 13 /// sub/fsub simd_sub<T>(x: T, y: T) -> T14 pub(crate) fn simd_sub<T>(x: T, y: T) -> T; 15 16 /// mul/fmul simd_mul<T>(x: T, y: T) -> T17 pub(crate) fn simd_mul<T>(x: T, y: T) -> T; 18 19 /// udiv/sdiv/fdiv simd_div<T>(x: T, y: T) -> T20 pub(crate) fn simd_div<T>(x: T, y: T) -> T; 21 22 /// urem/srem/frem simd_rem<T>(x: T, y: T) -> T23 pub(crate) fn simd_rem<T>(x: T, y: T) -> T; 24 25 /// shl simd_shl<T>(x: T, y: T) -> T26 pub(crate) fn simd_shl<T>(x: T, y: T) -> T; 27 28 /// lshr/ashr simd_shr<T>(x: T, y: T) -> T29 pub(crate) fn simd_shr<T>(x: T, y: T) -> T; 30 31 /// and simd_and<T>(x: T, y: T) -> T32 pub(crate) fn simd_and<T>(x: T, y: T) -> T; 33 34 /// or simd_or<T>(x: T, y: T) -> T35 pub(crate) fn simd_or<T>(x: T, y: T) -> T; 36 37 /// xor simd_xor<T>(x: T, y: T) -> T38 pub(crate) fn simd_xor<T>(x: T, y: T) -> T; 39 40 /// fptoui/fptosi/uitofp/sitofp simd_cast<T, U>(x: T) -> U41 pub(crate) fn simd_cast<T, U>(x: T) -> U; 42 43 /// neg/fneg simd_neg<T>(x: T) -> T44 pub(crate) fn simd_neg<T>(x: T) -> T; 45 46 /// fabs simd_fabs<T>(x: T) -> T47 pub(crate) fn simd_fabs<T>(x: T) -> T; 48 simd_eq<T, U>(x: T, y: T) -> U49 pub(crate) fn simd_eq<T, U>(x: T, y: T) -> U; simd_ne<T, U>(x: T, y: T) -> U50 pub(crate) fn simd_ne<T, U>(x: T, y: T) -> U; simd_lt<T, U>(x: T, y: T) -> U51 pub(crate) fn simd_lt<T, U>(x: T, y: T) -> U; simd_le<T, U>(x: T, y: T) -> U52 pub(crate) fn simd_le<T, U>(x: T, y: T) -> U; simd_gt<T, U>(x: T, y: T) -> U53 pub(crate) fn simd_gt<T, U>(x: T, y: T) -> U; simd_ge<T, U>(x: T, y: T) -> U54 pub(crate) fn simd_ge<T, U>(x: T, y: T) -> U; 55 56 // shufflevector simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V57 pub(crate) fn simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V; 58 simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T59 pub(crate) fn simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T; simd_scatter<T, U, V>(val: T, ptr: U, mask: V)60 pub(crate) fn simd_scatter<T, U, V>(val: T, ptr: U, mask: V); 61 62 // {s,u}add.sat simd_saturating_add<T>(x: T, y: T) -> T63 pub(crate) fn simd_saturating_add<T>(x: T, y: T) -> T; 64 65 // {s,u}sub.sat simd_saturating_sub<T>(x: T, y: T) -> T66 pub(crate) fn simd_saturating_sub<T>(x: T, y: T) -> T; 67 68 // reductions simd_reduce_add_ordered<T, U>(x: T, y: U) -> U69 pub(crate) fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U; simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U70 pub(crate) fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U; 71 #[allow(unused)] simd_reduce_all<T>(x: T) -> bool72 pub(crate) fn simd_reduce_all<T>(x: T) -> bool; 73 #[allow(unused)] simd_reduce_any<T>(x: T) -> bool74 pub(crate) fn simd_reduce_any<T>(x: T) -> bool; simd_reduce_max<T, U>(x: T) -> U75 pub(crate) fn simd_reduce_max<T, U>(x: T) -> U; simd_reduce_min<T, U>(x: T) -> U76 pub(crate) fn simd_reduce_min<T, U>(x: T) -> U; simd_reduce_and<T, U>(x: T) -> U77 pub(crate) fn simd_reduce_and<T, U>(x: T) -> U; simd_reduce_or<T, U>(x: T) -> U78 pub(crate) fn simd_reduce_or<T, U>(x: T) -> U; simd_reduce_xor<T, U>(x: T) -> U79 pub(crate) fn simd_reduce_xor<T, U>(x: T) -> U; 80 81 // truncate integer vector to bitmask 82 #[allow(unused)] simd_bitmask<T, U>(x: T) -> U83 pub(crate) fn simd_bitmask<T, U>(x: T) -> U; 84 85 // select simd_select<M, T>(m: M, a: T, b: T) -> T86 pub(crate) fn simd_select<M, T>(m: M, a: T, b: T) -> T; 87 #[allow(unused)] simd_select_bitmask<M, T>(m: M, a: T, b: T) -> T88 pub(crate) fn simd_select_bitmask<M, T>(m: M, a: T, b: T) -> T; 89 } 90 91 #[cfg(feature = "std")] 92 mod std { 93 extern "platform-intrinsic" { 94 // ceil simd_ceil<T>(x: T) -> T95 pub(crate) fn simd_ceil<T>(x: T) -> T; 96 97 // floor simd_floor<T>(x: T) -> T98 pub(crate) fn simd_floor<T>(x: T) -> T; 99 100 // round simd_round<T>(x: T) -> T101 pub(crate) fn simd_round<T>(x: T) -> T; 102 103 // trunc simd_trunc<T>(x: T) -> T104 pub(crate) fn simd_trunc<T>(x: T) -> T; 105 106 // fsqrt simd_fsqrt<T>(x: T) -> T107 pub(crate) fn simd_fsqrt<T>(x: T) -> T; 108 109 // fma simd_fma<T>(x: T, y: T, z: T) -> T110 pub(crate) fn simd_fma<T>(x: T, y: T, z: T) -> T; 111 } 112 } 113 114 #[cfg(feature = "std")] 115 pub(crate) use crate::simd::intrinsics::std::*; 116