1#![allow(missing_docs)]
10
11use archmage::SimdToken;
12
13pub trait WidthDispatch: SimdToken + Copy {
19 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 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 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 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 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 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 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 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 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 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 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 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}