Skip to main content

magetypes/
width.rs

1//! Width dispatch trait for token-based SIMD type construction.
2//!
3//! **Auto-generated** by `cargo xtask generate` - do not edit manually.
4//!
5//! The `WidthDispatch` trait provides access to ALL SIMD sizes from any token.
6//! Native types are used where the hardware supports them; polyfills are used
7//! for wider types on narrower hardware.
8
9#![allow(missing_docs)]
10
11use archmage::SimdToken;
12
13/// Trait providing access to all SIMD sizes from a capability token.
14///
15/// Every token implementing this trait can construct vectors of any size.
16/// The associated types determine whether native or polyfilled implementations
17/// are used based on the token's hardware capabilities.
18pub trait WidthDispatch: SimdToken + Copy {
19    // 128-bit types
20    type F32x4;
21    type F64x2;
22    type I8x16;
23    type U8x16;
24    type I16x8;
25    type U16x8;
26    type I32x4;
27    type U32x4;
28    type I64x2;
29    type U64x2;
30
31    // 256-bit types
32    type F32x8;
33    type F64x4;
34    type I8x32;
35    type U8x32;
36    type I16x16;
37    type U16x16;
38    type I32x8;
39    type U32x8;
40    type I64x4;
41    type U64x4;
42
43    // 512-bit types
44    type F32x16;
45    type F64x8;
46    type I8x64;
47    type U8x64;
48    type I16x32;
49    type U16x32;
50    type I32x16;
51    type U32x16;
52    type I64x8;
53    type U64x8;
54
55    fn f32x4_splat(self, v: f32) -> Self::F32x4;
56    fn f32x4_zero(self) -> Self::F32x4;
57    fn f32x4_load(self, data: &[f32; 4]) -> Self::F32x4;
58    fn f64x2_splat(self, v: f64) -> Self::F64x2;
59    fn f64x2_zero(self) -> Self::F64x2;
60    fn f64x2_load(self, data: &[f64; 2]) -> Self::F64x2;
61    fn i8x16_splat(self, v: i8) -> Self::I8x16;
62    fn i8x16_zero(self) -> Self::I8x16;
63    fn i8x16_load(self, data: &[i8; 16]) -> Self::I8x16;
64    fn u8x16_splat(self, v: u8) -> Self::U8x16;
65    fn u8x16_zero(self) -> Self::U8x16;
66    fn u8x16_load(self, data: &[u8; 16]) -> Self::U8x16;
67    fn i16x8_splat(self, v: i16) -> Self::I16x8;
68    fn i16x8_zero(self) -> Self::I16x8;
69    fn i16x8_load(self, data: &[i16; 8]) -> Self::I16x8;
70    fn u16x8_splat(self, v: u16) -> Self::U16x8;
71    fn u16x8_zero(self) -> Self::U16x8;
72    fn u16x8_load(self, data: &[u16; 8]) -> Self::U16x8;
73    fn i32x4_splat(self, v: i32) -> Self::I32x4;
74    fn i32x4_zero(self) -> Self::I32x4;
75    fn i32x4_load(self, data: &[i32; 4]) -> Self::I32x4;
76    fn u32x4_splat(self, v: u32) -> Self::U32x4;
77    fn u32x4_zero(self) -> Self::U32x4;
78    fn u32x4_load(self, data: &[u32; 4]) -> Self::U32x4;
79    fn i64x2_splat(self, v: i64) -> Self::I64x2;
80    fn i64x2_zero(self) -> Self::I64x2;
81    fn i64x2_load(self, data: &[i64; 2]) -> Self::I64x2;
82    fn u64x2_splat(self, v: u64) -> Self::U64x2;
83    fn u64x2_zero(self) -> Self::U64x2;
84    fn u64x2_load(self, data: &[u64; 2]) -> Self::U64x2;
85    fn f32x8_splat(self, v: f32) -> Self::F32x8;
86    fn f32x8_zero(self) -> Self::F32x8;
87    fn f32x8_load(self, data: &[f32; 8]) -> Self::F32x8;
88    fn f64x4_splat(self, v: f64) -> Self::F64x4;
89    fn f64x4_zero(self) -> Self::F64x4;
90    fn f64x4_load(self, data: &[f64; 4]) -> Self::F64x4;
91    fn i8x32_splat(self, v: i8) -> Self::I8x32;
92    fn i8x32_zero(self) -> Self::I8x32;
93    fn i8x32_load(self, data: &[i8; 32]) -> Self::I8x32;
94    fn u8x32_splat(self, v: u8) -> Self::U8x32;
95    fn u8x32_zero(self) -> Self::U8x32;
96    fn u8x32_load(self, data: &[u8; 32]) -> Self::U8x32;
97    fn i16x16_splat(self, v: i16) -> Self::I16x16;
98    fn i16x16_zero(self) -> Self::I16x16;
99    fn i16x16_load(self, data: &[i16; 16]) -> Self::I16x16;
100    fn u16x16_splat(self, v: u16) -> Self::U16x16;
101    fn u16x16_zero(self) -> Self::U16x16;
102    fn u16x16_load(self, data: &[u16; 16]) -> Self::U16x16;
103    fn i32x8_splat(self, v: i32) -> Self::I32x8;
104    fn i32x8_zero(self) -> Self::I32x8;
105    fn i32x8_load(self, data: &[i32; 8]) -> Self::I32x8;
106    fn u32x8_splat(self, v: u32) -> Self::U32x8;
107    fn u32x8_zero(self) -> Self::U32x8;
108    fn u32x8_load(self, data: &[u32; 8]) -> Self::U32x8;
109    fn i64x4_splat(self, v: i64) -> Self::I64x4;
110    fn i64x4_zero(self) -> Self::I64x4;
111    fn i64x4_load(self, data: &[i64; 4]) -> Self::I64x4;
112    fn u64x4_splat(self, v: u64) -> Self::U64x4;
113    fn u64x4_zero(self) -> Self::U64x4;
114    fn u64x4_load(self, data: &[u64; 4]) -> Self::U64x4;
115    fn f32x16_splat(self, v: f32) -> Self::F32x16;
116    fn f32x16_zero(self) -> Self::F32x16;
117    fn f32x16_load(self, data: &[f32; 16]) -> Self::F32x16;
118    fn f64x8_splat(self, v: f64) -> Self::F64x8;
119    fn f64x8_zero(self) -> Self::F64x8;
120    fn f64x8_load(self, data: &[f64; 8]) -> Self::F64x8;
121    fn i8x64_splat(self, v: i8) -> Self::I8x64;
122    fn i8x64_zero(self) -> Self::I8x64;
123    fn i8x64_load(self, data: &[i8; 64]) -> Self::I8x64;
124    fn u8x64_splat(self, v: u8) -> Self::U8x64;
125    fn u8x64_zero(self) -> Self::U8x64;
126    fn u8x64_load(self, data: &[u8; 64]) -> Self::U8x64;
127    fn i16x32_splat(self, v: i16) -> Self::I16x32;
128    fn i16x32_zero(self) -> Self::I16x32;
129    fn i16x32_load(self, data: &[i16; 32]) -> Self::I16x32;
130    fn u16x32_splat(self, v: u16) -> Self::U16x32;
131    fn u16x32_zero(self) -> Self::U16x32;
132    fn u16x32_load(self, data: &[u16; 32]) -> Self::U16x32;
133    fn i32x16_splat(self, v: i32) -> Self::I32x16;
134    fn i32x16_zero(self) -> Self::I32x16;
135    fn i32x16_load(self, data: &[i32; 16]) -> Self::I32x16;
136    fn u32x16_splat(self, v: u32) -> Self::U32x16;
137    fn u32x16_zero(self) -> Self::U32x16;
138    fn u32x16_load(self, data: &[u32; 16]) -> Self::U32x16;
139    fn i64x8_splat(self, v: i64) -> Self::I64x8;
140    fn i64x8_zero(self) -> Self::I64x8;
141    fn i64x8_load(self, data: &[i64; 8]) -> Self::I64x8;
142    fn u64x8_splat(self, v: u64) -> Self::U64x8;
143    fn u64x8_zero(self) -> Self::U64x8;
144    fn u64x8_load(self, data: &[u64; 8]) -> Self::U64x8;
145}
146
147#[cfg(target_arch = "x86_64")]
148mod x86_impl {
149    use super::WidthDispatch;
150    use archmage::X64V3Token;
151
152    use crate::simd::{
153        f32x4, f32x8, f64x2, f64x4, i8x16, i8x32, i16x8, i16x16, i32x4, i32x8, i64x2, i64x4, u8x16,
154        u8x32, u16x8, u16x16, u32x4, u32x8, u64x2, u64x4,
155    };
156
157    impl WidthDispatch for X64V3Token {
158        // 128-bit types
159        type F32x4 = f32x4;
160        type F64x2 = f64x2;
161        type I8x16 = i8x16;
162        type U8x16 = u8x16;
163        type I16x8 = i16x8;
164        type U16x8 = u16x8;
165        type I32x4 = i32x4;
166        type U32x4 = u32x4;
167        type I64x2 = i64x2;
168        type U64x2 = u64x2;
169
170        // 256-bit types
171        type F32x8 = f32x8;
172        type F64x4 = f64x4;
173        type I8x32 = i8x32;
174        type U8x32 = u8x32;
175        type I16x16 = i16x16;
176        type U16x16 = u16x16;
177        type I32x8 = i32x8;
178        type U32x8 = u32x8;
179        type I64x4 = i64x4;
180        type U64x4 = u64x4;
181
182        // 512-bit types
183        type F32x16 = crate::simd::polyfill::v3_512::f32x16;
184        type F64x8 = crate::simd::polyfill::v3_512::f64x8;
185        type I8x64 = crate::simd::polyfill::v3_512::i8x64;
186        type U8x64 = crate::simd::polyfill::v3_512::u8x64;
187        type I16x32 = crate::simd::polyfill::v3_512::i16x32;
188        type U16x32 = crate::simd::polyfill::v3_512::u16x32;
189        type I32x16 = crate::simd::polyfill::v3_512::i32x16;
190        type U32x16 = crate::simd::polyfill::v3_512::u32x16;
191        type I64x8 = crate::simd::polyfill::v3_512::i64x8;
192        type U64x8 = crate::simd::polyfill::v3_512::u64x8;
193
194        #[inline(always)]
195        fn f32x4_splat(self, v: f32) -> Self::F32x4 {
196            f32x4::splat(self, v)
197        }
198
199        #[inline(always)]
200        fn f32x4_zero(self) -> Self::F32x4 {
201            f32x4::zero(self)
202        }
203
204        #[inline(always)]
205        fn f32x4_load(self, data: &[f32; 4]) -> Self::F32x4 {
206            f32x4::load(self, data)
207        }
208        #[inline(always)]
209        fn f64x2_splat(self, v: f64) -> Self::F64x2 {
210            f64x2::splat(self, v)
211        }
212
213        #[inline(always)]
214        fn f64x2_zero(self) -> Self::F64x2 {
215            f64x2::zero(self)
216        }
217
218        #[inline(always)]
219        fn f64x2_load(self, data: &[f64; 2]) -> Self::F64x2 {
220            f64x2::load(self, data)
221        }
222        #[inline(always)]
223        fn i8x16_splat(self, v: i8) -> Self::I8x16 {
224            i8x16::splat(self, v)
225        }
226
227        #[inline(always)]
228        fn i8x16_zero(self) -> Self::I8x16 {
229            i8x16::zero(self)
230        }
231
232        #[inline(always)]
233        fn i8x16_load(self, data: &[i8; 16]) -> Self::I8x16 {
234            i8x16::load(self, data)
235        }
236        #[inline(always)]
237        fn u8x16_splat(self, v: u8) -> Self::U8x16 {
238            u8x16::splat(self, v)
239        }
240
241        #[inline(always)]
242        fn u8x16_zero(self) -> Self::U8x16 {
243            u8x16::zero(self)
244        }
245
246        #[inline(always)]
247        fn u8x16_load(self, data: &[u8; 16]) -> Self::U8x16 {
248            u8x16::load(self, data)
249        }
250        #[inline(always)]
251        fn i16x8_splat(self, v: i16) -> Self::I16x8 {
252            i16x8::splat(self, v)
253        }
254
255        #[inline(always)]
256        fn i16x8_zero(self) -> Self::I16x8 {
257            i16x8::zero(self)
258        }
259
260        #[inline(always)]
261        fn i16x8_load(self, data: &[i16; 8]) -> Self::I16x8 {
262            i16x8::load(self, data)
263        }
264        #[inline(always)]
265        fn u16x8_splat(self, v: u16) -> Self::U16x8 {
266            u16x8::splat(self, v)
267        }
268
269        #[inline(always)]
270        fn u16x8_zero(self) -> Self::U16x8 {
271            u16x8::zero(self)
272        }
273
274        #[inline(always)]
275        fn u16x8_load(self, data: &[u16; 8]) -> Self::U16x8 {
276            u16x8::load(self, data)
277        }
278        #[inline(always)]
279        fn i32x4_splat(self, v: i32) -> Self::I32x4 {
280            i32x4::splat(self, v)
281        }
282
283        #[inline(always)]
284        fn i32x4_zero(self) -> Self::I32x4 {
285            i32x4::zero(self)
286        }
287
288        #[inline(always)]
289        fn i32x4_load(self, data: &[i32; 4]) -> Self::I32x4 {
290            i32x4::load(self, data)
291        }
292        #[inline(always)]
293        fn u32x4_splat(self, v: u32) -> Self::U32x4 {
294            u32x4::splat(self, v)
295        }
296
297        #[inline(always)]
298        fn u32x4_zero(self) -> Self::U32x4 {
299            u32x4::zero(self)
300        }
301
302        #[inline(always)]
303        fn u32x4_load(self, data: &[u32; 4]) -> Self::U32x4 {
304            u32x4::load(self, data)
305        }
306        #[inline(always)]
307        fn i64x2_splat(self, v: i64) -> Self::I64x2 {
308            i64x2::splat(self, v)
309        }
310
311        #[inline(always)]
312        fn i64x2_zero(self) -> Self::I64x2 {
313            i64x2::zero(self)
314        }
315
316        #[inline(always)]
317        fn i64x2_load(self, data: &[i64; 2]) -> Self::I64x2 {
318            i64x2::load(self, data)
319        }
320        #[inline(always)]
321        fn u64x2_splat(self, v: u64) -> Self::U64x2 {
322            u64x2::splat(self, v)
323        }
324
325        #[inline(always)]
326        fn u64x2_zero(self) -> Self::U64x2 {
327            u64x2::zero(self)
328        }
329
330        #[inline(always)]
331        fn u64x2_load(self, data: &[u64; 2]) -> Self::U64x2 {
332            u64x2::load(self, data)
333        }
334        #[inline(always)]
335        fn f32x8_splat(self, v: f32) -> Self::F32x8 {
336            f32x8::splat(self, v)
337        }
338
339        #[inline(always)]
340        fn f32x8_zero(self) -> Self::F32x8 {
341            f32x8::zero(self)
342        }
343
344        #[inline(always)]
345        fn f32x8_load(self, data: &[f32; 8]) -> Self::F32x8 {
346            f32x8::load(self, data)
347        }
348        #[inline(always)]
349        fn f64x4_splat(self, v: f64) -> Self::F64x4 {
350            f64x4::splat(self, v)
351        }
352
353        #[inline(always)]
354        fn f64x4_zero(self) -> Self::F64x4 {
355            f64x4::zero(self)
356        }
357
358        #[inline(always)]
359        fn f64x4_load(self, data: &[f64; 4]) -> Self::F64x4 {
360            f64x4::load(self, data)
361        }
362        #[inline(always)]
363        fn i8x32_splat(self, v: i8) -> Self::I8x32 {
364            i8x32::splat(self, v)
365        }
366
367        #[inline(always)]
368        fn i8x32_zero(self) -> Self::I8x32 {
369            i8x32::zero(self)
370        }
371
372        #[inline(always)]
373        fn i8x32_load(self, data: &[i8; 32]) -> Self::I8x32 {
374            i8x32::load(self, data)
375        }
376        #[inline(always)]
377        fn u8x32_splat(self, v: u8) -> Self::U8x32 {
378            u8x32::splat(self, v)
379        }
380
381        #[inline(always)]
382        fn u8x32_zero(self) -> Self::U8x32 {
383            u8x32::zero(self)
384        }
385
386        #[inline(always)]
387        fn u8x32_load(self, data: &[u8; 32]) -> Self::U8x32 {
388            u8x32::load(self, data)
389        }
390        #[inline(always)]
391        fn i16x16_splat(self, v: i16) -> Self::I16x16 {
392            i16x16::splat(self, v)
393        }
394
395        #[inline(always)]
396        fn i16x16_zero(self) -> Self::I16x16 {
397            i16x16::zero(self)
398        }
399
400        #[inline(always)]
401        fn i16x16_load(self, data: &[i16; 16]) -> Self::I16x16 {
402            i16x16::load(self, data)
403        }
404        #[inline(always)]
405        fn u16x16_splat(self, v: u16) -> Self::U16x16 {
406            u16x16::splat(self, v)
407        }
408
409        #[inline(always)]
410        fn u16x16_zero(self) -> Self::U16x16 {
411            u16x16::zero(self)
412        }
413
414        #[inline(always)]
415        fn u16x16_load(self, data: &[u16; 16]) -> Self::U16x16 {
416            u16x16::load(self, data)
417        }
418        #[inline(always)]
419        fn i32x8_splat(self, v: i32) -> Self::I32x8 {
420            i32x8::splat(self, v)
421        }
422
423        #[inline(always)]
424        fn i32x8_zero(self) -> Self::I32x8 {
425            i32x8::zero(self)
426        }
427
428        #[inline(always)]
429        fn i32x8_load(self, data: &[i32; 8]) -> Self::I32x8 {
430            i32x8::load(self, data)
431        }
432        #[inline(always)]
433        fn u32x8_splat(self, v: u32) -> Self::U32x8 {
434            u32x8::splat(self, v)
435        }
436
437        #[inline(always)]
438        fn u32x8_zero(self) -> Self::U32x8 {
439            u32x8::zero(self)
440        }
441
442        #[inline(always)]
443        fn u32x8_load(self, data: &[u32; 8]) -> Self::U32x8 {
444            u32x8::load(self, data)
445        }
446        #[inline(always)]
447        fn i64x4_splat(self, v: i64) -> Self::I64x4 {
448            i64x4::splat(self, v)
449        }
450
451        #[inline(always)]
452        fn i64x4_zero(self) -> Self::I64x4 {
453            i64x4::zero(self)
454        }
455
456        #[inline(always)]
457        fn i64x4_load(self, data: &[i64; 4]) -> Self::I64x4 {
458            i64x4::load(self, data)
459        }
460        #[inline(always)]
461        fn u64x4_splat(self, v: u64) -> Self::U64x4 {
462            u64x4::splat(self, v)
463        }
464
465        #[inline(always)]
466        fn u64x4_zero(self) -> Self::U64x4 {
467            u64x4::zero(self)
468        }
469
470        #[inline(always)]
471        fn u64x4_load(self, data: &[u64; 4]) -> Self::U64x4 {
472            u64x4::load(self, data)
473        }
474        #[inline(always)]
475        fn f32x16_splat(self, v: f32) -> Self::F32x16 {
476            crate::simd::polyfill::v3_512::f32x16::splat(self, v)
477        }
478
479        #[inline(always)]
480        fn f32x16_zero(self) -> Self::F32x16 {
481            crate::simd::polyfill::v3_512::f32x16::zero(self)
482        }
483
484        #[inline(always)]
485        fn f32x16_load(self, data: &[f32; 16]) -> Self::F32x16 {
486            crate::simd::polyfill::v3_512::f32x16::load(self, data)
487        }
488        #[inline(always)]
489        fn f64x8_splat(self, v: f64) -> Self::F64x8 {
490            crate::simd::polyfill::v3_512::f64x8::splat(self, v)
491        }
492
493        #[inline(always)]
494        fn f64x8_zero(self) -> Self::F64x8 {
495            crate::simd::polyfill::v3_512::f64x8::zero(self)
496        }
497
498        #[inline(always)]
499        fn f64x8_load(self, data: &[f64; 8]) -> Self::F64x8 {
500            crate::simd::polyfill::v3_512::f64x8::load(self, data)
501        }
502        #[inline(always)]
503        fn i8x64_splat(self, v: i8) -> Self::I8x64 {
504            crate::simd::polyfill::v3_512::i8x64::splat(self, v)
505        }
506
507        #[inline(always)]
508        fn i8x64_zero(self) -> Self::I8x64 {
509            crate::simd::polyfill::v3_512::i8x64::zero(self)
510        }
511
512        #[inline(always)]
513        fn i8x64_load(self, data: &[i8; 64]) -> Self::I8x64 {
514            crate::simd::polyfill::v3_512::i8x64::load(self, data)
515        }
516        #[inline(always)]
517        fn u8x64_splat(self, v: u8) -> Self::U8x64 {
518            crate::simd::polyfill::v3_512::u8x64::splat(self, v)
519        }
520
521        #[inline(always)]
522        fn u8x64_zero(self) -> Self::U8x64 {
523            crate::simd::polyfill::v3_512::u8x64::zero(self)
524        }
525
526        #[inline(always)]
527        fn u8x64_load(self, data: &[u8; 64]) -> Self::U8x64 {
528            crate::simd::polyfill::v3_512::u8x64::load(self, data)
529        }
530        #[inline(always)]
531        fn i16x32_splat(self, v: i16) -> Self::I16x32 {
532            crate::simd::polyfill::v3_512::i16x32::splat(self, v)
533        }
534
535        #[inline(always)]
536        fn i16x32_zero(self) -> Self::I16x32 {
537            crate::simd::polyfill::v3_512::i16x32::zero(self)
538        }
539
540        #[inline(always)]
541        fn i16x32_load(self, data: &[i16; 32]) -> Self::I16x32 {
542            crate::simd::polyfill::v3_512::i16x32::load(self, data)
543        }
544        #[inline(always)]
545        fn u16x32_splat(self, v: u16) -> Self::U16x32 {
546            crate::simd::polyfill::v3_512::u16x32::splat(self, v)
547        }
548
549        #[inline(always)]
550        fn u16x32_zero(self) -> Self::U16x32 {
551            crate::simd::polyfill::v3_512::u16x32::zero(self)
552        }
553
554        #[inline(always)]
555        fn u16x32_load(self, data: &[u16; 32]) -> Self::U16x32 {
556            crate::simd::polyfill::v3_512::u16x32::load(self, data)
557        }
558        #[inline(always)]
559        fn i32x16_splat(self, v: i32) -> Self::I32x16 {
560            crate::simd::polyfill::v3_512::i32x16::splat(self, v)
561        }
562
563        #[inline(always)]
564        fn i32x16_zero(self) -> Self::I32x16 {
565            crate::simd::polyfill::v3_512::i32x16::zero(self)
566        }
567
568        #[inline(always)]
569        fn i32x16_load(self, data: &[i32; 16]) -> Self::I32x16 {
570            crate::simd::polyfill::v3_512::i32x16::load(self, data)
571        }
572        #[inline(always)]
573        fn u32x16_splat(self, v: u32) -> Self::U32x16 {
574            crate::simd::polyfill::v3_512::u32x16::splat(self, v)
575        }
576
577        #[inline(always)]
578        fn u32x16_zero(self) -> Self::U32x16 {
579            crate::simd::polyfill::v3_512::u32x16::zero(self)
580        }
581
582        #[inline(always)]
583        fn u32x16_load(self, data: &[u32; 16]) -> Self::U32x16 {
584            crate::simd::polyfill::v3_512::u32x16::load(self, data)
585        }
586        #[inline(always)]
587        fn i64x8_splat(self, v: i64) -> Self::I64x8 {
588            crate::simd::polyfill::v3_512::i64x8::splat(self, v)
589        }
590
591        #[inline(always)]
592        fn i64x8_zero(self) -> Self::I64x8 {
593            crate::simd::polyfill::v3_512::i64x8::zero(self)
594        }
595
596        #[inline(always)]
597        fn i64x8_load(self, data: &[i64; 8]) -> Self::I64x8 {
598            crate::simd::polyfill::v3_512::i64x8::load(self, data)
599        }
600        #[inline(always)]
601        fn u64x8_splat(self, v: u64) -> Self::U64x8 {
602            crate::simd::polyfill::v3_512::u64x8::splat(self, v)
603        }
604
605        #[inline(always)]
606        fn u64x8_zero(self) -> Self::U64x8 {
607            crate::simd::polyfill::v3_512::u64x8::zero(self)
608        }
609
610        #[inline(always)]
611        fn u64x8_load(self, data: &[u64; 8]) -> Self::U64x8 {
612            crate::simd::polyfill::v3_512::u64x8::load(self, data)
613        }
614    }
615}
616
617#[cfg(target_arch = "aarch64")]
618mod arm_impl {
619    use super::WidthDispatch;
620    use archmage::NeonToken;
621
622    use crate::simd::{f32x4, f64x2, i8x16, i16x8, i32x4, i64x2, u8x16, u16x8, u32x4, u64x2};
623
624    impl WidthDispatch for NeonToken {
625        // 128-bit types
626        type F32x4 = f32x4;
627        type F64x2 = f64x2;
628        type I8x16 = i8x16;
629        type U8x16 = u8x16;
630        type I16x8 = i16x8;
631        type U16x8 = u16x8;
632        type I32x4 = i32x4;
633        type U32x4 = u32x4;
634        type I64x2 = i64x2;
635        type U64x2 = u64x2;
636
637        // 256-bit types
638        type F32x8 = crate::simd::polyfill::neon::f32x8;
639        type F64x4 = crate::simd::polyfill::neon::f64x4;
640        type I8x32 = crate::simd::polyfill::neon::i8x32;
641        type U8x32 = crate::simd::polyfill::neon::u8x32;
642        type I16x16 = crate::simd::polyfill::neon::i16x16;
643        type U16x16 = crate::simd::polyfill::neon::u16x16;
644        type I32x8 = crate::simd::polyfill::neon::i32x8;
645        type U32x8 = crate::simd::polyfill::neon::u32x8;
646        type I64x4 = crate::simd::polyfill::neon::i64x4;
647        type U64x4 = crate::simd::polyfill::neon::u64x4;
648
649        // 512-bit types
650        type F32x16 = [f32x4; 4];
651        type F64x8 = [f64x2; 4];
652        type I8x64 = [i8x16; 4];
653        type U8x64 = [u8x16; 4];
654        type I16x32 = [i16x8; 4];
655        type U16x32 = [u16x8; 4];
656        type I32x16 = [i32x4; 4];
657        type U32x16 = [u32x4; 4];
658        type I64x8 = [i64x2; 4];
659        type U64x8 = [u64x2; 4];
660
661        #[inline(always)]
662        fn f32x4_splat(self, v: f32) -> Self::F32x4 {
663            f32x4::splat(self, v)
664        }
665
666        #[inline(always)]
667        fn f32x4_zero(self) -> Self::F32x4 {
668            f32x4::zero(self)
669        }
670
671        #[inline(always)]
672        fn f32x4_load(self, data: &[f32; 4]) -> Self::F32x4 {
673            f32x4::load(self, data)
674        }
675        #[inline(always)]
676        fn f64x2_splat(self, v: f64) -> Self::F64x2 {
677            f64x2::splat(self, v)
678        }
679
680        #[inline(always)]
681        fn f64x2_zero(self) -> Self::F64x2 {
682            f64x2::zero(self)
683        }
684
685        #[inline(always)]
686        fn f64x2_load(self, data: &[f64; 2]) -> Self::F64x2 {
687            f64x2::load(self, data)
688        }
689        #[inline(always)]
690        fn i8x16_splat(self, v: i8) -> Self::I8x16 {
691            i8x16::splat(self, v)
692        }
693
694        #[inline(always)]
695        fn i8x16_zero(self) -> Self::I8x16 {
696            i8x16::zero(self)
697        }
698
699        #[inline(always)]
700        fn i8x16_load(self, data: &[i8; 16]) -> Self::I8x16 {
701            i8x16::load(self, data)
702        }
703        #[inline(always)]
704        fn u8x16_splat(self, v: u8) -> Self::U8x16 {
705            u8x16::splat(self, v)
706        }
707
708        #[inline(always)]
709        fn u8x16_zero(self) -> Self::U8x16 {
710            u8x16::zero(self)
711        }
712
713        #[inline(always)]
714        fn u8x16_load(self, data: &[u8; 16]) -> Self::U8x16 {
715            u8x16::load(self, data)
716        }
717        #[inline(always)]
718        fn i16x8_splat(self, v: i16) -> Self::I16x8 {
719            i16x8::splat(self, v)
720        }
721
722        #[inline(always)]
723        fn i16x8_zero(self) -> Self::I16x8 {
724            i16x8::zero(self)
725        }
726
727        #[inline(always)]
728        fn i16x8_load(self, data: &[i16; 8]) -> Self::I16x8 {
729            i16x8::load(self, data)
730        }
731        #[inline(always)]
732        fn u16x8_splat(self, v: u16) -> Self::U16x8 {
733            u16x8::splat(self, v)
734        }
735
736        #[inline(always)]
737        fn u16x8_zero(self) -> Self::U16x8 {
738            u16x8::zero(self)
739        }
740
741        #[inline(always)]
742        fn u16x8_load(self, data: &[u16; 8]) -> Self::U16x8 {
743            u16x8::load(self, data)
744        }
745        #[inline(always)]
746        fn i32x4_splat(self, v: i32) -> Self::I32x4 {
747            i32x4::splat(self, v)
748        }
749
750        #[inline(always)]
751        fn i32x4_zero(self) -> Self::I32x4 {
752            i32x4::zero(self)
753        }
754
755        #[inline(always)]
756        fn i32x4_load(self, data: &[i32; 4]) -> Self::I32x4 {
757            i32x4::load(self, data)
758        }
759        #[inline(always)]
760        fn u32x4_splat(self, v: u32) -> Self::U32x4 {
761            u32x4::splat(self, v)
762        }
763
764        #[inline(always)]
765        fn u32x4_zero(self) -> Self::U32x4 {
766            u32x4::zero(self)
767        }
768
769        #[inline(always)]
770        fn u32x4_load(self, data: &[u32; 4]) -> Self::U32x4 {
771            u32x4::load(self, data)
772        }
773        #[inline(always)]
774        fn i64x2_splat(self, v: i64) -> Self::I64x2 {
775            i64x2::splat(self, v)
776        }
777
778        #[inline(always)]
779        fn i64x2_zero(self) -> Self::I64x2 {
780            i64x2::zero(self)
781        }
782
783        #[inline(always)]
784        fn i64x2_load(self, data: &[i64; 2]) -> Self::I64x2 {
785            i64x2::load(self, data)
786        }
787        #[inline(always)]
788        fn u64x2_splat(self, v: u64) -> Self::U64x2 {
789            u64x2::splat(self, v)
790        }
791
792        #[inline(always)]
793        fn u64x2_zero(self) -> Self::U64x2 {
794            u64x2::zero(self)
795        }
796
797        #[inline(always)]
798        fn u64x2_load(self, data: &[u64; 2]) -> Self::U64x2 {
799            u64x2::load(self, data)
800        }
801        #[inline(always)]
802        fn f32x8_splat(self, v: f32) -> Self::F32x8 {
803            crate::simd::polyfill::neon::f32x8::splat(self, v)
804        }
805
806        #[inline(always)]
807        fn f32x8_zero(self) -> Self::F32x8 {
808            crate::simd::polyfill::neon::f32x8::zero(self)
809        }
810
811        #[inline(always)]
812        fn f32x8_load(self, data: &[f32; 8]) -> Self::F32x8 {
813            crate::simd::polyfill::neon::f32x8::load(self, data)
814        }
815        #[inline(always)]
816        fn f64x4_splat(self, v: f64) -> Self::F64x4 {
817            crate::simd::polyfill::neon::f64x4::splat(self, v)
818        }
819
820        #[inline(always)]
821        fn f64x4_zero(self) -> Self::F64x4 {
822            crate::simd::polyfill::neon::f64x4::zero(self)
823        }
824
825        #[inline(always)]
826        fn f64x4_load(self, data: &[f64; 4]) -> Self::F64x4 {
827            crate::simd::polyfill::neon::f64x4::load(self, data)
828        }
829        #[inline(always)]
830        fn i8x32_splat(self, v: i8) -> Self::I8x32 {
831            crate::simd::polyfill::neon::i8x32::splat(self, v)
832        }
833
834        #[inline(always)]
835        fn i8x32_zero(self) -> Self::I8x32 {
836            crate::simd::polyfill::neon::i8x32::zero(self)
837        }
838
839        #[inline(always)]
840        fn i8x32_load(self, data: &[i8; 32]) -> Self::I8x32 {
841            crate::simd::polyfill::neon::i8x32::load(self, data)
842        }
843        #[inline(always)]
844        fn u8x32_splat(self, v: u8) -> Self::U8x32 {
845            crate::simd::polyfill::neon::u8x32::splat(self, v)
846        }
847
848        #[inline(always)]
849        fn u8x32_zero(self) -> Self::U8x32 {
850            crate::simd::polyfill::neon::u8x32::zero(self)
851        }
852
853        #[inline(always)]
854        fn u8x32_load(self, data: &[u8; 32]) -> Self::U8x32 {
855            crate::simd::polyfill::neon::u8x32::load(self, data)
856        }
857        #[inline(always)]
858        fn i16x16_splat(self, v: i16) -> Self::I16x16 {
859            crate::simd::polyfill::neon::i16x16::splat(self, v)
860        }
861
862        #[inline(always)]
863        fn i16x16_zero(self) -> Self::I16x16 {
864            crate::simd::polyfill::neon::i16x16::zero(self)
865        }
866
867        #[inline(always)]
868        fn i16x16_load(self, data: &[i16; 16]) -> Self::I16x16 {
869            crate::simd::polyfill::neon::i16x16::load(self, data)
870        }
871        #[inline(always)]
872        fn u16x16_splat(self, v: u16) -> Self::U16x16 {
873            crate::simd::polyfill::neon::u16x16::splat(self, v)
874        }
875
876        #[inline(always)]
877        fn u16x16_zero(self) -> Self::U16x16 {
878            crate::simd::polyfill::neon::u16x16::zero(self)
879        }
880
881        #[inline(always)]
882        fn u16x16_load(self, data: &[u16; 16]) -> Self::U16x16 {
883            crate::simd::polyfill::neon::u16x16::load(self, data)
884        }
885        #[inline(always)]
886        fn i32x8_splat(self, v: i32) -> Self::I32x8 {
887            crate::simd::polyfill::neon::i32x8::splat(self, v)
888        }
889
890        #[inline(always)]
891        fn i32x8_zero(self) -> Self::I32x8 {
892            crate::simd::polyfill::neon::i32x8::zero(self)
893        }
894
895        #[inline(always)]
896        fn i32x8_load(self, data: &[i32; 8]) -> Self::I32x8 {
897            crate::simd::polyfill::neon::i32x8::load(self, data)
898        }
899        #[inline(always)]
900        fn u32x8_splat(self, v: u32) -> Self::U32x8 {
901            crate::simd::polyfill::neon::u32x8::splat(self, v)
902        }
903
904        #[inline(always)]
905        fn u32x8_zero(self) -> Self::U32x8 {
906            crate::simd::polyfill::neon::u32x8::zero(self)
907        }
908
909        #[inline(always)]
910        fn u32x8_load(self, data: &[u32; 8]) -> Self::U32x8 {
911            crate::simd::polyfill::neon::u32x8::load(self, data)
912        }
913        #[inline(always)]
914        fn i64x4_splat(self, v: i64) -> Self::I64x4 {
915            crate::simd::polyfill::neon::i64x4::splat(self, v)
916        }
917
918        #[inline(always)]
919        fn i64x4_zero(self) -> Self::I64x4 {
920            crate::simd::polyfill::neon::i64x4::zero(self)
921        }
922
923        #[inline(always)]
924        fn i64x4_load(self, data: &[i64; 4]) -> Self::I64x4 {
925            crate::simd::polyfill::neon::i64x4::load(self, data)
926        }
927        #[inline(always)]
928        fn u64x4_splat(self, v: u64) -> Self::U64x4 {
929            crate::simd::polyfill::neon::u64x4::splat(self, v)
930        }
931
932        #[inline(always)]
933        fn u64x4_zero(self) -> Self::U64x4 {
934            crate::simd::polyfill::neon::u64x4::zero(self)
935        }
936
937        #[inline(always)]
938        fn u64x4_load(self, data: &[u64; 4]) -> Self::U64x4 {
939            crate::simd::polyfill::neon::u64x4::load(self, data)
940        }
941        #[inline(always)]
942        fn f32x16_splat(self, v: f32) -> Self::F32x16 {
943            {
944                let part = f32x4::splat(self, v);
945                [part, part, part, part]
946            }
947        }
948
949        #[inline(always)]
950        fn f32x16_zero(self) -> Self::F32x16 {
951            {
952                let part = f32x4::zero(self);
953                [part, part, part, part]
954            }
955        }
956
957        #[inline(always)]
958        fn f32x16_load(self, data: &[f32; 16]) -> Self::F32x16 {
959            {
960                [
961                    f32x4::load(self, data[0..4].try_into().unwrap()),
962                    f32x4::load(self, data[4..8].try_into().unwrap()),
963                    f32x4::load(self, data[8..12].try_into().unwrap()),
964                    f32x4::load(self, data[12..16].try_into().unwrap()),
965                ]
966            }
967        }
968        #[inline(always)]
969        fn f64x8_splat(self, v: f64) -> Self::F64x8 {
970            {
971                let part = f64x2::splat(self, v);
972                [part, part, part, part]
973            }
974        }
975
976        #[inline(always)]
977        fn f64x8_zero(self) -> Self::F64x8 {
978            {
979                let part = f64x2::zero(self);
980                [part, part, part, part]
981            }
982        }
983
984        #[inline(always)]
985        fn f64x8_load(self, data: &[f64; 8]) -> Self::F64x8 {
986            {
987                [
988                    f64x2::load(self, data[0..2].try_into().unwrap()),
989                    f64x2::load(self, data[2..4].try_into().unwrap()),
990                    f64x2::load(self, data[4..6].try_into().unwrap()),
991                    f64x2::load(self, data[6..8].try_into().unwrap()),
992                ]
993            }
994        }
995        #[inline(always)]
996        fn i8x64_splat(self, v: i8) -> Self::I8x64 {
997            {
998                let part = i8x16::splat(self, v);
999                [part, part, part, part]
1000            }
1001        }
1002
1003        #[inline(always)]
1004        fn i8x64_zero(self) -> Self::I8x64 {
1005            {
1006                let part = i8x16::zero(self);
1007                [part, part, part, part]
1008            }
1009        }
1010
1011        #[inline(always)]
1012        fn i8x64_load(self, data: &[i8; 64]) -> Self::I8x64 {
1013            {
1014                [
1015                    i8x16::load(self, data[0..16].try_into().unwrap()),
1016                    i8x16::load(self, data[16..32].try_into().unwrap()),
1017                    i8x16::load(self, data[32..48].try_into().unwrap()),
1018                    i8x16::load(self, data[48..64].try_into().unwrap()),
1019                ]
1020            }
1021        }
1022        #[inline(always)]
1023        fn u8x64_splat(self, v: u8) -> Self::U8x64 {
1024            {
1025                let part = u8x16::splat(self, v);
1026                [part, part, part, part]
1027            }
1028        }
1029
1030        #[inline(always)]
1031        fn u8x64_zero(self) -> Self::U8x64 {
1032            {
1033                let part = u8x16::zero(self);
1034                [part, part, part, part]
1035            }
1036        }
1037
1038        #[inline(always)]
1039        fn u8x64_load(self, data: &[u8; 64]) -> Self::U8x64 {
1040            {
1041                [
1042                    u8x16::load(self, data[0..16].try_into().unwrap()),
1043                    u8x16::load(self, data[16..32].try_into().unwrap()),
1044                    u8x16::load(self, data[32..48].try_into().unwrap()),
1045                    u8x16::load(self, data[48..64].try_into().unwrap()),
1046                ]
1047            }
1048        }
1049        #[inline(always)]
1050        fn i16x32_splat(self, v: i16) -> Self::I16x32 {
1051            {
1052                let part = i16x8::splat(self, v);
1053                [part, part, part, part]
1054            }
1055        }
1056
1057        #[inline(always)]
1058        fn i16x32_zero(self) -> Self::I16x32 {
1059            {
1060                let part = i16x8::zero(self);
1061                [part, part, part, part]
1062            }
1063        }
1064
1065        #[inline(always)]
1066        fn i16x32_load(self, data: &[i16; 32]) -> Self::I16x32 {
1067            {
1068                [
1069                    i16x8::load(self, data[0..8].try_into().unwrap()),
1070                    i16x8::load(self, data[8..16].try_into().unwrap()),
1071                    i16x8::load(self, data[16..24].try_into().unwrap()),
1072                    i16x8::load(self, data[24..32].try_into().unwrap()),
1073                ]
1074            }
1075        }
1076        #[inline(always)]
1077        fn u16x32_splat(self, v: u16) -> Self::U16x32 {
1078            {
1079                let part = u16x8::splat(self, v);
1080                [part, part, part, part]
1081            }
1082        }
1083
1084        #[inline(always)]
1085        fn u16x32_zero(self) -> Self::U16x32 {
1086            {
1087                let part = u16x8::zero(self);
1088                [part, part, part, part]
1089            }
1090        }
1091
1092        #[inline(always)]
1093        fn u16x32_load(self, data: &[u16; 32]) -> Self::U16x32 {
1094            {
1095                [
1096                    u16x8::load(self, data[0..8].try_into().unwrap()),
1097                    u16x8::load(self, data[8..16].try_into().unwrap()),
1098                    u16x8::load(self, data[16..24].try_into().unwrap()),
1099                    u16x8::load(self, data[24..32].try_into().unwrap()),
1100                ]
1101            }
1102        }
1103        #[inline(always)]
1104        fn i32x16_splat(self, v: i32) -> Self::I32x16 {
1105            {
1106                let part = i32x4::splat(self, v);
1107                [part, part, part, part]
1108            }
1109        }
1110
1111        #[inline(always)]
1112        fn i32x16_zero(self) -> Self::I32x16 {
1113            {
1114                let part = i32x4::zero(self);
1115                [part, part, part, part]
1116            }
1117        }
1118
1119        #[inline(always)]
1120        fn i32x16_load(self, data: &[i32; 16]) -> Self::I32x16 {
1121            {
1122                [
1123                    i32x4::load(self, data[0..4].try_into().unwrap()),
1124                    i32x4::load(self, data[4..8].try_into().unwrap()),
1125                    i32x4::load(self, data[8..12].try_into().unwrap()),
1126                    i32x4::load(self, data[12..16].try_into().unwrap()),
1127                ]
1128            }
1129        }
1130        #[inline(always)]
1131        fn u32x16_splat(self, v: u32) -> Self::U32x16 {
1132            {
1133                let part = u32x4::splat(self, v);
1134                [part, part, part, part]
1135            }
1136        }
1137
1138        #[inline(always)]
1139        fn u32x16_zero(self) -> Self::U32x16 {
1140            {
1141                let part = u32x4::zero(self);
1142                [part, part, part, part]
1143            }
1144        }
1145
1146        #[inline(always)]
1147        fn u32x16_load(self, data: &[u32; 16]) -> Self::U32x16 {
1148            {
1149                [
1150                    u32x4::load(self, data[0..4].try_into().unwrap()),
1151                    u32x4::load(self, data[4..8].try_into().unwrap()),
1152                    u32x4::load(self, data[8..12].try_into().unwrap()),
1153                    u32x4::load(self, data[12..16].try_into().unwrap()),
1154                ]
1155            }
1156        }
1157        #[inline(always)]
1158        fn i64x8_splat(self, v: i64) -> Self::I64x8 {
1159            {
1160                let part = i64x2::splat(self, v);
1161                [part, part, part, part]
1162            }
1163        }
1164
1165        #[inline(always)]
1166        fn i64x8_zero(self) -> Self::I64x8 {
1167            {
1168                let part = i64x2::zero(self);
1169                [part, part, part, part]
1170            }
1171        }
1172
1173        #[inline(always)]
1174        fn i64x8_load(self, data: &[i64; 8]) -> Self::I64x8 {
1175            {
1176                [
1177                    i64x2::load(self, data[0..2].try_into().unwrap()),
1178                    i64x2::load(self, data[2..4].try_into().unwrap()),
1179                    i64x2::load(self, data[4..6].try_into().unwrap()),
1180                    i64x2::load(self, data[6..8].try_into().unwrap()),
1181                ]
1182            }
1183        }
1184        #[inline(always)]
1185        fn u64x8_splat(self, v: u64) -> Self::U64x8 {
1186            {
1187                let part = u64x2::splat(self, v);
1188                [part, part, part, part]
1189            }
1190        }
1191
1192        #[inline(always)]
1193        fn u64x8_zero(self) -> Self::U64x8 {
1194            {
1195                let part = u64x2::zero(self);
1196                [part, part, part, part]
1197            }
1198        }
1199
1200        #[inline(always)]
1201        fn u64x8_load(self, data: &[u64; 8]) -> Self::U64x8 {
1202            {
1203                [
1204                    u64x2::load(self, data[0..2].try_into().unwrap()),
1205                    u64x2::load(self, data[2..4].try_into().unwrap()),
1206                    u64x2::load(self, data[4..6].try_into().unwrap()),
1207                    u64x2::load(self, data[6..8].try_into().unwrap()),
1208                ]
1209            }
1210        }
1211    }
1212}
1213
1214#[cfg(target_arch = "wasm32")]
1215mod wasm_impl {
1216    use super::WidthDispatch;
1217    use archmage::Wasm128Token;
1218
1219    use crate::simd::{f32x4, f64x2, i8x16, i16x8, i32x4, i64x2, u8x16, u16x8, u32x4, u64x2};
1220
1221    impl WidthDispatch for Wasm128Token {
1222        // 128-bit types
1223        type F32x4 = f32x4;
1224        type F64x2 = f64x2;
1225        type I8x16 = i8x16;
1226        type U8x16 = u8x16;
1227        type I16x8 = i16x8;
1228        type U16x8 = u16x8;
1229        type I32x4 = i32x4;
1230        type U32x4 = u32x4;
1231        type I64x2 = i64x2;
1232        type U64x2 = u64x2;
1233
1234        // 256-bit types
1235        type F32x8 = crate::simd::polyfill::wasm128::f32x8;
1236        type F64x4 = crate::simd::polyfill::wasm128::f64x4;
1237        type I8x32 = crate::simd::polyfill::wasm128::i8x32;
1238        type U8x32 = crate::simd::polyfill::wasm128::u8x32;
1239        type I16x16 = crate::simd::polyfill::wasm128::i16x16;
1240        type U16x16 = crate::simd::polyfill::wasm128::u16x16;
1241        type I32x8 = crate::simd::polyfill::wasm128::i32x8;
1242        type U32x8 = crate::simd::polyfill::wasm128::u32x8;
1243        type I64x4 = crate::simd::polyfill::wasm128::i64x4;
1244        type U64x4 = crate::simd::polyfill::wasm128::u64x4;
1245
1246        // 512-bit types
1247        type F32x16 = [f32x4; 4];
1248        type F64x8 = [f64x2; 4];
1249        type I8x64 = [i8x16; 4];
1250        type U8x64 = [u8x16; 4];
1251        type I16x32 = [i16x8; 4];
1252        type U16x32 = [u16x8; 4];
1253        type I32x16 = [i32x4; 4];
1254        type U32x16 = [u32x4; 4];
1255        type I64x8 = [i64x2; 4];
1256        type U64x8 = [u64x2; 4];
1257
1258        #[inline(always)]
1259        fn f32x4_splat(self, v: f32) -> Self::F32x4 {
1260            f32x4::splat(self, v)
1261        }
1262
1263        #[inline(always)]
1264        fn f32x4_zero(self) -> Self::F32x4 {
1265            f32x4::zero(self)
1266        }
1267
1268        #[inline(always)]
1269        fn f32x4_load(self, data: &[f32; 4]) -> Self::F32x4 {
1270            f32x4::load(self, data)
1271        }
1272        #[inline(always)]
1273        fn f64x2_splat(self, v: f64) -> Self::F64x2 {
1274            f64x2::splat(self, v)
1275        }
1276
1277        #[inline(always)]
1278        fn f64x2_zero(self) -> Self::F64x2 {
1279            f64x2::zero(self)
1280        }
1281
1282        #[inline(always)]
1283        fn f64x2_load(self, data: &[f64; 2]) -> Self::F64x2 {
1284            f64x2::load(self, data)
1285        }
1286        #[inline(always)]
1287        fn i8x16_splat(self, v: i8) -> Self::I8x16 {
1288            i8x16::splat(self, v)
1289        }
1290
1291        #[inline(always)]
1292        fn i8x16_zero(self) -> Self::I8x16 {
1293            i8x16::zero(self)
1294        }
1295
1296        #[inline(always)]
1297        fn i8x16_load(self, data: &[i8; 16]) -> Self::I8x16 {
1298            i8x16::load(self, data)
1299        }
1300        #[inline(always)]
1301        fn u8x16_splat(self, v: u8) -> Self::U8x16 {
1302            u8x16::splat(self, v)
1303        }
1304
1305        #[inline(always)]
1306        fn u8x16_zero(self) -> Self::U8x16 {
1307            u8x16::zero(self)
1308        }
1309
1310        #[inline(always)]
1311        fn u8x16_load(self, data: &[u8; 16]) -> Self::U8x16 {
1312            u8x16::load(self, data)
1313        }
1314        #[inline(always)]
1315        fn i16x8_splat(self, v: i16) -> Self::I16x8 {
1316            i16x8::splat(self, v)
1317        }
1318
1319        #[inline(always)]
1320        fn i16x8_zero(self) -> Self::I16x8 {
1321            i16x8::zero(self)
1322        }
1323
1324        #[inline(always)]
1325        fn i16x8_load(self, data: &[i16; 8]) -> Self::I16x8 {
1326            i16x8::load(self, data)
1327        }
1328        #[inline(always)]
1329        fn u16x8_splat(self, v: u16) -> Self::U16x8 {
1330            u16x8::splat(self, v)
1331        }
1332
1333        #[inline(always)]
1334        fn u16x8_zero(self) -> Self::U16x8 {
1335            u16x8::zero(self)
1336        }
1337
1338        #[inline(always)]
1339        fn u16x8_load(self, data: &[u16; 8]) -> Self::U16x8 {
1340            u16x8::load(self, data)
1341        }
1342        #[inline(always)]
1343        fn i32x4_splat(self, v: i32) -> Self::I32x4 {
1344            i32x4::splat(self, v)
1345        }
1346
1347        #[inline(always)]
1348        fn i32x4_zero(self) -> Self::I32x4 {
1349            i32x4::zero(self)
1350        }
1351
1352        #[inline(always)]
1353        fn i32x4_load(self, data: &[i32; 4]) -> Self::I32x4 {
1354            i32x4::load(self, data)
1355        }
1356        #[inline(always)]
1357        fn u32x4_splat(self, v: u32) -> Self::U32x4 {
1358            u32x4::splat(self, v)
1359        }
1360
1361        #[inline(always)]
1362        fn u32x4_zero(self) -> Self::U32x4 {
1363            u32x4::zero(self)
1364        }
1365
1366        #[inline(always)]
1367        fn u32x4_load(self, data: &[u32; 4]) -> Self::U32x4 {
1368            u32x4::load(self, data)
1369        }
1370        #[inline(always)]
1371        fn i64x2_splat(self, v: i64) -> Self::I64x2 {
1372            i64x2::splat(self, v)
1373        }
1374
1375        #[inline(always)]
1376        fn i64x2_zero(self) -> Self::I64x2 {
1377            i64x2::zero(self)
1378        }
1379
1380        #[inline(always)]
1381        fn i64x2_load(self, data: &[i64; 2]) -> Self::I64x2 {
1382            i64x2::load(self, data)
1383        }
1384        #[inline(always)]
1385        fn u64x2_splat(self, v: u64) -> Self::U64x2 {
1386            u64x2::splat(self, v)
1387        }
1388
1389        #[inline(always)]
1390        fn u64x2_zero(self) -> Self::U64x2 {
1391            u64x2::zero(self)
1392        }
1393
1394        #[inline(always)]
1395        fn u64x2_load(self, data: &[u64; 2]) -> Self::U64x2 {
1396            u64x2::load(self, data)
1397        }
1398        #[inline(always)]
1399        fn f32x8_splat(self, v: f32) -> Self::F32x8 {
1400            crate::simd::polyfill::wasm128::f32x8::splat(self, v)
1401        }
1402
1403        #[inline(always)]
1404        fn f32x8_zero(self) -> Self::F32x8 {
1405            crate::simd::polyfill::wasm128::f32x8::zero(self)
1406        }
1407
1408        #[inline(always)]
1409        fn f32x8_load(self, data: &[f32; 8]) -> Self::F32x8 {
1410            crate::simd::polyfill::wasm128::f32x8::load(self, data)
1411        }
1412        #[inline(always)]
1413        fn f64x4_splat(self, v: f64) -> Self::F64x4 {
1414            crate::simd::polyfill::wasm128::f64x4::splat(self, v)
1415        }
1416
1417        #[inline(always)]
1418        fn f64x4_zero(self) -> Self::F64x4 {
1419            crate::simd::polyfill::wasm128::f64x4::zero(self)
1420        }
1421
1422        #[inline(always)]
1423        fn f64x4_load(self, data: &[f64; 4]) -> Self::F64x4 {
1424            crate::simd::polyfill::wasm128::f64x4::load(self, data)
1425        }
1426        #[inline(always)]
1427        fn i8x32_splat(self, v: i8) -> Self::I8x32 {
1428            crate::simd::polyfill::wasm128::i8x32::splat(self, v)
1429        }
1430
1431        #[inline(always)]
1432        fn i8x32_zero(self) -> Self::I8x32 {
1433            crate::simd::polyfill::wasm128::i8x32::zero(self)
1434        }
1435
1436        #[inline(always)]
1437        fn i8x32_load(self, data: &[i8; 32]) -> Self::I8x32 {
1438            crate::simd::polyfill::wasm128::i8x32::load(self, data)
1439        }
1440        #[inline(always)]
1441        fn u8x32_splat(self, v: u8) -> Self::U8x32 {
1442            crate::simd::polyfill::wasm128::u8x32::splat(self, v)
1443        }
1444
1445        #[inline(always)]
1446        fn u8x32_zero(self) -> Self::U8x32 {
1447            crate::simd::polyfill::wasm128::u8x32::zero(self)
1448        }
1449
1450        #[inline(always)]
1451        fn u8x32_load(self, data: &[u8; 32]) -> Self::U8x32 {
1452            crate::simd::polyfill::wasm128::u8x32::load(self, data)
1453        }
1454        #[inline(always)]
1455        fn i16x16_splat(self, v: i16) -> Self::I16x16 {
1456            crate::simd::polyfill::wasm128::i16x16::splat(self, v)
1457        }
1458
1459        #[inline(always)]
1460        fn i16x16_zero(self) -> Self::I16x16 {
1461            crate::simd::polyfill::wasm128::i16x16::zero(self)
1462        }
1463
1464        #[inline(always)]
1465        fn i16x16_load(self, data: &[i16; 16]) -> Self::I16x16 {
1466            crate::simd::polyfill::wasm128::i16x16::load(self, data)
1467        }
1468        #[inline(always)]
1469        fn u16x16_splat(self, v: u16) -> Self::U16x16 {
1470            crate::simd::polyfill::wasm128::u16x16::splat(self, v)
1471        }
1472
1473        #[inline(always)]
1474        fn u16x16_zero(self) -> Self::U16x16 {
1475            crate::simd::polyfill::wasm128::u16x16::zero(self)
1476        }
1477
1478        #[inline(always)]
1479        fn u16x16_load(self, data: &[u16; 16]) -> Self::U16x16 {
1480            crate::simd::polyfill::wasm128::u16x16::load(self, data)
1481        }
1482        #[inline(always)]
1483        fn i32x8_splat(self, v: i32) -> Self::I32x8 {
1484            crate::simd::polyfill::wasm128::i32x8::splat(self, v)
1485        }
1486
1487        #[inline(always)]
1488        fn i32x8_zero(self) -> Self::I32x8 {
1489            crate::simd::polyfill::wasm128::i32x8::zero(self)
1490        }
1491
1492        #[inline(always)]
1493        fn i32x8_load(self, data: &[i32; 8]) -> Self::I32x8 {
1494            crate::simd::polyfill::wasm128::i32x8::load(self, data)
1495        }
1496        #[inline(always)]
1497        fn u32x8_splat(self, v: u32) -> Self::U32x8 {
1498            crate::simd::polyfill::wasm128::u32x8::splat(self, v)
1499        }
1500
1501        #[inline(always)]
1502        fn u32x8_zero(self) -> Self::U32x8 {
1503            crate::simd::polyfill::wasm128::u32x8::zero(self)
1504        }
1505
1506        #[inline(always)]
1507        fn u32x8_load(self, data: &[u32; 8]) -> Self::U32x8 {
1508            crate::simd::polyfill::wasm128::u32x8::load(self, data)
1509        }
1510        #[inline(always)]
1511        fn i64x4_splat(self, v: i64) -> Self::I64x4 {
1512            crate::simd::polyfill::wasm128::i64x4::splat(self, v)
1513        }
1514
1515        #[inline(always)]
1516        fn i64x4_zero(self) -> Self::I64x4 {
1517            crate::simd::polyfill::wasm128::i64x4::zero(self)
1518        }
1519
1520        #[inline(always)]
1521        fn i64x4_load(self, data: &[i64; 4]) -> Self::I64x4 {
1522            crate::simd::polyfill::wasm128::i64x4::load(self, data)
1523        }
1524        #[inline(always)]
1525        fn u64x4_splat(self, v: u64) -> Self::U64x4 {
1526            crate::simd::polyfill::wasm128::u64x4::splat(self, v)
1527        }
1528
1529        #[inline(always)]
1530        fn u64x4_zero(self) -> Self::U64x4 {
1531            crate::simd::polyfill::wasm128::u64x4::zero(self)
1532        }
1533
1534        #[inline(always)]
1535        fn u64x4_load(self, data: &[u64; 4]) -> Self::U64x4 {
1536            crate::simd::polyfill::wasm128::u64x4::load(self, data)
1537        }
1538        #[inline(always)]
1539        fn f32x16_splat(self, v: f32) -> Self::F32x16 {
1540            {
1541                let part = f32x4::splat(self, v);
1542                [part, part, part, part]
1543            }
1544        }
1545
1546        #[inline(always)]
1547        fn f32x16_zero(self) -> Self::F32x16 {
1548            {
1549                let part = f32x4::zero(self);
1550                [part, part, part, part]
1551            }
1552        }
1553
1554        #[inline(always)]
1555        fn f32x16_load(self, data: &[f32; 16]) -> Self::F32x16 {
1556            {
1557                [
1558                    f32x4::load(self, data[0..4].try_into().unwrap()),
1559                    f32x4::load(self, data[4..8].try_into().unwrap()),
1560                    f32x4::load(self, data[8..12].try_into().unwrap()),
1561                    f32x4::load(self, data[12..16].try_into().unwrap()),
1562                ]
1563            }
1564        }
1565        #[inline(always)]
1566        fn f64x8_splat(self, v: f64) -> Self::F64x8 {
1567            {
1568                let part = f64x2::splat(self, v);
1569                [part, part, part, part]
1570            }
1571        }
1572
1573        #[inline(always)]
1574        fn f64x8_zero(self) -> Self::F64x8 {
1575            {
1576                let part = f64x2::zero(self);
1577                [part, part, part, part]
1578            }
1579        }
1580
1581        #[inline(always)]
1582        fn f64x8_load(self, data: &[f64; 8]) -> Self::F64x8 {
1583            {
1584                [
1585                    f64x2::load(self, data[0..2].try_into().unwrap()),
1586                    f64x2::load(self, data[2..4].try_into().unwrap()),
1587                    f64x2::load(self, data[4..6].try_into().unwrap()),
1588                    f64x2::load(self, data[6..8].try_into().unwrap()),
1589                ]
1590            }
1591        }
1592        #[inline(always)]
1593        fn i8x64_splat(self, v: i8) -> Self::I8x64 {
1594            {
1595                let part = i8x16::splat(self, v);
1596                [part, part, part, part]
1597            }
1598        }
1599
1600        #[inline(always)]
1601        fn i8x64_zero(self) -> Self::I8x64 {
1602            {
1603                let part = i8x16::zero(self);
1604                [part, part, part, part]
1605            }
1606        }
1607
1608        #[inline(always)]
1609        fn i8x64_load(self, data: &[i8; 64]) -> Self::I8x64 {
1610            {
1611                [
1612                    i8x16::load(self, data[0..16].try_into().unwrap()),
1613                    i8x16::load(self, data[16..32].try_into().unwrap()),
1614                    i8x16::load(self, data[32..48].try_into().unwrap()),
1615                    i8x16::load(self, data[48..64].try_into().unwrap()),
1616                ]
1617            }
1618        }
1619        #[inline(always)]
1620        fn u8x64_splat(self, v: u8) -> Self::U8x64 {
1621            {
1622                let part = u8x16::splat(self, v);
1623                [part, part, part, part]
1624            }
1625        }
1626
1627        #[inline(always)]
1628        fn u8x64_zero(self) -> Self::U8x64 {
1629            {
1630                let part = u8x16::zero(self);
1631                [part, part, part, part]
1632            }
1633        }
1634
1635        #[inline(always)]
1636        fn u8x64_load(self, data: &[u8; 64]) -> Self::U8x64 {
1637            {
1638                [
1639                    u8x16::load(self, data[0..16].try_into().unwrap()),
1640                    u8x16::load(self, data[16..32].try_into().unwrap()),
1641                    u8x16::load(self, data[32..48].try_into().unwrap()),
1642                    u8x16::load(self, data[48..64].try_into().unwrap()),
1643                ]
1644            }
1645        }
1646        #[inline(always)]
1647        fn i16x32_splat(self, v: i16) -> Self::I16x32 {
1648            {
1649                let part = i16x8::splat(self, v);
1650                [part, part, part, part]
1651            }
1652        }
1653
1654        #[inline(always)]
1655        fn i16x32_zero(self) -> Self::I16x32 {
1656            {
1657                let part = i16x8::zero(self);
1658                [part, part, part, part]
1659            }
1660        }
1661
1662        #[inline(always)]
1663        fn i16x32_load(self, data: &[i16; 32]) -> Self::I16x32 {
1664            {
1665                [
1666                    i16x8::load(self, data[0..8].try_into().unwrap()),
1667                    i16x8::load(self, data[8..16].try_into().unwrap()),
1668                    i16x8::load(self, data[16..24].try_into().unwrap()),
1669                    i16x8::load(self, data[24..32].try_into().unwrap()),
1670                ]
1671            }
1672        }
1673        #[inline(always)]
1674        fn u16x32_splat(self, v: u16) -> Self::U16x32 {
1675            {
1676                let part = u16x8::splat(self, v);
1677                [part, part, part, part]
1678            }
1679        }
1680
1681        #[inline(always)]
1682        fn u16x32_zero(self) -> Self::U16x32 {
1683            {
1684                let part = u16x8::zero(self);
1685                [part, part, part, part]
1686            }
1687        }
1688
1689        #[inline(always)]
1690        fn u16x32_load(self, data: &[u16; 32]) -> Self::U16x32 {
1691            {
1692                [
1693                    u16x8::load(self, data[0..8].try_into().unwrap()),
1694                    u16x8::load(self, data[8..16].try_into().unwrap()),
1695                    u16x8::load(self, data[16..24].try_into().unwrap()),
1696                    u16x8::load(self, data[24..32].try_into().unwrap()),
1697                ]
1698            }
1699        }
1700        #[inline(always)]
1701        fn i32x16_splat(self, v: i32) -> Self::I32x16 {
1702            {
1703                let part = i32x4::splat(self, v);
1704                [part, part, part, part]
1705            }
1706        }
1707
1708        #[inline(always)]
1709        fn i32x16_zero(self) -> Self::I32x16 {
1710            {
1711                let part = i32x4::zero(self);
1712                [part, part, part, part]
1713            }
1714        }
1715
1716        #[inline(always)]
1717        fn i32x16_load(self, data: &[i32; 16]) -> Self::I32x16 {
1718            {
1719                [
1720                    i32x4::load(self, data[0..4].try_into().unwrap()),
1721                    i32x4::load(self, data[4..8].try_into().unwrap()),
1722                    i32x4::load(self, data[8..12].try_into().unwrap()),
1723                    i32x4::load(self, data[12..16].try_into().unwrap()),
1724                ]
1725            }
1726        }
1727        #[inline(always)]
1728        fn u32x16_splat(self, v: u32) -> Self::U32x16 {
1729            {
1730                let part = u32x4::splat(self, v);
1731                [part, part, part, part]
1732            }
1733        }
1734
1735        #[inline(always)]
1736        fn u32x16_zero(self) -> Self::U32x16 {
1737            {
1738                let part = u32x4::zero(self);
1739                [part, part, part, part]
1740            }
1741        }
1742
1743        #[inline(always)]
1744        fn u32x16_load(self, data: &[u32; 16]) -> Self::U32x16 {
1745            {
1746                [
1747                    u32x4::load(self, data[0..4].try_into().unwrap()),
1748                    u32x4::load(self, data[4..8].try_into().unwrap()),
1749                    u32x4::load(self, data[8..12].try_into().unwrap()),
1750                    u32x4::load(self, data[12..16].try_into().unwrap()),
1751                ]
1752            }
1753        }
1754        #[inline(always)]
1755        fn i64x8_splat(self, v: i64) -> Self::I64x8 {
1756            {
1757                let part = i64x2::splat(self, v);
1758                [part, part, part, part]
1759            }
1760        }
1761
1762        #[inline(always)]
1763        fn i64x8_zero(self) -> Self::I64x8 {
1764            {
1765                let part = i64x2::zero(self);
1766                [part, part, part, part]
1767            }
1768        }
1769
1770        #[inline(always)]
1771        fn i64x8_load(self, data: &[i64; 8]) -> Self::I64x8 {
1772            {
1773                [
1774                    i64x2::load(self, data[0..2].try_into().unwrap()),
1775                    i64x2::load(self, data[2..4].try_into().unwrap()),
1776                    i64x2::load(self, data[4..6].try_into().unwrap()),
1777                    i64x2::load(self, data[6..8].try_into().unwrap()),
1778                ]
1779            }
1780        }
1781        #[inline(always)]
1782        fn u64x8_splat(self, v: u64) -> Self::U64x8 {
1783            {
1784                let part = u64x2::splat(self, v);
1785                [part, part, part, part]
1786            }
1787        }
1788
1789        #[inline(always)]
1790        fn u64x8_zero(self) -> Self::U64x8 {
1791            {
1792                let part = u64x2::zero(self);
1793                [part, part, part, part]
1794            }
1795        }
1796
1797        #[inline(always)]
1798        fn u64x8_load(self, data: &[u64; 8]) -> Self::U64x8 {
1799            {
1800                [
1801                    u64x2::load(self, data[0..2].try_into().unwrap()),
1802                    u64x2::load(self, data[2..4].try_into().unwrap()),
1803                    u64x2::load(self, data[4..6].try_into().unwrap()),
1804                    u64x2::load(self, data[6..8].try_into().unwrap()),
1805                ]
1806            }
1807        }
1808    }
1809}