polylane/mask/
mod.rs

1// Copyright 2025 Gabriel Bjørnager Jensen.
2//
3// This Source Code Form is subject to the terms of
4// the Mozilla Public License, v. 2.0. If a copy of
5// the MPL was not distributed with this file, you
6// can obtain one at:
7// <https://mozilla.org/MPL/2.0/>.
8
9//! Collection of SIMD mask types.
10
11mod test;
12
13use crate::prelude::*;
14
15macro_rules! def_mask {
16	{
17		ident:       $ident:ident,
18		elm:         $elm:ident,
19		len:         $len:literal,
20		inner:       $inner:ty,
21		pretty_size: $pretty_size:literal,
22		pretty_len:  $pretty_len:expr$(,)?
23	} => {
24		#[doc = ::core::concat!(
25			"SIMD vector mask suitable for (",
26			$pretty_len,
27			") ",
28			$pretty_size,
29			"-bit element(s).\n",
30			"\n",
31			"For a given SIMD vector with elements of some width, the equivalent mask type can be described as another SIMD vector of equivalently-wide, signed integers.\n",
32			"That is, for example, for an [`f32x6`](::polylane::simd::f32x6) vector, the appropriate mask vector type would be [`i32x6`](::polylane::simd::i32x6).\n",
33		)]
34		#[repr(transparent)]
35		#[derive(
36			::core::clone::Clone,
37			::core::marker::Copy,
38			::core::fmt::Debug,
39			::core::default::Default,
40			::core::cmp::Eq,
41			::core::cmp::PartialEq,
42			::core::cmp::PartialOrd,
43		)]
44		#[cfg_attr(
45			feature = "bytemuck",
46			derive(
47				::bytemuck::Pod,
48				::bytemuck::Zeroable,
49			),
50		)]
51		#[cfg_attr(
52			feature = "zerocopy",
53			derive(
54				::zerocopy::FromBytes,
55				::zerocopy::IntoBytes,
56				::zerocopy::KnownLayout,
57			),
58		)]
59		pub struct $ident($inner);
60
61		impl $ident {
62			/// Constructs a SIMD mask from a bitmask.
63			#[inline]
64			#[must_use]
65			pub const fn from_bitmask(mask: [bool; $len]) -> Self {
66				let mut data = [0x0; $len];
67
68				let mut i = 0x0;
69				while i < $len {
70					data[i] = 0x0 - mask[i] as $elm;
71
72					i += 0x1;
73				}
74
75				let mask = <$inner>::from_array(data);
76
77				Self::from_int(mask)
78			}
79
80			/// Constructs a SIMD mask from a SIMD vector.
81			///
82			/// See [from_int_unchecked](Self::from_int_unchecked) for this operation without checks.
83			///
84			/// # Panics
85			///
86			/// All values of the SIMD vector must either be `0` (mask does not apply) or `-1` (mask applies).
87			/// If this is not the case, then this constructor will panic.
88			#[inline]
89			#[must_use]
90			pub const fn from_int(value: $inner) -> Self {
91				let mut i = 0x0;
92				while i < <$inner>::LEN {
93					let mask_element = value.as_array()[i];
94
95					assert!(
96						mask_element == 0x0 || mask_element == -0x1,
97						"mask elements must either be `0` or `-1`",
98					);
99
100					i += 0x1;
101				}
102
103				// SAFETY: We have verified the data.
104				unsafe { Self::from_int_unchecked(value) }
105			}
106
107			/// Constructs a SIMD mask from a SIMD vector.
108			///
109			/// See [from_int](Self::from_int) for a safe variant of this function.
110			///
111			/// # Safety
112			///
113			/// All values of the SIMD vector must either be `0` (mask does not apply) or `-1` (mask applies).
114			/// Behaviour is undefined if this is not the case.
115			#[inline(always)]
116			#[must_use]
117			pub const unsafe fn from_int_unchecked(value: $inner) -> Self {
118				Self(value)
119			}
120
121			/// Converts the SIMD mask into a bitmask.
122			///
123			/// For each value in the initial mask, `0` values are converted to `false` and `-1` values are converted to `true`.
124			#[inline]
125			#[must_use]
126			pub const fn to_bitmask(self) -> [bool; $len] {
127				let mask = self.to_int().to_array();
128
129				let mut data = [false; $len];
130
131				let mut i = 0x0;
132				while i < $len {
133					data[i] = mask[i] < 0x0;
134
135					i += 0x1;
136				}
137
138				data
139			}
140
141			/// Converts the SIMD mask into a SIMD vector.
142			///
143			/// For each element of the returned vector, `0` denotes an index that the mask applies to and `-1` denotes an index that the mask does *not* apply to.
144			#[inline(always)]
145			#[must_use]
146			pub const fn to_int(self) -> $inner {
147				self.0
148			}
149		}
150
151		impl ::core::convert::From<[bool; $len]> for $ident {
152			/// See [`from_bitmask`](Self::from_bitmask).
153			#[inline(always)]
154			fn from(value: [bool; $len]) -> Self {
155				Self::from_bitmask(value)
156			}
157		}
158	};
159}
160
161def_mask! {
162	ident:       Mask8x1,
163	elm:         i8,
164	len:         0x1,
165	inner:       i8x1,
166	pretty_size: "8",
167	pretty_len:  "1",
168}
169
170def_mask! {
171	ident:       Mask8x2,
172	elm:         i8,
173	len:         0x2,
174	inner:       i8x2,
175	pretty_size: "8",
176	pretty_len:  "2",
177}
178
179def_mask! {
180	ident:       Mask8x3,
181	elm:         i8,
182	len:         0x3,
183	inner:       i8x3,
184	pretty_size: "8",
185	pretty_len:  "3",
186}
187
188def_mask! {
189	ident:       Mask8x4,
190	elm:         i8,
191	len:         0x4,
192	inner:       i8x4,
193	pretty_size: "8",
194	pretty_len:  "4",
195}
196
197def_mask! {
198	ident:       Mask8x5,
199	elm:         i8,
200	len:         0x5,
201	inner:       i8x5,
202	pretty_size: "8",
203	pretty_len:  "5",
204}
205
206def_mask! {
207	ident:       Mask8x6,
208	elm:         i8,
209	len:         0x6,
210	inner:       i8x6,
211	pretty_size: "8",
212	pretty_len:  "6",
213}
214
215def_mask! {
216	ident:       Mask8x7,
217	elm:         i8,
218	len:         0x7,
219	inner:       i8x7,
220	pretty_size: "8",
221	pretty_len:  "7",
222}
223
224def_mask! {
225	ident:       Mask8x8,
226	elm:         i8,
227	len:         0x8,
228	inner:       i8x8,
229	pretty_size: "8",
230	pretty_len:  "8",
231}
232
233def_mask! {
234	ident:       Mask8x9,
235	elm:         i8,
236	len:         0x9,
237	inner:       i8x9,
238	pretty_size: "8",
239	pretty_len:  "9",
240}
241
242def_mask! {
243	ident:       Mask8x10,
244	elm:         i8,
245	len:         0xA,
246	inner:       i8x10,
247	pretty_size: "8",
248	pretty_len:  "10",
249}
250
251def_mask! {
252	ident:       Mask8x11,
253	elm:         i8,
254	len:         0xB,
255	inner:       i8x11,
256	pretty_size: "8",
257	pretty_len:  "11",
258}
259
260def_mask! {
261	ident:       Mask8x12,
262	elm:         i8,
263	len:         0xC,
264	inner:       i8x12,
265	pretty_size: "8",
266	pretty_len:  "12",
267}
268
269def_mask! {
270	ident:       Mask8x13,
271	elm:         i8,
272	len:         0xD,
273	inner:       i8x13,
274	pretty_size: "8",
275	pretty_len:  "13",
276}
277
278def_mask! {
279	ident:       Mask8x14,
280	elm:         i8,
281	len:         0xE,
282	inner:       i8x14,
283	pretty_size: "8",
284	pretty_len:  "14",
285}
286
287def_mask! {
288	ident:       Mask8x15,
289	elm:         i8,
290	len:         0xF,
291	inner:       i8x15,
292	pretty_size: "8",
293	pretty_len:  "15",
294}
295
296def_mask! {
297	ident:       Mask8x16,
298	elm:         i8,
299	len:         0x10,
300	inner:       i8x16,
301	pretty_size: "8",
302	pretty_len:  "16",
303}
304
305def_mask! {
306	ident:       Mask8x17,
307	elm:         i8,
308	len:         0x11,
309	inner:       i8x17,
310	pretty_size: "8",
311	pretty_len:  "17",
312}
313
314def_mask! {
315	ident:       Mask8x18,
316	elm:         i8,
317	len:         0x12,
318	inner:       i8x18,
319	pretty_size: "8",
320	pretty_len:  "18",
321}
322
323def_mask! {
324	ident:       Mask8x19,
325	elm:         i8,
326	len:         0x13,
327	inner:       i8x19,
328	pretty_size: "8",
329	pretty_len:  "19",
330}
331
332def_mask! {
333	ident:       Mask8x20,
334	elm:         i8,
335	len:         0x14,
336	inner:       i8x20,
337	pretty_size: "8",
338	pretty_len:  "20",
339}
340
341def_mask! {
342	ident:       Mask8x21,
343	elm:         i8,
344	len:         0x15,
345	inner:       i8x21,
346	pretty_size: "8",
347	pretty_len:  "21",
348}
349
350def_mask! {
351	ident:       Mask8x22,
352	elm:         i8,
353	len:         0x16,
354	inner:       i8x22,
355	pretty_size: "8",
356	pretty_len:  "22",
357}
358
359def_mask! {
360	ident:       Mask8x23,
361	elm:         i8,
362	len:         0x17,
363	inner:       i8x23,
364	pretty_size: "8",
365	pretty_len:  "23",
366}
367
368def_mask! {
369	ident:       Mask8x24,
370	elm:         i8,
371	len:         0x18,
372	inner:       i8x24,
373	pretty_size: "8",
374	pretty_len:  "24",
375}
376
377def_mask! {
378	ident:       Mask8x25,
379	elm:         i8,
380	len:         0x19,
381	inner:       i8x25,
382	pretty_size: "8",
383	pretty_len:  "25",
384}
385
386def_mask! {
387	ident:       Mask8x26,
388	elm:         i8,
389	len:         0x1A,
390	inner:       i8x26,
391	pretty_size: "8",
392	pretty_len:  "26",
393}
394
395def_mask! {
396	ident:       Mask8x27,
397	elm:         i8,
398	len:         0x1B,
399	inner:       i8x27,
400	pretty_size: "8",
401	pretty_len:  "27",
402}
403
404def_mask! {
405	ident:       Mask8x28,
406	elm:         i8,
407	len:         0x1C,
408	inner:       i8x28,
409	pretty_size: "8",
410	pretty_len:  "28",
411}
412
413def_mask! {
414	ident:       Mask8x29,
415	elm:         i8,
416	len:         0x1D,
417	inner:       i8x29,
418	pretty_size: "8",
419	pretty_len:  "29",
420}
421
422def_mask! {
423	ident:       Mask8x30,
424	elm:         i8,
425	len:         0x1E,
426	inner:       i8x30,
427	pretty_size: "8",
428	pretty_len:  "30",
429}
430
431def_mask! {
432	ident:       Mask8x31,
433	elm:         i8,
434	len:         0x1F,
435	inner:       i8x31,
436	pretty_size: "8",
437	pretty_len:  "31",
438}
439
440def_mask! {
441	ident:       Mask8x32,
442	elm:         i8,
443	len:         0x20,
444	inner:       i8x32,
445	pretty_size: "8",
446	pretty_len:  "32",
447}
448
449def_mask! {
450	ident:       Mask8x33,
451	elm:         i8,
452	len:         0x21,
453	inner:       i8x33,
454	pretty_size: "8",
455	pretty_len:  "33",
456}
457
458def_mask! {
459	ident:       Mask8x34,
460	elm:         i8,
461	len:         0x22,
462	inner:       i8x34,
463	pretty_size: "8",
464	pretty_len:  "34",
465}
466
467def_mask! {
468	ident:       Mask8x35,
469	elm:         i8,
470	len:         0x23,
471	inner:       i8x35,
472	pretty_size: "8",
473	pretty_len:  "35",
474}
475
476def_mask! {
477	ident:       Mask8x36,
478	elm:         i8,
479	len:         0x24,
480	inner:       i8x36,
481	pretty_size: "8",
482	pretty_len:  "36",
483}
484
485def_mask! {
486	ident:       Mask8x37,
487	elm:         i8,
488	len:         0x25,
489	inner:       i8x37,
490	pretty_size: "8",
491	pretty_len:  "37",
492}
493
494def_mask! {
495	ident:       Mask8x38,
496	elm:         i8,
497	len:         0x26,
498	inner:       i8x38,
499	pretty_size: "8",
500	pretty_len:  "38",
501}
502
503def_mask! {
504	ident:       Mask8x39,
505	elm:         i8,
506	len:         0x27,
507	inner:       i8x39,
508	pretty_size: "8",
509	pretty_len:  "39",
510}
511
512def_mask! {
513	ident:       Mask8x40,
514	elm:         i8,
515	len:         0x28,
516	inner:       i8x40,
517	pretty_size: "8",
518	pretty_len:  "40",
519}
520
521def_mask! {
522	ident:       Mask8x41,
523	elm:         i8,
524	len:         0x29,
525	inner:       i8x41,
526	pretty_size: "8",
527	pretty_len:  "41",
528}
529
530def_mask! {
531	ident:       Mask8x42,
532	elm:         i8,
533	len:         0x2A,
534	inner:       i8x42,
535	pretty_size: "8",
536	pretty_len:  "42",
537}
538
539def_mask! {
540	ident:       Mask8x43,
541	elm:         i8,
542	len:         0x2B,
543	inner:       i8x43,
544	pretty_size: "8",
545	pretty_len:  "43",
546}
547
548def_mask! {
549	ident:       Mask8x44,
550	elm:         i8,
551	len:         0x2C,
552	inner:       i8x44,
553	pretty_size: "8",
554	pretty_len:  "44",
555}
556
557def_mask! {
558	ident:       Mask8x45,
559	elm:         i8,
560	len:         0x2D,
561	inner:       i8x45,
562	pretty_size: "8",
563	pretty_len:  "45",
564}
565
566def_mask! {
567	ident:       Mask8x46,
568	elm:         i8,
569	len:         0x2E,
570	inner:       i8x46,
571	pretty_size: "8",
572	pretty_len:  "46",
573}
574
575def_mask! {
576	ident:       Mask8x47,
577	elm:         i8,
578	len:         0x2F,
579	inner:       i8x47,
580	pretty_size: "8",
581	pretty_len:  "47",
582}
583
584def_mask! {
585	ident:       Mask8x48,
586	elm:         i8,
587	len:         0x30,
588	inner:       i8x48,
589	pretty_size: "8",
590	pretty_len:  "48",
591}
592
593def_mask! {
594	ident:       Mask8x49,
595	elm:         i8,
596	len:         0x31,
597	inner:       i8x49,
598	pretty_size: "8",
599	pretty_len:  "49",
600}
601
602def_mask! {
603	ident:       Mask8x50,
604	elm:         i8,
605	len:         0x32,
606	inner:       i8x50,
607	pretty_size: "8",
608	pretty_len:  "50",
609}
610
611def_mask! {
612	ident:       Mask8x51,
613	elm:         i8,
614	len:         0x33,
615	inner:       i8x51,
616	pretty_size: "8",
617	pretty_len:  "51",
618}
619
620def_mask! {
621	ident:       Mask8x52,
622	elm:         i8,
623	len:         0x34,
624	inner:       i8x52,
625	pretty_size: "8",
626	pretty_len:  "52",
627}
628
629def_mask! {
630	ident:       Mask8x53,
631	elm:         i8,
632	len:         0x35,
633	inner:       i8x53,
634	pretty_size: "8",
635	pretty_len:  "53",
636}
637
638def_mask! {
639	ident:       Mask8x54,
640	elm:         i8,
641	len:         0x36,
642	inner:       i8x54,
643	pretty_size: "8",
644	pretty_len:  "54",
645}
646
647def_mask! {
648	ident:       Mask8x55,
649	elm:         i8,
650	len:         0x37,
651	inner:       i8x55,
652	pretty_size: "8",
653	pretty_len:  "55",
654}
655
656def_mask! {
657	ident:       Mask8x56,
658	elm:         i8,
659	len:         0x38,
660	inner:       i8x56,
661	pretty_size: "8",
662	pretty_len:  "56",
663}
664
665def_mask! {
666	ident:       Mask8x57,
667	elm:         i8,
668	len:         0x39,
669	inner:       i8x57,
670	pretty_size: "8",
671	pretty_len:  "57",
672}
673
674def_mask! {
675	ident:       Mask8x58,
676	elm:         i8,
677	len:         0x3A,
678	inner:       i8x58,
679	pretty_size: "8",
680	pretty_len:  "58",
681}
682
683def_mask! {
684	ident:       Mask8x59,
685	elm:         i8,
686	len:         0x3B,
687	inner:       i8x59,
688	pretty_size: "8",
689	pretty_len:  "59",
690}
691
692def_mask! {
693	ident:       Mask8x60,
694	elm:         i8,
695	len:         0x3C,
696	inner:       i8x60,
697	pretty_size: "8",
698	pretty_len:  "60",
699}
700
701def_mask! {
702	ident:       Mask8x61,
703	elm:         i8,
704	len:         0x3D,
705	inner:       i8x61,
706	pretty_size: "8",
707	pretty_len:  "61",
708}
709
710def_mask! {
711	ident:       Mask8x62,
712	elm:         i8,
713	len:         0x3E,
714	inner:       i8x62,
715	pretty_size: "8",
716	pretty_len:  "62",
717}
718
719def_mask! {
720	ident:       Mask8x63,
721	elm:         i8,
722	len:         0x3F,
723	inner:       i8x63,
724	pretty_size: "8",
725	pretty_len:  "63",
726}
727
728def_mask! {
729	ident:       Mask8x64,
730	elm:         i8,
731	len:         0x40,
732	inner:       i8x64,
733	pretty_size: "8",
734	pretty_len:  "64",
735}
736
737def_mask! {
738	ident:       Mask16x1,
739	elm:         i16,
740	len:         0x1,
741	inner:       i16x1,
742	pretty_size: "16",
743	pretty_len:  "1",
744}
745
746def_mask! {
747	ident:       Mask16x2,
748	elm:         i16,
749	len:         0x2,
750	inner:       i16x2,
751	pretty_size: "16",
752	pretty_len:  "2",
753}
754
755def_mask! {
756	ident:       Mask16x3,
757	elm:         i16,
758	len:         0x3,
759	inner:       i16x3,
760	pretty_size: "16",
761	pretty_len:  "3",
762}
763
764def_mask! {
765	ident:       Mask16x4,
766	elm:         i16,
767	len:         0x4,
768	inner:       i16x4,
769	pretty_size: "16",
770	pretty_len:  "4",
771}
772
773def_mask! {
774	ident:       Mask16x5,
775	elm:         i16,
776	len:         0x5,
777	inner:       i16x5,
778	pretty_size: "16",
779	pretty_len:  "5",
780}
781
782def_mask! {
783	ident:       Mask16x6,
784	elm:         i16,
785	len:         0x6,
786	inner:       i16x6,
787	pretty_size: "16",
788	pretty_len:  "6",
789}
790
791def_mask! {
792	ident:       Mask16x7,
793	elm:         i16,
794	len:         0x7,
795	inner:       i16x7,
796	pretty_size: "16",
797	pretty_len:  "7",
798}
799
800def_mask! {
801	ident:       Mask16x8,
802	elm:         i16,
803	len:         0x8,
804	inner:       i16x8,
805	pretty_size: "16",
806	pretty_len:  "8",
807}
808
809def_mask! {
810	ident:       Mask16x9,
811	elm:         i16,
812	len:         0x9,
813	inner:       i16x9,
814	pretty_size: "16",
815	pretty_len:  "9",
816}
817
818def_mask! {
819	ident:       Mask16x10,
820	elm:         i16,
821	len:         0xA,
822	inner:       i16x10,
823	pretty_size: "16",
824	pretty_len:  "10",
825}
826
827def_mask! {
828	ident:       Mask16x11,
829	elm:         i16,
830	len:         0xB,
831	inner:       i16x11,
832	pretty_size: "16",
833	pretty_len:  "11",
834}
835
836def_mask! {
837	ident:       Mask16x12,
838	elm:         i16,
839	len:         0xC,
840	inner:       i16x12,
841	pretty_size: "16",
842	pretty_len:  "12",
843}
844
845def_mask! {
846	ident:       Mask16x13,
847	elm:         i16,
848	len:         0xD,
849	inner:       i16x13,
850	pretty_size: "16",
851	pretty_len:  "13",
852}
853
854def_mask! {
855	ident:       Mask16x14,
856	elm:         i16,
857	len:         0xE,
858	inner:       i16x14,
859	pretty_size: "16",
860	pretty_len:  "14",
861}
862
863def_mask! {
864	ident:       Mask16x15,
865	elm:         i16,
866	len:         0xF,
867	inner:       i16x15,
868	pretty_size: "16",
869	pretty_len:  "15",
870}
871
872def_mask! {
873	ident:       Mask16x16,
874	elm:         i16,
875	len:         0x10,
876	inner:       i16x16,
877	pretty_size: "16",
878	pretty_len:  "16",
879}
880
881def_mask! {
882	ident:       Mask16x17,
883	elm:         i16,
884	len:         0x11,
885	inner:       i16x17,
886	pretty_size: "16",
887	pretty_len:  "17",
888}
889
890def_mask! {
891	ident:       Mask16x18,
892	elm:         i16,
893	len:         0x12,
894	inner:       i16x18,
895	pretty_size: "16",
896	pretty_len:  "18",
897}
898
899def_mask! {
900	ident:       Mask16x19,
901	elm:         i16,
902	len:         0x13,
903	inner:       i16x19,
904	pretty_size: "16",
905	pretty_len:  "19",
906}
907
908def_mask! {
909	ident:       Mask16x20,
910	elm:         i16,
911	len:         0x14,
912	inner:       i16x20,
913	pretty_size: "16",
914	pretty_len:  "20",
915}
916
917def_mask! {
918	ident:       Mask16x21,
919	elm:         i16,
920	len:         0x15,
921	inner:       i16x21,
922	pretty_size: "16",
923	pretty_len:  "21",
924}
925
926def_mask! {
927	ident:       Mask16x22,
928	elm:         i16,
929	len:         0x16,
930	inner:       i16x22,
931	pretty_size: "16",
932	pretty_len:  "22",
933}
934
935def_mask! {
936	ident:       Mask16x23,
937	elm:         i16,
938	len:         0x17,
939	inner:       i16x23,
940	pretty_size: "16",
941	pretty_len:  "23",
942}
943
944def_mask! {
945	ident:       Mask16x24,
946	elm:         i16,
947	len:         0x18,
948	inner:       i16x24,
949	pretty_size: "16",
950	pretty_len:  "24",
951}
952
953def_mask! {
954	ident:       Mask16x25,
955	elm:         i16,
956	len:         0x19,
957	inner:       i16x25,
958	pretty_size: "16",
959	pretty_len:  "25",
960}
961
962def_mask! {
963	ident:       Mask16x26,
964	elm:         i16,
965	len:         0x1A,
966	inner:       i16x26,
967	pretty_size: "16",
968	pretty_len:  "26",
969}
970
971def_mask! {
972	ident:       Mask16x27,
973	elm:         i16,
974	len:         0x1B,
975	inner:       i16x27,
976	pretty_size: "16",
977	pretty_len:  "27",
978}
979
980def_mask! {
981	ident:       Mask16x28,
982	elm:         i16,
983	len:         0x1C,
984	inner:       i16x28,
985	pretty_size: "16",
986	pretty_len:  "28",
987}
988
989def_mask! {
990	ident:       Mask16x29,
991	elm:         i16,
992	len:         0x1D,
993	inner:       i16x29,
994	pretty_size: "16",
995	pretty_len:  "29",
996}
997
998def_mask! {
999	ident:       Mask16x30,
1000	elm:         i16,
1001	len:         0x1E,
1002	inner:       i16x30,
1003	pretty_size: "16",
1004	pretty_len:  "30",
1005}
1006
1007def_mask! {
1008	ident:       Mask16x31,
1009	elm:         i16,
1010	len:         0x1F,
1011	inner:       i16x31,
1012	pretty_size: "16",
1013	pretty_len:  "31",
1014}
1015
1016def_mask! {
1017	ident:       Mask16x32,
1018	elm:         i16,
1019	len:         0x20,
1020	inner:       i16x32,
1021	pretty_size: "16",
1022	pretty_len:  "32",
1023}
1024
1025def_mask! {
1026	ident:       Mask32x1,
1027	elm:         i32,
1028	len:         0x1,
1029	inner:       i32x1,
1030	pretty_size: "32",
1031	pretty_len:  "1",
1032}
1033
1034def_mask! {
1035	ident:       Mask32x2,
1036	elm:         i32,
1037	len:         0x2,
1038	inner:       i32x2,
1039	pretty_size: "32",
1040	pretty_len:  "2",
1041}
1042
1043def_mask! {
1044	ident:       Mask32x3,
1045	elm:         i32,
1046	len:         0x3,
1047	inner:       i32x3,
1048	pretty_size: "32",
1049	pretty_len:  "3",
1050}
1051
1052def_mask! {
1053	ident:       Mask32x4,
1054	elm:         i32,
1055	len:         0x4,
1056	inner:       i32x4,
1057	pretty_size: "32",
1058	pretty_len:  "4",
1059}
1060
1061def_mask! {
1062	ident:       Mask32x5,
1063	elm:         i32,
1064	len:         0x5,
1065	inner:       i32x5,
1066	pretty_size: "32",
1067	pretty_len:  "5",
1068}
1069
1070def_mask! {
1071	ident:       Mask32x6,
1072	elm:         i32,
1073	len:         0x6,
1074	inner:       i32x6,
1075	pretty_size: "32",
1076	pretty_len:  "6",
1077}
1078
1079def_mask! {
1080	ident:       Mask32x7,
1081	elm:         i32,
1082	len:         0x7,
1083	inner:       i32x7,
1084	pretty_size: "32",
1085	pretty_len:  "7",
1086}
1087
1088def_mask! {
1089	ident:       Mask32x8,
1090	elm:         i32,
1091	len:         0x8,
1092	inner:       i32x8,
1093	pretty_size: "32",
1094	pretty_len:  "8",
1095}
1096
1097def_mask! {
1098	ident:       Mask32x9,
1099	elm:         i32,
1100	len:         0x9,
1101	inner:       i32x9,
1102	pretty_size: "32",
1103	pretty_len:  "9",
1104}
1105
1106def_mask! {
1107	ident:       Mask32x10,
1108	elm:         i32,
1109	len:         0xA,
1110	inner:       i32x10,
1111	pretty_size: "32",
1112	pretty_len:  "10",
1113}
1114
1115def_mask! {
1116	ident:       Mask32x11,
1117	elm:         i32,
1118	len:         0xB,
1119	inner:       i32x11,
1120	pretty_size: "32",
1121	pretty_len:  "11",
1122}
1123
1124def_mask! {
1125	ident:       Mask32x12,
1126	elm:         i32,
1127	len:         0xC,
1128	inner:       i32x12,
1129	pretty_size: "32",
1130	pretty_len:  "12",
1131}
1132
1133def_mask! {
1134	ident:       Mask32x13,
1135	elm:         i32,
1136	len:         0xD,
1137	inner:       i32x13,
1138	pretty_size: "32",
1139	pretty_len:  "13",
1140}
1141
1142def_mask! {
1143	ident:       Mask32x14,
1144	elm:         i32,
1145	len:         0xE,
1146	inner:       i32x14,
1147	pretty_size: "32",
1148	pretty_len:  "14",
1149}
1150
1151def_mask! {
1152	ident:       Mask32x15,
1153	elm:         i32,
1154	len:         0xF,
1155	inner:       i32x15,
1156	pretty_size: "32",
1157	pretty_len:  "15",
1158}
1159
1160def_mask! {
1161	ident:       Mask32x16,
1162	elm:         i32,
1163	len:         0x10,
1164	inner:       i32x16,
1165	pretty_size: "32",
1166	pretty_len:  "16",
1167}
1168
1169def_mask! {
1170	ident:       Mask64x1,
1171	elm:         i64,
1172	len:         0x1,
1173	inner:       i64x1,
1174	pretty_size: "64",
1175	pretty_len:  "1",
1176}
1177
1178def_mask! {
1179	ident:       Mask64x2,
1180	elm:         i64,
1181	len:         0x2,
1182	inner:       i64x2,
1183	pretty_size: "64",
1184	pretty_len:  "2",
1185}
1186
1187def_mask! {
1188	ident:       Mask64x3,
1189	elm:         i64,
1190	len:         0x3,
1191	inner:       i64x3,
1192	pretty_size: "64",
1193	pretty_len:  "3",
1194}
1195
1196def_mask! {
1197	ident:       Mask64x4,
1198	elm:         i64,
1199	len:         0x4,
1200	inner:       i64x4,
1201	pretty_size: "64",
1202	pretty_len:  "4",
1203}
1204
1205def_mask! {
1206	ident:       Mask64x5,
1207	elm:         i64,
1208	len:         0x5,
1209	inner:       i64x5,
1210	pretty_size: "64",
1211	pretty_len:  "5",
1212}
1213
1214def_mask! {
1215	ident:       Mask64x6,
1216	elm:         i64,
1217	len:         0x6,
1218	inner:       i64x6,
1219	pretty_size: "64",
1220	pretty_len:  "6",
1221}
1222
1223def_mask! {
1224	ident:       Mask64x7,
1225	elm:         i64,
1226	len:         0x7,
1227	inner:       i64x7,
1228	pretty_size: "64",
1229	pretty_len:  "7",
1230}
1231
1232def_mask! {
1233	ident:       Mask64x8,
1234	elm:         i64,
1235	len:         0x8,
1236	inner:       i64x8,
1237	pretty_size: "64",
1238	pretty_len:  "8",
1239}
1240
1241def_mask! {
1242	ident:       Mask128x1,
1243	elm:         i128,
1244	len:         0x1,
1245	inner:       i128x1,
1246	pretty_size: "128",
1247	pretty_len:  "1",
1248}
1249
1250def_mask! {
1251	ident:       Mask128x2,
1252	elm:         i128,
1253	len:         0x2,
1254	inner:       i128x2,
1255	pretty_size: "128",
1256	pretty_len:  "2",
1257}
1258
1259def_mask! {
1260	ident:       Mask128x3,
1261	elm:         i128,
1262	len:         0x3,
1263	inner:       i128x3,
1264	pretty_size: "128",
1265	pretty_len:  "3",
1266}
1267
1268def_mask! {
1269	ident:       Mask128x4,
1270	elm:         i128,
1271	len:         0x4,
1272	inner:       i128x4,
1273	pretty_size: "128",
1274	pretty_len:  "4",
1275}