]> git.proxmox.com Git - rustc.git/blob - library/stdarch/crates/core_arch/src/simd.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / library / stdarch / crates / core_arch / src / simd.rs
1 //! Internal `#[repr(simd)]` types
2
3 #![allow(non_camel_case_types)]
4
5 macro_rules! simd_ty {
6 ($id:ident [$ety:ident]: $($elem_ty:ident),* | $($elem_name:ident),*) => {
7 #[repr(simd)]
8 #[derive(Copy, Clone, Debug, PartialEq)]
9 pub(crate) struct $id($(pub $elem_ty),*);
10
11 #[allow(clippy::use_self)]
12 impl $id {
13 #[inline]
14 pub(crate) const fn new($($elem_name: $elem_ty),*) -> Self {
15 $id($($elem_name),*)
16 }
17 // FIXME: Workaround rust@60637
18 #[inline(always)]
19 pub(crate) const fn splat(value: $ety) -> Self {
20 $id($({
21 #[allow(non_camel_case_types, dead_code)]
22 struct $elem_name;
23 value
24 }),*)
25 }
26
27 // FIXME: Workaround rust@60637
28 #[inline(always)]
29 pub(crate) fn extract(self, index: usize) -> $ety {
30 unsafe {
31 crate::core_arch::simd_llvm::simd_extract(self, index as u32)
32 }
33 }
34 }
35 }
36 }
37
38 macro_rules! simd_m_ty {
39 ($id:ident [$ety:ident]: $($elem_ty:ident),* | $($elem_name:ident),*) => {
40 #[repr(simd)]
41 #[derive(Copy, Clone, Debug, PartialEq)]
42 pub(crate) struct $id($(pub $elem_ty),*);
43
44 #[allow(clippy::use_self)]
45 impl $id {
46 #[inline]
47 const fn bool_to_internal(x: bool) -> $ety {
48 [0 as $ety, !(0 as $ety)][x as usize]
49 }
50
51 #[inline]
52 pub(crate) const fn new($($elem_name: bool),*) -> Self {
53 $id($(Self::bool_to_internal($elem_name)),*)
54 }
55
56 // FIXME: Workaround rust@60637
57 #[inline(always)]
58 pub(crate) const fn splat(value: bool) -> Self {
59 $id($({
60 #[allow(non_camel_case_types, dead_code)]
61 struct $elem_name;
62 Self::bool_to_internal(value)
63 }),*)
64 }
65
66 // FIXME: Workaround rust@60637
67 #[inline(always)]
68 pub(crate) fn extract(self, index: usize) -> bool {
69 let r: $ety = unsafe {
70 crate::core_arch::simd_llvm::simd_extract(self, index as u32)
71 };
72 r != 0
73 }
74 }
75 }
76 }
77
78 // 16-bit wide types:
79
80 simd_ty!(u8x2[u8]: u8, u8 | x0, x1);
81 simd_ty!(i8x2[i8]: i8, i8 | x0, x1);
82
83 // 32-bit wide types:
84
85 simd_ty!(u8x4[u8]: u8, u8, u8, u8 | x0, x1, x2, x3);
86 simd_ty!(u16x2[u16]: u16, u16 | x0, x1);
87
88 simd_ty!(i8x4[i8]: i8, i8, i8, i8 | x0, x1, x2, x3);
89 simd_ty!(i16x2[i16]: i16, i16 | x0, x1);
90
91 // 64-bit wide types:
92
93 simd_ty!(
94 u8x8[u8]: u8,
95 u8,
96 u8,
97 u8,
98 u8,
99 u8,
100 u8,
101 u8 | x0,
102 x1,
103 x2,
104 x3,
105 x4,
106 x5,
107 x6,
108 x7
109 );
110 simd_ty!(u16x4[u16]: u16, u16, u16, u16 | x0, x1, x2, x3);
111 simd_ty!(u32x2[u32]: u32, u32 | x0, x1);
112 simd_ty!(u64x1[u64]: u64 | x1);
113
114 simd_ty!(
115 i8x8[i8]: i8,
116 i8,
117 i8,
118 i8,
119 i8,
120 i8,
121 i8,
122 i8 | x0,
123 x1,
124 x2,
125 x3,
126 x4,
127 x5,
128 x6,
129 x7
130 );
131 simd_ty!(i16x4[i16]: i16, i16, i16, i16 | x0, x1, x2, x3);
132 simd_ty!(i32x2[i32]: i32, i32 | x0, x1);
133 simd_ty!(i64x1[i64]: i64 | x1);
134
135 simd_ty!(f32x2[f32]: f32, f32 | x0, x1);
136
137 // 128-bit wide types:
138
139 simd_ty!(
140 u8x16[u8]: u8,
141 u8,
142 u8,
143 u8,
144 u8,
145 u8,
146 u8,
147 u8,
148 u8,
149 u8,
150 u8,
151 u8,
152 u8,
153 u8,
154 u8,
155 u8 | x0,
156 x1,
157 x2,
158 x3,
159 x4,
160 x5,
161 x6,
162 x7,
163 x8,
164 x9,
165 x10,
166 x11,
167 x12,
168 x13,
169 x14,
170 x15
171 );
172 simd_ty!(
173 u16x8[u16]: u16,
174 u16,
175 u16,
176 u16,
177 u16,
178 u16,
179 u16,
180 u16 | x0,
181 x1,
182 x2,
183 x3,
184 x4,
185 x5,
186 x6,
187 x7
188 );
189 simd_ty!(u32x4[u32]: u32, u32, u32, u32 | x0, x1, x2, x3);
190 simd_ty!(u64x2[u64]: u64, u64 | x0, x1);
191
192 simd_ty!(
193 i8x16[i8]: i8,
194 i8,
195 i8,
196 i8,
197 i8,
198 i8,
199 i8,
200 i8,
201 i8,
202 i8,
203 i8,
204 i8,
205 i8,
206 i8,
207 i8,
208 i8 | x0,
209 x1,
210 x2,
211 x3,
212 x4,
213 x5,
214 x6,
215 x7,
216 x8,
217 x9,
218 x10,
219 x11,
220 x12,
221 x13,
222 x14,
223 x15
224 );
225 simd_ty!(
226 i16x8[i16]: i16,
227 i16,
228 i16,
229 i16,
230 i16,
231 i16,
232 i16,
233 i16 | x0,
234 x1,
235 x2,
236 x3,
237 x4,
238 x5,
239 x6,
240 x7
241 );
242 simd_ty!(i32x4[i32]: i32, i32, i32, i32 | x0, x1, x2, x3);
243 simd_ty!(i64x2[i64]: i64, i64 | x0, x1);
244
245 simd_ty!(f32x4[f32]: f32, f32, f32, f32 | x0, x1, x2, x3);
246 simd_ty!(f64x2[f64]: f64, f64 | x0, x1);
247
248 simd_m_ty!(
249 m8x16[i8]: i8,
250 i8,
251 i8,
252 i8,
253 i8,
254 i8,
255 i8,
256 i8,
257 i8,
258 i8,
259 i8,
260 i8,
261 i8,
262 i8,
263 i8,
264 i8 | x0,
265 x1,
266 x2,
267 x3,
268 x4,
269 x5,
270 x6,
271 x7,
272 x8,
273 x9,
274 x10,
275 x11,
276 x12,
277 x13,
278 x14,
279 x15
280 );
281 simd_m_ty!(
282 m16x8[i16]: i16,
283 i16,
284 i16,
285 i16,
286 i16,
287 i16,
288 i16,
289 i16 | x0,
290 x1,
291 x2,
292 x3,
293 x4,
294 x5,
295 x6,
296 x7
297 );
298 simd_m_ty!(m32x4[i32]: i32, i32, i32, i32 | x0, x1, x2, x3);
299 simd_m_ty!(m64x2[i64]: i64, i64 | x0, x1);
300
301 // 256-bit wide types:
302
303 simd_ty!(
304 u8x32[u8]: u8,
305 u8,
306 u8,
307 u8,
308 u8,
309 u8,
310 u8,
311 u8,
312 u8,
313 u8,
314 u8,
315 u8,
316 u8,
317 u8,
318 u8,
319 u8,
320 u8,
321 u8,
322 u8,
323 u8,
324 u8,
325 u8,
326 u8,
327 u8,
328 u8,
329 u8,
330 u8,
331 u8,
332 u8,
333 u8,
334 u8,
335 u8 | x0,
336 x1,
337 x2,
338 x3,
339 x4,
340 x5,
341 x6,
342 x7,
343 x8,
344 x9,
345 x10,
346 x11,
347 x12,
348 x13,
349 x14,
350 x15,
351 x16,
352 x17,
353 x18,
354 x19,
355 x20,
356 x21,
357 x22,
358 x23,
359 x24,
360 x25,
361 x26,
362 x27,
363 x28,
364 x29,
365 x30,
366 x31
367 );
368 simd_ty!(
369 u16x16[u16]: u16,
370 u16,
371 u16,
372 u16,
373 u16,
374 u16,
375 u16,
376 u16,
377 u16,
378 u16,
379 u16,
380 u16,
381 u16,
382 u16,
383 u16,
384 u16 | x0,
385 x1,
386 x2,
387 x3,
388 x4,
389 x5,
390 x6,
391 x7,
392 x8,
393 x9,
394 x10,
395 x11,
396 x12,
397 x13,
398 x14,
399 x15
400 );
401 simd_ty!(
402 u32x8[u32]: u32,
403 u32,
404 u32,
405 u32,
406 u32,
407 u32,
408 u32,
409 u32 | x0,
410 x1,
411 x2,
412 x3,
413 x4,
414 x5,
415 x6,
416 x7
417 );
418 simd_ty!(u64x4[u64]: u64, u64, u64, u64 | x0, x1, x2, x3);
419
420 simd_ty!(
421 i8x32[i8]: i8,
422 i8,
423 i8,
424 i8,
425 i8,
426 i8,
427 i8,
428 i8,
429 i8,
430 i8,
431 i8,
432 i8,
433 i8,
434 i8,
435 i8,
436 i8,
437 i8,
438 i8,
439 i8,
440 i8,
441 i8,
442 i8,
443 i8,
444 i8,
445 i8,
446 i8,
447 i8,
448 i8,
449 i8,
450 i8,
451 i8,
452 i8 | x0,
453 x1,
454 x2,
455 x3,
456 x4,
457 x5,
458 x6,
459 x7,
460 x8,
461 x9,
462 x10,
463 x11,
464 x12,
465 x13,
466 x14,
467 x15,
468 x16,
469 x17,
470 x18,
471 x19,
472 x20,
473 x21,
474 x22,
475 x23,
476 x24,
477 x25,
478 x26,
479 x27,
480 x28,
481 x29,
482 x30,
483 x31
484 );
485 simd_ty!(
486 i16x16[i16]: i16,
487 i16,
488 i16,
489 i16,
490 i16,
491 i16,
492 i16,
493 i16,
494 i16,
495 i16,
496 i16,
497 i16,
498 i16,
499 i16,
500 i16,
501 i16 | x0,
502 x1,
503 x2,
504 x3,
505 x4,
506 x5,
507 x6,
508 x7,
509 x8,
510 x9,
511 x10,
512 x11,
513 x12,
514 x13,
515 x14,
516 x15
517 );
518 simd_ty!(
519 i32x8[i32]: i32,
520 i32,
521 i32,
522 i32,
523 i32,
524 i32,
525 i32,
526 i32 | x0,
527 x1,
528 x2,
529 x3,
530 x4,
531 x5,
532 x6,
533 x7
534 );
535 simd_ty!(i64x4[i64]: i64, i64, i64, i64 | x0, x1, x2, x3);
536
537 simd_ty!(
538 f32x8[f32]: f32,
539 f32,
540 f32,
541 f32,
542 f32,
543 f32,
544 f32,
545 f32 | x0,
546 x1,
547 x2,
548 x3,
549 x4,
550 x5,
551 x6,
552 x7
553 );
554
555 // 512-bit wide types:
556
557 simd_ty!(
558 i32x16[i32]: i32,
559 i32,
560 i32,
561 i32,
562 i32,
563 i32,
564 i32,
565 i32,
566 i32,
567 i32,
568 i32,
569 i32,
570 i32,
571 i32,
572 i32,
573 i32 | x0,
574 x1,
575 x2,
576 x3,
577 x4,
578 x5,
579 x6,
580 x7,
581 x8,
582 x9,
583 x10,
584 x11,
585 x12,
586 x13,
587 x14,
588 x15
589 );
590
591 simd_ty!(
592 u32x16[u32]: u32,
593 u32,
594 u32,
595 u32,
596 u32,
597 u32,
598 u32,
599 u32,
600 u32,
601 u32,
602 u32,
603 u32,
604 u32,
605 u32,
606 u32,
607 u32 | x0,
608 x1,
609 x2,
610 x3,
611 x4,
612 x5,
613 x6,
614 x7,
615 x8,
616 x9,
617 x10,
618 x11,
619 x12,
620 x13,
621 x14,
622 x15
623 );
624
625 simd_ty!(
626 f32x16[f32]: f32,
627 f32,
628 f32,
629 f32,
630 f32,
631 f32,
632 f32,
633 f32,
634 f32,
635 f32,
636 f32,
637 f32,
638 f32,
639 f32,
640 f32,
641 f32 | x0,
642 x1,
643 x2,
644 x3,
645 x4,
646 x5,
647 x6,
648 x7,
649 x8,
650 x9,
651 x10,
652 x11,
653 x12,
654 x13,
655 x14,
656 x15
657 );
658
659 simd_ty!(
660 i64x8[i64]: i64,
661 i64,
662 i64,
663 i64,
664 i64,
665 i64,
666 i64,
667 i64 | x0,
668 x1,
669 x2,
670 x3,
671 x4,
672 x5,
673 x6,
674 x7
675 );
676
677 simd_ty!(
678 u64x8[u64]: u64,
679 u64,
680 u64,
681 u64,
682 u64,
683 u64,
684 u64,
685 u64 | x0,
686 x1,
687 x2,
688 x3,
689 x4,
690 x5,
691 x6,
692 x7
693 );
694
695 simd_ty!(
696 f64x8[f64]: f64,
697 f64,
698 f64,
699 f64,
700 f64,
701 f64,
702 f64,
703 f64 | x0,
704 x1,
705 x2,
706 x3,
707 x4,
708 x5,
709 x6,
710 x7
711 );