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
899#[cfg(test)]
900mod tests {
901    use crate::{
902        core_arch::{loongarch64::*, simd::*},
903        mem::transmute,
904    };
905    use std::hint::black_box;
906    use stdarch_test::simd_test;
907
908    #[simd_test(enable = "lasx")]
909    unsafe fn xvldi() {
910        let r = i8x32::new(
911            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,
912            0, 0, 0,
913        );
914        assert_eq!(r, transmute(lasx_xvldi::<0>()));
915        let r = i8x32::new(
916            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
917            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
918        );
919        assert_eq!(r, transmute(lasx_xvldi::<255>()));
920        let r = i8x32::new(
921            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,
922            0, 0, 0,
923        );
924        assert_eq!(r, transmute(lasx_xvldi::<1024>()));
925        let r = i8x32::new(
926            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,
927            -2, 0, -2, 0, -2, 0, -2,
928        );
929        assert_eq!(r, transmute(lasx_xvldi::<1536>()));
930        let r = i8x32::new(
931            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,
932            0, 0, 0,
933        );
934        assert_eq!(r, transmute(lasx_xvldi::<2048>()));
935        let r = i8x32::new(
936            0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1,
937            -1, 0, -2, -1, -1, 0, -2, -1, -1,
938        );
939        assert_eq!(r, transmute(lasx_xvldi::<2560>()));
940        let r = i8x32::new(
941            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,
942            0, 0, 0,
943        );
944        assert_eq!(r, transmute(lasx_xvldi::<3072>()));
945        let r = i8x32::new(
946            0, -2, -1, -1, -1, -1, -1, -1, 0, -2, -1, -1, -1, -1, -1, -1, 0, -2, -1, -1, -1, -1,
947            -1, -1, 0, -2, -1, -1, -1, -1, -1, -1,
948        );
949        assert_eq!(r, transmute(lasx_xvldi::<3584>()));
950        let r = i8x32::new(
951            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,
952            0, 0, 0,
953        );
954        assert_eq!(r, transmute(lasx_xvldi::<-4096>()));
955        let r = i8x32::new(
956            -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0,
957            0, -128, 0, 0, 0, -128, 0, 0, 0,
958        );
959        assert_eq!(r, transmute(lasx_xvldi::<-3968>()));
960        let r = i8x32::new(
961            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,
962            0, 0, 0,
963        );
964        assert_eq!(r, transmute(lasx_xvldi::<-3840>()));
965        let r = i8x32::new(
966            0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0,
967            0, 0, -128, 0, 0, 0, -128, 0, 0,
968        );
969        assert_eq!(r, transmute(lasx_xvldi::<-3712>()));
970        let r = i8x32::new(
971            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,
972            0, 0, 0,
973        );
974        assert_eq!(r, transmute(lasx_xvldi::<-3584>()));
975        let r = i8x32::new(
976            0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128,
977            0, 0, 0, -128, 0, 0, 0, -128, 0,
978        );
979        assert_eq!(r, transmute(lasx_xvldi::<-3456>()));
980        let r = i8x32::new(
981            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,
982            0, 0, 0,
983        );
984        assert_eq!(r, transmute(lasx_xvldi::<-3328>()));
985        let r = i8x32::new(
986            0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0,
987            -128, 0, 0, 0, -128, 0, 0, 0, -128,
988        );
989        assert_eq!(r, transmute(lasx_xvldi::<-3200>()));
990        let r = i8x32::new(
991            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,
992            0, 0, 0,
993        );
994        assert_eq!(r, transmute(lasx_xvldi::<-3072>()));
995        let r = i8x32::new(
996            -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128,
997            0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0,
998        );
999        assert_eq!(r, transmute(lasx_xvldi::<-2944>()));
1000        let r = i8x32::new(
1001            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,
1002            0, 0, 0,
1003        );
1004        assert_eq!(r, transmute(lasx_xvldi::<-2816>()));
1005        let r = i8x32::new(
1006            0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0,
1007            -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128,
1008        );
1009        assert_eq!(r, transmute(lasx_xvldi::<-2688>()));
1010        let r = i8x32::new(
1011            -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,
1012            0, -1, 0, 0, 0,
1013        );
1014        assert_eq!(r, transmute(lasx_xvldi::<-2560>()));
1015        let r = i8x32::new(
1016            -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1,
1017            -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0,
1018        );
1019        assert_eq!(r, transmute(lasx_xvldi::<-2432>()));
1020        let r = i8x32::new(
1021            -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,
1022            -1, 0, 0, -1, -1, 0, 0,
1023        );
1024        assert_eq!(r, transmute(lasx_xvldi::<-2304>()));
1025        let r = i8x32::new(
1026            -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0,
1027            -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0,
1028        );
1029        assert_eq!(r, transmute(lasx_xvldi::<-2176>()));
1030        let r = i8x32::new(
1031            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,
1032            0, 0, 0,
1033        );
1034        assert_eq!(r, transmute(lasx_xvldi::<-2048>()));
1035        let r = i8x32::new(
1036            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1037            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1038        );
1039        assert_eq!(r, transmute(lasx_xvldi::<-1793>()));
1040        let r = i8x32::new(
1041            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,
1042            0, 0, 0,
1043        );
1044        assert_eq!(r, transmute(lasx_xvldi::<-1792>()));
1045        let r = i8x32::new(
1046            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,
1047            -1, 0, -1, 0, -1, 0, -1,
1048        );
1049        assert_eq!(r, transmute(lasx_xvldi::<-1622>()));
1050        let r = i8x32::new(
1051            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,
1052            64, 0, 0, 0, 64,
1053        );
1054        assert_eq!(r, transmute(lasx_xvldi::<-1536>()));
1055        let r = i8x32::new(
1056            0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80,
1057            -63, 0, 0, 80, -63, 0, 0, 80, -63,
1058        );
1059        assert_eq!(r, transmute(lasx_xvldi::<-1366>()));
1060        let r = i8x32::new(
1061            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,
1062            0, 0, 0, 0,
1063        );
1064        assert_eq!(r, transmute(lasx_xvldi::<-1280>()));
1065        let r = i8x32::new(
1066            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,
1067            80, -63, 0, 0, 0, 0,
1068        );
1069        assert_eq!(r, transmute(lasx_xvldi::<-1110>()));
1070        let r = i8x32::new(
1071            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,
1072            0, 0, 0, 64,
1073        );
1074        assert_eq!(r, transmute(lasx_xvldi::<-1024>()));
1075        let r = i8x32::new(
1076            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,
1077            0, 0, 0, 0, 42, -64,
1078        );
1079        assert_eq!(r, transmute(lasx_xvldi::<-854>()));
1080    }
1081
1082    #[simd_test(enable = "lasx")]
1083    unsafe fn xvbsll_v() {
1084        let a = i8x32::new(
1085            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1086            25, 26, 27, 28, 29, 30, 31, 32,
1087        );
1088        let r = i8x32::new(
1089            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1090            25, 26, 27, 28, 29, 30, 31, 32,
1091        );
1092        assert_eq!(r, transmute(lasx_xvbsll_v::<0>(black_box(transmute(a)))));
1093        let r = i8x32::new(
1094            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 17, 18, 19, 20, 21, 22, 23,
1095            24, 25, 26, 27, 28, 29, 30, 31,
1096        );
1097        assert_eq!(r, transmute(lasx_xvbsll_v::<1>(black_box(transmute(a)))));
1098        let r = i8x32::new(
1099            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,
1100            24, 25, 26, 27, 28, 29, 30,
1101        );
1102        assert_eq!(r, transmute(lasx_xvbsll_v::<2>(black_box(transmute(a)))));
1103        let r = i8x32::new(
1104            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,
1105            23, 24, 25, 26, 27, 28, 29,
1106        );
1107        assert_eq!(r, transmute(lasx_xvbsll_v::<3>(black_box(transmute(a)))));
1108        let r = i8x32::new(
1109            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,
1110            23, 24, 25, 26, 27, 28,
1111        );
1112        assert_eq!(r, transmute(lasx_xvbsll_v::<4>(black_box(transmute(a)))));
1113        let r = i8x32::new(
1114            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,
1115            22, 23, 24, 25, 26, 27,
1116        );
1117        assert_eq!(r, transmute(lasx_xvbsll_v::<5>(black_box(transmute(a)))));
1118        let r = i8x32::new(
1119            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,
1120            22, 23, 24, 25, 26,
1121        );
1122        assert_eq!(r, transmute(lasx_xvbsll_v::<6>(black_box(transmute(a)))));
1123        let r = i8x32::new(
1124            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,
1125            21, 22, 23, 24, 25,
1126        );
1127        assert_eq!(r, transmute(lasx_xvbsll_v::<7>(black_box(transmute(a)))));
1128        let r = i8x32::new(
1129            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,
1130            21, 22, 23, 24,
1131        );
1132        assert_eq!(r, transmute(lasx_xvbsll_v::<8>(black_box(transmute(a)))));
1133        let r = i8x32::new(
1134            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,
1135            20, 21, 22, 23,
1136        );
1137        assert_eq!(r, transmute(lasx_xvbsll_v::<9>(black_box(transmute(a)))));
1138        let r = i8x32::new(
1139            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,
1140            19, 20, 21, 22,
1141        );
1142        assert_eq!(r, transmute(lasx_xvbsll_v::<10>(black_box(transmute(a)))));
1143        let r = i8x32::new(
1144            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,
1145            18, 19, 20, 21,
1146        );
1147        assert_eq!(r, transmute(lasx_xvbsll_v::<11>(black_box(transmute(a)))));
1148        let r = i8x32::new(
1149            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,
1150            18, 19, 20,
1151        );
1152        assert_eq!(r, transmute(lasx_xvbsll_v::<12>(black_box(transmute(a)))));
1153        let r = i8x32::new(
1154            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,
1155            17, 18, 19,
1156        );
1157        assert_eq!(r, transmute(lasx_xvbsll_v::<13>(black_box(transmute(a)))));
1158        let r = i8x32::new(
1159            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,
1160            0, 17, 18,
1161        );
1162        assert_eq!(r, transmute(lasx_xvbsll_v::<14>(black_box(transmute(a)))));
1163        let r = i8x32::new(
1164            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,
1165            0, 0, 17,
1166        );
1167        assert_eq!(r, transmute(lasx_xvbsll_v::<15>(black_box(transmute(a)))));
1168    }
1169
1170    #[simd_test(enable = "lasx")]
1171    unsafe fn xvbsrl_v() {
1172        let a = i8x32::new(
1173            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1174            25, 26, 27, 28, 29, 30, 31, 32,
1175        );
1176        let r = i8x32::new(
1177            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1178            25, 26, 27, 28, 29, 30, 31, 32,
1179        );
1180        assert_eq!(r, transmute(lasx_xvbsrl_v::<0>(black_box(transmute(a)))));
1181        let r = i8x32::new(
1182            2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 18, 19, 20, 21, 22, 23, 24, 25,
1183            26, 27, 28, 29, 30, 31, 32, 0,
1184        );
1185        assert_eq!(r, transmute(lasx_xvbsrl_v::<1>(black_box(transmute(a)))));
1186        let r = i8x32::new(
1187            3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 19, 20, 21, 22, 23, 24, 25, 26,
1188            27, 28, 29, 30, 31, 32, 0, 0,
1189        );
1190        assert_eq!(r, transmute(lasx_xvbsrl_v::<2>(black_box(transmute(a)))));
1191        let r = i8x32::new(
1192            4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27,
1193            28, 29, 30, 31, 32, 0, 0, 0,
1194        );
1195        assert_eq!(r, transmute(lasx_xvbsrl_v::<3>(black_box(transmute(a)))));
1196        let r = i8x32::new(
1197            5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28,
1198            29, 30, 31, 32, 0, 0, 0, 0,
1199        );
1200        assert_eq!(r, transmute(lasx_xvbsrl_v::<4>(black_box(transmute(a)))));
1201        let r = i8x32::new(
1202            6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29,
1203            30, 31, 32, 0, 0, 0, 0, 0,
1204        );
1205        assert_eq!(r, transmute(lasx_xvbsrl_v::<5>(black_box(transmute(a)))));
1206        let r = i8x32::new(
1207            7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, 29, 30,
1208            31, 32, 0, 0, 0, 0, 0, 0,
1209        );
1210        assert_eq!(r, transmute(lasx_xvbsrl_v::<6>(black_box(transmute(a)))));
1211        let r = i8x32::new(
1212            8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31,
1213            32, 0, 0, 0, 0, 0, 0, 0,
1214        );
1215        assert_eq!(r, transmute(lasx_xvbsrl_v::<7>(black_box(transmute(a)))));
1216        let r = i8x32::new(
1217            9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 29, 30, 31, 32,
1218            0, 0, 0, 0, 0, 0, 0, 0,
1219        );
1220        assert_eq!(r, transmute(lasx_xvbsrl_v::<8>(black_box(transmute(a)))));
1221        let r = i8x32::new(
1222            10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 0,
1223            0, 0, 0, 0, 0, 0, 0, 0,
1224        );
1225        assert_eq!(r, transmute(lasx_xvbsrl_v::<9>(black_box(transmute(a)))));
1226        let r = i8x32::new(
1227            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,
1228            0, 0, 0, 0, 0, 0, 0,
1229        );
1230        assert_eq!(r, transmute(lasx_xvbsrl_v::<10>(black_box(transmute(a)))));
1231        let r = i8x32::new(
1232            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,
1233            0, 0, 0, 0, 0, 0,
1234        );
1235        assert_eq!(r, transmute(lasx_xvbsrl_v::<11>(black_box(transmute(a)))));
1236        let r = i8x32::new(
1237            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,
1238            0, 0, 0, 0, 0, 0,
1239        );
1240        assert_eq!(r, transmute(lasx_xvbsrl_v::<12>(black_box(transmute(a)))));
1241        let r = i8x32::new(
1242            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,
1243            0, 0, 0, 0, 0,
1244        );
1245        assert_eq!(r, transmute(lasx_xvbsrl_v::<13>(black_box(transmute(a)))));
1246        let r = i8x32::new(
1247            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,
1248            0, 0, 0, 0,
1249        );
1250        assert_eq!(r, transmute(lasx_xvbsrl_v::<14>(black_box(transmute(a)))));
1251        let r = i8x32::new(
1252            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,
1253            0, 0, 0, 0,
1254        );
1255        assert_eq!(r, transmute(lasx_xvbsrl_v::<15>(black_box(transmute(a)))));
1256    }
1257}