1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//! 512-bit wide vector types

use prelude::v1::*;

use coresimd::simd_llvm::*;

define_ty! { f64x8, f64, f64, f64, f64, f64, f64, f64, f64 }
define_impl! { f64x8, f64, 8, i64x8, x0, x1, x2, x3, x4, x5, x6, x7 }

define_ty! {
    f32x16,
    f32, f32, f32, f32, f32, f32, f32, f32,
    f32, f32, f32, f32, f32, f32, f32, f32
}
define_impl! {
    f32x16, f32, 16, i32x16,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15
}

define_ty! { u64x8, u64, u64, u64, u64, u64, u64, u64, u64 }
define_impl! { u64x8, u64, 8, i64x8, x0, x1, x2, x3, x4, x5, x6, x7 }

define_ty! { i64x8, i64, i64, i64, i64, i64, i64, i64, i64 }
define_impl! { i64x8, i64, 8, i64x8, x0, x1, x2, x3, x4, x5, x6, x7 }

define_ty! {
    u32x16,
    u32, u32, u32, u32, u32, u32, u32, u32,
    u32, u32, u32, u32, u32, u32, u32, u32
}
define_impl! {
    u32x16, u32, 16, i32x16,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15
}

define_ty! {
    i32x16,
    i32, i32, i32, i32, i32, i32, i32, i32,
    i32, i32, i32, i32, i32, i32, i32, i32
}
define_impl! {
    i32x16, i32, 16, i32x16,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15
}

define_ty! {
    u16x32,
    u16, u16, u16, u16, u16, u16, u16, u16,
    u16, u16, u16, u16, u16, u16, u16, u16,
    u16, u16, u16, u16, u16, u16, u16, u16,
    u16, u16, u16, u16, u16, u16, u16, u16
}
define_impl! {
    u16x32, u16, 32, i16x32,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15,
    x16, x17, x18, x19, x20, x21, x22, x23,
    x24, x25, x26, x27, x28, x29, x30, x31
}

define_ty! {
    i16x32,
    i16, i16, i16, i16, i16, i16, i16, i16,
    i16, i16, i16, i16, i16, i16, i16, i16,
    i16, i16, i16, i16, i16, i16, i16, i16,
    i16, i16, i16, i16, i16, i16, i16, i16
}
define_impl! {
    i16x32, i16, 32, i16x32,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15,
    x16, x17, x18, x19, x20, x21, x22, x23,
    x24, x25, x26, x27, x28, x29, x30, x31
}

define_ty! {
    u8x64,
    u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
    u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
    u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
    u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8
}
define_impl! {
    u8x64, u8, 64, i8x64,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15,
    x16, x17, x18, x19, x20, x21, x22, x23,
    x24, x25, x26, x27, x28, x29, x30, x31,
    x32, x33, x34, x35, x36, x37, x38, x39,
    x40, x41, x42, x43, x44, x45, x46, x47,
    x48, x49, x50, x51, x52, x53, x54, x55,
    x56, x57, x58, x59, x60, x61, x62, x63
}

define_ty! {
    i8x64,
    i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
    i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
    i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
    i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8
}
define_impl! {
    i8x64, i8, 64, i8x64,
    x0, x1, x2, x3, x4, x5, x6, x7,
    x8, x9, x10, x11, x12, x13, x14, x15,
    x16, x17, x18, x19, x20, x21, x22, x23,
    x24, x25, x26, x27, x28, x29, x30, x31,
    x32, x33, x34, x35, x36, x37, x38, x39,
    x40, x41, x42, x43, x44, x45, x46, x47,
    x48, x49, x50, x51, x52, x53, x54, x55,
    x56, x57, x58, x59, x60, x61, x62, x63
}

define_from!(u64x8, i64x8, u32x16, i32x16, u16x32, i16x32, u8x64, i8x64);
define_from!(i64x8, u64x8, u32x16, i32x16, u16x32, i16x32, u8x64, i8x64);
define_from!(u32x16, u64x8, i64x8, i32x16, u16x32, i16x32, u8x64, i8x64);
define_from!(i32x16, u64x8, i64x8, u32x16, u16x32, i16x32, u8x64, i8x64);
define_from!(u16x32, u64x8, i64x8, u32x16, i32x16, i16x32, u8x64, i8x64);
define_from!(i16x32, u64x8, i64x8, u32x16, i32x16, u16x32, u8x64, i8x64);
define_from!(u8x64, u64x8, i64x8, u32x16, i32x16, u16x32, i16x32, i8x64);
define_from!(i8x64, u64x8, i64x8, u32x16, i32x16, u16x32, i16x32, u8x64);

define_common_ops!(
    f64x8,
    f32x16,
    u64x8,
    i64x8,
    u32x16,
    i32x16,
    u16x32,
    i16x32,
    u8x64,
    i8x64
);
define_float_ops!(f64x8, f32x16);
define_integer_ops!(
    (u64x8, u64),
    (i64x8, i64),
    (u32x16, u32),
    (i32x16, i32),
    (u16x32, u16),
    (i16x32, i16),
    (u8x64, u8),
    (i8x64, i8)
);
define_signed_integer_ops!(i64x8, i32x16, i16x32, i8x64);
define_casts!(
    (f64x8, f32x8, as_f32x8),
    (f64x8, u64x8, as_u64x8),
    (f64x8, i64x8, as_i64x8),
    (f32x16, u32x16, as_u32x16),
    (f32x16, i32x16, as_i32x16),
    (u64x8, f64x8, as_f64x8),
    (u64x8, i64x8, as_i64x8),
    (i64x8, f64x8, as_f64x8),
    (i64x8, u64x8, as_u64x8),
    (u32x16, f32x16, as_f32x16),
    (u32x16, i32x16, as_i32x16),
    (i32x16, f32x16, as_f32x16),
    (i32x16, u32x16, as_u32x16),
    (u16x32, i16x32, as_i16x32),
    (i16x32, u16x32, as_u16x32),
    (u8x64, i8x64, as_i8x64),
    (i8x64, u8x64, as_u8x64)
);

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn operators() {
        test_ops_si!(i8x64, i16x32, i32x16, i64x8);
        test_ops_ui!(u8x64, u16x32, u32x16, u64x8);
        test_ops_f!(f32x16, f64x8);
    }
}