Skip to main content

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

1//! LoongArch64 LSX 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!(b, a, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30])
12}
13
14#[inline(always)]
15#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
16const unsafe fn simd_ext_pickev_h<T: Copy>(a: T, b: T) -> T {
17    simd_shuffle!(b, a, [0, 2, 4, 6, 8, 10, 12, 14])
18}
19
20#[inline(always)]
21#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
22const unsafe fn simd_ext_pickev_w<T: Copy>(a: T, b: T) -> T {
23    simd_shuffle!(b, a, [0, 2, 4, 6])
24}
25
26#[inline(always)]
27#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
28const unsafe fn simd_ext_pickev_d<T: Copy>(a: T, b: T) -> T {
29    simd_shuffle!(b, a, [0, 2])
30}
31
32#[inline(always)]
33#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
34const unsafe fn simd_ext_pickod_b<T: Copy>(a: T, b: T) -> T {
35    simd_shuffle!(b, a, [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31])
36}
37
38#[inline(always)]
39#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
40const unsafe fn simd_ext_pickod_h<T: Copy>(a: T, b: T) -> T {
41    simd_shuffle!(b, a, [1, 3, 5, 7, 9, 11, 13, 15])
42}
43
44#[inline(always)]
45#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
46const unsafe fn simd_ext_pickod_w<T: Copy>(a: T, b: T) -> T {
47    simd_shuffle!(b, a, [1, 3, 5, 7])
48}
49
50#[inline(always)]
51#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
52const unsafe fn simd_ext_pickod_d<T: Copy>(a: T, b: T) -> T {
53    simd_shuffle!(b, a, [1, 3])
54}
55
56#[inline(always)]
57#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
58const unsafe fn simd_ext_ilvh_b<T: Copy>(a: T, b: T) -> T {
59    simd_shuffle!(b, a, [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31])
60}
61
62#[inline(always)]
63#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
64const unsafe fn simd_ext_ilvh_h<T: Copy>(a: T, b: T) -> T {
65    simd_shuffle!(b, a, [4, 12, 5, 13, 6, 14, 7, 15])
66}
67
68#[inline(always)]
69#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
70const unsafe fn simd_ext_ilvh_w<T: Copy>(a: T, b: T) -> T {
71    simd_shuffle!(b, a, [2, 6, 3, 7])
72}
73
74#[inline(always)]
75#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
76const unsafe fn simd_ext_ilvh_d<T: Copy>(a: T, b: T) -> T {
77    simd_shuffle!(b, a, [1, 3])
78}
79
80#[inline(always)]
81#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
82const unsafe fn simd_ext_ilvl_b<T: Copy>(a: T, b: T) -> T {
83    simd_shuffle!(b, a, [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23])
84}
85
86#[inline(always)]
87#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
88const unsafe fn simd_ext_ilvl_h<T: Copy>(a: T, b: T) -> T {
89    simd_shuffle!(b, a, [0, 8, 1, 9, 2, 10, 3, 11])
90}
91
92#[inline(always)]
93#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
94const unsafe fn simd_ext_ilvl_w<T: Copy>(a: T, b: T) -> T {
95    simd_shuffle!(b, a, [0, 4, 1, 5])
96}
97
98#[inline(always)]
99#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
100const unsafe fn simd_ext_ilvl_d<T: Copy>(a: T, b: T) -> T {
101    simd_shuffle!(b, a, [0, 2])
102}
103
104#[inline(always)]
105#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
106const unsafe fn simd_ext_replvei_b<const I: u32, T: Copy>(a: T) -> T {
107    simd_shuffle!(a, a, [I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I])
108}
109
110#[inline(always)]
111#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
112const unsafe fn simd_ext_replvei_h<const I: u32, T: Copy>(a: T) -> T {
113    simd_shuffle!(a, a, [I, I, I, I, I, I, I, I])
114}
115
116#[inline(always)]
117#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
118const unsafe fn simd_ext_replvei_w<const I: u32, T: Copy>(a: T) -> T {
119    simd_shuffle!(a, a, [I, I, I, I])
120}
121
122#[inline(always)]
123#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
124const unsafe fn simd_ext_replvei_d<const I: u32, T: Copy>(a: T) -> T {
125    simd_shuffle!(a, a, [I, I])
126}
127
128#[inline(always)]
129#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
130const unsafe fn simd_ext_packev_b<T: Copy>(a: T, b: T) -> T {
131    simd_shuffle!(b, a, [0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30])
132}
133
134#[inline(always)]
135#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
136const unsafe fn simd_ext_packev_h<T: Copy>(a: T, b: T) -> T {
137    simd_shuffle!(b, a, [0, 8, 2, 10, 4, 12, 6, 14])
138}
139
140#[inline(always)]
141#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
142const unsafe fn simd_ext_packev_w<T: Copy>(a: T, b: T) -> T {
143    simd_shuffle!(b, a, [0, 4, 2, 6])
144}
145
146#[inline(always)]
147#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
148const unsafe fn simd_ext_packev_d<T: Copy>(a: T, b: T) -> T {
149    simd_shuffle!(b, a, [0, 2])
150}
151
152#[inline(always)]
153#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
154const unsafe fn simd_ext_packod_b<T: Copy>(a: T, b: T) -> T {
155    simd_shuffle!(b, a, [1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31])
156}
157
158#[inline(always)]
159#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
160const unsafe fn simd_ext_packod_h<T: Copy>(a: T, b: T) -> T {
161    simd_shuffle!(b, a, [1, 9, 3, 11, 5, 13, 7, 15])
162}
163
164#[inline(always)]
165#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
166const unsafe fn simd_ext_packod_w<T: Copy>(a: T, b: T) -> T {
167    simd_shuffle!(b, a, [1, 5, 3, 7])
168}
169
170#[inline(always)]
171#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
172const unsafe fn simd_ext_packod_d<T: Copy>(a: T, b: T) -> T {
173    simd_shuffle!(b, a, [1, 3])
174}
175
176#[inline(always)]
177#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
178const unsafe fn simd_ext_shuf4i_b<const I: u32, T: Copy>(a: T) -> T {
179    simd_shuffle!(
180        a,
181        a,
182        [
183            ((I >> 0) & 3) + 0, ((I >> 2) & 3) + 0, ((I >> 4) & 3) + 0, ((I >> 6) & 3) + 0,
184            ((I >> 0) & 3) + 4, ((I >> 2) & 3) + 4, ((I >> 4) & 3) + 4, ((I >> 6) & 3) + 4,
185            ((I >> 0) & 3) + 8, ((I >> 2) & 3) + 8, ((I >> 4) & 3) + 8, ((I >> 6) & 3) + 8,
186            ((I >> 0) & 3) + 12, ((I >> 2) & 3) + 12, ((I >> 4) & 3) + 12, ((I >> 6) & 3) + 12
187        ]
188    )
189}
190
191#[inline(always)]
192#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
193const unsafe fn simd_ext_shuf4i_h<const I: u32, T: Copy>(a: T) -> T {
194    simd_shuffle!(
195        a,
196        a,
197        [
198            ((I >> 0) & 3) + 0, ((I >> 2) & 3) + 0, ((I >> 4) & 3) + 0, ((I >> 6) & 3) + 0,
199            ((I >> 0) & 3) + 4, ((I >> 2) & 3) + 4, ((I >> 4) & 3) + 4, ((I >> 6) & 3) + 4
200        ]
201    )
202}
203
204#[inline(always)]
205#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
206const unsafe fn simd_ext_shuf4i_w<const I: u32, T: Copy>(a: T) -> T {
207    simd_shuffle!(a, a, [((I >> 0) & 3), ((I >> 2) & 3), ((I >> 4) & 3), ((I >> 6) & 3)])
208}
209
210#[inline(always)]
211#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
212const unsafe fn simd_ext_shuf4i_d<const I: u32, T: Copy>(a: T, b: T) -> T {
213    simd_shuffle!(a, b, [((I >> 0) & 3), ((I >> 2) & 3)])
214}
215
216#[inline(always)]
217#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
218pub(super) const unsafe fn simd_ext_bsll<const I: u32, T: Copy + const SimdExt>(a: T) -> T {
219    let z = simd_ext_splat(0);
220    match I & 0xf {
221        0 => simd_shuffle!(a, z, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
222        1 => simd_shuffle!(a, z, [16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),
223        2 => simd_shuffle!(a, z, [16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
224        3 => simd_shuffle!(a, z, [16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
225        4 => simd_shuffle!(a, z, [16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
226        5 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
227        6 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
228        7 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8]),
229        8 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7]),
230        9 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6]),
231        10 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5]),
232        11 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4]),
233        12 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3]),
234        13 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2]),
235        14 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1]),
236        15 => simd_shuffle!(a, z, [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0]),
237        _ => unreachable!(),
238    }
239}
240
241#[inline(always)]
242#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
243pub(super) const unsafe fn simd_ext_bsrl<const I: u32, T: Copy + const SimdExt>(a: T) -> T {
244    let z = simd_ext_splat(0);
245    match I & 0xf {
246        0 => simd_shuffle!(a, z, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
247        1 => simd_shuffle!(a, z, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
248        2 => simd_shuffle!(a, z, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16]),
249        3 => simd_shuffle!(a, z, [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16]),
250        4 => simd_shuffle!(a, z, [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16]),
251        5 => simd_shuffle!(a, z, [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16]),
252        6 => simd_shuffle!(a, z, [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16]),
253        7 => simd_shuffle!(a, z, [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16]),
254        8 => simd_shuffle!(a, z, [8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16]),
255        9 => simd_shuffle!(a, z, [9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
256        10 => simd_shuffle!(a, z, [10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
257        11 => simd_shuffle!(a, z, [11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
258        12 => simd_shuffle!(a, z, [12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
259        13 => simd_shuffle!(a, z, [13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
260        14 => simd_shuffle!(a, z, [14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
261        15 => simd_shuffle!(a, z, [15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]),
262        _ => unreachable!(),
263    }
264}
265
266impl_vv!("lsx", lsx_vpcnt_b, simd_ctpop, m128i, i8x16);
267impl_vv!("lsx", lsx_vpcnt_h, simd_ctpop, m128i, i16x8);
268impl_vv!("lsx", lsx_vpcnt_w, simd_ctpop, m128i, i32x4);
269impl_vv!("lsx", lsx_vpcnt_d, simd_ctpop, m128i, i64x2);
270impl_vv!("lsx", lsx_vclz_b, simd_ctlz, m128i, i8x16);
271impl_vv!("lsx", lsx_vclz_h, simd_ctlz, m128i, i16x8);
272impl_vv!("lsx", lsx_vclz_w, simd_ctlz, m128i, i32x4);
273impl_vv!("lsx", lsx_vclz_d, simd_ctlz, m128i, i64x2);
274impl_vv!("lsx", lsx_vneg_b, simd_neg, m128i, i8x16);
275impl_vv!("lsx", lsx_vneg_h, simd_neg, m128i, i16x8);
276impl_vv!("lsx", lsx_vneg_w, simd_neg, m128i, i32x4);
277impl_vv!("lsx", lsx_vneg_d, simd_neg, m128i, i64x2);
278impl_vv!("lsx", lsx_vfsqrt_s, simd_fsqrt, m128, f32x4);
279impl_vv!("lsx", lsx_vfsqrt_d, simd_fsqrt, m128d, f64x2);
280impl_vv!("lsx", lsx_vfrsqrt_s, simd_ext_frsqrt_s, m128, f32x4);
281impl_vv!("lsx", lsx_vfrsqrt_d, simd_ext_frsqrt_d, m128d, f64x2);
282impl_vv!("lsx", lsx_vfrecip_s, simd_ext_frecip_s, m128, f32x4);
283impl_vv!("lsx", lsx_vfrecip_d, simd_ext_frecip_d, m128d, f64x2);
284impl_vv!("lsx", lsx_vfrintrp_s, simd_ceil, m128, f32x4);
285impl_vv!("lsx", lsx_vfrintrp_d, simd_ceil, m128d, f64x2);
286impl_vv!("lsx", lsx_vfrintrm_s, simd_floor, m128, f32x4);
287impl_vv!("lsx", lsx_vfrintrm_d, simd_floor, m128d, f64x2);
288impl_vv!("lsx", lsx_vfrintrz_s, simd_trunc, m128, f32x4);
289impl_vv!("lsx", lsx_vfrintrz_d, simd_trunc, m128d, f64x2);
290
291impl_gv!("lsx", lsx_vreplgr2vr_b, simd_ext_splat, m128i, i8x16, i32);
292impl_gv!("lsx", lsx_vreplgr2vr_h, simd_ext_splat, m128i, i16x8, i32);
293impl_gv!("lsx", lsx_vreplgr2vr_w, simd_ext_splat, m128i, i32x4, i32);
294impl_gv!("lsx", lsx_vreplgr2vr_d, simd_ext_splat, m128i, i64x2, i64);
295
296impl_ggv!("lsx", lsx_vldx, simd_ext_ldx, m128i, i8x16, *const i8, i64, unsafe);
297
298impl_gsv!("lsx", lsx_vld, simd_ext_ld, m128i, i8x16, *const i8, 12, const, unsafe);
299
300impl_sv!("lsx", lsx_vrepli_b, simd_ext_splat, m128i, i8x16, 10);
301impl_sv!("lsx", lsx_vrepli_h, simd_ext_splat, m128i, i16x8, 10);
302impl_sv!("lsx", lsx_vrepli_w, simd_ext_splat, m128i, i32x4, 10);
303impl_sv!("lsx", lsx_vrepli_d, simd_ext_splat, m128i, i64x2, 10);
304impl_sv!("lsx", lsx_vldi, simd_ext_ldi, m128i, i64x2, 13, const);
305
306impl_vvv!("lsx", lsx_vadd_b, simd_add, m128i, i8x16);
307impl_vvv!("lsx", lsx_vadd_h, simd_add, m128i, i16x8);
308impl_vvv!("lsx", lsx_vadd_w, simd_add, m128i, i32x4);
309impl_vvv!("lsx", lsx_vadd_d, simd_add, m128i, i64x2);
310impl_vvv!("lsx", lsx_vsub_b, simd_sub, m128i, i8x16);
311impl_vvv!("lsx", lsx_vsub_h, simd_sub, m128i, i16x8);
312impl_vvv!("lsx", lsx_vsub_w, simd_sub, m128i, i32x4);
313impl_vvv!("lsx", lsx_vsub_d, simd_sub, m128i, i64x2);
314impl_vvv!("lsx", lsx_vmax_b, simd_imax, m128i, i8x16);
315impl_vvv!("lsx", lsx_vmax_h, simd_imax, m128i, i16x8);
316impl_vvv!("lsx", lsx_vmax_w, simd_imax, m128i, i32x4);
317impl_vvv!("lsx", lsx_vmax_d, simd_imax, m128i, i64x2);
318impl_vvv!("lsx", lsx_vmax_bu, simd_imax, m128i, u8x16);
319impl_vvv!("lsx", lsx_vmax_hu, simd_imax, m128i, u16x8);
320impl_vvv!("lsx", lsx_vmax_wu, simd_imax, m128i, u32x4);
321impl_vvv!("lsx", lsx_vmax_du, simd_imax, m128i, u64x2);
322impl_vvv!("lsx", lsx_vmin_b, simd_imin, m128i, i8x16);
323impl_vvv!("lsx", lsx_vmin_h, simd_imin, m128i, i16x8);
324impl_vvv!("lsx", lsx_vmin_w, simd_imin, m128i, i32x4);
325impl_vvv!("lsx", lsx_vmin_d, simd_imin, m128i, i64x2);
326impl_vvv!("lsx", lsx_vmin_bu, simd_imin, m128i, u8x16);
327impl_vvv!("lsx", lsx_vmin_hu, simd_imin, m128i, u16x8);
328impl_vvv!("lsx", lsx_vmin_wu, simd_imin, m128i, u32x4);
329impl_vvv!("lsx", lsx_vmin_du, simd_imin, m128i, u64x2);
330impl_vvv!("lsx", lsx_vseq_b, simd_eq, m128i, i8x16);
331impl_vvv!("lsx", lsx_vseq_h, simd_eq, m128i, i16x8);
332impl_vvv!("lsx", lsx_vseq_w, simd_eq, m128i, i32x4);
333impl_vvv!("lsx", lsx_vseq_d, simd_eq, m128i, i64x2);
334impl_vvv!("lsx", lsx_vslt_b, simd_lt, m128i, i8x16);
335impl_vvv!("lsx", lsx_vslt_h, simd_lt, m128i, i16x8);
336impl_vvv!("lsx", lsx_vslt_w, simd_lt, m128i, i32x4);
337impl_vvv!("lsx", lsx_vslt_d, simd_lt, m128i, i64x2);
338impl_vvv!("lsx", lsx_vslt_bu, simd_lt, m128i, u8x16);
339impl_vvv!("lsx", lsx_vslt_hu, simd_lt, m128i, u16x8);
340impl_vvv!("lsx", lsx_vslt_wu, simd_lt, m128i, u32x4);
341impl_vvv!("lsx", lsx_vslt_du, simd_lt, m128i, u64x2);
342impl_vvv!("lsx", lsx_vsle_b, simd_le, m128i, i8x16);
343impl_vvv!("lsx", lsx_vsle_h, simd_le, m128i, i16x8);
344impl_vvv!("lsx", lsx_vsle_w, simd_le, m128i, i32x4);
345impl_vvv!("lsx", lsx_vsle_d, simd_le, m128i, i64x2);
346impl_vvv!("lsx", lsx_vsle_bu, simd_le, m128i, u8x16);
347impl_vvv!("lsx", lsx_vsle_hu, simd_le, m128i, u16x8);
348impl_vvv!("lsx", lsx_vsle_wu, simd_le, m128i, u32x4);
349impl_vvv!("lsx", lsx_vsle_du, simd_le, m128i, u64x2);
350impl_vvv!("lsx", lsx_vmul_b, simd_mul, m128i, i8x16);
351impl_vvv!("lsx", lsx_vmul_h, simd_mul, m128i, i16x8);
352impl_vvv!("lsx", lsx_vmul_w, simd_mul, m128i, i32x4);
353impl_vvv!("lsx", lsx_vmul_d, simd_mul, m128i, i64x2);
354impl_vvv!("lsx", lsx_vdiv_b, simd_div, m128i, i8x16);
355impl_vvv!("lsx", lsx_vdiv_h, simd_div, m128i, i16x8);
356impl_vvv!("lsx", lsx_vdiv_w, simd_div, m128i, i32x4);
357impl_vvv!("lsx", lsx_vdiv_d, simd_div, m128i, i64x2);
358impl_vvv!("lsx", lsx_vdiv_bu, simd_div, m128i, u8x16);
359impl_vvv!("lsx", lsx_vdiv_hu, simd_div, m128i, u16x8);
360impl_vvv!("lsx", lsx_vdiv_wu, simd_div, m128i, u32x4);
361impl_vvv!("lsx", lsx_vdiv_du, simd_div, m128i, u64x2);
362impl_vvv!("lsx", lsx_vmod_b, simd_rem, m128i, i8x16);
363impl_vvv!("lsx", lsx_vmod_h, simd_rem, m128i, i16x8);
364impl_vvv!("lsx", lsx_vmod_w, simd_rem, m128i, i32x4);
365impl_vvv!("lsx", lsx_vmod_d, simd_rem, m128i, i64x2);
366impl_vvv!("lsx", lsx_vmod_bu, simd_rem, m128i, u8x16);
367impl_vvv!("lsx", lsx_vmod_hu, simd_rem, m128i, u16x8);
368impl_vvv!("lsx", lsx_vmod_wu, simd_rem, m128i, u32x4);
369impl_vvv!("lsx", lsx_vmod_du, simd_rem, m128i, u64x2);
370impl_vvv!("lsx", lsx_vand_v, simd_and, m128i, u8x16);
371impl_vvv!("lsx", lsx_vandn_v, simd_ext_andn, m128i, u8x16);
372impl_vvv!("lsx", lsx_vor_v, simd_or, m128i, u8x16);
373impl_vvv!("lsx", lsx_vorn_v, simd_ext_orn, m128i, u8x16);
374impl_vvv!("lsx", lsx_vnor_v, simd_ext_nor, m128i, u8x16);
375impl_vvv!("lsx", lsx_vxor_v, simd_xor, m128i, u8x16);
376impl_vvv!("lsx", lsx_vfadd_s, simd_add, m128, f32x4);
377impl_vvv!("lsx", lsx_vfadd_d, simd_add, m128d, f64x2);
378impl_vvv!("lsx", lsx_vfsub_s, simd_sub, m128, f32x4);
379impl_vvv!("lsx", lsx_vfsub_d, simd_sub, m128d, f64x2);
380impl_vvv!("lsx", lsx_vfmul_s, simd_mul, m128, f32x4);
381impl_vvv!("lsx", lsx_vfmul_d, simd_mul, m128d, f64x2);
382impl_vvv!("lsx", lsx_vfdiv_s, simd_div, m128, f32x4);
383impl_vvv!("lsx", lsx_vfdiv_d, simd_div, m128d, f64x2);
384impl_vvv!("lsx", lsx_vsll_b, simd_ext_shl, m128i, i8x16);
385impl_vvv!("lsx", lsx_vsll_h, simd_ext_shl, m128i, i16x8);
386impl_vvv!("lsx", lsx_vsll_w, simd_ext_shl, m128i, i32x4);
387impl_vvv!("lsx", lsx_vsll_d, simd_ext_shl, m128i, i64x2);
388impl_vvv!("lsx", lsx_vsra_b, simd_ext_shr, m128i, i8x16);
389impl_vvv!("lsx", lsx_vsra_h, simd_ext_shr, m128i, i16x8);
390impl_vvv!("lsx", lsx_vsra_w, simd_ext_shr, m128i, i32x4);
391impl_vvv!("lsx", lsx_vsra_d, simd_ext_shr, m128i, i64x2);
392impl_vvv!("lsx", lsx_vsrl_b, simd_ext_shr, m128i, u8x16);
393impl_vvv!("lsx", lsx_vsrl_h, simd_ext_shr, m128i, u16x8);
394impl_vvv!("lsx", lsx_vsrl_w, simd_ext_shr, m128i, u32x4);
395impl_vvv!("lsx", lsx_vsrl_d, simd_ext_shr, m128i, u64x2);
396impl_vvv!("lsx", lsx_vrotr_b, simd_ext_rotr, m128i, u8x16);
397impl_vvv!("lsx", lsx_vrotr_h, simd_ext_rotr, m128i, u16x8);
398impl_vvv!("lsx", lsx_vrotr_w, simd_ext_rotr, m128i, u32x4);
399impl_vvv!("lsx", lsx_vrotr_d, simd_ext_rotr, m128i, u64x2);
400impl_vvv!("lsx", lsx_vbitclr_b, simd_ext_bitclr, m128i, u8x16);
401impl_vvv!("lsx", lsx_vbitclr_h, simd_ext_bitclr, m128i, u16x8);
402impl_vvv!("lsx", lsx_vbitclr_w, simd_ext_bitclr, m128i, u32x4);
403impl_vvv!("lsx", lsx_vbitclr_d, simd_ext_bitclr, m128i, u64x2);
404impl_vvv!("lsx", lsx_vbitset_b, simd_ext_bitset, m128i, u8x16);
405impl_vvv!("lsx", lsx_vbitset_h, simd_ext_bitset, m128i, u16x8);
406impl_vvv!("lsx", lsx_vbitset_w, simd_ext_bitset, m128i, u32x4);
407impl_vvv!("lsx", lsx_vbitset_d, simd_ext_bitset, m128i, u64x2);
408impl_vvv!("lsx", lsx_vbitrev_b, simd_ext_bitrev, m128i, u8x16);
409impl_vvv!("lsx", lsx_vbitrev_h, simd_ext_bitrev, m128i, u16x8);
410impl_vvv!("lsx", lsx_vbitrev_w, simd_ext_bitrev, m128i, u32x4);
411impl_vvv!("lsx", lsx_vbitrev_d, simd_ext_bitrev, m128i, u64x2);
412impl_vvv!("lsx", lsx_vsadd_b, simd_saturating_add, m128i, i8x16);
413impl_vvv!("lsx", lsx_vsadd_h, simd_saturating_add, m128i, i16x8);
414impl_vvv!("lsx", lsx_vsadd_w, simd_saturating_add, m128i, i32x4);
415impl_vvv!("lsx", lsx_vsadd_d, simd_saturating_add, m128i, i64x2);
416impl_vvv!("lsx", lsx_vsadd_bu, simd_saturating_add, m128i, u8x16);
417impl_vvv!("lsx", lsx_vsadd_hu, simd_saturating_add, m128i, u16x8);
418impl_vvv!("lsx", lsx_vsadd_wu, simd_saturating_add, m128i, u32x4);
419impl_vvv!("lsx", lsx_vsadd_du, simd_saturating_add, m128i, u64x2);
420impl_vvv!("lsx", lsx_vssub_b, simd_saturating_sub, m128i, i8x16);
421impl_vvv!("lsx", lsx_vssub_h, simd_saturating_sub, m128i, i16x8);
422impl_vvv!("lsx", lsx_vssub_w, simd_saturating_sub, m128i, i32x4);
423impl_vvv!("lsx", lsx_vssub_d, simd_saturating_sub, m128i, i64x2);
424impl_vvv!("lsx", lsx_vssub_bu, simd_saturating_sub, m128i, u8x16);
425impl_vvv!("lsx", lsx_vssub_hu, simd_saturating_sub, m128i, u16x8);
426impl_vvv!("lsx", lsx_vssub_wu, simd_saturating_sub, m128i, u32x4);
427impl_vvv!("lsx", lsx_vssub_du, simd_saturating_sub, m128i, u64x2);
428impl_vvv!("lsx", lsx_vadda_b, simd_ext_adda, m128i, i8x16);
429impl_vvv!("lsx", lsx_vadda_h, simd_ext_adda, m128i, i16x8);
430impl_vvv!("lsx", lsx_vadda_w, simd_ext_adda, m128i, i32x4);
431impl_vvv!("lsx", lsx_vadda_d, simd_ext_adda, m128i, i64x2);
432impl_vvv!("lsx", lsx_vabsd_b, simd_ext_absd, m128i, i8x16);
433impl_vvv!("lsx", lsx_vabsd_h, simd_ext_absd, m128i, i16x8);
434impl_vvv!("lsx", lsx_vabsd_w, simd_ext_absd, m128i, i32x4);
435impl_vvv!("lsx", lsx_vabsd_d, simd_ext_absd, m128i, i64x2);
436impl_vvv!("lsx", lsx_vabsd_bu, simd_ext_absd, m128i, u8x16);
437impl_vvv!("lsx", lsx_vabsd_hu, simd_ext_absd, m128i, u16x8);
438impl_vvv!("lsx", lsx_vabsd_wu, simd_ext_absd, m128i, u32x4);
439impl_vvv!("lsx", lsx_vabsd_du, simd_ext_absd, m128i, u64x2);
440impl_vvv!("lsx", lsx_vmuh_b, simd_ext_muh, m128i, i8x16, i16x16);
441impl_vvv!("lsx", lsx_vmuh_h, simd_ext_muh, m128i, i16x8, i32x8);
442impl_vvv!("lsx", lsx_vmuh_w, simd_ext_muh, m128i, i32x4, i64x4);
443impl_vvv!("lsx", lsx_vmuh_d, simd_ext_muh, m128i, i64x2, i128x2);
444impl_vvv!("lsx", lsx_vmuh_bu, simd_ext_muh, m128i, u8x16, u16x16);
445impl_vvv!("lsx", lsx_vmuh_hu, simd_ext_muh, m128i, u16x8, u32x8);
446impl_vvv!("lsx", lsx_vmuh_wu, simd_ext_muh, m128i, u32x4, u64x4);
447impl_vvv!("lsx", lsx_vmuh_du, simd_ext_muh, m128i, u64x2, u128x2);
448impl_vvv!("lsx", lsx_vpickev_b, simd_ext_pickev_b, m128i, i8x16);
449impl_vvv!("lsx", lsx_vpickev_h, simd_ext_pickev_h, m128i, i16x8);
450impl_vvv!("lsx", lsx_vpickev_w, simd_ext_pickev_w, m128i, i32x4);
451impl_vvv!("lsx", lsx_vpickev_d, simd_ext_pickev_d, m128i, i64x2);
452impl_vvv!("lsx", lsx_vpickod_b, simd_ext_pickod_b, m128i, i8x16);
453impl_vvv!("lsx", lsx_vpickod_h, simd_ext_pickod_h, m128i, i16x8);
454impl_vvv!("lsx", lsx_vpickod_w, simd_ext_pickod_w, m128i, i32x4);
455impl_vvv!("lsx", lsx_vpickod_d, simd_ext_pickod_d, m128i, i64x2);
456impl_vvv!("lsx", lsx_vilvh_b, simd_ext_ilvh_b, m128i, i8x16);
457impl_vvv!("lsx", lsx_vilvh_h, simd_ext_ilvh_h, m128i, i16x8);
458impl_vvv!("lsx", lsx_vilvh_w, simd_ext_ilvh_w, m128i, i32x4);
459impl_vvv!("lsx", lsx_vilvh_d, simd_ext_ilvh_d, m128i, i64x2);
460impl_vvv!("lsx", lsx_vilvl_b, simd_ext_ilvl_b, m128i, i8x16);
461impl_vvv!("lsx", lsx_vilvl_h, simd_ext_ilvl_h, m128i, i16x8);
462impl_vvv!("lsx", lsx_vilvl_w, simd_ext_ilvl_w, m128i, i32x4);
463impl_vvv!("lsx", lsx_vilvl_d, simd_ext_ilvl_d, m128i, i64x2);
464impl_vvv!("lsx", lsx_vpackev_b, simd_ext_packev_b, m128i, i8x16);
465impl_vvv!("lsx", lsx_vpackev_h, simd_ext_packev_h, m128i, i16x8);
466impl_vvv!("lsx", lsx_vpackev_w, simd_ext_packev_w, m128i, i32x4);
467impl_vvv!("lsx", lsx_vpackev_d, simd_ext_packev_d, m128i, i64x2);
468impl_vvv!("lsx", lsx_vpackod_b, simd_ext_packod_b, m128i, i8x16);
469impl_vvv!("lsx", lsx_vpackod_h, simd_ext_packod_h, m128i, i16x8);
470impl_vvv!("lsx", lsx_vpackod_w, simd_ext_packod_w, m128i, i32x4);
471impl_vvv!("lsx", lsx_vpackod_d, simd_ext_packod_d, m128i, i64x2);
472
473impl_vgg!("lsx", lsx_vstx, simd_ext_stx, m128i, i8x16, *mut i8, i64, unsafe);
474
475impl_vgs!("lsx", lsx_vst, simd_ext_st, m128i, i8x16, *mut i8, 12, const, unsafe);
476
477impl_vuv!("lsx", lsx_vslli_b, simd_shl, m128i, i8x16);
478impl_vuv!("lsx", lsx_vslli_h, simd_shl, m128i, i16x8);
479impl_vuv!("lsx", lsx_vslli_w, simd_shl, m128i, i32x4);
480impl_vuv!("lsx", lsx_vslli_d, simd_shl, m128i, i64x2);
481impl_vuv!("lsx", lsx_vsrai_b, simd_shr, m128i, i8x16);
482impl_vuv!("lsx", lsx_vsrai_h, simd_shr, m128i, i16x8);
483impl_vuv!("lsx", lsx_vsrai_w, simd_shr, m128i, i32x4);
484impl_vuv!("lsx", lsx_vsrai_d, simd_shr, m128i, i64x2);
485impl_vuv!("lsx", lsx_vsrli_b, simd_shr, m128i, u8x16);
486impl_vuv!("lsx", lsx_vsrli_h, simd_shr, m128i, u16x8);
487impl_vuv!("lsx", lsx_vsrli_w, simd_shr, m128i, u32x4);
488impl_vuv!("lsx", lsx_vsrli_d, simd_shr, m128i, u64x2);
489impl_vuv!("lsx", lsx_vrotri_b, simd_ext_rotr, m128i, u8x16);
490impl_vuv!("lsx", lsx_vrotri_h, simd_ext_rotr, m128i, u16x8);
491impl_vuv!("lsx", lsx_vrotri_w, simd_ext_rotr, m128i, u32x4);
492impl_vuv!("lsx", lsx_vrotri_d, simd_ext_rotr, m128i, u64x2);
493impl_vuv!("lsx", lsx_vaddi_bu, simd_add, m128i, u8x16, 5);
494impl_vuv!("lsx", lsx_vaddi_hu, simd_add, m128i, u16x8, 5);
495impl_vuv!("lsx", lsx_vaddi_wu, simd_add, m128i, u32x4, 5);
496impl_vuv!("lsx", lsx_vaddi_du, simd_add, m128i, u64x2, 5);
497impl_vuv!("lsx", lsx_vslti_bu, simd_lt, m128i, u8x16, 5);
498impl_vuv!("lsx", lsx_vslti_hu, simd_lt, m128i, u16x8, 5);
499impl_vuv!("lsx", lsx_vslti_wu, simd_lt, m128i, u32x4, 5);
500impl_vuv!("lsx", lsx_vslti_du, simd_lt, m128i, u64x2, 5);
501impl_vuv!("lsx", lsx_vslei_bu, simd_le, m128i, u8x16, 5);
502impl_vuv!("lsx", lsx_vslei_hu, simd_le, m128i, u16x8, 5);
503impl_vuv!("lsx", lsx_vslei_wu, simd_le, m128i, u32x4, 5);
504impl_vuv!("lsx", lsx_vslei_du, simd_le, m128i, u64x2, 5);
505impl_vuv!("lsx", lsx_vmaxi_bu, simd_imax, m128i, u8x16, 5);
506impl_vuv!("lsx", lsx_vmaxi_hu, simd_imax, m128i, u16x8, 5);
507impl_vuv!("lsx", lsx_vmaxi_wu, simd_imax, m128i, u32x4, 5);
508impl_vuv!("lsx", lsx_vmaxi_du, simd_imax, m128i, u64x2, 5);
509impl_vuv!("lsx", lsx_vmini_bu, simd_imin, m128i, u8x16, 5);
510impl_vuv!("lsx", lsx_vmini_hu, simd_imin, m128i, u16x8, 5);
511impl_vuv!("lsx", lsx_vmini_wu, simd_imin, m128i, u32x4, 5);
512impl_vuv!("lsx", lsx_vmini_du, simd_imin, m128i, u64x2, 5);
513impl_vuv!("lsx", lsx_vreplvei_b, simd_ext_replvei_b, m128i, i8x16, 4, const);
514impl_vuv!("lsx", lsx_vreplvei_h, simd_ext_replvei_h, m128i, i16x8, 3, const);
515impl_vuv!("lsx", lsx_vreplvei_w, simd_ext_replvei_w, m128i, i32x4, 2, const);
516impl_vuv!("lsx", lsx_vreplvei_d, simd_ext_replvei_d, m128i, i64x2, 1, const);
517impl_vuv!("lsx", lsx_vshuf4i_b, simd_ext_shuf4i_b, m128i, i8x16, 8, const);
518impl_vuv!("lsx", lsx_vshuf4i_h, simd_ext_shuf4i_h, m128i, i16x8, 8, const);
519impl_vuv!("lsx", lsx_vshuf4i_w, simd_ext_shuf4i_w, m128i, i32x4, 8, const);
520impl_vuv!("lsx", lsx_vbsll_v, simd_ext_bsll, m128i, i8x16, 5, const);
521impl_vuv!("lsx", lsx_vbsrl_v, simd_ext_bsrl, m128i, i8x16, 5, const);
522
523impl_vug!("lsx", lsx_vpickve2gr_b, simd_extract, m128i, i8x16, i32, 4);
524impl_vug!("lsx", lsx_vpickve2gr_h, simd_extract, m128i, i16x8, i32, 3);
525impl_vug!("lsx", lsx_vpickve2gr_w, simd_extract, m128i, i32x4, i32, 2);
526impl_vug!("lsx", lsx_vpickve2gr_d, simd_extract, m128i, i64x2, i64, 1);
527impl_vug!("lsx", lsx_vpickve2gr_bu, simd_extract, m128i, u8x16, u32, 4);
528impl_vug!("lsx", lsx_vpickve2gr_hu, simd_extract, m128i, u16x8, u32, 3);
529impl_vug!("lsx", lsx_vpickve2gr_wu, simd_extract, m128i, u32x4, u32, 2);
530impl_vug!("lsx", lsx_vpickve2gr_du, simd_extract, m128i, u64x2, u64, 1);
531
532impl_vsv!("lsx", lsx_vseqi_b, simd_eq, m128i, i8x16, 5);
533impl_vsv!("lsx", lsx_vseqi_h, simd_eq, m128i, i16x8, 5);
534impl_vsv!("lsx", lsx_vseqi_w, simd_eq, m128i, i32x4, 5);
535impl_vsv!("lsx", lsx_vseqi_d, simd_eq, m128i, i64x2, 5);
536impl_vsv!("lsx", lsx_vslti_b, simd_lt, m128i, i8x16, 5);
537impl_vsv!("lsx", lsx_vslti_h, simd_lt, m128i, i16x8, 5);
538impl_vsv!("lsx", lsx_vslti_w, simd_lt, m128i, i32x4, 5);
539impl_vsv!("lsx", lsx_vslti_d, simd_lt, m128i, i64x2, 5);
540impl_vsv!("lsx", lsx_vslei_b, simd_le, m128i, i8x16, 5);
541impl_vsv!("lsx", lsx_vslei_h, simd_le, m128i, i16x8, 5);
542impl_vsv!("lsx", lsx_vslei_w, simd_le, m128i, i32x4, 5);
543impl_vsv!("lsx", lsx_vslei_d, simd_le, m128i, i64x2, 5);
544impl_vsv!("lsx", lsx_vmaxi_b, simd_imax, m128i, i8x16, 5);
545impl_vsv!("lsx", lsx_vmaxi_h, simd_imax, m128i, i16x8, 5);
546impl_vsv!("lsx", lsx_vmaxi_w, simd_imax, m128i, i32x4, 5);
547impl_vsv!("lsx", lsx_vmaxi_d, simd_imax, m128i, i64x2, 5);
548impl_vsv!("lsx", lsx_vmini_b, simd_imin, m128i, i8x16, 5);
549impl_vsv!("lsx", lsx_vmini_h, simd_imin, m128i, i16x8, 5);
550impl_vsv!("lsx", lsx_vmini_w, simd_imin, m128i, i32x4, 5);
551impl_vsv!("lsx", lsx_vmini_d, simd_imin, m128i, i64x2, 5);
552
553impl_vvvv!("lsx", lsx_vmadd_b, simd_ext_madd, m128i, i8x16);
554impl_vvvv!("lsx", lsx_vmadd_h, simd_ext_madd, m128i, i16x8);
555impl_vvvv!("lsx", lsx_vmadd_w, simd_ext_madd, m128i, i32x4);
556impl_vvvv!("lsx", lsx_vmadd_d, simd_ext_madd, m128i, i64x2);
557impl_vvvv!("lsx", lsx_vmsub_b, simd_ext_msub, m128i, i8x16);
558impl_vvvv!("lsx", lsx_vmsub_h, simd_ext_msub, m128i, i16x8);
559impl_vvvv!("lsx", lsx_vmsub_w, simd_ext_msub, m128i, i32x4);
560impl_vvvv!("lsx", lsx_vmsub_d, simd_ext_msub, m128i, i64x2);
561impl_vvvv!("lsx", lsx_vfmadd_s, simd_fma, m128, f32x4);
562impl_vvvv!("lsx", lsx_vfmadd_d, simd_fma, m128d, f64x2);
563impl_vvvv!("lsx", lsx_vfmsub_s, simd_ext_fmsub, m128, f32x4);
564impl_vvvv!("lsx", lsx_vfmsub_d, simd_ext_fmsub, m128d, f64x2);
565impl_vvvv!("lsx", lsx_vfnmadd_s, simd_ext_fnmadd, m128, f32x4);
566impl_vvvv!("lsx", lsx_vfnmadd_d, simd_ext_fnmadd, m128d, f64x2);
567impl_vvvv!("lsx", lsx_vfnmsub_s, simd_ext_fnmsub, m128, f32x4);
568impl_vvvv!("lsx", lsx_vfnmsub_d, simd_ext_fnmsub, m128d, f64x2);
569
570impl_vvuv!("lsx", lsx_vshuf4i_d, simd_ext_shuf4i_d, m128i, i64x2, 8, const);
571
572impl_vugv!("lsx", lsx_vinsgr2vr_b, simd_insert, m128i, i8x16, i32, 4);
573impl_vugv!("lsx", lsx_vinsgr2vr_h, simd_insert, m128i, i16x8, i32, 3);
574impl_vugv!("lsx", lsx_vinsgr2vr_w, simd_insert, m128i, i32x4, i32, 2);
575impl_vugv!("lsx", lsx_vinsgr2vr_d, simd_insert, m128i, i64x2, i64, 1);
576
577#[cfg(test)]
578mod tests {
579    use crate::{
580        core_arch::{loongarch64::*, simd::*},
581        mem::transmute,
582    };
583    use std::hint::black_box;
584    use stdarch_test::simd_test;
585
586    #[simd_test(enable = "lsx")]
587    unsafe fn vldi() {
588        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
589        assert_eq!(r, transmute(lsx_vldi::<0>()));
590        let r = i8x16::new(
591            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
592        );
593        assert_eq!(r, transmute(lsx_vldi::<255>()));
594        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
595        assert_eq!(r, transmute(lsx_vldi::<1024>()));
596        let r = i8x16::new(0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2, 0, -2);
597        assert_eq!(r, transmute(lsx_vldi::<1536>()));
598        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
599        assert_eq!(r, transmute(lsx_vldi::<2048>()));
600        let r = i8x16::new(0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1, 0, -2, -1, -1);
601        assert_eq!(r, transmute(lsx_vldi::<2560>()));
602        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
603        assert_eq!(r, transmute(lsx_vldi::<3072>()));
604        let r = i8x16::new(0, -2, -1, -1, -1, -1, -1, -1, 0, -2, -1, -1, -1, -1, -1, -1);
605        assert_eq!(r, transmute(lsx_vldi::<3584>()));
606        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
607        assert_eq!(r, transmute(lsx_vldi::<-4096>()));
608        let r = i8x16::new(-128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0);
609        assert_eq!(r, transmute(lsx_vldi::<-3968>()));
610        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
611        assert_eq!(r, transmute(lsx_vldi::<-3840>()));
612        let r = i8x16::new(0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0);
613        assert_eq!(r, transmute(lsx_vldi::<-3712>()));
614        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
615        assert_eq!(r, transmute(lsx_vldi::<-3584>()));
616        let r = i8x16::new(0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0);
617        assert_eq!(r, transmute(lsx_vldi::<-3456>()));
618        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
619        assert_eq!(r, transmute(lsx_vldi::<-3328>()));
620        let r = i8x16::new(0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128, 0, 0, 0, -128);
621        assert_eq!(r, transmute(lsx_vldi::<-3200>()));
622        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
623        assert_eq!(r, transmute(lsx_vldi::<-3072>()));
624        let r = i8x16::new(
625            -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0,
626        );
627        assert_eq!(r, transmute(lsx_vldi::<-2944>()));
628        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
629        assert_eq!(r, transmute(lsx_vldi::<-2816>()));
630        let r = i8x16::new(
631            0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128, 0, -128,
632        );
633        assert_eq!(r, transmute(lsx_vldi::<-2688>()));
634        let r = i8x16::new(-1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0);
635        assert_eq!(r, transmute(lsx_vldi::<-2560>()));
636        let r = i8x16::new(
637            -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0, -1, -128, 0, 0,
638        );
639        assert_eq!(r, transmute(lsx_vldi::<-2432>()));
640        let r = i8x16::new(-1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0);
641        assert_eq!(r, transmute(lsx_vldi::<-2304>()));
642        let r = i8x16::new(
643            -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0, -1, -1, -128, 0,
644        );
645        assert_eq!(r, transmute(lsx_vldi::<-2176>()));
646        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
647        assert_eq!(r, transmute(lsx_vldi::<-2048>()));
648        let r = i8x16::new(
649            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
650        );
651        assert_eq!(r, transmute(lsx_vldi::<-1793>()));
652        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
653        assert_eq!(r, transmute(lsx_vldi::<-1792>()));
654        let r = i8x16::new(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1);
655        assert_eq!(r, transmute(lsx_vldi::<-1622>()));
656        let r = i8x16::new(0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 64);
657        assert_eq!(r, transmute(lsx_vldi::<-1536>()));
658        let r = i8x16::new(0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63, 0, 0, 80, -63);
659        assert_eq!(r, transmute(lsx_vldi::<-1366>()));
660        let r = i8x16::new(0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0);
661        assert_eq!(r, transmute(lsx_vldi::<-1280>()));
662        let r = i8x16::new(0, 0, 80, -63, 0, 0, 0, 0, 0, 0, 80, -63, 0, 0, 0, 0);
663        assert_eq!(r, transmute(lsx_vldi::<-1110>()));
664        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64);
665        assert_eq!(r, transmute(lsx_vldi::<-1024>()));
666        let r = i8x16::new(0, 0, 0, 0, 0, 0, 42, -64, 0, 0, 0, 0, 0, 0, 42, -64);
667        assert_eq!(r, transmute(lsx_vldi::<-854>()));
668    }
669
670    #[simd_test(enable = "lsx")]
671    unsafe fn vbsll_v() {
672        let a = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
673        let r = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
674        assert_eq!(r, transmute(lsx_vbsll_v::<0>(black_box(transmute(a)))));
675        let r = i8x16::new(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
676        assert_eq!(r, transmute(lsx_vbsll_v::<1>(black_box(transmute(a)))));
677        let r = i8x16::new(0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
678        assert_eq!(r, transmute(lsx_vbsll_v::<2>(black_box(transmute(a)))));
679        let r = i8x16::new(0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
680        assert_eq!(r, transmute(lsx_vbsll_v::<3>(black_box(transmute(a)))));
681        let r = i8x16::new(0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
682        assert_eq!(r, transmute(lsx_vbsll_v::<4>(black_box(transmute(a)))));
683        let r = i8x16::new(0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
684        assert_eq!(r, transmute(lsx_vbsll_v::<5>(black_box(transmute(a)))));
685        let r = i8x16::new(0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
686        assert_eq!(r, transmute(lsx_vbsll_v::<6>(black_box(transmute(a)))));
687        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
688        assert_eq!(r, transmute(lsx_vbsll_v::<7>(black_box(transmute(a)))));
689        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8);
690        assert_eq!(r, transmute(lsx_vbsll_v::<8>(black_box(transmute(a)))));
691        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7);
692        assert_eq!(r, transmute(lsx_vbsll_v::<9>(black_box(transmute(a)))));
693        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6);
694        assert_eq!(r, transmute(lsx_vbsll_v::<10>(black_box(transmute(a)))));
695        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5);
696        assert_eq!(r, transmute(lsx_vbsll_v::<11>(black_box(transmute(a)))));
697        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4);
698        assert_eq!(r, transmute(lsx_vbsll_v::<12>(black_box(transmute(a)))));
699        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3);
700        assert_eq!(r, transmute(lsx_vbsll_v::<13>(black_box(transmute(a)))));
701        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2);
702        assert_eq!(r, transmute(lsx_vbsll_v::<14>(black_box(transmute(a)))));
703        let r = i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
704        assert_eq!(r, transmute(lsx_vbsll_v::<15>(black_box(transmute(a)))));
705    }
706
707    #[simd_test(enable = "lsx")]
708    unsafe fn vbsrl_v() {
709        let a = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
710        let r = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
711        assert_eq!(r, transmute(lsx_vbsrl_v::<0>(black_box(transmute(a)))));
712        let r = i8x16::new(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0);
713        assert_eq!(r, transmute(lsx_vbsrl_v::<1>(black_box(transmute(a)))));
714        let r = i8x16::new(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0);
715        assert_eq!(r, transmute(lsx_vbsrl_v::<2>(black_box(transmute(a)))));
716        let r = i8x16::new(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0);
717        assert_eq!(r, transmute(lsx_vbsrl_v::<3>(black_box(transmute(a)))));
718        let r = i8x16::new(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0);
719        assert_eq!(r, transmute(lsx_vbsrl_v::<4>(black_box(transmute(a)))));
720        let r = i8x16::new(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0);
721        assert_eq!(r, transmute(lsx_vbsrl_v::<5>(black_box(transmute(a)))));
722        let r = i8x16::new(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0);
723        assert_eq!(r, transmute(lsx_vbsrl_v::<6>(black_box(transmute(a)))));
724        let r = i8x16::new(8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0);
725        assert_eq!(r, transmute(lsx_vbsrl_v::<7>(black_box(transmute(a)))));
726        let r = i8x16::new(9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0);
727        assert_eq!(r, transmute(lsx_vbsrl_v::<8>(black_box(transmute(a)))));
728        let r = i8x16::new(10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0);
729        assert_eq!(r, transmute(lsx_vbsrl_v::<9>(black_box(transmute(a)))));
730        let r = i8x16::new(11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
731        assert_eq!(r, transmute(lsx_vbsrl_v::<10>(black_box(transmute(a)))));
732        let r = i8x16::new(12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
733        assert_eq!(r, transmute(lsx_vbsrl_v::<11>(black_box(transmute(a)))));
734        let r = i8x16::new(13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
735        assert_eq!(r, transmute(lsx_vbsrl_v::<12>(black_box(transmute(a)))));
736        let r = i8x16::new(14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
737        assert_eq!(r, transmute(lsx_vbsrl_v::<13>(black_box(transmute(a)))));
738        let r = i8x16::new(15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
739        assert_eq!(r, transmute(lsx_vbsrl_v::<14>(black_box(transmute(a)))));
740        let r = i8x16::new(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
741        assert_eq!(r, transmute(lsx_vbsrl_v::<15>(black_box(transmute(a)))));
742    }
743}