Skip to main content

core/stdarch/crates/core_arch/src/loongarch64/lasx/
portable.rs

1//! LoongArch64 LASX intrinsics - intrinsics::simd implementation
2
3use super::super::{simd::*, *};
4use crate::core_arch::simd::*;
5use crate::intrinsics::simd::*;
6use crate::mem::transmute;
7
8#[inline(always)]
9#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
10const unsafe fn simd_ext_pickev_b<T: Copy>(a: T, b: T) -> T {
11    simd_shuffle!(
12        b,
13        a,
14        [
15            0, 2, 4, 6, 8, 10, 12, 14, 32, 34, 36, 38, 40, 42, 44, 46,
16            16, 18, 20, 22, 24, 26, 28, 30, 48, 50, 52, 54, 56, 58, 60, 62
17        ]
18    )
19}
20
21#[inline(always)]
22#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
23const unsafe fn simd_ext_pickev_h<T: Copy>(a: T, b: T) -> T {
24    simd_shuffle!(b, a, [0, 2, 4, 6, 16, 18, 20, 22, 8, 10, 12, 14, 24, 26, 28, 30])
25}
26
27#[inline(always)]
28#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
29const unsafe fn simd_ext_pickev_w<T: Copy>(a: T, b: T) -> T {
30    simd_shuffle!(b, a, [0, 2, 8, 10, 4, 6, 12, 14])
31}
32
33#[inline(always)]
34#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
35const unsafe fn simd_ext_pickev_d<T: Copy>(a: T, b: T) -> T {
36    simd_shuffle!(b, a, [0, 4, 2, 6])
37}
38
39#[inline(always)]
40#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
41const unsafe fn simd_ext_pickod_b<T: Copy>(a: T, b: T) -> T {
42    simd_shuffle!(
43        b,
44        a,
45        [
46            1, 3, 5, 7, 9, 11, 13, 15, 33, 35, 37, 39, 41, 43, 45, 47,
47            17, 19, 21, 23, 25, 27, 29, 31, 49, 51, 53, 55, 57, 59, 61, 63
48        ]
49    )
50}
51
52#[inline(always)]
53#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
54const unsafe fn simd_ext_pickod_h<T: Copy>(a: T, b: T) -> T {
55    simd_shuffle!(b, a, [1, 3, 5, 7, 17, 19, 21, 23, 9, 11, 13, 15, 25, 27, 29, 31])
56}
57
58#[inline(always)]
59#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
60const unsafe fn simd_ext_pickod_w<T: Copy>(a: T, b: T) -> T {
61    simd_shuffle!(b, a, [1, 3, 9, 11, 5, 7, 13, 15])
62}
63
64#[inline(always)]
65#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
66const unsafe fn simd_ext_pickod_d<T: Copy>(a: T, b: T) -> T {
67    simd_shuffle!(b, a, [1, 5, 3, 7])
68}
69
70#[inline(always)]
71#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
72const unsafe fn simd_ext_ilvh_b<T: Copy>(a: T, b: T) -> T {
73    simd_shuffle!(
74        b,
75        a,
76        [
77            8, 40, 9, 41, 10, 42, 11, 43, 12, 44, 13, 45, 14, 46, 15, 47,
78            24, 56, 25, 57, 26, 58, 27, 59, 28, 60, 29, 61, 30, 62, 31, 63
79        ]
80    )
81}
82
83#[inline(always)]
84#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
85const unsafe fn simd_ext_ilvh_h<T: Copy>(a: T, b: T) -> T {
86    simd_shuffle!(b, a, [4, 20, 5, 21, 6, 22, 7, 23, 12, 28, 13, 29, 14, 30, 15, 31])
87}
88
89#[inline(always)]
90#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
91const unsafe fn simd_ext_ilvh_w<T: Copy>(a: T, b: T) -> T {
92    simd_shuffle!(b, a, [2, 10, 3, 11, 6, 14, 7, 15])
93}
94
95#[inline(always)]
96#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
97const unsafe fn simd_ext_ilvh_d<T: Copy>(a: T, b: T) -> T {
98    simd_shuffle!(b, a, [1, 5, 3, 7])
99}
100
101#[inline(always)]
102#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
103const unsafe fn simd_ext_ilvl_b<T: Copy>(a: T, b: T) -> T {
104    simd_shuffle!(
105        b,
106        a,
107        [
108            0, 32, 1, 33, 2, 34, 3, 35, 4, 36, 5, 37, 6, 38, 7, 39,
109            16, 48, 17, 49, 18, 50, 19, 51, 20, 52, 21, 53, 22, 54, 23, 55
110        ]
111    )
112}
113
114#[inline(always)]
115#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
116const unsafe fn simd_ext_ilvl_h<T: Copy>(a: T, b: T) -> T {
117    simd_shuffle!(b, a, [0, 16, 1, 17, 2, 18, 3, 19, 8, 24, 9, 25, 10, 26, 11, 27])
118}
119
120#[inline(always)]
121#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
122const unsafe fn simd_ext_ilvl_w<T: Copy>(a: T, b: T) -> T {
123    simd_shuffle!(b, a, [0, 8, 1, 9, 4, 12, 5, 13])
124}
125
126#[inline(always)]
127#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
128const unsafe fn simd_ext_ilvl_d<T: Copy>(a: T, b: T) -> T {
129    simd_shuffle!(b, a, [0, 4, 2, 6])
130}
131
132#[inline(always)]
133#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
134const unsafe fn simd_ext_replvei_b<const I: u32, T: Copy>(a: T) -> T {
135    simd_shuffle!(
136        a,
137        a,
138        [
139            I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,
140            I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16,
141            I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16
142        ]
143    )
144}
145
146#[inline(always)]
147#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
148const unsafe fn simd_ext_replvei_h<const I: u32, T: Copy>(a: T) -> T {
149    simd_shuffle!(
150        a,
151        a,
152        [
153            I, I, I, I, I, I, I, I,
154            I + 8, I + 8, I + 8, I + 8, I + 8, I + 8, I + 8, I + 8
155        ]
156    )
157}
158
159#[inline(always)]
160#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
161const unsafe fn simd_ext_replvei_w<const I: u32, T: Copy>(a: T) -> T {
162    simd_shuffle!(a, a, [I, I, I, I, I + 4, I + 4, I + 4, I + 4])
163}
164
165#[inline(always)]
166#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
167const unsafe fn simd_ext_replvei_d<const I: u32, T: Copy>(a: T) -> T {
168    simd_shuffle!(a, a, [I, I, I + 2, I + 2])
169}
170
171#[inline(always)]
172#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
173const unsafe fn simd_ext_replve0_b<T: Copy>(a: T) -> T {
174    simd_shuffle!(
175        a,
176        a,
177        [
178            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
179            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
180        ]
181    )
182}
183
184#[inline(always)]
185#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
186const unsafe fn simd_ext_replve0_h<T: Copy>(a: T) -> T {
187    simd_shuffle!(a, a, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
188}
189
190#[inline(always)]
191#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
192const unsafe fn simd_ext_replve0_w<T: Copy>(a: T) -> T {
193    simd_shuffle!(a, a, [0, 0, 0, 0, 0, 0, 0, 0])
194}
195
196#[inline(always)]
197#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
198const unsafe fn simd_ext_replve0_d<T: Copy>(a: T) -> T {
199    simd_shuffle!(a, a, [0, 0, 0, 0])
200}
201
202#[inline(always)]
203#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
204const unsafe fn simd_ext_replve0_q<T: Copy>(a: T) -> T {
205    simd_shuffle!(a, a, [0, 1, 0, 1])
206}
207
208#[inline(always)]
209#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
210const unsafe fn simd_ext_packev_b<T: Copy>(a: T, b: T) -> T {
211    simd_shuffle!(
212        b,
213        a,
214        [
215            0, 32, 2, 34, 4, 36, 6, 38, 8, 40, 10, 42, 12, 44, 14, 46,
216            16, 48, 18, 50, 20, 52, 22, 54, 24, 56, 26, 58, 28, 60, 30, 62
217        ]
218    )
219}
220
221#[inline(always)]
222#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
223const unsafe fn simd_ext_packev_h<T: Copy>(a: T, b: T) -> T {
224    simd_shuffle!(b, a, [0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30])
225}
226
227#[inline(always)]
228#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
229const unsafe fn simd_ext_packev_w<T: Copy>(a: T, b: T) -> T {
230    simd_shuffle!(b, a, [0, 8, 2, 10, 4, 12, 6, 14])
231}
232
233#[inline(always)]
234#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
235const unsafe fn simd_ext_packev_d<T: Copy>(a: T, b: T) -> T {
236    simd_shuffle!(b, a, [0, 4, 2, 6])
237}
238
239#[inline(always)]
240#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
241const unsafe fn simd_ext_packod_b<T: Copy>(a: T, b: T) -> T {
242    simd_shuffle!(
243        b,
244        a,
245        [
246            1, 33, 3, 35, 5, 37, 7, 39, 9, 41, 11, 43, 13, 45, 15, 47,
247            17, 49, 19, 51, 21, 53, 23, 55, 25, 57, 27, 59, 29, 61, 31, 63
248        ]
249    )
250}
251
252#[inline(always)]
253#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
254const unsafe fn simd_ext_packod_h<T: Copy>(a: T, b: T) -> T {
255    simd_shuffle!(b, a, [1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31])
256}
257
258#[inline(always)]
259#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
260const unsafe fn simd_ext_packod_w<T: Copy>(a: T, b: T) -> T {
261    simd_shuffle!(b, a, [1, 9, 3, 11, 5, 13, 7, 15])
262}
263
264#[inline(always)]
265#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
266const unsafe fn simd_ext_packod_d<T: Copy>(a: T, b: T) -> T {
267    simd_shuffle!(b, a, [1, 5, 3, 7])
268}
269
270#[inline(always)]
271#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
272const unsafe fn simd_ext_shuf4i_b<const I: u32, T: Copy>(a: T) -> T {
273    simd_shuffle!(
274        a,
275        a,
276        [
277            ((I >> 0) & 3) + 0, ((I >> 2) & 3) + 0, ((I >> 4) & 3) + 0, ((I >> 6) & 3) + 0,
278            ((I >> 0) & 3) + 4, ((I >> 2) & 3) + 4, ((I >> 4) & 3) + 4, ((I >> 6) & 3) + 4,
279            ((I >> 0) & 3) + 8, ((I >> 2) & 3) + 8, ((I >> 4) & 3) + 8, ((I >> 6) & 3) + 8,
280            ((I >> 0) & 3) + 12, ((I >> 2) & 3) + 12, ((I >> 4) & 3) + 12, ((I >> 6) & 3) + 12,
281            ((I >> 0) & 3) + 16, ((I >> 2) & 3) + 16, ((I >> 4) & 3) + 16, ((I >> 6) & 3) + 16,
282            ((I >> 0) & 3) + 20, ((I >> 2) & 3) + 20, ((I >> 4) & 3) + 20, ((I >> 6) & 3) + 20,
283            ((I >> 0) & 3) + 24, ((I >> 2) & 3) + 24, ((I >> 4) & 3) + 24, ((I >> 6) & 3) + 24,
284            ((I >> 0) & 3) + 28, ((I >> 2) & 3) + 28, ((I >> 4) & 3) + 28, ((I >> 6) & 3) + 28
285        ]
286    )
287}
288
289#[inline(always)]
290#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
291const unsafe fn simd_ext_shuf4i_h<const I: u32, T: Copy>(a: T) -> T {
292    simd_shuffle!(
293        a,
294        a,
295        [
296            ((I >> 0) & 3) + 0, ((I >> 2) & 3) + 0, ((I >> 4) & 3) + 0, ((I >> 6) & 3) + 0,
297            ((I >> 0) & 3) + 4, ((I >> 2) & 3) + 4, ((I >> 4) & 3) + 4, ((I >> 6) & 3) + 4,
298            ((I >> 0) & 3) + 8, ((I >> 2) & 3) + 8, ((I >> 4) & 3) + 8, ((I >> 6) & 3) + 8,
299            ((I >> 0) & 3) + 12, ((I >> 2) & 3) + 12, ((I >> 4) & 3) + 12, ((I >> 6) & 3) + 12,
300        ]
301    )
302}
303
304#[inline(always)]
305#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
306const unsafe fn simd_ext_shuf4i_w<const I: u32, T: Copy>(a: T) -> T {
307    simd_shuffle!(
308        a,
309        a,
310        [
311            ((I >> 0) & 3) + 0, ((I >> 2) & 3) + 0, ((I >> 4) & 3) + 0, ((I >> 6) & 3) + 0,
312            ((I >> 0) & 3) + 4, ((I >> 2) & 3) + 4, ((I >> 4) & 3) + 4, ((I >> 6) & 3) + 4
313        ]
314    )
315}
316
317#[inline(always)]
318#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
319pub(super) const unsafe fn simd_ext_bsll<const I: u32, T: Copy + const SimdExt>(a: T) -> T {
320    let z = simd_ext_splat(0);
321    match I & 0xf {
322        0 => simd_shuffle!(
323            a,
324            z,
325            [
326                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
327                16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
328            ]
329        ),
330        1 => simd_shuffle!(
331            a,
332            z,
333            [
334                32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
335                32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
336            ]
337        ),
338        2 => simd_shuffle!(
339            a,
340            z,
341            [
342                32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
343                32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
344            ]
345        ),
346        3 => simd_shuffle!(
347            a,
348            z,
349            [
350                32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
351                32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
352            ]
353        ),
354        4 => simd_shuffle!(
355            a,
356            z,
357            [
358                32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
359                32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
360            ]
361        ),
362        5 => simd_shuffle!(
363            a,
364            z,
365            [
366                32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
367                32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
368            ]
369        ),
370        6 => simd_shuffle!(
371            a,
372            z,
373            [
374                32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
375                32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
376            ]
377        ),
378        7 => simd_shuffle!(
379            a,
380            z,
381            [
382                32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7, 8,
383                32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23, 24,
384            ]
385        ),
386        8 => simd_shuffle!(
387            a,
388            z,
389            [
390                32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6, 7,
391                32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22, 23,
392            ]
393        ),
394        9 => simd_shuffle!(
395            a,
396            z,
397            [
398                32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5, 6,
399                32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21, 22,
400            ]
401        ),
402        10 => simd_shuffle!(
403            a,
404            z,
405            [
406                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4, 5,
407                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20, 21,
408            ]
409        ),
410        11 => simd_shuffle!(
411            a,
412            z,
413            [
414                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3, 4,
415                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19, 20,
416            ]
417        ),
418        12 => simd_shuffle!(
419            a,
420            z,
421            [
422                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2, 3,
423                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18, 19,
424            ]
425        ),
426        13 => simd_shuffle!(
427            a,
428            z,
429            [
430                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1, 2,
431                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17, 18,
432            ]
433        ),
434        14 => simd_shuffle!(
435            a,
436            z,
437            [
438                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 1,
439                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 17,
440            ]
441        ),
442        15 => simd_shuffle!(
443            a,
444            z,
445            [
446                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0,
447                32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16,
448            ]
449        ),
450        _ => unreachable!(),
451    }
452}
453
454#[inline(always)]
455#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
456pub(super) const unsafe fn simd_ext_bsrl<const I: u32, T: Copy + const SimdExt>(a: T) -> T {
457    let z = simd_ext_splat(0);
458    match I & 0xf {
459        0 => simd_shuffle!(
460            a,
461            z,
462            [
463                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
464                16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
465            ]
466        ),
467        1 => simd_shuffle!(
468            a,
469            z,
470            [
471                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32,
472                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
473            ]
474        ),
475        2 => simd_shuffle!(
476            a,
477            z,
478            [
479                2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32,
480                18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32
481            ]
482        ),
483        3 => simd_shuffle!(
484            a,
485            z,
486            [
487                3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32,
488                19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32
489            ]
490        ),
491        4 => simd_shuffle!(
492            a,
493            z,
494            [
495                4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32,
496                20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32
497            ]
498        ),
499        5 => simd_shuffle!(
500            a,
501            z,
502            [
503                5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32,
504                21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32
505            ]
506        ),
507        6 => simd_shuffle!(
508            a,
509            z,
510            [
511                6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32,
512                22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32
513            ]
514        ),
515        7 => simd_shuffle!(
516            a,
517            z,
518            [
519                7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32,
520                23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32
521            ]
522        ),
523        8 => simd_shuffle!(
524            a,
525            z,
526            [
527                8, 9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32,
528                24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32
529            ]
530        ),
531        9 => simd_shuffle!(
532            a,
533            z,
534            [
535                9, 10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32,
536                25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32
537            ]
538        ),
539        10 => simd_shuffle!(
540            a,
541            z,
542            [
543                10, 11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
544                26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
545            ]
546        ),
547        11 => simd_shuffle!(
548            a,
549            z,
550            [
551                11, 12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
552                27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
553            ]
554        ),
555        12 => simd_shuffle!(
556            a,
557            z,
558            [
559                12, 13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
560                28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
561            ]
562        ),
563        13 => simd_shuffle!(
564            a,
565            z,
566            [
567                13, 14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
568                29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
569            ]
570        ),
571        14 => simd_shuffle!(
572            a,
573            z,
574            [
575                14, 15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
576                30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
577            ]
578        ),
579        15 => simd_shuffle!(
580            a,
581            z,
582            [
583                15, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
584                31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
585            ]
586        ),
587        _ => unreachable!(),
588    }
589}
590
591impl_vv!("lasx", lasx_xvpcnt_b, simd_ctpop, m256i, i8x32);
592impl_vv!("lasx", lasx_xvpcnt_h, simd_ctpop, m256i, i16x16);
593impl_vv!("lasx", lasx_xvpcnt_w, simd_ctpop, m256i, i32x8);
594impl_vv!("lasx", lasx_xvpcnt_d, simd_ctpop, m256i, i64x4);
595impl_vv!("lasx", lasx_xvclz_b, simd_ctlz, m256i, i8x32);
596impl_vv!("lasx", lasx_xvclz_h, simd_ctlz, m256i, i16x16);
597impl_vv!("lasx", lasx_xvclz_w, simd_ctlz, m256i, i32x8);
598impl_vv!("lasx", lasx_xvclz_d, simd_ctlz, m256i, i64x4);
599impl_vv!("lasx", lasx_xvneg_b, simd_neg, m256i, i8x32);
600impl_vv!("lasx", lasx_xvneg_h, simd_neg, m256i, i16x16);
601impl_vv!("lasx", lasx_xvneg_w, simd_neg, m256i, i32x8);
602impl_vv!("lasx", lasx_xvneg_d, simd_neg, m256i, i64x4);
603impl_vv!("lasx", lasx_xvfsqrt_s, simd_fsqrt, m256, f32x8);
604impl_vv!("lasx", lasx_xvfsqrt_d, simd_fsqrt, m256d, f64x4);
605impl_vv!("lasx", lasx_xvfrsqrt_s, simd_ext_frsqrt_s, m256, f32x8);
606impl_vv!("lasx", lasx_xvfrsqrt_d, simd_ext_frsqrt_d, m256d, f64x4);
607impl_vv!("lasx", lasx_xvfrecip_s, simd_ext_frecip_s, m256, f32x8);
608impl_vv!("lasx", lasx_xvfrecip_d, simd_ext_frecip_d, m256d, f64x4);
609impl_vv!("lasx", lasx_xvfrintrp_s, simd_ceil, m256, f32x8);
610impl_vv!("lasx", lasx_xvfrintrp_d, simd_ceil, m256d, f64x4);
611impl_vv!("lasx", lasx_xvfrintrm_s, simd_floor, m256, f32x8);
612impl_vv!("lasx", lasx_xvfrintrm_d, simd_floor, m256d, f64x4);
613impl_vv!("lasx", lasx_xvfrintrz_s, simd_trunc, m256, f32x8);
614impl_vv!("lasx", lasx_xvfrintrz_d, simd_trunc, m256d, f64x4);
615impl_vv!("lasx", lasx_xvreplve0_b, simd_ext_replve0_b, m256i, i8x32);
616impl_vv!("lasx", lasx_xvreplve0_h, simd_ext_replve0_h, m256i, i16x16);
617impl_vv!("lasx", lasx_xvreplve0_w, simd_ext_replve0_w, m256i, i32x8);
618impl_vv!("lasx", lasx_xvreplve0_d, simd_ext_replve0_d, m256i, i64x4);
619impl_vv!("lasx", lasx_xvreplve0_q, simd_ext_replve0_q, m256i, i64x4);
620
621impl_gv!("lasx", lasx_xvreplgr2vr_b, simd_ext_splat, m256i, i8x32, i32);
622impl_gv!("lasx", lasx_xvreplgr2vr_h, simd_ext_splat, m256i, i16x16, i32);
623impl_gv!("lasx", lasx_xvreplgr2vr_w, simd_ext_splat, m256i, i32x8, i32);
624impl_gv!("lasx", lasx_xvreplgr2vr_d, simd_ext_splat, m256i, i64x4, i64);
625
626impl_ggv!("lasx", lasx_xvldx, simd_ext_ldx, m256i, i8x32, *const i8, i64, unsafe);
627
628impl_gsv!("lasx", lasx_xvld, simd_ext_ld, m256i, i8x32, *const i8, 12, const, unsafe);
629
630impl_sv!("lasx", lasx_xvrepli_b, simd_ext_splat, m256i, i8x32, 10);
631impl_sv!("lasx", lasx_xvrepli_h, simd_ext_splat, m256i, i16x16, 10);
632impl_sv!("lasx", lasx_xvrepli_w, simd_ext_splat, m256i, i32x8, 10);
633impl_sv!("lasx", lasx_xvrepli_d, simd_ext_splat, m256i, i64x4, 10);
634impl_sv!("lasx", lasx_xvldi, simd_ext_ldi, m256i, i64x4, 13, const);
635
636impl_vvv!("lasx", lasx_xvadd_b, simd_add, m256i, i8x32);
637impl_vvv!("lasx", lasx_xvadd_h, simd_add, m256i, i16x16);
638impl_vvv!("lasx", lasx_xvadd_w, simd_add, m256i, i32x8);
639impl_vvv!("lasx", lasx_xvadd_d, simd_add, m256i, i64x4);
640impl_vvv!("lasx", lasx_xvsub_b, simd_sub, m256i, i8x32);
641impl_vvv!("lasx", lasx_xvsub_h, simd_sub, m256i, i16x16);
642impl_vvv!("lasx", lasx_xvsub_w, simd_sub, m256i, i32x8);
643impl_vvv!("lasx", lasx_xvsub_d, simd_sub, m256i, i64x4);
644impl_vvv!("lasx", lasx_xvmax_b, simd_imax, m256i, i8x32);
645impl_vvv!("lasx", lasx_xvmax_h, simd_imax, m256i, i16x16);
646impl_vvv!("lasx", lasx_xvmax_w, simd_imax, m256i, i32x8);
647impl_vvv!("lasx", lasx_xvmax_d, simd_imax, m256i, i64x4);
648impl_vvv!("lasx", lasx_xvmax_bu, simd_imax, m256i, u8x32);
649impl_vvv!("lasx", lasx_xvmax_hu, simd_imax, m256i, u16x16);
650impl_vvv!("lasx", lasx_xvmax_wu, simd_imax, m256i, u32x8);
651impl_vvv!("lasx", lasx_xvmax_du, simd_imax, m256i, u64x4);
652impl_vvv!("lasx", lasx_xvmin_b, simd_imin, m256i, i8x32);
653impl_vvv!("lasx", lasx_xvmin_h, simd_imin, m256i, i16x16);
654impl_vvv!("lasx", lasx_xvmin_w, simd_imin, m256i, i32x8);
655impl_vvv!("lasx", lasx_xvmin_d, simd_imin, m256i, i64x4);
656impl_vvv!("lasx", lasx_xvmin_bu, simd_imin, m256i, u8x32);
657impl_vvv!("lasx", lasx_xvmin_hu, simd_imin, m256i, u16x16);
658impl_vvv!("lasx", lasx_xvmin_wu, simd_imin, m256i, u32x8);
659impl_vvv!("lasx", lasx_xvmin_du, simd_imin, m256i, u64x4);
660impl_vvv!("lasx", lasx_xvseq_b, simd_eq, m256i, i8x32);
661impl_vvv!("lasx", lasx_xvseq_h, simd_eq, m256i, i16x16);
662impl_vvv!("lasx", lasx_xvseq_w, simd_eq, m256i, i32x8);
663impl_vvv!("lasx", lasx_xvseq_d, simd_eq, m256i, i64x4);
664impl_vvv!("lasx", lasx_xvslt_b, simd_lt, m256i, i8x32);
665impl_vvv!("lasx", lasx_xvslt_h, simd_lt, m256i, i16x16);
666impl_vvv!("lasx", lasx_xvslt_w, simd_lt, m256i, i32x8);
667impl_vvv!("lasx", lasx_xvslt_d, simd_lt, m256i, i64x4);
668impl_vvv!("lasx", lasx_xvslt_bu, simd_lt, m256i, u8x32);
669impl_vvv!("lasx", lasx_xvslt_hu, simd_lt, m256i, u16x16);
670impl_vvv!("lasx", lasx_xvslt_wu, simd_lt, m256i, u32x8);
671impl_vvv!("lasx", lasx_xvslt_du, simd_lt, m256i, u64x4);
672impl_vvv!("lasx", lasx_xvsle_b, simd_le, m256i, i8x32);
673impl_vvv!("lasx", lasx_xvsle_h, simd_le, m256i, i16x16);
674impl_vvv!("lasx", lasx_xvsle_w, simd_le, m256i, i32x8);
675impl_vvv!("lasx", lasx_xvsle_d, simd_le, m256i, i64x4);
676impl_vvv!("lasx", lasx_xvsle_bu, simd_le, m256i, u8x32);
677impl_vvv!("lasx", lasx_xvsle_hu, simd_le, m256i, u16x16);
678impl_vvv!("lasx", lasx_xvsle_wu, simd_le, m256i, u32x8);
679impl_vvv!("lasx", lasx_xvsle_du, simd_le, m256i, u64x4);
680impl_vvv!("lasx", lasx_xvmul_b, simd_mul, m256i, i8x32);
681impl_vvv!("lasx", lasx_xvmul_h, simd_mul, m256i, i16x16);
682impl_vvv!("lasx", lasx_xvmul_w, simd_mul, m256i, i32x8);
683impl_vvv!("lasx", lasx_xvmul_d, simd_mul, m256i, i64x4);
684impl_vvv!("lasx", lasx_xvdiv_b, simd_div, m256i, i8x32);
685impl_vvv!("lasx", lasx_xvdiv_h, simd_div, m256i, i16x16);
686impl_vvv!("lasx", lasx_xvdiv_w, simd_div, m256i, i32x8);
687impl_vvv!("lasx", lasx_xvdiv_d, simd_div, m256i, i64x4);
688impl_vvv!("lasx", lasx_xvdiv_bu, simd_div, m256i, u8x32);
689impl_vvv!("lasx", lasx_xvdiv_hu, simd_div, m256i, u16x16);
690impl_vvv!("lasx", lasx_xvdiv_wu, simd_div, m256i, u32x8);
691impl_vvv!("lasx", lasx_xvdiv_du, simd_div, m256i, u64x4);
692impl_vvv!("lasx", lasx_xvmod_b, simd_rem, m256i, i8x32);
693impl_vvv!("lasx", lasx_xvmod_h, simd_rem, m256i, i16x16);
694impl_vvv!("lasx", lasx_xvmod_w, simd_rem, m256i, i32x8);
695impl_vvv!("lasx", lasx_xvmod_d, simd_rem, m256i, i64x4);
696impl_vvv!("lasx", lasx_xvmod_bu, simd_rem, m256i, u8x32);
697impl_vvv!("lasx", lasx_xvmod_hu, simd_rem, m256i, u16x16);
698impl_vvv!("lasx", lasx_xvmod_wu, simd_rem, m256i, u32x8);
699impl_vvv!("lasx", lasx_xvmod_du, simd_rem, m256i, u64x4);
700impl_vvv!("lasx", lasx_xvand_v, simd_and, m256i, u8x32);
701impl_vvv!("lasx", lasx_xvandn_v, simd_ext_andn, m256i, u8x32);
702impl_vvv!("lasx", lasx_xvor_v, simd_or, m256i, u8x32);
703impl_vvv!("lasx", lasx_xvorn_v, simd_ext_orn, m256i, u8x32);
704impl_vvv!("lasx", lasx_xvnor_v, simd_ext_nor, m256i, u8x32);
705impl_vvv!("lasx", lasx_xvxor_v, simd_xor, m256i, u8x32);
706impl_vvv!("lasx", lasx_xvfadd_s, simd_add, m256, f32x8);
707impl_vvv!("lasx", lasx_xvfadd_d, simd_add, m256d, f64x4);
708impl_vvv!("lasx", lasx_xvfsub_s, simd_sub, m256, f32x8);
709impl_vvv!("lasx", lasx_xvfsub_d, simd_sub, m256d, f64x4);
710impl_vvv!("lasx", lasx_xvfmul_s, simd_mul, m256, f32x8);
711impl_vvv!("lasx", lasx_xvfmul_d, simd_mul, m256d, f64x4);
712impl_vvv!("lasx", lasx_xvfdiv_s, simd_div, m256, f32x8);
713impl_vvv!("lasx", lasx_xvfdiv_d, simd_div, m256d, f64x4);
714impl_vvv!("lasx", lasx_xvsll_b, simd_ext_shl, m256i, i8x32);
715impl_vvv!("lasx", lasx_xvsll_h, simd_ext_shl, m256i, i16x16);
716impl_vvv!("lasx", lasx_xvsll_w, simd_ext_shl, m256i, i32x8);
717impl_vvv!("lasx", lasx_xvsll_d, simd_ext_shl, m256i, i64x4);
718impl_vvv!("lasx", lasx_xvsra_b, simd_ext_shr, m256i, i8x32);
719impl_vvv!("lasx", lasx_xvsra_h, simd_ext_shr, m256i, i16x16);
720impl_vvv!("lasx", lasx_xvsra_w, simd_ext_shr, m256i, i32x8);
721impl_vvv!("lasx", lasx_xvsra_d, simd_ext_shr, m256i, i64x4);
722impl_vvv!("lasx", lasx_xvsrl_b, simd_ext_shr, m256i, u8x32);
723impl_vvv!("lasx", lasx_xvsrl_h, simd_ext_shr, m256i, u16x16);
724impl_vvv!("lasx", lasx_xvsrl_w, simd_ext_shr, m256i, u32x8);
725impl_vvv!("lasx", lasx_xvsrl_d, simd_ext_shr, m256i, u64x4);
726impl_vvv!("lasx", lasx_xvrotr_b, simd_ext_rotr, m256i, u8x32);
727impl_vvv!("lasx", lasx_xvrotr_h, simd_ext_rotr, m256i, u16x16);
728impl_vvv!("lasx", lasx_xvrotr_w, simd_ext_rotr, m256i, u32x8);
729impl_vvv!("lasx", lasx_xvrotr_d, simd_ext_rotr, m256i, u64x4);
730impl_vvv!("lasx", lasx_xvbitclr_b, simd_ext_bitclr, m256i, u8x32);
731impl_vvv!("lasx", lasx_xvbitclr_h, simd_ext_bitclr, m256i, u16x16);
732impl_vvv!("lasx", lasx_xvbitclr_w, simd_ext_bitclr, m256i, u32x8);
733impl_vvv!("lasx", lasx_xvbitclr_d, simd_ext_bitclr, m256i, u64x4);
734impl_vvv!("lasx", lasx_xvbitset_b, simd_ext_bitset, m256i, u8x32);
735impl_vvv!("lasx", lasx_xvbitset_h, simd_ext_bitset, m256i, u16x16);
736impl_vvv!("lasx", lasx_xvbitset_w, simd_ext_bitset, m256i, u32x8);
737impl_vvv!("lasx", lasx_xvbitset_d, simd_ext_bitset, m256i, u64x4);
738impl_vvv!("lasx", lasx_xvbitrev_b, simd_ext_bitrev, m256i, u8x32);
739impl_vvv!("lasx", lasx_xvbitrev_h, simd_ext_bitrev, m256i, u16x16);
740impl_vvv!("lasx", lasx_xvbitrev_w, simd_ext_bitrev, m256i, u32x8);
741impl_vvv!("lasx", lasx_xvbitrev_d, simd_ext_bitrev, m256i, u64x4);
742impl_vvv!("lasx", lasx_xvsadd_b, simd_saturating_add, m256i, i8x32);
743impl_vvv!("lasx", lasx_xvsadd_h, simd_saturating_add, m256i, i16x16);
744impl_vvv!("lasx", lasx_xvsadd_w, simd_saturating_add, m256i, i32x8);
745impl_vvv!("lasx", lasx_xvsadd_d, simd_saturating_add, m256i, i64x4);
746impl_vvv!("lasx", lasx_xvsadd_bu, simd_saturating_add, m256i, u8x32);
747impl_vvv!("lasx", lasx_xvsadd_hu, simd_saturating_add, m256i, u16x16);
748impl_vvv!("lasx", lasx_xvsadd_wu, simd_saturating_add, m256i, u32x8);
749impl_vvv!("lasx", lasx_xvsadd_du, simd_saturating_add, m256i, u64x4);
750impl_vvv!("lasx", lasx_xvssub_b, simd_saturating_sub, m256i, i8x32);
751impl_vvv!("lasx", lasx_xvssub_h, simd_saturating_sub, m256i, i16x16);
752impl_vvv!("lasx", lasx_xvssub_w, simd_saturating_sub, m256i, i32x8);
753impl_vvv!("lasx", lasx_xvssub_d, simd_saturating_sub, m256i, i64x4);
754impl_vvv!("lasx", lasx_xvssub_bu, simd_saturating_sub, m256i, u8x32);
755impl_vvv!("lasx", lasx_xvssub_hu, simd_saturating_sub, m256i, u16x16);
756impl_vvv!("lasx", lasx_xvssub_wu, simd_saturating_sub, m256i, u32x8);
757impl_vvv!("lasx", lasx_xvssub_du, simd_saturating_sub, m256i, u64x4);
758impl_vvv!("lasx", lasx_xvadda_b, simd_ext_adda, m256i, i8x32);
759impl_vvv!("lasx", lasx_xvadda_h, simd_ext_adda, m256i, i16x16);
760impl_vvv!("lasx", lasx_xvadda_w, simd_ext_adda, m256i, i32x8);
761impl_vvv!("lasx", lasx_xvadda_d, simd_ext_adda, m256i, i64x4);
762impl_vvv!("lasx", lasx_xvabsd_b, simd_ext_absd, m256i, i8x32);
763impl_vvv!("lasx", lasx_xvabsd_h, simd_ext_absd, m256i, i16x16);
764impl_vvv!("lasx", lasx_xvabsd_w, simd_ext_absd, m256i, i32x8);
765impl_vvv!("lasx", lasx_xvabsd_d, simd_ext_absd, m256i, i64x4);
766impl_vvv!("lasx", lasx_xvabsd_bu, simd_ext_absd, m256i, u8x32);
767impl_vvv!("lasx", lasx_xvabsd_hu, simd_ext_absd, m256i, u16x16);
768impl_vvv!("lasx", lasx_xvabsd_wu, simd_ext_absd, m256i, u32x8);
769impl_vvv!("lasx", lasx_xvabsd_du, simd_ext_absd, m256i, u64x4);
770impl_vvv!("lasx", lasx_xvmuh_b, simd_ext_muh, m256i, i8x32, i16x32);
771impl_vvv!("lasx", lasx_xvmuh_h, simd_ext_muh, m256i, i16x16, i32x16);
772impl_vvv!("lasx", lasx_xvmuh_w, simd_ext_muh, m256i, i32x8, i64x8);
773impl_vvv!("lasx", lasx_xvmuh_d, simd_ext_muh, m256i, i64x4, i128x4);
774impl_vvv!("lasx", lasx_xvmuh_bu, simd_ext_muh, m256i, u8x32, u16x32);
775impl_vvv!("lasx", lasx_xvmuh_hu, simd_ext_muh, m256i, u16x16, u32x16);
776impl_vvv!("lasx", lasx_xvmuh_wu, simd_ext_muh, m256i, u32x8, u64x8);
777impl_vvv!("lasx", lasx_xvmuh_du, simd_ext_muh, m256i, u64x4, u128x4);
778impl_vvv!("lasx", lasx_xvpickev_b, simd_ext_pickev_b, m256i, i8x32);
779impl_vvv!("lasx", lasx_xvpickev_h, simd_ext_pickev_h, m256i, i16x16);
780impl_vvv!("lasx", lasx_xvpickev_w, simd_ext_pickev_w, m256i, i32x8);
781impl_vvv!("lasx", lasx_xvpickev_d, simd_ext_pickev_d, m256i, i64x4);
782impl_vvv!("lasx", lasx_xvpickod_b, simd_ext_pickod_b, m256i, i8x32);
783impl_vvv!("lasx", lasx_xvpickod_h, simd_ext_pickod_h, m256i, i16x16);
784impl_vvv!("lasx", lasx_xvpickod_w, simd_ext_pickod_w, m256i, i32x8);
785impl_vvv!("lasx", lasx_xvpickod_d, simd_ext_pickod_d, m256i, i64x4);
786impl_vvv!("lasx", lasx_xvilvh_b, simd_ext_ilvh_b, m256i, i8x32);
787impl_vvv!("lasx", lasx_xvilvh_h, simd_ext_ilvh_h, m256i, i16x16);
788impl_vvv!("lasx", lasx_xvilvh_w, simd_ext_ilvh_w, m256i, i32x8);
789impl_vvv!("lasx", lasx_xvilvh_d, simd_ext_ilvh_d, m256i, i64x4);
790impl_vvv!("lasx", lasx_xvilvl_b, simd_ext_ilvl_b, m256i, i8x32);
791impl_vvv!("lasx", lasx_xvilvl_h, simd_ext_ilvl_h, m256i, i16x16);
792impl_vvv!("lasx", lasx_xvilvl_w, simd_ext_ilvl_w, m256i, i32x8);
793impl_vvv!("lasx", lasx_xvilvl_d, simd_ext_ilvl_d, m256i, i64x4);
794impl_vvv!("lasx", lasx_xvpackev_b, simd_ext_packev_b, m256i, i8x32);
795impl_vvv!("lasx", lasx_xvpackev_h, simd_ext_packev_h, m256i, i16x16);
796impl_vvv!("lasx", lasx_xvpackev_w, simd_ext_packev_w, m256i, i32x8);
797impl_vvv!("lasx", lasx_xvpackev_d, simd_ext_packev_d, m256i, i64x4);
798impl_vvv!("lasx", lasx_xvpackod_b, simd_ext_packod_b, m256i, i8x32);
799impl_vvv!("lasx", lasx_xvpackod_h, simd_ext_packod_h, m256i, i16x16);
800impl_vvv!("lasx", lasx_xvpackod_w, simd_ext_packod_w, m256i, i32x8);
801impl_vvv!("lasx", lasx_xvpackod_d, simd_ext_packod_d, m256i, i64x4);
802
803impl_vgg!("lasx", lasx_xvstx, simd_ext_stx, m256i, i8x32, *mut i8, i64, unsafe);
804
805impl_vgs!("lasx", lasx_xvst, simd_ext_st, m256i, i8x32, *mut i8, 12, const, unsafe);
806
807impl_vuv!("lasx", lasx_xvslli_b, simd_shl, m256i, i8x32);
808impl_vuv!("lasx", lasx_xvslli_h, simd_shl, m256i, i16x16);
809impl_vuv!("lasx", lasx_xvslli_w, simd_shl, m256i, i32x8);
810impl_vuv!("lasx", lasx_xvslli_d, simd_shl, m256i, i64x4);
811impl_vuv!("lasx", lasx_xvsrai_b, simd_shr, m256i, i8x32);
812impl_vuv!("lasx", lasx_xvsrai_h, simd_shr, m256i, i16x16);
813impl_vuv!("lasx", lasx_xvsrai_w, simd_shr, m256i, i32x8);
814impl_vuv!("lasx", lasx_xvsrai_d, simd_shr, m256i, i64x4);
815impl_vuv!("lasx", lasx_xvsrli_b, simd_shr, m256i, u8x32);
816impl_vuv!("lasx", lasx_xvsrli_h, simd_shr, m256i, u16x16);
817impl_vuv!("lasx", lasx_xvsrli_w, simd_shr, m256i, u32x8);
818impl_vuv!("lasx", lasx_xvsrli_d, simd_shr, m256i, u64x4);
819impl_vuv!("lasx", lasx_xvrotri_b, simd_ext_rotr, m256i, u8x32);
820impl_vuv!("lasx", lasx_xvrotri_h, simd_ext_rotr, m256i, u16x16);
821impl_vuv!("lasx", lasx_xvrotri_w, simd_ext_rotr, m256i, u32x8);
822impl_vuv!("lasx", lasx_xvrotri_d, simd_ext_rotr, m256i, u64x4);
823impl_vuv!("lasx", lasx_xvaddi_bu, simd_add, m256i, u8x32, 5);
824impl_vuv!("lasx", lasx_xvaddi_hu, simd_add, m256i, u16x16, 5);
825impl_vuv!("lasx", lasx_xvaddi_wu, simd_add, m256i, u32x8, 5);
826impl_vuv!("lasx", lasx_xvaddi_du, simd_add, m256i, u64x4, 5);
827impl_vuv!("lasx", lasx_xvslti_bu, simd_lt, m256i, u8x32, 5);
828impl_vuv!("lasx", lasx_xvslti_hu, simd_lt, m256i, u16x16, 5);
829impl_vuv!("lasx", lasx_xvslti_wu, simd_lt, m256i, u32x8, 5);
830impl_vuv!("lasx", lasx_xvslti_du, simd_lt, m256i, u64x4, 5);
831impl_vuv!("lasx", lasx_xvslei_bu, simd_le, m256i, u8x32, 5);
832impl_vuv!("lasx", lasx_xvslei_hu, simd_le, m256i, u16x16, 5);
833impl_vuv!("lasx", lasx_xvslei_wu, simd_le, m256i, u32x8, 5);
834impl_vuv!("lasx", lasx_xvslei_du, simd_le, m256i, u64x4, 5);
835impl_vuv!("lasx", lasx_xvmaxi_bu, simd_imax, m256i, u8x32, 5);
836impl_vuv!("lasx", lasx_xvmaxi_hu, simd_imax, m256i, u16x16, 5);
837impl_vuv!("lasx", lasx_xvmaxi_wu, simd_imax, m256i, u32x8, 5);
838impl_vuv!("lasx", lasx_xvmaxi_du, simd_imax, m256i, u64x4, 5);
839impl_vuv!("lasx", lasx_xvmini_bu, simd_imin, m256i, u8x32, 5);
840impl_vuv!("lasx", lasx_xvmini_hu, simd_imin, m256i, u16x16, 5);
841impl_vuv!("lasx", lasx_xvmini_wu, simd_imin, m256i, u32x8, 5);
842impl_vuv!("lasx", lasx_xvmini_du, simd_imin, m256i, u64x4, 5);
843impl_vuv!("lasx", lasx_xvrepl128vei_b, simd_ext_replvei_b, m256i, i8x32, 4, const);
844impl_vuv!("lasx", lasx_xvrepl128vei_h, simd_ext_replvei_h, m256i, i16x16, 3, const);
845impl_vuv!("lasx", lasx_xvrepl128vei_w, simd_ext_replvei_w, m256i, i32x8, 2, const);
846impl_vuv!("lasx", lasx_xvrepl128vei_d, simd_ext_replvei_d, m256i, i64x4, 1, const);
847impl_vuv!("lasx", lasx_xvshuf4i_b, simd_ext_shuf4i_b, m256i, i8x32, 8, const);
848impl_vuv!("lasx", lasx_xvshuf4i_h, simd_ext_shuf4i_h, m256i, i16x16, 8, const);
849impl_vuv!("lasx", lasx_xvshuf4i_w, simd_ext_shuf4i_w, m256i, i32x8, 8, const);
850impl_vuv!("lasx", lasx_xvbsll_v, simd_ext_bsll, m256i, i8x32, 5, const);
851impl_vuv!("lasx", lasx_xvbsrl_v, simd_ext_bsrl, m256i, i8x32, 5, const);
852
853impl_vug!("lasx", lasx_xvpickve2gr_w, simd_extract, m256i, i32x8, i32, 3);
854impl_vug!("lasx", lasx_xvpickve2gr_d, simd_extract, m256i, i64x4, i64, 2);
855impl_vug!("lasx", lasx_xvpickve2gr_wu, simd_extract, m256i, u32x8, u32, 3);
856impl_vug!("lasx", lasx_xvpickve2gr_du, simd_extract, m256i, u64x4, u64, 2);
857
858impl_vsv!("lasx", lasx_xvseqi_b, simd_eq, m256i, i8x32, 5);
859impl_vsv!("lasx", lasx_xvseqi_h, simd_eq, m256i, i16x16, 5);
860impl_vsv!("lasx", lasx_xvseqi_w, simd_eq, m256i, i32x8, 5);
861impl_vsv!("lasx", lasx_xvseqi_d, simd_eq, m256i, i64x4, 5);
862impl_vsv!("lasx", lasx_xvslti_b, simd_lt, m256i, i8x32, 5);
863impl_vsv!("lasx", lasx_xvslti_h, simd_lt, m256i, i16x16, 5);
864impl_vsv!("lasx", lasx_xvslti_w, simd_lt, m256i, i32x8, 5);
865impl_vsv!("lasx", lasx_xvslti_d, simd_lt, m256i, i64x4, 5);
866impl_vsv!("lasx", lasx_xvslei_b, simd_le, m256i, i8x32, 5);
867impl_vsv!("lasx", lasx_xvslei_h, simd_le, m256i, i16x16, 5);
868impl_vsv!("lasx", lasx_xvslei_w, simd_le, m256i, i32x8, 5);
869impl_vsv!("lasx", lasx_xvslei_d, simd_le, m256i, i64x4, 5);
870impl_vsv!("lasx", lasx_xvmaxi_b, simd_imax, m256i, i8x32, 5);
871impl_vsv!("lasx", lasx_xvmaxi_h, simd_imax, m256i, i16x16, 5);
872impl_vsv!("lasx", lasx_xvmaxi_w, simd_imax, m256i, i32x8, 5);
873impl_vsv!("lasx", lasx_xvmaxi_d, simd_imax, m256i, i64x4, 5);
874impl_vsv!("lasx", lasx_xvmini_b, simd_imin, m256i, i8x32, 5);
875impl_vsv!("lasx", lasx_xvmini_h, simd_imin, m256i, i16x16, 5);
876impl_vsv!("lasx", lasx_xvmini_w, simd_imin, m256i, i32x8, 5);
877impl_vsv!("lasx", lasx_xvmini_d, simd_imin, m256i, i64x4, 5);
878
879impl_vvvv!("lasx", lasx_xvmadd_b, simd_ext_madd, m256i, i8x32);
880impl_vvvv!("lasx", lasx_xvmadd_h, simd_ext_madd, m256i, i16x16);
881impl_vvvv!("lasx", lasx_xvmadd_w, simd_ext_madd, m256i, i32x8);
882impl_vvvv!("lasx", lasx_xvmadd_d, simd_ext_madd, m256i, i64x4);
883impl_vvvv!("lasx", lasx_xvmsub_b, simd_ext_msub, m256i, i8x32);
884impl_vvvv!("lasx", lasx_xvmsub_h, simd_ext_msub, m256i, i16x16);
885impl_vvvv!("lasx", lasx_xvmsub_w, simd_ext_msub, m256i, i32x8);
886impl_vvvv!("lasx", lasx_xvmsub_d, simd_ext_msub, m256i, i64x4);
887impl_vvvv!("lasx", lasx_xvfmadd_s, simd_fma, m256, f32x8);
888impl_vvvv!("lasx", lasx_xvfmadd_d, simd_fma, m256d, f64x4);
889impl_vvvv!("lasx", lasx_xvfmsub_s, simd_ext_fmsub, m256, f32x8);
890impl_vvvv!("lasx", lasx_xvfmsub_d, simd_ext_fmsub, m256d, f64x4);
891impl_vvvv!("lasx", lasx_xvfnmadd_s, simd_ext_fnmadd, m256, f32x8);
892impl_vvvv!("lasx", lasx_xvfnmadd_d, simd_ext_fnmadd, m256d, f64x4);
893impl_vvvv!("lasx", lasx_xvfnmsub_s, simd_ext_fnmsub, m256, f32x8);
894impl_vvvv!("lasx", lasx_xvfnmsub_d, simd_ext_fnmsub, m256d, f64x4);
895
896impl_vugv!("lasx", lasx_xvinsgr2vr_w, simd_insert, m256i, i32x8, i32, 3);
897impl_vugv!("lasx", lasx_xvinsgr2vr_d, simd_insert, m256i, i64x4, i64, 2);
898
899impl_vavg!("lasx", lasx_xvavg_b, m256i, i8x32, i16x32);
900impl_vavg!("lasx", lasx_xvavg_h, m256i, i16x16, i32x16);
901impl_vavg!("lasx", lasx_xvavg_w, m256i, i32x8, i64x8);
902impl_vavg!("lasx", lasx_xvavg_d, m256i, i64x4, i128x4);
903impl_vavg!("lasx", lasx_xvavg_bu, m256i, u8x32, u16x32);
904impl_vavg!("lasx", lasx_xvavg_hu, m256i, u16x16, u32x16);
905impl_vavg!("lasx", lasx_xvavg_wu, m256i, u32x8, u64x8);
906impl_vavg!("lasx", lasx_xvavg_du, m256i, u64x4, u128x4);
907
908impl_vavgr!("lasx", lasx_xvavgr_b, m256i, i8x32, i16x32);
909impl_vavgr!("lasx", lasx_xvavgr_h, m256i, i16x16, i32x16);
910impl_vavgr!("lasx", lasx_xvavgr_w, m256i, i32x8, i64x8);
911impl_vavgr!("lasx", lasx_xvavgr_d, m256i, i64x4, i128x4);
912impl_vavgr!("lasx", lasx_xvavgr_bu, m256i, u8x32, u16x32);
913impl_vavgr!("lasx", lasx_xvavgr_hu, m256i, u16x16, u32x16);
914impl_vavgr!("lasx", lasx_xvavgr_wu, m256i, u32x8, u64x8);
915impl_vavgr!("lasx", lasx_xvavgr_du, m256i, u64x4, u128x4);
916
917#[cfg(test)]
918mod tests {
919    use crate::{
920        core_arch::{loongarch64::*, simd::*},
921        mem::transmute,
922    };
923    use std::hint::black_box;
924    use stdarch_test::simd_test;
925
926    #[simd_test(enable = "lasx")]
927    unsafe fn xvldi() {
928        let r = i8x32::new(
929            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
930            0, 0, 0,
931        );
932        assert_eq!(r, transmute(lasx_xvldi::<0>()));
933        let r = i8x32::new(
934            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
935            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
936        );
937        assert_eq!(r, transmute(lasx_xvldi::<255>()));
938        let r = i8x32::new(
939            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
940            0, 0, 0,
941        );
942        assert_eq!(r, transmute(lasx_xvldi::<1024>()));
943        let r = i8x32::new(
944            0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0,
945            -2, 0, -2, 0, -2, 0, -2,
946        );
947        assert_eq!(r, transmute(lasx_xvldi::<1536>()));
948        let r = i8x32::new(
949            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
950            0, 0, 0,
951        );
952        assert_eq!(r, transmute(lasx_xvldi::<2048>()));
953        let r = i8x32::new(
954            0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1,
955            -1, 0, -2, -1, -1, 0, -2, -1, -1,
956        );
957        assert_eq!(r, transmute(lasx_xvldi::<2560>()));
958        let r = i8x32::new(
959            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
960            0, 0, 0,
961        );
962        assert_eq!(r, transmute(lasx_xvldi::<3072>()));
963        let r = i8x32::new(
964            0, -2, -1, -1, -1, -1, -1, -1, 0, -2, -1, -1, -1, -1, -1, -1, 0, -2, -1, -1, -1, -1,
965            -1, -1, 0, -2, -1, -1, -1, -1, -1, -1,
966        );
967        assert_eq!(r, transmute(lasx_xvldi::<3584>()));
968        let r = i8x32::new(
969            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
970            0, 0, 0,
971        );
972        assert_eq!(r, transmute(lasx_xvldi::<-4096>()));
973        let r = i8x32::new(
974            -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0,
975            0, -128, 0, 0, 0, -128, 0, 0, 0,
976        );
977        assert_eq!(r, transmute(lasx_xvldi::<-3968>()));
978        let r = i8x32::new(
979            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
980            0, 0, 0,
981        );
982        assert_eq!(r, transmute(lasx_xvldi::<-3840>()));
983        let r = i8x32::new(
984            0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0,
985            0, 0, -128, 0, 0, 0, -128, 0, 0,
986        );
987        assert_eq!(r, transmute(lasx_xvldi::<-3712>()));
988        let r = i8x32::new(
989            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
990            0, 0, 0,
991        );
992        assert_eq!(r, transmute(lasx_xvldi::<-3584>()));
993        let r = i8x32::new(
994            0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128,
995            0, 0, 0, -128, 0, 0, 0, -128, 0,
996        );
997        assert_eq!(r, transmute(lasx_xvldi::<-3456>()));
998        let r = i8x32::new(
999            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1000            0, 0, 0,
1001        );
1002        assert_eq!(r, transmute(lasx_xvldi::<-3328>()));
1003        let r = i8x32::new(
1004            0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0,
1005            -128, 0, 0, 0, -128, 0, 0, 0, -128,
1006        );
1007        assert_eq!(r, transmute(lasx_xvldi::<-3200>()));
1008        let r = i8x32::new(
1009            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1010            0, 0, 0,
1011        );
1012        assert_eq!(r, transmute(lasx_xvldi::<-3072>()));
1013        let r = i8x32::new(
1014            -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128,
1015            0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0,
1016        );
1017        assert_eq!(r, transmute(lasx_xvldi::<-2944>()));
1018        let r = i8x32::new(
1019            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1020            0, 0, 0,
1021        );
1022        assert_eq!(r, transmute(lasx_xvldi::<-2816>()));
1023        let r = i8x32::new(
1024            0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0,
1025            -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128,
1026        );
1027        assert_eq!(r, transmute(lasx_xvldi::<-2688>()));
1028        let r = i8x32::new(
1029            -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0,
1030            0, -1, 0, 0, 0,
1031        );
1032        assert_eq!(r, transmute(lasx_xvldi::<-2560>()));
1033        let r = i8x32::new(
1034            -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1,
1035            -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0,
1036        );
1037        assert_eq!(r, transmute(lasx_xvldi::<-2432>()));
1038        let r = i8x32::new(
1039            -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1,
1040            -1, 0, 0, -1, -1, 0, 0,
1041        );
1042        assert_eq!(r, transmute(lasx_xvldi::<-2304>()));
1043        let r = i8x32::new(
1044            -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0,
1045            -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0,
1046        );
1047        assert_eq!(r, transmute(lasx_xvldi::<-2176>()));
1048        let r = i8x32::new(
1049            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1050            0, 0, 0,
1051        );
1052        assert_eq!(r, transmute(lasx_xvldi::<-2048>()));
1053        let r = i8x32::new(
1054            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1055            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1056        );
1057        assert_eq!(r, transmute(lasx_xvldi::<-1793>()));
1058        let r = i8x32::new(
1059            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1060            0, 0, 0,
1061        );
1062        assert_eq!(r, transmute(lasx_xvldi::<-1792>()));
1063        let r = i8x32::new(
1064            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0,
1065            -1, 0, -1, 0, -1, 0, -1,
1066        );
1067        assert_eq!(r, transmute(lasx_xvldi::<-1622>()));
1068        let r = i8x32::new(
1069            0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0,
1070            64, 0, 0, 0, 64,
1071        );
1072        assert_eq!(r, transmute(lasx_xvldi::<-1536>()));
1073        let r = i8x32::new(
1074            0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80,
1075            -63, 0, 0, 80, -63, 0, 0, 80, -63,
1076        );
1077        assert_eq!(r, transmute(lasx_xvldi::<-1366>()));
1078        let r = i8x32::new(
1079            0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64,
1080            0, 0, 0, 0,
1081        );
1082        assert_eq!(r, transmute(lasx_xvldi::<-1280>()));
1083        let r = i8x32::new(
1084            0, 0, 80, -63, 0, 0, 0, 0, 0, 0, 80, -63, 0, 0, 0, 0, 0, 0, 80, -63, 0, 0, 0, 0, 0, 0,
1085            80, -63, 0, 0, 0, 0,
1086        );
1087        assert_eq!(r, transmute(lasx_xvldi::<-1110>()));
1088        let r = i8x32::new(
1089            0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0,
1090            0, 0, 0, 64,
1091        );
1092        assert_eq!(r, transmute(lasx_xvldi::<-1024>()));
1093        let r = i8x32::new(
1094            0, 0, 0, 0, 0, 0, 42, -64, 0, 0, 0, 0, 0, 0, 42, -64, 0, 0, 0, 0, 0, 0, 42, -64, 0, 0,
1095            0, 0, 0, 0, 42, -64,
1096        );
1097        assert_eq!(r, transmute(lasx_xvldi::<-854>()));
1098    }
1099
1100    #[simd_test(enable = "lasx")]
1101    unsafe fn xvbsll_v() {
1102        let a = i8x32::new(
1103            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1104            25, 26, 27, 28, 29, 30, 31, 32,
1105        );
1106        let r = i8x32::new(
1107            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1108            25, 26, 27, 28, 29, 30, 31, 32,
1109        );
1110        assert_eq!(r, transmute(lasx_xvbsll_v::<0>(black_box(transmute(a)))));
1111        let r = i8x32::new(
1112            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 17, 18, 19, 20, 21, 22, 23,
1113            24, 25, 26, 27, 28, 29, 30, 31,
1114        );
1115        assert_eq!(r, transmute(lasx_xvbsll_v::<1>(black_box(transmute(a)))));
1116        let r = i8x32::new(
1117            0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 17, 18, 19, 20, 21, 22, 23,
1118            24, 25, 26, 27, 28, 29, 30,
1119        );
1120        assert_eq!(r, transmute(lasx_xvbsll_v::<2>(black_box(transmute(a)))));
1121        let r = i8x32::new(
1122            0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 17, 18, 19, 20, 21, 22,
1123            23, 24, 25, 26, 27, 28, 29,
1124        );
1125        assert_eq!(r, transmute(lasx_xvbsll_v::<3>(black_box(transmute(a)))));
1126        let r = i8x32::new(
1127            0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22,
1128            23, 24, 25, 26, 27, 28,
1129        );
1130        assert_eq!(r, transmute(lasx_xvbsll_v::<4>(black_box(transmute(a)))));
1131        let r = i8x32::new(
1132            0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21,
1133            22, 23, 24, 25, 26, 27,
1134        );
1135        assert_eq!(r, transmute(lasx_xvbsll_v::<5>(black_box(transmute(a)))));
1136        let r = i8x32::new(
1137            0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21,
1138            22, 23, 24, 25, 26,
1139        );
1140        assert_eq!(r, transmute(lasx_xvbsll_v::<6>(black_box(transmute(a)))));
1141        let r = i8x32::new(
1142            0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20,
1143            21, 22, 23, 24, 25,
1144        );
1145        assert_eq!(r, transmute(lasx_xvbsll_v::<7>(black_box(transmute(a)))));
1146        let r = i8x32::new(
1147            0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20,
1148            21, 22, 23, 24,
1149        );
1150        assert_eq!(r, transmute(lasx_xvbsll_v::<8>(black_box(transmute(a)))));
1151        let r = i8x32::new(
1152            0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19,
1153            20, 21, 22, 23,
1154        );
1155        assert_eq!(r, transmute(lasx_xvbsll_v::<9>(black_box(transmute(a)))));
1156        let r = i8x32::new(
1157            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18,
1158            19, 20, 21, 22,
1159        );
1160        assert_eq!(r, transmute(lasx_xvbsll_v::<10>(black_box(transmute(a)))));
1161        let r = i8x32::new(
1162            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
1163            18, 19, 20, 21,
1164        );
1165        assert_eq!(r, transmute(lasx_xvbsll_v::<11>(black_box(transmute(a)))));
1166        let r = i8x32::new(
1167            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
1168            18, 19, 20,
1169        );
1170        assert_eq!(r, transmute(lasx_xvbsll_v::<12>(black_box(transmute(a)))));
1171        let r = i8x32::new(
1172            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1173            17, 18, 19,
1174        );
1175        assert_eq!(r, transmute(lasx_xvbsll_v::<13>(black_box(transmute(a)))));
1176        let r = i8x32::new(
1177            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1178            0, 17, 18,
1179        );
1180        assert_eq!(r, transmute(lasx_xvbsll_v::<14>(black_box(transmute(a)))));
1181        let r = i8x32::new(
1182            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1183            0, 0, 17,
1184        );
1185        assert_eq!(r, transmute(lasx_xvbsll_v::<15>(black_box(transmute(a)))));
1186    }
1187
1188    #[simd_test(enable = "lasx")]
1189    unsafe fn xvbsrl_v() {
1190        let a = i8x32::new(
1191            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1192            25, 26, 27, 28, 29, 30, 31, 32,
1193        );
1194        let r = i8x32::new(
1195            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1196            25, 26, 27, 28, 29, 30, 31, 32,
1197        );
1198        assert_eq!(r, transmute(lasx_xvbsrl_v::<0>(black_box(transmute(a)))));
1199        let r = i8x32::new(
1200            2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 18, 19, 20, 21, 22, 23, 24, 25,
1201            26, 27, 28, 29, 30, 31, 32, 0,
1202        );
1203        assert_eq!(r, transmute(lasx_xvbsrl_v::<1>(black_box(transmute(a)))));
1204        let r = i8x32::new(
1205            3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 19, 20, 21, 22, 23, 24, 25, 26,
1206            27, 28, 29, 30, 31, 32, 0, 0,
1207        );
1208        assert_eq!(r, transmute(lasx_xvbsrl_v::<2>(black_box(transmute(a)))));
1209        let r = i8x32::new(
1210            4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27,
1211            28, 29, 30, 31, 32, 0, 0, 0,
1212        );
1213        assert_eq!(r, transmute(lasx_xvbsrl_v::<3>(black_box(transmute(a)))));
1214        let r = i8x32::new(
1215            5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28,
1216            29, 30, 31, 32, 0, 0, 0, 0,
1217        );
1218        assert_eq!(r, transmute(lasx_xvbsrl_v::<4>(black_box(transmute(a)))));
1219        let r = i8x32::new(
1220            6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29,
1221            30, 31, 32, 0, 0, 0, 0, 0,
1222        );
1223        assert_eq!(r, transmute(lasx_xvbsrl_v::<5>(black_box(transmute(a)))));
1224        let r = i8x32::new(
1225            7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, 29, 30,
1226            31, 32, 0, 0, 0, 0, 0, 0,
1227        );
1228        assert_eq!(r, transmute(lasx_xvbsrl_v::<6>(black_box(transmute(a)))));
1229        let r = i8x32::new(
1230            8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31,
1231            32, 0, 0, 0, 0, 0, 0, 0,
1232        );
1233        assert_eq!(r, transmute(lasx_xvbsrl_v::<7>(black_box(transmute(a)))));
1234        let r = i8x32::new(
1235            9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 29, 30, 31, 32,
1236            0, 0, 0, 0, 0, 0, 0, 0,
1237        );
1238        assert_eq!(r, transmute(lasx_xvbsrl_v::<8>(black_box(transmute(a)))));
1239        let r = i8x32::new(
1240            10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 0,
1241            0, 0, 0, 0, 0, 0, 0, 0,
1242        );
1243        assert_eq!(r, transmute(lasx_xvbsrl_v::<9>(black_box(transmute(a)))));
1244        let r = i8x32::new(
1245            11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 0, 0, 0,
1246            0, 0, 0, 0, 0, 0, 0,
1247        );
1248        assert_eq!(r, transmute(lasx_xvbsrl_v::<10>(black_box(transmute(a)))));
1249        let r = i8x32::new(
1250            12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, 0,
1251            0, 0, 0, 0, 0, 0,
1252        );
1253        assert_eq!(r, transmute(lasx_xvbsrl_v::<11>(black_box(transmute(a)))));
1254        let r = i8x32::new(
1255            13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 32, 0, 0, 0, 0, 0, 0,
1256            0, 0, 0, 0, 0, 0,
1257        );
1258        assert_eq!(r, transmute(lasx_xvbsrl_v::<12>(black_box(transmute(a)))));
1259        let r = i8x32::new(
1260            14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0,
1261            0, 0, 0, 0, 0,
1262        );
1263        assert_eq!(r, transmute(lasx_xvbsrl_v::<13>(black_box(transmute(a)))));
1264        let r = i8x32::new(
1265            15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1266            0, 0, 0, 0,
1267        );
1268        assert_eq!(r, transmute(lasx_xvbsrl_v::<14>(black_box(transmute(a)))));
1269        let r = i8x32::new(
1270            16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1271            0, 0, 0, 0,
1272        );
1273        assert_eq!(r, transmute(lasx_xvbsrl_v::<15>(black_box(transmute(a)))));
1274    }
1275}