macros.rs - source
Description: Source of the Rust file `library/core/src/../../stdarch/crates/core_arch/src/s390x/macros.rs`.

#
core/stdarch/crates/core_arch/src/s390x/
macros.rs

    1#![allow(unused_macros)] // FIXME remove when more tests are added
    2#![allow(unused_imports)] // FIXME remove when more tests are added
    3
    4macro_rules! test_impl {
    5    ($fun:ident ($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, _]) => {
    6        #[inline]
    7        #[target_feature(enable = "vector")]
    8        pub unsafe fn $fun ($($v : $ty),*) -> $r {
    9            $call ($($v),*)
    10        }
    11    };
    12    ($fun:ident +($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, $instr:ident]) => {
    13        #[inline]
    14        #[target_feature(enable = "vector")]
    15        #[cfg_attr(test, assert_instr($instr))]
    16        pub unsafe fn $fun ($($v : $ty),*) -> $r {
    17            transmute($call ($($v),*))
    18        }
    19    };
    20    ($fun:ident +($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, $tf:literal $instr:ident]) => {
    21        #[inline]
    22        #[target_feature(enable = "vector")]
    23        #[cfg_attr(all(test, target_feature = $tf), assert_instr($instr))]
    24        pub unsafe fn $fun ($($v : $ty),*) -> $r {
    25            transmute($call ($($v),*))
    26        }
    27    };
    28    ($fun:ident ($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, $tf:literal $instr:ident]) => {
    29        #[inline]
    30        #[target_feature(enable = "vector")]
    31        #[cfg_attr(all(test, target_feature = $tf), assert_instr($instr))]
    32        pub unsafe fn $fun ($($v : $ty),*) -> $r {
    33            $call ($($v),*)
    34        }
    35    };
    36    ($fun:ident ($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, $instr:ident]) => {
    37        #[inline]
    38        #[target_feature(enable = "vector")]
    39        #[cfg_attr(test, assert_instr($instr))]
    40        pub unsafe fn $fun ($($v : $ty),*) -> $r {
    41            $call ($($v),*)
    42        }
    43    };
    44}
    45
    46#[allow(unknown_lints, unused_macro_rules)]
    47macro_rules! impl_vec_trait {
    48    ([$Trait:ident $m:ident] $fun:ident ($a:ty)) => {
    49        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    50        impl $Trait for $a {
    51            #[inline]
    52            #[target_feature(enable = "vector")]
    53            unsafe fn $m(self) -> Self {
    54                $fun(transmute(self))
    55            }
    56        }
    57    };
    58    ([$Trait:ident $m:ident]+ $fun:ident ($a:ty)) => {
    59        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    60        impl $Trait for $a {
    61            #[inline]
    62            #[target_feature(enable = "vector")]
    63            unsafe fn $m(self) -> Self {
    64                transmute($fun(transmute(self)))
    65            }
    66        }
    67    };
    68    ([$Trait:ident $m:ident] $fun:ident ($a:ty) -> $r:ty) => {
    69        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    70        impl $Trait for $a {
    71            type Result = $r;
    72            #[inline]
    73            #[target_feature(enable = "vector")]
    74            unsafe fn $m(self) -> Self::Result {
    75                $fun(transmute(self))
    76            }
    77        }
    78    };
    79    ([$Trait:ident $m:ident]+ $fun:ident ($a:ty) -> $r:ty) => {
    80        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    81        impl $Trait for $a {
    82            type Result = $r;
    83            #[inline]
    84            #[target_feature(enable = "vector")]
    85            unsafe fn $m(self) -> Self::Result {
    86                transmute($fun(transmute(self)))
    87            }
    88        }
    89    };
    90    ([$Trait:ident $m:ident] 1 ($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident, $sf: ident)) => {
    91        impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char) -> vector_unsigned_char }
    92        impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char) -> vector_signed_char }
    93        impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short) -> vector_unsigned_short }
    94        impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short) -> vector_signed_short }
    95        impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int) -> vector_unsigned_int }
    96        impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int) -> vector_signed_int }
    97        impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_long_long) -> vector_unsigned_long_long }
    98        impl_vec_trait!{ [$Trait $m] $sw (vector_signed_long_long) -> vector_signed_long_long }
    99        impl_vec_trait!{ [$Trait $m] $sf (vector_float) -> vector_float }
    100        impl_vec_trait!{ [$Trait $m] $sf (vector_double) -> vector_double }
    101    };
    102    ([$Trait:ident $m:ident] $fun:ident ($a:ty, $b:ty) -> $r:ty) => {
    103        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    104        impl $Trait<$b> for $a {
    105            type Result = $r;
    106            #[inline]
    107            #[target_feature(enable = "vector")]
    108            unsafe fn $m(self, b: $b) -> Self::Result {
    109                $fun(transmute(self), transmute(b))
    110            }
    111        }
    112    };
    113    ([$Trait:ident $m:ident]+ $fun:ident ($a:ty, $b:ty) -> $r:ty) => {
    114        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    115        impl $Trait<$b> for $a {
    116            type Result = $r;
    117            #[inline]
    118            #[target_feature(enable = "vector")]
    119            unsafe fn $m(self, b: $b) -> Self::Result {
    120                transmute($fun(transmute(self), transmute(b)))
    121            }
    122        }
    123    };
    124    ([$Trait:ident $m:ident] $fun:ident ($a:ty, ~$b:ty) -> $r:ty) => {
    125        impl_vec_trait!{ [$Trait $m] $fun ($a, $a) -> $r }
    126        impl_vec_trait!{ [$Trait $m] $fun ($a, $b) -> $r }
    127        impl_vec_trait!{ [$Trait $m] $fun ($b, $a) -> $r }
    128    };
    129    ([$Trait:ident $m:ident] ~($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident, $ug:ident, $sg:ident)) => {
    130        impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char, ~vector_bool_char) -> vector_unsigned_char }
    131        impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char, ~vector_bool_char) -> vector_signed_char }
    132        impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short, ~vector_bool_short) -> vector_unsigned_short }
    133        impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short, ~vector_bool_short) -> vector_signed_short }
    134        impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int, ~vector_bool_int) -> vector_unsigned_int }
    135        impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int, ~vector_bool_int) -> vector_signed_int }
    136        impl_vec_trait!{ [$Trait $m] $ug (vector_unsigned_long_long, ~vector_bool_long_long) -> vector_unsigned_long_long }
    137        impl_vec_trait!{ [$Trait $m] $sg (vector_signed_long_long, ~vector_bool_long_long) -> vector_signed_long_long }
    138    };
    139    ([$Trait:ident $m:ident] ~($fn:ident)) => {
    140        impl_vec_trait!{ [$Trait $m] ~($fn, $fn, $fn, $fn, $fn, $fn, $fn, $fn) }
    141    };
    142    ([$Trait:ident $m:ident] 2 ($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident, $ug:ident, $sg:ident)) => {
    143        impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
    144        impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char, vector_signed_char) -> vector_signed_char }
    145        impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
    146        impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short, vector_signed_short) -> vector_signed_short }
    147        impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
    148        impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int, vector_signed_int) -> vector_signed_int }
    149        impl_vec_trait!{ [$Trait $m] $ug (vector_unsigned_long_long, vector_unsigned_long_long) -> vector_unsigned_long_long }
    150        impl_vec_trait!{ [$Trait $m] $sg (vector_signed_long_long, vector_signed_long_long) -> vector_signed_long_long }
    151    };
    152    ([$Trait:ident $m:ident] 2 ($fn:ident)) => {
    153        impl_vec_trait!{ [$Trait $m] ($fn, $fn, $fn, $fn, $fn, $fn, $fn, $fn) }
    154    };
    155    ([$Trait:ident $m:ident]+ 2b ($b:ident, $h:ident, $w:ident, $g:ident)) => {
    156        impl_vec_trait!{ [$Trait $m]+ $b (vector_bool_char, vector_bool_char) -> vector_bool_char }
    157        impl_vec_trait!{ [$Trait $m]+ $b (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
    158        impl_vec_trait!{ [$Trait $m]+ $b (vector_signed_char, vector_signed_char) -> vector_signed_char }
    159        impl_vec_trait!{ [$Trait $m]+ $h (vector_bool_short, vector_bool_short) -> vector_bool_short }
    160        impl_vec_trait!{ [$Trait $m]+ $h (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
    161        impl_vec_trait!{ [$Trait $m]+ $h (vector_signed_short, vector_signed_short) -> vector_signed_short }
    162        impl_vec_trait!{ [$Trait $m]+ $w (vector_bool_int, vector_bool_int) -> vector_bool_int }
    163        impl_vec_trait!{ [$Trait $m]+ $w (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
    164        impl_vec_trait!{ [$Trait $m]+ $w (vector_signed_int, vector_signed_int) -> vector_signed_int }
    165        impl_vec_trait!{ [$Trait $m]+ $g (vector_unsigned_long_long, vector_unsigned_long_long) -> vector_unsigned_long_long }
    166        impl_vec_trait!{ [$Trait $m]+ $g (vector_signed_long_long, vector_signed_long_long) -> vector_signed_long_long }
    167    };
    168    ([$Trait:ident $m:ident]+ 2b ($fn:ident)) => {
    169        impl_vec_trait!{ [$Trait $m]+ 2b ($fn, $fn, $fn, $fn) }
    170    };
    171    ([$Trait:ident $m:ident]+ 2c ($b:ident, $h:ident, $w:ident, $g:ident, $s:ident, $d:ident)) => {
    172        impl_vec_trait!{ [$Trait $m]+ $b (vector_bool_char, vector_bool_char) -> vector_bool_char }
    173        impl_vec_trait!{ [$Trait $m]+ $b (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
    174        impl_vec_trait!{ [$Trait $m]+ $b (vector_signed_char, vector_signed_char) -> vector_signed_char }
    175        impl_vec_trait!{ [$Trait $m]+ $h (vector_bool_short, vector_bool_short) -> vector_bool_short }
    176        impl_vec_trait!{ [$Trait $m]+ $h (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
    177        impl_vec_trait!{ [$Trait $m]+ $h (vector_signed_short, vector_signed_short) -> vector_signed_short }
    178        impl_vec_trait!{ [$Trait $m]+ $w (vector_bool_int, vector_bool_int) -> vector_bool_int }
    179        impl_vec_trait!{ [$Trait $m]+ $w (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
    180        impl_vec_trait!{ [$Trait $m]+ $w (vector_signed_int, vector_signed_int) -> vector_signed_int }
    181        impl_vec_trait!{ [$Trait $m]+ $g (vector_unsigned_long_long, vector_unsigned_long_long) -> vector_unsigned_long_long }
    182        impl_vec_trait!{ [$Trait $m]+ $g (vector_signed_long_long, vector_signed_long_long) -> vector_signed_long_long }
    183        impl_vec_trait!{ [$Trait $m]+ $s (vector_float, vector_float) -> vector_float }
    184        impl_vec_trait!{ [$Trait $m]+ $d (vector_double, vector_double) -> vector_double }
    185    };
    186    ([$Trait:ident $m:ident]+ 2c ($fn:ident)) => {
    187        impl_vec_trait!{ [$Trait $m]+ 2c ($fn, $fn, $fn, $fn, $fn, $fn) }
    188    };
    189}
    190
    191macro_rules! s_t_l {
    192    (i64x2) => {
    193        vector_signed_long_long
    194    };
    195    (i32x4) => {
    196        vector_signed_int
    197    };
    198    (i16x8) => {
    199        vector_signed_short
    200    };
    201    (i8x16) => {
    202        vector_signed_char
    203    };
    204
    205    (u64x2) => {
    206        vector_unsigned_long_long
    207    };
    208    (u32x4) => {
    209        vector_unsigned_int
    210    };
    211    (u16x8) => {
    212        vector_unsigned_short
    213    };
    214    (u8x16) => {
    215        vector_unsigned_char
    216    };
    217
    218    (f32x4) => {
    219        vector_float
    220    };
    221    (f64x2) => {
    222        vector_double
    223    };
    224}
    225
    226macro_rules! l_t_t {
    227    (vector_signed_long_long) => {
    228        i64
    229    };
    230    (vector_signed_int) => {
    231        i32
    232    };
    233    (vector_signed_short) => {
    234        i16
    235    };
    236    (vector_signed_char) => {
    237        i8
    238    };
    239
    240    (vector_unsigned_long_long ) => {
    241        u64
    242    };
    243    (vector_unsigned_int ) => {
    244        u32
    245    };
    246    (vector_unsigned_short ) => {
    247        u16
    248    };
    249    (vector_unsigned_char ) => {
    250        u8
    251    };
    252
    253    (vector_bool_long_long ) => {
    254        u64
    255    };
    256    (vector_bool_int ) => {
    257        u32
    258    };
    259    (vector_bool_short ) => {
    260        u16
    261    };
    262    (vector_bool_char ) => {
    263        u8
    264    };
    265
    266    (vector_float) => {
    267        f32
    268    };
    269    (vector_double) => {
    270        f64
    271    };
    272}
    273
    274macro_rules! t_t_l {
    275    (i64) => {
    276        vector_signed_long_long
    277    };
    278    (i32) => {
    279        vector_signed_int
    280    };
    281    (i16) => {
    282        vector_signed_short
    283    };
    284    (i8) => {
    285        vector_signed_char
    286    };
    287
    288    (u64) => {
    289        vector_unsigned_long_long
    290    };
    291    (u32) => {
    292        vector_unsigned_int
    293    };
    294    (u16) => {
    295        vector_unsigned_short
    296    };
    297    (u8) => {
    298        vector_unsigned_char
    299    };
    300
    301    (f32) => {
    302        vector_float
    303    };
    304    (f64) => {
    305        vector_double
    306    };
    307}
    308
    309macro_rules! t_t_s {
    310    (i64) => {
    311        i64x2
    312    };
    313    (i32) => {
    314        i32x4
    315    };
    316    (i16) => {
    317        i16x8
    318    };
    319    (i8) => {
    320        i8x16
    321    };
    322
    323    (u64) => {
    324        u64x2
    325    };
    326    (u32) => {
    327        u32x4
    328    };
    329    (u16) => {
    330        u16x8
    331    };
    332    (u8) => {
    333        u8x16
    334    };
    335
    336    (f32) => {
    337        f32x4
    338    };
    339    (f64) => {
    340        f64x2
    341    };
    342}
    343
    344macro_rules! t_u {
    345    (vector_bool_char) => {
    346        vector_unsigned_char
    347    };
    348    (vector_bool_short) => {
    349        vector_unsigned_short
    350    };
    351    (vector_bool_int) => {
    352        vector_unsigned_int
    353    };
    354    (vector_bool_long_long) => {
    355        vector_unsigned_long_long
    356    };
    357    (vector_unsigned_char) => {
    358        vector_unsigned_char
    359    };
    360    (vector_unsigned_short) => {
    361        vector_unsigned_short
    362    };
    363    (vector_unsigned_int) => {
    364        vector_unsigned_int
    365    };
    366    (vector_unsigned_long_long) => {
    367        vector_unsigned_long_long
    368    };
    369    (vector_signed_char) => {
    370        vector_unsigned_char
    371    };
    372    (vector_signed_short) => {
    373        vector_unsigned_short
    374    };
    375    (vector_signed_int) => {
    376        vector_unsigned_int
    377    };
    378    (vector_signed_long_long) => {
    379        vector_unsigned_long_long
    380    };
    381    (vector_float) => {
    382        vector_unsigned_int
    383    };
    384    (vector_double) => {
    385        vector_unsigned_long_long
    386    };
    387}
    388
    389macro_rules! t_b {
    390    (vector_bool_char) => {
    391        vector_bool_char
    392    };
    393    (vector_bool_short) => {
    394        vector_bool_short
    395    };
    396    (vector_bool_int) => {
    397        vector_bool_int
    398    };
    399    (vector_bool_long_long) => {
    400        vector_bool_long_long
    401    };
    402    (vector_signed_char) => {
    403        vector_bool_char
    404    };
    405    (vector_signed_short) => {
    406        vector_bool_short
    407    };
    408    (vector_signed_int) => {
    409        vector_bool_int
    410    };
    411    (vector_signed_long_long) => {
    412        vector_bool_long_long
    413    };
    414    (vector_unsigned_char) => {
    415        vector_bool_char
    416    };
    417    (vector_unsigned_short) => {
    418        vector_bool_short
    419    };
    420    (vector_unsigned_int) => {
    421        vector_bool_int
    422    };
    423    (vector_unsigned_long_long) => {
    424        vector_bool_long_long
    425    };
    426    (vector_float) => {
    427        vector_bool_int
    428    };
    429    (vector_double) => {
    430        vector_bool_long_long
    431    };
    432}
    433
    434macro_rules! impl_from {
    435    ($s: ident) => {
    436        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    437        impl From<$s> for s_t_l!($s) {
    438            #[inline]
    439            fn from (v: $s) -> Self {
    440                unsafe {
    441                    transmute(v)
    442                }
    443            }
    444        }
    445    };
    446    ($($s: ident),*) => {
    447        $(
    448            impl_from! { $s }
    449        )*
    450    };
    451}
    452
    453macro_rules! impl_neg {
    454    ($s: ident : $zero: expr) => {
    455        #[unstable(feature = "stdarch_s390x", issue = "135681")]
    456        impl crate::ops::Neg for s_t_l!($s) {
    457            type Output = s_t_l!($s);
    458            #[inline]
    459            fn neg(self) -> Self::Output {
    460                unsafe { simd_neg(self) }
    461            }
    462        }
    463    };
    464}
    465
    466pub(crate) use impl_from;
    467pub(crate) use impl_neg;
    468pub(crate) use impl_vec_trait;
    469pub(crate) use l_t_t;
    470pub(crate) use s_t_l;
    471pub(crate) use t_b;
    472pub(crate) use t_t_l;
    473pub(crate) use t_t_s;
    474pub(crate) use t_u;
    475pub(crate) use test_impl;