123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- macro_rules! intrinsics {
- () => ();
-
-
-
-
-
-
-
-
-
-
-
-
- (
- #[maybe_use_optimized_c_shim]
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- #[cfg($name = "optimized-c")]
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- extern $abi {
- fn $name($($argname: $ty),*) -> $ret;
- }
- unsafe {
- $name($($argname),*)
- }
- }
- #[cfg(not($name = "optimized-c"))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- intrinsics!($($rest)*);
- );
-
-
-
- (
- #[aapcs_on_arm]
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- #[cfg(target_arch = "arm")]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern "aapcs" fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- #[cfg(not(target_arch = "arm"))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- intrinsics!($($rest)*);
- );
-
-
- (
- #[unadjusted_on_win64]
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- #[cfg(all(windows, target_pointer_width = "64"))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern "unadjusted" fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- #[cfg(not(all(windows, target_pointer_width = "64")))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- intrinsics!($($rest)*);
- );
-
-
-
-
-
-
-
- (
- #[win64_128bit_abi_hack]
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- #[cfg(all(windows, target_arch = "x86_64"))]
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- #[cfg(all(windows, target_arch = "x86_64"))]
- pub mod $name {
- #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
- pub extern $abi fn $name( $($argname: $ty),* )
- -> ::macros::win64_128bit_abi_hack::U64x2
- {
- let e: $ret = super::$name($($argname),*);
- ::macros::win64_128bit_abi_hack::U64x2::from(e)
- }
- }
- #[cfg(not(all(windows, target_arch = "x86_64")))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- intrinsics!($($rest)*);
- );
-
-
-
-
- (
- #[arm_aeabi_alias = $alias:ident]
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- #[cfg(target_arch = "arm")]
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- #[cfg(target_arch = "arm")]
- pub mod $name {
- #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- super::$name($($argname),*)
- }
- }
- #[cfg(target_arch = "arm")]
- pub mod $alias {
- #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
- pub extern "aapcs" fn $alias( $($argname: $ty),* ) -> $ret {
- super::$name($($argname),*)
- }
- }
- #[cfg(not(target_arch = "arm"))]
- intrinsics! {
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- }
- intrinsics!($($rest)*);
- );
-
-
-
-
-
-
-
-
-
-
-
-
- (
- $(#[$($attr:tt)*])*
- pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
- $($body:tt)*
- }
- $($rest:tt)*
- ) => (
- $(#[$($attr)*])*
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- $($body)*
- }
- pub mod $name {
- $(#[$($attr)*])*
- #[cfg_attr(not(feature = "mangled-names"), no_mangle)]
- pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
- super::$name($($argname),*)
- }
- }
- intrinsics!($($rest)*);
- );
- }
- #[cfg(all(windows, target_pointer_width = "64"))]
- pub mod win64_128bit_abi_hack {
- #[repr(simd)]
- pub struct U64x2(u64, u64);
- impl From<i128> for U64x2 {
- fn from(i: i128) -> U64x2 {
- use int::DInt;
- let j = i as u128;
- U64x2(j.lo(), j.hi())
- }
- }
- impl From<u128> for U64x2 {
- fn from(i: u128) -> U64x2 {
- use int::DInt;
- U64x2(i.lo(), i.hi())
- }
- }
- }
|