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 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!(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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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
216impl_vv!("lsx", lsx_vpcnt_b, is::simd_ctpop, m128i, i8x16);
217impl_vv!("lsx", lsx_vpcnt_h, is::simd_ctpop, m128i, i16x8);
218impl_vv!("lsx", lsx_vpcnt_w, is::simd_ctpop, m128i, i32x4);
219impl_vv!("lsx", lsx_vpcnt_d, is::simd_ctpop, m128i, i64x2);
220impl_vv!("lsx", lsx_vclz_b, is::simd_ctlz, m128i, i8x16);
221impl_vv!("lsx", lsx_vclz_h, is::simd_ctlz, m128i, i16x8);
222impl_vv!("lsx", lsx_vclz_w, is::simd_ctlz, m128i, i32x4);
223impl_vv!("lsx", lsx_vclz_d, is::simd_ctlz, m128i, i64x2);
224impl_vv!("lsx", lsx_vneg_b, is::simd_neg, m128i, i8x16);
225impl_vv!("lsx", lsx_vneg_h, is::simd_neg, m128i, i16x8);
226impl_vv!("lsx", lsx_vneg_w, is::simd_neg, m128i, i32x4);
227impl_vv!("lsx", lsx_vneg_d, is::simd_neg, m128i, i64x2);
228impl_vv!("lsx", lsx_vfsqrt_s, is::simd_fsqrt, m128, f32x4);
229impl_vv!("lsx", lsx_vfsqrt_d, is::simd_fsqrt, m128d, f64x2);
230
231impl_gv!("lsx", lsx_vreplgr2vr_b, ls::simd_splat, m128i, i8x16, i32);
232impl_gv!("lsx", lsx_vreplgr2vr_h, ls::simd_splat, m128i, i16x8, i32);
233impl_gv!("lsx", lsx_vreplgr2vr_w, ls::simd_splat, m128i, i32x4, i32);
234impl_gv!("lsx", lsx_vreplgr2vr_d, ls::simd_splat, m128i, i64x2, i64);
235
236impl_sv!("lsx", lsx_vrepli_b, ls::simd_splat, m128i, i8x16, 10);
237impl_sv!("lsx", lsx_vrepli_h, ls::simd_splat, m128i, i16x8, 10);
238impl_sv!("lsx", lsx_vrepli_w, ls::simd_splat, m128i, i32x4, 10);
239impl_sv!("lsx", lsx_vrepli_d, ls::simd_splat, m128i, i64x2, 10);
240
241impl_vvv!("lsx", lsx_vadd_b, is::simd_add, m128i, i8x16);
242impl_vvv!("lsx", lsx_vadd_h, is::simd_add, m128i, i16x8);
243impl_vvv!("lsx", lsx_vadd_w, is::simd_add, m128i, i32x4);
244impl_vvv!("lsx", lsx_vadd_d, is::simd_add, m128i, i64x2);
245impl_vvv!("lsx", lsx_vsub_b, is::simd_sub, m128i, i8x16);
246impl_vvv!("lsx", lsx_vsub_h, is::simd_sub, m128i, i16x8);
247impl_vvv!("lsx", lsx_vsub_w, is::simd_sub, m128i, i32x4);
248impl_vvv!("lsx", lsx_vsub_d, is::simd_sub, m128i, i64x2);
249impl_vvv!("lsx", lsx_vmax_b, cs::simd_imax, m128i, i8x16);
250impl_vvv!("lsx", lsx_vmax_h, cs::simd_imax, m128i, i16x8);
251impl_vvv!("lsx", lsx_vmax_w, cs::simd_imax, m128i, i32x4);
252impl_vvv!("lsx", lsx_vmax_d, cs::simd_imax, m128i, i64x2);
253impl_vvv!("lsx", lsx_vmax_bu, cs::simd_imax, m128i, u8x16);
254impl_vvv!("lsx", lsx_vmax_hu, cs::simd_imax, m128i, u16x8);
255impl_vvv!("lsx", lsx_vmax_wu, cs::simd_imax, m128i, u32x4);
256impl_vvv!("lsx", lsx_vmax_du, cs::simd_imax, m128i, u64x2);
257impl_vvv!("lsx", lsx_vmin_b, cs::simd_imin, m128i, i8x16);
258impl_vvv!("lsx", lsx_vmin_h, cs::simd_imin, m128i, i16x8);
259impl_vvv!("lsx", lsx_vmin_w, cs::simd_imin, m128i, i32x4);
260impl_vvv!("lsx", lsx_vmin_d, cs::simd_imin, m128i, i64x2);
261impl_vvv!("lsx", lsx_vmin_bu, cs::simd_imin, m128i, u8x16);
262impl_vvv!("lsx", lsx_vmin_hu, cs::simd_imin, m128i, u16x8);
263impl_vvv!("lsx", lsx_vmin_wu, cs::simd_imin, m128i, u32x4);
264impl_vvv!("lsx", lsx_vmin_du, cs::simd_imin, m128i, u64x2);
265impl_vvv!("lsx", lsx_vseq_b, is::simd_eq, m128i, i8x16);
266impl_vvv!("lsx", lsx_vseq_h, is::simd_eq, m128i, i16x8);
267impl_vvv!("lsx", lsx_vseq_w, is::simd_eq, m128i, i32x4);
268impl_vvv!("lsx", lsx_vseq_d, is::simd_eq, m128i, i64x2);
269impl_vvv!("lsx", lsx_vslt_b, is::simd_lt, m128i, i8x16);
270impl_vvv!("lsx", lsx_vslt_h, is::simd_lt, m128i, i16x8);
271impl_vvv!("lsx", lsx_vslt_w, is::simd_lt, m128i, i32x4);
272impl_vvv!("lsx", lsx_vslt_d, is::simd_lt, m128i, i64x2);
273impl_vvv!("lsx", lsx_vslt_bu, is::simd_lt, m128i, u8x16);
274impl_vvv!("lsx", lsx_vslt_hu, is::simd_lt, m128i, u16x8);
275impl_vvv!("lsx", lsx_vslt_wu, is::simd_lt, m128i, u32x4);
276impl_vvv!("lsx", lsx_vslt_du, is::simd_lt, m128i, u64x2);
277impl_vvv!("lsx", lsx_vsle_b, is::simd_le, m128i, i8x16);
278impl_vvv!("lsx", lsx_vsle_h, is::simd_le, m128i, i16x8);
279impl_vvv!("lsx", lsx_vsle_w, is::simd_le, m128i, i32x4);
280impl_vvv!("lsx", lsx_vsle_d, is::simd_le, m128i, i64x2);
281impl_vvv!("lsx", lsx_vsle_bu, is::simd_le, m128i, u8x16);
282impl_vvv!("lsx", lsx_vsle_hu, is::simd_le, m128i, u16x8);
283impl_vvv!("lsx", lsx_vsle_wu, is::simd_le, m128i, u32x4);
284impl_vvv!("lsx", lsx_vsle_du, is::simd_le, m128i, u64x2);
285impl_vvv!("lsx", lsx_vmul_b, is::simd_mul, m128i, i8x16);
286impl_vvv!("lsx", lsx_vmul_h, is::simd_mul, m128i, i16x8);
287impl_vvv!("lsx", lsx_vmul_w, is::simd_mul, m128i, i32x4);
288impl_vvv!("lsx", lsx_vmul_d, is::simd_mul, m128i, i64x2);
289impl_vvv!("lsx", lsx_vdiv_b, is::simd_div, m128i, i8x16);
290impl_vvv!("lsx", lsx_vdiv_h, is::simd_div, m128i, i16x8);
291impl_vvv!("lsx", lsx_vdiv_w, is::simd_div, m128i, i32x4);
292impl_vvv!("lsx", lsx_vdiv_d, is::simd_div, m128i, i64x2);
293impl_vvv!("lsx", lsx_vdiv_bu, is::simd_div, m128i, u8x16);
294impl_vvv!("lsx", lsx_vdiv_hu, is::simd_div, m128i, u16x8);
295impl_vvv!("lsx", lsx_vdiv_wu, is::simd_div, m128i, u32x4);
296impl_vvv!("lsx", lsx_vdiv_du, is::simd_div, m128i, u64x2);
297impl_vvv!("lsx", lsx_vmod_b, is::simd_rem, m128i, i8x16);
298impl_vvv!("lsx", lsx_vmod_h, is::simd_rem, m128i, i16x8);
299impl_vvv!("lsx", lsx_vmod_w, is::simd_rem, m128i, i32x4);
300impl_vvv!("lsx", lsx_vmod_d, is::simd_rem, m128i, i64x2);
301impl_vvv!("lsx", lsx_vmod_bu, is::simd_rem, m128i, u8x16);
302impl_vvv!("lsx", lsx_vmod_hu, is::simd_rem, m128i, u16x8);
303impl_vvv!("lsx", lsx_vmod_wu, is::simd_rem, m128i, u32x4);
304impl_vvv!("lsx", lsx_vmod_du, is::simd_rem, m128i, u64x2);
305impl_vvv!("lsx", lsx_vand_v, is::simd_and, m128i, u8x16);
306impl_vvv!("lsx", lsx_vandn_v, ls::simd_andn, m128i, u8x16);
307impl_vvv!("lsx", lsx_vor_v, is::simd_or, m128i, u8x16);
308impl_vvv!("lsx", lsx_vorn_v, ls::simd_orn, m128i, u8x16);
309impl_vvv!("lsx", lsx_vnor_v, ls::simd_nor, m128i, u8x16);
310impl_vvv!("lsx", lsx_vxor_v, is::simd_xor, m128i, u8x16);
311impl_vvv!("lsx", lsx_vfadd_s, is::simd_add, m128, f32x4);
312impl_vvv!("lsx", lsx_vfadd_d, is::simd_add, m128d, f64x2);
313impl_vvv!("lsx", lsx_vfsub_s, is::simd_sub, m128, f32x4);
314impl_vvv!("lsx", lsx_vfsub_d, is::simd_sub, m128d, f64x2);
315impl_vvv!("lsx", lsx_vfmul_s, is::simd_mul, m128, f32x4);
316impl_vvv!("lsx", lsx_vfmul_d, is::simd_mul, m128d, f64x2);
317impl_vvv!("lsx", lsx_vfdiv_s, is::simd_div, m128, f32x4);
318impl_vvv!("lsx", lsx_vfdiv_d, is::simd_div, m128d, f64x2);
319impl_vvv!("lsx", lsx_vsll_b, ls::simd_shl, m128i, i8x16);
320impl_vvv!("lsx", lsx_vsll_h, ls::simd_shl, m128i, i16x8);
321impl_vvv!("lsx", lsx_vsll_w, ls::simd_shl, m128i, i32x4);
322impl_vvv!("lsx", lsx_vsll_d, ls::simd_shl, m128i, i64x2);
323impl_vvv!("lsx", lsx_vsra_b, ls::simd_shr, m128i, i8x16);
324impl_vvv!("lsx", lsx_vsra_h, ls::simd_shr, m128i, i16x8);
325impl_vvv!("lsx", lsx_vsra_w, ls::simd_shr, m128i, i32x4);
326impl_vvv!("lsx", lsx_vsra_d, ls::simd_shr, m128i, i64x2);
327impl_vvv!("lsx", lsx_vsrl_b, ls::simd_shr, m128i, u8x16);
328impl_vvv!("lsx", lsx_vsrl_h, ls::simd_shr, m128i, u16x8);
329impl_vvv!("lsx", lsx_vsrl_w, ls::simd_shr, m128i, u32x4);
330impl_vvv!("lsx", lsx_vsrl_d, ls::simd_shr, m128i, u64x2);
331impl_vvv!("lsx", lsx_vbitclr_b, ls::simd_bitclr, m128i, u8x16);
332impl_vvv!("lsx", lsx_vbitclr_h, ls::simd_bitclr, m128i, u16x8);
333impl_vvv!("lsx", lsx_vbitclr_w, ls::simd_bitclr, m128i, u32x4);
334impl_vvv!("lsx", lsx_vbitclr_d, ls::simd_bitclr, m128i, u64x2);
335impl_vvv!("lsx", lsx_vbitset_b, ls::simd_bitset, m128i, u8x16);
336impl_vvv!("lsx", lsx_vbitset_h, ls::simd_bitset, m128i, u16x8);
337impl_vvv!("lsx", lsx_vbitset_w, ls::simd_bitset, m128i, u32x4);
338impl_vvv!("lsx", lsx_vbitset_d, ls::simd_bitset, m128i, u64x2);
339impl_vvv!("lsx", lsx_vbitrev_b, ls::simd_bitrev, m128i, u8x16);
340impl_vvv!("lsx", lsx_vbitrev_h, ls::simd_bitrev, m128i, u16x8);
341impl_vvv!("lsx", lsx_vbitrev_w, ls::simd_bitrev, m128i, u32x4);
342impl_vvv!("lsx", lsx_vbitrev_d, ls::simd_bitrev, m128i, u64x2);
343impl_vvv!("lsx", lsx_vsadd_b, is::simd_saturating_add, m128i, i8x16);
344impl_vvv!("lsx", lsx_vsadd_h, is::simd_saturating_add, m128i, i16x8);
345impl_vvv!("lsx", lsx_vsadd_w, is::simd_saturating_add, m128i, i32x4);
346impl_vvv!("lsx", lsx_vsadd_d, is::simd_saturating_add, m128i, i64x2);
347impl_vvv!("lsx", lsx_vsadd_bu, is::simd_saturating_add, m128i, u8x16);
348impl_vvv!("lsx", lsx_vsadd_hu, is::simd_saturating_add, m128i, u16x8);
349impl_vvv!("lsx", lsx_vsadd_wu, is::simd_saturating_add, m128i, u32x4);
350impl_vvv!("lsx", lsx_vsadd_du, is::simd_saturating_add, m128i, u64x2);
351impl_vvv!("lsx", lsx_vssub_b, is::simd_saturating_sub, m128i, i8x16);
352impl_vvv!("lsx", lsx_vssub_h, is::simd_saturating_sub, m128i, i16x8);
353impl_vvv!("lsx", lsx_vssub_w, is::simd_saturating_sub, m128i, i32x4);
354impl_vvv!("lsx", lsx_vssub_d, is::simd_saturating_sub, m128i, i64x2);
355impl_vvv!("lsx", lsx_vssub_bu, is::simd_saturating_sub, m128i, u8x16);
356impl_vvv!("lsx", lsx_vssub_hu, is::simd_saturating_sub, m128i, u16x8);
357impl_vvv!("lsx", lsx_vssub_wu, is::simd_saturating_sub, m128i, u32x4);
358impl_vvv!("lsx", lsx_vssub_du, is::simd_saturating_sub, m128i, u64x2);
359impl_vvv!("lsx", lsx_vadda_b, ls::simd_adda, m128i, i8x16);
360impl_vvv!("lsx", lsx_vadda_h, ls::simd_adda, m128i, i16x8);
361impl_vvv!("lsx", lsx_vadda_w, ls::simd_adda, m128i, i32x4);
362impl_vvv!("lsx", lsx_vadda_d, ls::simd_adda, m128i, i64x2);
363impl_vvv!("lsx", lsx_vabsd_b, ls::simd_absd, m128i, i8x16);
364impl_vvv!("lsx", lsx_vabsd_h, ls::simd_absd, m128i, i16x8);
365impl_vvv!("lsx", lsx_vabsd_w, ls::simd_absd, m128i, i32x4);
366impl_vvv!("lsx", lsx_vabsd_d, ls::simd_absd, m128i, i64x2);
367impl_vvv!("lsx", lsx_vabsd_bu, ls::simd_absd, m128i, u8x16);
368impl_vvv!("lsx", lsx_vabsd_hu, ls::simd_absd, m128i, u16x8);
369impl_vvv!("lsx", lsx_vabsd_wu, ls::simd_absd, m128i, u32x4);
370impl_vvv!("lsx", lsx_vabsd_du, ls::simd_absd, m128i, u64x2);
371impl_vvv!("lsx", lsx_vpickev_b, simd_pickev_b, m128i, i8x16);
372impl_vvv!("lsx", lsx_vpickev_h, simd_pickev_h, m128i, i16x8);
373impl_vvv!("lsx", lsx_vpickev_w, simd_pickev_w, m128i, i32x4);
374impl_vvv!("lsx", lsx_vpickev_d, simd_pickev_d, m128i, i64x2);
375impl_vvv!("lsx", lsx_vpickod_b, simd_pickod_b, m128i, i8x16);
376impl_vvv!("lsx", lsx_vpickod_h, simd_pickod_h, m128i, i16x8);
377impl_vvv!("lsx", lsx_vpickod_w, simd_pickod_w, m128i, i32x4);
378impl_vvv!("lsx", lsx_vpickod_d, simd_pickod_d, m128i, i64x2);
379impl_vvv!("lsx", lsx_vilvh_b, simd_ilvh_b, m128i, i8x16);
380impl_vvv!("lsx", lsx_vilvh_h, simd_ilvh_h, m128i, i16x8);
381impl_vvv!("lsx", lsx_vilvh_w, simd_ilvh_w, m128i, i32x4);
382impl_vvv!("lsx", lsx_vilvh_d, simd_ilvh_d, m128i, i64x2);
383impl_vvv!("lsx", lsx_vilvl_b, simd_ilvl_b, m128i, i8x16);
384impl_vvv!("lsx", lsx_vilvl_h, simd_ilvl_h, m128i, i16x8);
385impl_vvv!("lsx", lsx_vilvl_w, simd_ilvl_w, m128i, i32x4);
386impl_vvv!("lsx", lsx_vilvl_d, simd_ilvl_d, m128i, i64x2);
387impl_vvv!("lsx", lsx_vpackev_b, simd_packev_b, m128i, i8x16);
388impl_vvv!("lsx", lsx_vpackev_h, simd_packev_h, m128i, i16x8);
389impl_vvv!("lsx", lsx_vpackev_w, simd_packev_w, m128i, i32x4);
390impl_vvv!("lsx", lsx_vpackev_d, simd_packev_d, m128i, i64x2);
391impl_vvv!("lsx", lsx_vpackod_b, simd_packod_b, m128i, i8x16);
392impl_vvv!("lsx", lsx_vpackod_h, simd_packod_h, m128i, i16x8);
393impl_vvv!("lsx", lsx_vpackod_w, simd_packod_w, m128i, i32x4);
394impl_vvv!("lsx", lsx_vpackod_d, simd_packod_d, m128i, i64x2);
395
396impl_vuv!("lsx", lsx_vslli_b, is::simd_shl, m128i, i8x16);
397impl_vuv!("lsx", lsx_vslli_h, is::simd_shl, m128i, i16x8);
398impl_vuv!("lsx", lsx_vslli_w, is::simd_shl, m128i, i32x4);
399impl_vuv!("lsx", lsx_vslli_d, is::simd_shl, m128i, i64x2);
400impl_vuv!("lsx", lsx_vsrai_b, is::simd_shr, m128i, i8x16);
401impl_vuv!("lsx", lsx_vsrai_h, is::simd_shr, m128i, i16x8);
402impl_vuv!("lsx", lsx_vsrai_w, is::simd_shr, m128i, i32x4);
403impl_vuv!("lsx", lsx_vsrai_d, is::simd_shr, m128i, i64x2);
404impl_vuv!("lsx", lsx_vsrli_b, is::simd_shr, m128i, u8x16);
405impl_vuv!("lsx", lsx_vsrli_h, is::simd_shr, m128i, u16x8);
406impl_vuv!("lsx", lsx_vsrli_w, is::simd_shr, m128i, u32x4);
407impl_vuv!("lsx", lsx_vsrli_d, is::simd_shr, m128i, u64x2);
408impl_vuv!("lsx", lsx_vaddi_bu, is::simd_add, m128i, u8x16, 5);
409impl_vuv!("lsx", lsx_vaddi_hu, is::simd_add, m128i, u16x8, 5);
410impl_vuv!("lsx", lsx_vaddi_wu, is::simd_add, m128i, u32x4, 5);
411impl_vuv!("lsx", lsx_vaddi_du, is::simd_add, m128i, u64x2, 5);
412impl_vuv!("lsx", lsx_vslti_bu, is::simd_lt, m128i, u8x16, 5);
413impl_vuv!("lsx", lsx_vslti_hu, is::simd_lt, m128i, u16x8, 5);
414impl_vuv!("lsx", lsx_vslti_wu, is::simd_lt, m128i, u32x4, 5);
415impl_vuv!("lsx", lsx_vslti_du, is::simd_lt, m128i, u64x2, 5);
416impl_vuv!("lsx", lsx_vslei_bu, is::simd_le, m128i, u8x16, 5);
417impl_vuv!("lsx", lsx_vslei_hu, is::simd_le, m128i, u16x8, 5);
418impl_vuv!("lsx", lsx_vslei_wu, is::simd_le, m128i, u32x4, 5);
419impl_vuv!("lsx", lsx_vslei_du, is::simd_le, m128i, u64x2, 5);
420impl_vuv!("lsx", lsx_vmaxi_bu, cs::simd_imax, m128i, u8x16, 5);
421impl_vuv!("lsx", lsx_vmaxi_hu, cs::simd_imax, m128i, u16x8, 5);
422impl_vuv!("lsx", lsx_vmaxi_wu, cs::simd_imax, m128i, u32x4, 5);
423impl_vuv!("lsx", lsx_vmaxi_du, cs::simd_imax, m128i, u64x2, 5);
424impl_vuv!("lsx", lsx_vmini_bu, cs::simd_imin, m128i, u8x16, 5);
425impl_vuv!("lsx", lsx_vmini_hu, cs::simd_imin, m128i, u16x8, 5);
426impl_vuv!("lsx", lsx_vmini_wu, cs::simd_imin, m128i, u32x4, 5);
427impl_vuv!("lsx", lsx_vmini_du, cs::simd_imin, m128i, u64x2, 5);
428impl_vuv!("lsx", lsx_vreplvei_b, simd_replvei_b, m128i, i8x16, 4, const);
429impl_vuv!("lsx", lsx_vreplvei_h, simd_replvei_h, m128i, i16x8, 3, const);
430impl_vuv!("lsx", lsx_vreplvei_w, simd_replvei_w, m128i, i32x4, 2, const);
431impl_vuv!("lsx", lsx_vreplvei_d, simd_replvei_d, m128i, i64x2, 1, const);
432impl_vuv!("lsx", lsx_vshuf4i_b, simd_shuf4i_b, m128i, i8x16, 8, const);
433impl_vuv!("lsx", lsx_vshuf4i_h, simd_shuf4i_h, m128i, i16x8, 8, const);
434impl_vuv!("lsx", lsx_vshuf4i_w, simd_shuf4i_w, m128i, i32x4, 8, const);
435
436impl_vug!("lsx", lsx_vpickve2gr_b, is::simd_extract, m128i, i8x16, i32, 4);
437impl_vug!("lsx", lsx_vpickve2gr_h, is::simd_extract, m128i, i16x8, i32, 3);
438impl_vug!("lsx", lsx_vpickve2gr_w, is::simd_extract, m128i, i32x4, i32, 2);
439impl_vug!("lsx", lsx_vpickve2gr_d, is::simd_extract, m128i, i64x2, i64, 1);
440impl_vug!("lsx", lsx_vpickve2gr_bu, is::simd_extract, m128i, u8x16, u32, 4);
441impl_vug!("lsx", lsx_vpickve2gr_hu, is::simd_extract, m128i, u16x8, u32, 3);
442impl_vug!("lsx", lsx_vpickve2gr_wu, is::simd_extract, m128i, u32x4, u32, 2);
443impl_vug!("lsx", lsx_vpickve2gr_du, is::simd_extract, m128i, u64x2, u64, 1);
444
445impl_vsv!("lsx", lsx_vseqi_b, is::simd_eq, m128i, i8x16, 5);
446impl_vsv!("lsx", lsx_vseqi_h, is::simd_eq, m128i, i16x8, 5);
447impl_vsv!("lsx", lsx_vseqi_w, is::simd_eq, m128i, i32x4, 5);
448impl_vsv!("lsx", lsx_vseqi_d, is::simd_eq, m128i, i64x2, 5);
449impl_vsv!("lsx", lsx_vslti_b, is::simd_lt, m128i, i8x16, 5);
450impl_vsv!("lsx", lsx_vslti_h, is::simd_lt, m128i, i16x8, 5);
451impl_vsv!("lsx", lsx_vslti_w, is::simd_lt, m128i, i32x4, 5);
452impl_vsv!("lsx", lsx_vslti_d, is::simd_lt, m128i, i64x2, 5);
453impl_vsv!("lsx", lsx_vslei_b, is::simd_le, m128i, i8x16, 5);
454impl_vsv!("lsx", lsx_vslei_h, is::simd_le, m128i, i16x8, 5);
455impl_vsv!("lsx", lsx_vslei_w, is::simd_le, m128i, i32x4, 5);
456impl_vsv!("lsx", lsx_vslei_d, is::simd_le, m128i, i64x2, 5);
457impl_vsv!("lsx", lsx_vmaxi_b, cs::simd_imax, m128i, i8x16, 5);
458impl_vsv!("lsx", lsx_vmaxi_h, cs::simd_imax, m128i, i16x8, 5);
459impl_vsv!("lsx", lsx_vmaxi_w, cs::simd_imax, m128i, i32x4, 5);
460impl_vsv!("lsx", lsx_vmaxi_d, cs::simd_imax, m128i, i64x2, 5);
461impl_vsv!("lsx", lsx_vmini_b, cs::simd_imin, m128i, i8x16, 5);
462impl_vsv!("lsx", lsx_vmini_h, cs::simd_imin, m128i, i16x8, 5);
463impl_vsv!("lsx", lsx_vmini_w, cs::simd_imin, m128i, i32x4, 5);
464impl_vsv!("lsx", lsx_vmini_d, cs::simd_imin, m128i, i64x2, 5);
465
466impl_vvvv!("lsx", lsx_vmadd_b, ls::simd_madd, m128i, i8x16);
467impl_vvvv!("lsx", lsx_vmadd_h, ls::simd_madd, m128i, i16x8);
468impl_vvvv!("lsx", lsx_vmadd_w, ls::simd_madd, m128i, i32x4);
469impl_vvvv!("lsx", lsx_vmadd_d, ls::simd_madd, m128i, i64x2);
470impl_vvvv!("lsx", lsx_vmsub_b, ls::simd_msub, m128i, i8x16);
471impl_vvvv!("lsx", lsx_vmsub_h, ls::simd_msub, m128i, i16x8);
472impl_vvvv!("lsx", lsx_vmsub_w, ls::simd_msub, m128i, i32x4);
473impl_vvvv!("lsx", lsx_vmsub_d, ls::simd_msub, m128i, i64x2);
474impl_vvvv!("lsx", lsx_vfmadd_s, is::simd_fma, m128, f32x4);
475impl_vvvv!("lsx", lsx_vfmadd_d, is::simd_fma, m128d, f64x2);
476impl_vvvv!("lsx", lsx_vfmsub_s, ls::simd_fmsub, m128, f32x4);
477impl_vvvv!("lsx", lsx_vfmsub_d, ls::simd_fmsub, m128d, f64x2);
478impl_vvvv!("lsx", lsx_vfnmadd_s, ls::simd_fnmadd, m128, f32x4);
479impl_vvvv!("lsx", lsx_vfnmadd_d, ls::simd_fnmadd, m128d, f64x2);
480impl_vvvv!("lsx", lsx_vfnmsub_s, ls::simd_fnmsub, m128, f32x4);
481impl_vvvv!("lsx", lsx_vfnmsub_d, ls::simd_fnmsub, m128d, f64x2);
482
483impl_vvuv!("lsx", lsx_vshuf4i_d, simd_shuf4i_d, m128i, i64x2, 8, const);
484
485impl_vugv!("lsx", lsx_vinsgr2vr_b, is::simd_insert, m128i, i8x16, i32, 4);
486impl_vugv!("lsx", lsx_vinsgr2vr_h, is::simd_insert, m128i, i16x8, i32, 3);
487impl_vugv!("lsx", lsx_vinsgr2vr_w, is::simd_insert, m128i, i32x4, i32, 2);
488impl_vugv!("lsx", lsx_vinsgr2vr_d, is::simd_insert, m128i, i64x2, i64, 1);