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 as ls, simd::*, *};
4use crate::core_arch::simd::{self as cs, *};
5use crate::intrinsics::simd as is;
6use crate::mem::transmute;
7
8#[inline(always)]
9#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
10const unsafe fn simd_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_pickev_d<T: Copy>(a: T, b: T) -> T {
24    simd_shuffle!(b, a, [0, 4, 2, 6])
25}
26
27#[inline(always)]
28#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
29const unsafe fn simd_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_pickev_h<T: Copy>(a: T, b: T) -> T {
36    simd_shuffle!(b, a, [0, 2, 4, 6, 16, 18, 20, 22, 8, 10, 12, 14, 24, 26, 28, 30])
37}
38
39#[inline(always)]
40#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
41const unsafe fn simd_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_pickod_d<T: Copy>(a: T, b: T) -> T {
55    simd_shuffle!(b, a, [1, 5, 3, 7])
56}
57
58#[inline(always)]
59#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
60const unsafe fn simd_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_pickod_h<T: Copy>(a: T, b: T) -> T {
67    simd_shuffle!(b, a, [1, 3, 5, 7, 17, 19, 21, 23, 9, 11, 13, 15, 25, 27, 29, 31])
68}
69
70#[inline(always)]
71#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
72const unsafe fn simd_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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
317impl_vv!("lasx", lasx_xvpcnt_b, is::simd_ctpop, m256i, i8x32);
318impl_vv!("lasx", lasx_xvpcnt_h, is::simd_ctpop, m256i, i16x16);
319impl_vv!("lasx", lasx_xvpcnt_w, is::simd_ctpop, m256i, i32x8);
320impl_vv!("lasx", lasx_xvpcnt_d, is::simd_ctpop, m256i, i64x4);
321impl_vv!("lasx", lasx_xvclz_b, is::simd_ctlz, m256i, i8x32);
322impl_vv!("lasx", lasx_xvclz_h, is::simd_ctlz, m256i, i16x16);
323impl_vv!("lasx", lasx_xvclz_w, is::simd_ctlz, m256i, i32x8);
324impl_vv!("lasx", lasx_xvclz_d, is::simd_ctlz, m256i, i64x4);
325impl_vv!("lasx", lasx_xvneg_b, is::simd_neg, m256i, i8x32);
326impl_vv!("lasx", lasx_xvneg_h, is::simd_neg, m256i, i16x16);
327impl_vv!("lasx", lasx_xvneg_w, is::simd_neg, m256i, i32x8);
328impl_vv!("lasx", lasx_xvneg_d, is::simd_neg, m256i, i64x4);
329impl_vv!("lasx", lasx_xvfsqrt_s, is::simd_fsqrt, m256, f32x8);
330impl_vv!("lasx", lasx_xvfsqrt_d, is::simd_fsqrt, m256d, f64x4);
331impl_vv!("lasx", lasx_xvreplve0_b, simd_replve0_b, m256i, i8x32);
332impl_vv!("lasx", lasx_xvreplve0_h, simd_replve0_h, m256i, i16x16);
333impl_vv!("lasx", lasx_xvreplve0_w, simd_replve0_w, m256i, i32x8);
334impl_vv!("lasx", lasx_xvreplve0_d, simd_replve0_d, m256i, i64x4);
335impl_vv!("lasx", lasx_xvreplve0_q, simd_replve0_q, m256i, i64x4);
336
337impl_gv!("lasx", lasx_xvreplgr2vr_b, ls::simd_splat, m256i, i8x32, i32);
338impl_gv!("lasx", lasx_xvreplgr2vr_h, ls::simd_splat, m256i, i16x16, i32);
339impl_gv!("lasx", lasx_xvreplgr2vr_w, ls::simd_splat, m256i, i32x8, i32);
340impl_gv!("lasx", lasx_xvreplgr2vr_d, ls::simd_splat, m256i, i64x4, i64);
341
342impl_sv!("lasx", lasx_xvrepli_b, ls::simd_splat, m256i, i8x32, 10);
343impl_sv!("lasx", lasx_xvrepli_h, ls::simd_splat, m256i, i16x16, 10);
344impl_sv!("lasx", lasx_xvrepli_w, ls::simd_splat, m256i, i32x8, 10);
345impl_sv!("lasx", lasx_xvrepli_d, ls::simd_splat, m256i, i64x4, 10);
346
347impl_vvv!("lasx", lasx_xvadd_b, is::simd_add, m256i, i8x32);
348impl_vvv!("lasx", lasx_xvadd_h, is::simd_add, m256i, i16x16);
349impl_vvv!("lasx", lasx_xvadd_w, is::simd_add, m256i, i32x8);
350impl_vvv!("lasx", lasx_xvadd_d, is::simd_add, m256i, i64x4);
351impl_vvv!("lasx", lasx_xvsub_b, is::simd_sub, m256i, i8x32);
352impl_vvv!("lasx", lasx_xvsub_h, is::simd_sub, m256i, i16x16);
353impl_vvv!("lasx", lasx_xvsub_w, is::simd_sub, m256i, i32x8);
354impl_vvv!("lasx", lasx_xvsub_d, is::simd_sub, m256i, i64x4);
355impl_vvv!("lasx", lasx_xvmax_b, cs::simd_imax, m256i, i8x32);
356impl_vvv!("lasx", lasx_xvmax_h, cs::simd_imax, m256i, i16x16);
357impl_vvv!("lasx", lasx_xvmax_w, cs::simd_imax, m256i, i32x8);
358impl_vvv!("lasx", lasx_xvmax_d, cs::simd_imax, m256i, i64x4);
359impl_vvv!("lasx", lasx_xvmax_bu, cs::simd_imax, m256i, u8x32);
360impl_vvv!("lasx", lasx_xvmax_hu, cs::simd_imax, m256i, u16x16);
361impl_vvv!("lasx", lasx_xvmax_wu, cs::simd_imax, m256i, u32x8);
362impl_vvv!("lasx", lasx_xvmax_du, cs::simd_imax, m256i, u64x4);
363impl_vvv!("lasx", lasx_xvmin_b, cs::simd_imin, m256i, i8x32);
364impl_vvv!("lasx", lasx_xvmin_h, cs::simd_imin, m256i, i16x16);
365impl_vvv!("lasx", lasx_xvmin_w, cs::simd_imin, m256i, i32x8);
366impl_vvv!("lasx", lasx_xvmin_d, cs::simd_imin, m256i, i64x4);
367impl_vvv!("lasx", lasx_xvmin_bu, cs::simd_imin, m256i, u8x32);
368impl_vvv!("lasx", lasx_xvmin_hu, cs::simd_imin, m256i, u16x16);
369impl_vvv!("lasx", lasx_xvmin_wu, cs::simd_imin, m256i, u32x8);
370impl_vvv!("lasx", lasx_xvmin_du, cs::simd_imin, m256i, u64x4);
371impl_vvv!("lasx", lasx_xvseq_b, is::simd_eq, m256i, i8x32);
372impl_vvv!("lasx", lasx_xvseq_h, is::simd_eq, m256i, i16x16);
373impl_vvv!("lasx", lasx_xvseq_w, is::simd_eq, m256i, i32x8);
374impl_vvv!("lasx", lasx_xvseq_d, is::simd_eq, m256i, i64x4);
375impl_vvv!("lasx", lasx_xvslt_b, is::simd_lt, m256i, i8x32);
376impl_vvv!("lasx", lasx_xvslt_h, is::simd_lt, m256i, i16x16);
377impl_vvv!("lasx", lasx_xvslt_w, is::simd_lt, m256i, i32x8);
378impl_vvv!("lasx", lasx_xvslt_d, is::simd_lt, m256i, i64x4);
379impl_vvv!("lasx", lasx_xvslt_bu, is::simd_lt, m256i, u8x32);
380impl_vvv!("lasx", lasx_xvslt_hu, is::simd_lt, m256i, u16x16);
381impl_vvv!("lasx", lasx_xvslt_wu, is::simd_lt, m256i, u32x8);
382impl_vvv!("lasx", lasx_xvslt_du, is::simd_lt, m256i, u64x4);
383impl_vvv!("lasx", lasx_xvsle_b, is::simd_le, m256i, i8x32);
384impl_vvv!("lasx", lasx_xvsle_h, is::simd_le, m256i, i16x16);
385impl_vvv!("lasx", lasx_xvsle_w, is::simd_le, m256i, i32x8);
386impl_vvv!("lasx", lasx_xvsle_d, is::simd_le, m256i, i64x4);
387impl_vvv!("lasx", lasx_xvsle_bu, is::simd_le, m256i, u8x32);
388impl_vvv!("lasx", lasx_xvsle_hu, is::simd_le, m256i, u16x16);
389impl_vvv!("lasx", lasx_xvsle_wu, is::simd_le, m256i, u32x8);
390impl_vvv!("lasx", lasx_xvsle_du, is::simd_le, m256i, u64x4);
391impl_vvv!("lasx", lasx_xvmul_b, is::simd_mul, m256i, i8x32);
392impl_vvv!("lasx", lasx_xvmul_h, is::simd_mul, m256i, i16x16);
393impl_vvv!("lasx", lasx_xvmul_w, is::simd_mul, m256i, i32x8);
394impl_vvv!("lasx", lasx_xvmul_d, is::simd_mul, m256i, i64x4);
395impl_vvv!("lasx", lasx_xvdiv_b, is::simd_div, m256i, i8x32);
396impl_vvv!("lasx", lasx_xvdiv_h, is::simd_div, m256i, i16x16);
397impl_vvv!("lasx", lasx_xvdiv_w, is::simd_div, m256i, i32x8);
398impl_vvv!("lasx", lasx_xvdiv_d, is::simd_div, m256i, i64x4);
399impl_vvv!("lasx", lasx_xvdiv_bu, is::simd_div, m256i, u8x32);
400impl_vvv!("lasx", lasx_xvdiv_hu, is::simd_div, m256i, u16x16);
401impl_vvv!("lasx", lasx_xvdiv_wu, is::simd_div, m256i, u32x8);
402impl_vvv!("lasx", lasx_xvdiv_du, is::simd_div, m256i, u64x4);
403impl_vvv!("lasx", lasx_xvmod_b, is::simd_rem, m256i, i8x32);
404impl_vvv!("lasx", lasx_xvmod_h, is::simd_rem, m256i, i16x16);
405impl_vvv!("lasx", lasx_xvmod_w, is::simd_rem, m256i, i32x8);
406impl_vvv!("lasx", lasx_xvmod_d, is::simd_rem, m256i, i64x4);
407impl_vvv!("lasx", lasx_xvmod_bu, is::simd_rem, m256i, u8x32);
408impl_vvv!("lasx", lasx_xvmod_hu, is::simd_rem, m256i, u16x16);
409impl_vvv!("lasx", lasx_xvmod_wu, is::simd_rem, m256i, u32x8);
410impl_vvv!("lasx", lasx_xvmod_du, is::simd_rem, m256i, u64x4);
411impl_vvv!("lasx", lasx_xvand_v, is::simd_and, m256i, u8x32);
412impl_vvv!("lasx", lasx_xvandn_v, ls::simd_andn, m256i, u8x32);
413impl_vvv!("lasx", lasx_xvor_v, is::simd_or, m256i, u8x32);
414impl_vvv!("lasx", lasx_xvorn_v, ls::simd_orn, m256i, u8x32);
415impl_vvv!("lasx", lasx_xvnor_v, ls::simd_nor, m256i, u8x32);
416impl_vvv!("lasx", lasx_xvxor_v, is::simd_xor, m256i, u8x32);
417impl_vvv!("lasx", lasx_xvfadd_s, is::simd_add, m256, f32x8);
418impl_vvv!("lasx", lasx_xvfadd_d, is::simd_add, m256d, f64x4);
419impl_vvv!("lasx", lasx_xvfsub_s, is::simd_sub, m256, f32x8);
420impl_vvv!("lasx", lasx_xvfsub_d, is::simd_sub, m256d, f64x4);
421impl_vvv!("lasx", lasx_xvfmul_s, is::simd_mul, m256, f32x8);
422impl_vvv!("lasx", lasx_xvfmul_d, is::simd_mul, m256d, f64x4);
423impl_vvv!("lasx", lasx_xvfdiv_s, is::simd_div, m256, f32x8);
424impl_vvv!("lasx", lasx_xvfdiv_d, is::simd_div, m256d, f64x4);
425impl_vvv!("lasx", lasx_xvsll_b, ls::simd_shl, m256i, i8x32);
426impl_vvv!("lasx", lasx_xvsll_h, ls::simd_shl, m256i, i16x16);
427impl_vvv!("lasx", lasx_xvsll_w, ls::simd_shl, m256i, i32x8);
428impl_vvv!("lasx", lasx_xvsll_d, ls::simd_shl, m256i, i64x4);
429impl_vvv!("lasx", lasx_xvsra_b, ls::simd_shr, m256i, i8x32);
430impl_vvv!("lasx", lasx_xvsra_h, ls::simd_shr, m256i, i16x16);
431impl_vvv!("lasx", lasx_xvsra_w, ls::simd_shr, m256i, i32x8);
432impl_vvv!("lasx", lasx_xvsra_d, ls::simd_shr, m256i, i64x4);
433impl_vvv!("lasx", lasx_xvsrl_b, ls::simd_shr, m256i, u8x32);
434impl_vvv!("lasx", lasx_xvsrl_h, ls::simd_shr, m256i, u16x16);
435impl_vvv!("lasx", lasx_xvsrl_w, ls::simd_shr, m256i, u32x8);
436impl_vvv!("lasx", lasx_xvsrl_d, ls::simd_shr, m256i, u64x4);
437impl_vvv!("lasx", lasx_xvbitclr_b, ls::simd_bitclr, m256i, u8x32);
438impl_vvv!("lasx", lasx_xvbitclr_h, ls::simd_bitclr, m256i, u16x16);
439impl_vvv!("lasx", lasx_xvbitclr_w, ls::simd_bitclr, m256i, u32x8);
440impl_vvv!("lasx", lasx_xvbitclr_d, ls::simd_bitclr, m256i, u64x4);
441impl_vvv!("lasx", lasx_xvbitset_b, ls::simd_bitset, m256i, u8x32);
442impl_vvv!("lasx", lasx_xvbitset_h, ls::simd_bitset, m256i, u16x16);
443impl_vvv!("lasx", lasx_xvbitset_w, ls::simd_bitset, m256i, u32x8);
444impl_vvv!("lasx", lasx_xvbitset_d, ls::simd_bitset, m256i, u64x4);
445impl_vvv!("lasx", lasx_xvbitrev_b, ls::simd_bitrev, m256i, u8x32);
446impl_vvv!("lasx", lasx_xvbitrev_h, ls::simd_bitrev, m256i, u16x16);
447impl_vvv!("lasx", lasx_xvbitrev_w, ls::simd_bitrev, m256i, u32x8);
448impl_vvv!("lasx", lasx_xvbitrev_d, ls::simd_bitrev, m256i, u64x4);
449impl_vvv!("lasx", lasx_xvsadd_b, is::simd_saturating_add, m256i, i8x32);
450impl_vvv!("lasx", lasx_xvsadd_h, is::simd_saturating_add, m256i, i16x16);
451impl_vvv!("lasx", lasx_xvsadd_w, is::simd_saturating_add, m256i, i32x8);
452impl_vvv!("lasx", lasx_xvsadd_d, is::simd_saturating_add, m256i, i64x4);
453impl_vvv!("lasx", lasx_xvsadd_bu, is::simd_saturating_add, m256i, u8x32);
454impl_vvv!("lasx", lasx_xvsadd_hu, is::simd_saturating_add, m256i, u16x16);
455impl_vvv!("lasx", lasx_xvsadd_wu, is::simd_saturating_add, m256i, u32x8);
456impl_vvv!("lasx", lasx_xvsadd_du, is::simd_saturating_add, m256i, u64x4);
457impl_vvv!("lasx", lasx_xvssub_b, is::simd_saturating_sub, m256i, i8x32);
458impl_vvv!("lasx", lasx_xvssub_h, is::simd_saturating_sub, m256i, i16x16);
459impl_vvv!("lasx", lasx_xvssub_w, is::simd_saturating_sub, m256i, i32x8);
460impl_vvv!("lasx", lasx_xvssub_d, is::simd_saturating_sub, m256i, i64x4);
461impl_vvv!("lasx", lasx_xvssub_bu, is::simd_saturating_sub, m256i, u8x32);
462impl_vvv!("lasx", lasx_xvssub_hu, is::simd_saturating_sub, m256i, u16x16);
463impl_vvv!("lasx", lasx_xvssub_wu, is::simd_saturating_sub, m256i, u32x8);
464impl_vvv!("lasx", lasx_xvssub_du, is::simd_saturating_sub, m256i, u64x4);
465impl_vvv!("lasx", lasx_xvadda_b, ls::simd_adda, m256i, i8x32);
466impl_vvv!("lasx", lasx_xvadda_h, ls::simd_adda, m256i, i16x16);
467impl_vvv!("lasx", lasx_xvadda_w, ls::simd_adda, m256i, i32x8);
468impl_vvv!("lasx", lasx_xvadda_d, ls::simd_adda, m256i, i64x4);
469impl_vvv!("lasx", lasx_xvabsd_b, ls::simd_absd, m256i, i8x32);
470impl_vvv!("lasx", lasx_xvabsd_h, ls::simd_absd, m256i, i16x16);
471impl_vvv!("lasx", lasx_xvabsd_w, ls::simd_absd, m256i, i32x8);
472impl_vvv!("lasx", lasx_xvabsd_d, ls::simd_absd, m256i, i64x4);
473impl_vvv!("lasx", lasx_xvabsd_bu, ls::simd_absd, m256i, u8x32);
474impl_vvv!("lasx", lasx_xvabsd_hu, ls::simd_absd, m256i, u16x16);
475impl_vvv!("lasx", lasx_xvabsd_wu, ls::simd_absd, m256i, u32x8);
476impl_vvv!("lasx", lasx_xvabsd_du, ls::simd_absd, m256i, u64x4);
477impl_vvv!("lasx", lasx_xvpickev_b, simd_pickev_b, m256i, i8x32);
478impl_vvv!("lasx", lasx_xvpickev_h, simd_pickev_h, m256i, i16x16);
479impl_vvv!("lasx", lasx_xvpickev_w, simd_pickev_w, m256i, i32x8);
480impl_vvv!("lasx", lasx_xvpickev_d, simd_pickev_d, m256i, i64x4);
481impl_vvv!("lasx", lasx_xvpickod_b, simd_pickod_b, m256i, i8x32);
482impl_vvv!("lasx", lasx_xvpickod_h, simd_pickod_h, m256i, i16x16);
483impl_vvv!("lasx", lasx_xvpickod_w, simd_pickod_w, m256i, i32x8);
484impl_vvv!("lasx", lasx_xvpickod_d, simd_pickod_d, m256i, i64x4);
485impl_vvv!("lasx", lasx_xvilvh_b, simd_ilvh_b, m256i, i8x32);
486impl_vvv!("lasx", lasx_xvilvh_h, simd_ilvh_h, m256i, i16x16);
487impl_vvv!("lasx", lasx_xvilvh_w, simd_ilvh_w, m256i, i32x8);
488impl_vvv!("lasx", lasx_xvilvh_d, simd_ilvh_d, m256i, i64x4);
489impl_vvv!("lasx", lasx_xvilvl_b, simd_ilvl_b, m256i, i8x32);
490impl_vvv!("lasx", lasx_xvilvl_h, simd_ilvl_h, m256i, i16x16);
491impl_vvv!("lasx", lasx_xvilvl_w, simd_ilvl_w, m256i, i32x8);
492impl_vvv!("lasx", lasx_xvilvl_d, simd_ilvl_d, m256i, i64x4);
493impl_vvv!("lasx", lasx_xvpackev_b, simd_packev_b, m256i, i8x32);
494impl_vvv!("lasx", lasx_xvpackev_h, simd_packev_h, m256i, i16x16);
495impl_vvv!("lasx", lasx_xvpackev_w, simd_packev_w, m256i, i32x8);
496impl_vvv!("lasx", lasx_xvpackev_d, simd_packev_d, m256i, i64x4);
497impl_vvv!("lasx", lasx_xvpackod_b, simd_packod_b, m256i, i8x32);
498impl_vvv!("lasx", lasx_xvpackod_h, simd_packod_h, m256i, i16x16);
499impl_vvv!("lasx", lasx_xvpackod_w, simd_packod_w, m256i, i32x8);
500impl_vvv!("lasx", lasx_xvpackod_d, simd_packod_d, m256i, i64x4);
501
502impl_vuv!("lasx", lasx_xvslli_b, is::simd_shl, m256i, i8x32);
503impl_vuv!("lasx", lasx_xvslli_h, is::simd_shl, m256i, i16x16);
504impl_vuv!("lasx", lasx_xvslli_w, is::simd_shl, m256i, i32x8);
505impl_vuv!("lasx", lasx_xvslli_d, is::simd_shl, m256i, i64x4);
506impl_vuv!("lasx", lasx_xvsrai_b, is::simd_shr, m256i, i8x32);
507impl_vuv!("lasx", lasx_xvsrai_h, is::simd_shr, m256i, i16x16);
508impl_vuv!("lasx", lasx_xvsrai_w, is::simd_shr, m256i, i32x8);
509impl_vuv!("lasx", lasx_xvsrai_d, is::simd_shr, m256i, i64x4);
510impl_vuv!("lasx", lasx_xvsrli_b, is::simd_shr, m256i, u8x32);
511impl_vuv!("lasx", lasx_xvsrli_h, is::simd_shr, m256i, u16x16);
512impl_vuv!("lasx", lasx_xvsrli_w, is::simd_shr, m256i, u32x8);
513impl_vuv!("lasx", lasx_xvsrli_d, is::simd_shr, m256i, u64x4);
514impl_vuv!("lasx", lasx_xvaddi_bu, is::simd_add, m256i, u8x32, 5);
515impl_vuv!("lasx", lasx_xvaddi_hu, is::simd_add, m256i, u16x16, 5);
516impl_vuv!("lasx", lasx_xvaddi_wu, is::simd_add, m256i, u32x8, 5);
517impl_vuv!("lasx", lasx_xvaddi_du, is::simd_add, m256i, u64x4, 5);
518impl_vuv!("lasx", lasx_xvslti_bu, is::simd_lt, m256i, u8x32, 5);
519impl_vuv!("lasx", lasx_xvslti_hu, is::simd_lt, m256i, u16x16, 5);
520impl_vuv!("lasx", lasx_xvslti_wu, is::simd_lt, m256i, u32x8, 5);
521impl_vuv!("lasx", lasx_xvslti_du, is::simd_lt, m256i, u64x4, 5);
522impl_vuv!("lasx", lasx_xvslei_bu, is::simd_le, m256i, u8x32, 5);
523impl_vuv!("lasx", lasx_xvslei_hu, is::simd_le, m256i, u16x16, 5);
524impl_vuv!("lasx", lasx_xvslei_wu, is::simd_le, m256i, u32x8, 5);
525impl_vuv!("lasx", lasx_xvslei_du, is::simd_le, m256i, u64x4, 5);
526impl_vuv!("lasx", lasx_xvmaxi_bu, cs::simd_imax, m256i, u8x32, 5);
527impl_vuv!("lasx", lasx_xvmaxi_hu, cs::simd_imax, m256i, u16x16, 5);
528impl_vuv!("lasx", lasx_xvmaxi_wu, cs::simd_imax, m256i, u32x8, 5);
529impl_vuv!("lasx", lasx_xvmaxi_du, cs::simd_imax, m256i, u64x4, 5);
530impl_vuv!("lasx", lasx_xvmini_bu, cs::simd_imin, m256i, u8x32, 5);
531impl_vuv!("lasx", lasx_xvmini_hu, cs::simd_imin, m256i, u16x16, 5);
532impl_vuv!("lasx", lasx_xvmini_wu, cs::simd_imin, m256i, u32x8, 5);
533impl_vuv!("lasx", lasx_xvmini_du, cs::simd_imin, m256i, u64x4, 5);
534impl_vuv!("lasx", lasx_xvrepl128vei_b, simd_replvei_b, m256i, i8x32, 4, const);
535impl_vuv!("lasx", lasx_xvrepl128vei_h, simd_replvei_h, m256i, i16x16, 3, const);
536impl_vuv!("lasx", lasx_xvrepl128vei_w, simd_replvei_w, m256i, i32x8, 2, const);
537impl_vuv!("lasx", lasx_xvrepl128vei_d, simd_replvei_d, m256i, i64x4, 1, const);
538impl_vuv!("lasx", lasx_xvshuf4i_b, simd_shuf4i_b, m256i, i8x32, 8, const);
539impl_vuv!("lasx", lasx_xvshuf4i_h, simd_shuf4i_h, m256i, i16x16, 8, const);
540impl_vuv!("lasx", lasx_xvshuf4i_w, simd_shuf4i_w, m256i, i32x8, 8, const);
541
542impl_vug!("lasx", lasx_xvpickve2gr_w, is::simd_extract, m256i, i32x8, i32, 3);
543impl_vug!("lasx", lasx_xvpickve2gr_d, is::simd_extract, m256i, i64x4, i64, 2);
544impl_vug!("lasx", lasx_xvpickve2gr_wu, is::simd_extract, m256i, u32x8, u32, 3);
545impl_vug!("lasx", lasx_xvpickve2gr_du, is::simd_extract, m256i, u64x4, u64, 2);
546
547impl_vsv!("lasx", lasx_xvseqi_b, is::simd_eq, m256i, i8x32, 5);
548impl_vsv!("lasx", lasx_xvseqi_h, is::simd_eq, m256i, i16x16, 5);
549impl_vsv!("lasx", lasx_xvseqi_w, is::simd_eq, m256i, i32x8, 5);
550impl_vsv!("lasx", lasx_xvseqi_d, is::simd_eq, m256i, i64x4, 5);
551impl_vsv!("lasx", lasx_xvslti_b, is::simd_lt, m256i, i8x32, 5);
552impl_vsv!("lasx", lasx_xvslti_h, is::simd_lt, m256i, i16x16, 5);
553impl_vsv!("lasx", lasx_xvslti_w, is::simd_lt, m256i, i32x8, 5);
554impl_vsv!("lasx", lasx_xvslti_d, is::simd_lt, m256i, i64x4, 5);
555impl_vsv!("lasx", lasx_xvslei_b, is::simd_le, m256i, i8x32, 5);
556impl_vsv!("lasx", lasx_xvslei_h, is::simd_le, m256i, i16x16, 5);
557impl_vsv!("lasx", lasx_xvslei_w, is::simd_le, m256i, i32x8, 5);
558impl_vsv!("lasx", lasx_xvslei_d, is::simd_le, m256i, i64x4, 5);
559impl_vsv!("lasx", lasx_xvmaxi_b, cs::simd_imax, m256i, i8x32, 5);
560impl_vsv!("lasx", lasx_xvmaxi_h, cs::simd_imax, m256i, i16x16, 5);
561impl_vsv!("lasx", lasx_xvmaxi_w, cs::simd_imax, m256i, i32x8, 5);
562impl_vsv!("lasx", lasx_xvmaxi_d, cs::simd_imax, m256i, i64x4, 5);
563impl_vsv!("lasx", lasx_xvmini_b, cs::simd_imin, m256i, i8x32, 5);
564impl_vsv!("lasx", lasx_xvmini_h, cs::simd_imin, m256i, i16x16, 5);
565impl_vsv!("lasx", lasx_xvmini_w, cs::simd_imin, m256i, i32x8, 5);
566impl_vsv!("lasx", lasx_xvmini_d, cs::simd_imin, m256i, i64x4, 5);
567
568impl_vvvv!("lasx", lasx_xvmadd_b, ls::simd_madd, m256i, i8x32);
569impl_vvvv!("lasx", lasx_xvmadd_h, ls::simd_madd, m256i, i16x16);
570impl_vvvv!("lasx", lasx_xvmadd_w, ls::simd_madd, m256i, i32x8);
571impl_vvvv!("lasx", lasx_xvmadd_d, ls::simd_madd, m256i, i64x4);
572impl_vvvv!("lasx", lasx_xvmsub_b, ls::simd_msub, m256i, i8x32);
573impl_vvvv!("lasx", lasx_xvmsub_h, ls::simd_msub, m256i, i16x16);
574impl_vvvv!("lasx", lasx_xvmsub_w, ls::simd_msub, m256i, i32x8);
575impl_vvvv!("lasx", lasx_xvmsub_d, ls::simd_msub, m256i, i64x4);
576impl_vvvv!("lasx", lasx_xvfmadd_s, is::simd_fma, m256, f32x8);
577impl_vvvv!("lasx", lasx_xvfmadd_d, is::simd_fma, m256d, f64x4);
578impl_vvvv!("lasx", lasx_xvfmsub_s, ls::simd_fmsub, m256, f32x8);
579impl_vvvv!("lasx", lasx_xvfmsub_d, ls::simd_fmsub, m256d, f64x4);
580impl_vvvv!("lasx", lasx_xvfnmadd_s, ls::simd_fnmadd, m256, f32x8);
581impl_vvvv!("lasx", lasx_xvfnmadd_d, ls::simd_fnmadd, m256d, f64x4);
582impl_vvvv!("lasx", lasx_xvfnmsub_s, ls::simd_fnmsub, m256, f32x8);
583impl_vvvv!("lasx", lasx_xvfnmsub_d, ls::simd_fnmsub, m256d, f64x4);
584
585impl_vugv!("lasx", lasx_xvinsgr2vr_w, is::simd_insert, m256i, i32x8, i32, 3);
586impl_vugv!("lasx", lasx_xvinsgr2vr_d, is::simd_insert, m256i, i64x4, i64, 2);