2 Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
3 Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,
8 #[rustfmt::skip] // work around for https://github.com/rust-lang/rustfmt/issues/4823
9 macro_rules! make_float_type {
30 #[float(prim = $float_prim:ident $(, scalar = $float_scalar:ident)?)]
46 type $float: Float<Self::$u32, BitsType = Self::$uint>
47 $(+ From<Self::$float_scalar>)?
48 + Compare<Bool = Self::$bool>
49 + Make<Self, Prim = $float_prim>
50 $(+ ConvertTo<Self::$uint_smaller>)*
51 $(+ ConvertTo<Self::$int_smaller>)*
52 $($(+ ConvertTo<Self::$float_smaller>)?)*
53 + ConvertTo<Self::$uint>
54 + ConvertTo<Self::$int>
55 $(+ ConvertTo<Self::$uint_larger>)*
56 $(+ ConvertTo<Self::$int_larger>)*
57 $($(+ Into<Self::$float_larger>)?)*;
73 #[rustfmt::skip] // work around for https://github.com/rust-lang/rustfmt/issues/4823
74 macro_rules! make_uint_int_float_type {
80 #[uint($($uint_smaller_traits:tt)*)]
82 #[int($($int_smaller_traits:tt)*)]
85 #[float($($float_smaller_traits:tt)*)]
91 #[uint(prim = $uint_prim:ident $(, scalar = $uint_scalar:ident)?)]
93 #[int(prim = $int_prim:ident $(, scalar = $int_scalar:ident)?)]
96 #[float(prim = $float_prim:ident $(, scalar = $float_scalar:ident)?)]
102 #[uint($($uint_larger_traits:tt)*)]
104 #[int($($int_larger_traits:tt)*)]
107 #[float($($float_larger_traits:tt)*)]
113 type $uint: UInt<Self::$u32>
114 $(+ From<Self::$uint_scalar>)?
115 + Compare<Bool = Self::$bool>
116 + Make<Self, Prim = $uint_prim>
117 $(+ ConvertTo<Self::$uint_smaller>)*
118 $(+ ConvertTo<Self::$int_smaller>)*
119 $($(+ ConvertTo<Self::$float_smaller>)?)*
120 + ConvertTo<Self::$int>
121 $(+ ConvertTo<Self::$float>)?
122 $(+ Into<Self::$uint_larger>)*
123 $(+ Into<Self::$int_larger>)*
124 $($(+ Into<Self::$float_larger>)?)*;
125 type $int: SInt<Self::$u32>
126 $(+ From<Self::$int_scalar>)?
127 + Compare<Bool = Self::$bool>
128 + Make<Self, Prim = $int_prim>
129 $(+ ConvertTo<Self::$uint_smaller>)*
130 $(+ ConvertTo<Self::$int_smaller>)*
131 $($(+ ConvertTo<Self::$float_smaller>)?)*
132 + ConvertTo<Self::$uint>
133 $(+ ConvertTo<Self::$float>)?
134 $(+ ConvertTo<Self::$uint_larger>)*
135 $(+ Into<Self::$int_larger>)*
136 $($(+ Into<Self::$float_larger>)?)*;
158 #[float(prim = $float_prim $(, scalar = $float_scalar)?)]
178 macro_rules! make_uint_int_float_types {
181 #[bool = $bool:ident]
184 [$first_larger:tt, $($larger:tt,)*]
186 make_uint_int_float_type! {
191 [$first_larger, $($larger,)*]
193 make_uint_int_float_types! {
196 [$($smaller,)* $current,],
203 #[bool = $bool:ident]
208 make_uint_int_float_type! {
218 #[rustfmt::skip] // work around for https://github.com/rust-lang/rustfmt/issues/4823
219 macro_rules! make_types {
222 $(#[scalar = $ScalarBool:ident])?
226 $(#[scalar = $ScalarU8:ident])?
230 $(#[scalar = $ScalarU16:ident])?
234 $(#[scalar = $ScalarU32:ident])?
238 $(#[scalar = $ScalarU64:ident])?
242 $(#[scalar = $ScalarI8:ident])?
246 $(#[scalar = $ScalarI16:ident])?
250 $(#[scalar = $ScalarI32:ident])?
254 $(#[scalar = $ScalarI64:ident])?
258 $(#[scalar = $ScalarF16:ident])?
262 $(#[scalar = $ScalarF32:ident])?
266 $(#[scalar = $ScalarF64:ident])?
270 $(+ From<Self::$ScalarBool>)?
271 + Make<Self, Prim = bool>
272 + Select<Self::$Bool>;
273 make_uint_int_float_types! {
278 #[uint(prim = u8 $(, scalar = $ScalarU8)?)]
280 #[int(prim = i8 $(, scalar = $ScalarI8)?)]
285 #[uint(prim = u16 $(, scalar = $ScalarU16)?)]
287 #[int(prim = i16 $(, scalar = $ScalarI16)?)]
289 #[float(prim = f16 $(, scalar = $ScalarF16)?)]
293 #[uint(prim = u32 $(, scalar = $ScalarU32)?)]
295 #[int(prim = i32 $(, scalar = $ScalarI32)?)]
297 #[float(prim = f32 $(, scalar = $ScalarF32)?)]
301 #[uint(prim = u64 $(, scalar = $ScalarU64)?)]
303 #[int(prim = i64 $(, scalar = $ScalarI64)?)]
305 #[float(prim = f64 $(, scalar = $ScalarF64)?)]
313 /// reference used to build IR for Kazan; an empty type for `core::simd`
314 pub trait Context: Copy {
401 fn make<T: Make<Self>>(self, v: T::Prim) -> T {
406 pub trait Make<Context>: Sized {
408 fn make(ctx: Context, v: Self::Prim) -> Self;
411 pub trait ConvertTo<T> {
415 impl<T, U: Into<T>> ConvertTo<T> for U {
438 + BitAnd<Output = Self>
439 + BitOr<Output = Self>
440 + BitXor<Output = Self>
448 pub trait Int<ShiftRhs>:
451 + Shl<ShiftRhs, Output = Self>
452 + Shr<ShiftRhs, Output = Self>
453 + ShlAssign<ShiftRhs>
454 + ShrAssign<ShiftRhs>
458 pub trait UInt<ShiftRhs>: Int<ShiftRhs> {}
460 pub trait SInt<ShiftRhs>: Int<ShiftRhs> + Neg<Output = Self> {}
462 pub trait Float<BitsShiftRhs>: Number + Neg<Output = Self> {
463 type BitsType: UInt<BitsShiftRhs>;
464 fn abs(self) -> Self;
465 fn trunc(self) -> Self;
466 fn ceil(self) -> Self;
467 fn floor(self) -> Self;
468 fn round(self) -> Self;
469 fn fma(self, a: Self, b: Self) -> Self;
470 fn is_nan(self) -> Self::Bool;
471 fn is_infinity(self) -> Self::Bool;
472 fn is_finite(self) -> Self::Bool;
473 fn from_bits(v: Self::BitsType) -> Self;
474 fn to_bits(self) -> Self::BitsType;
477 pub trait Bool: BitOps {}
479 pub trait Select<T>: Bool {
480 fn select(self, true_v: T, false_v: T) -> T;
483 pub trait Compare: Copy {
484 type Bool: Bool + Select<Self>;
485 fn eq(self, rhs: Self) -> Self::Bool;
486 fn ne(self, rhs: Self) -> Self::Bool;
487 fn lt(self, rhs: Self) -> Self::Bool;
488 fn gt(self, rhs: Self) -> Self::Bool;
489 fn le(self, rhs: Self) -> Self::Bool;
490 fn ge(self, rhs: Self) -> Self::Bool;