1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * LoongArch vector translate functions
4 * Copyright (c) 2022-2023 Loongson Technology Corporation Limited
7 #ifndef CONFIG_USER_ONLY
9 static bool check_vec(DisasContext *ctx, uint32_t oprsz)
11 if ((oprsz == 16) && ((ctx->base.tb->flags & HW_FLAGS_EUEN_SXE) == 0)) {
12 generate_exception(ctx, EXCCODE_SXD);
16 if ((oprsz == 32) && ((ctx->base.tb->flags & HW_FLAGS_EUEN_ASXE) == 0)) {
17 generate_exception(ctx, EXCCODE_ASXD);
26 static bool check_vec(DisasContext *ctx, uint32_t oprsz)
33 static bool gen_vvvv_ptr_vl(DisasContext *ctx, arg_vvvv *a, uint32_t oprsz,
34 gen_helper_gvec_4_ptr *fn)
36 tcg_gen_gvec_4_ptr(vec_full_offset(a->vd),
37 vec_full_offset(a->vj),
38 vec_full_offset(a->vk),
39 vec_full_offset(a->va),
41 oprsz, ctx->vl / 8, 0, fn);
45 static bool gen_vvvv_ptr(DisasContext *ctx, arg_vvvv *a,
46 gen_helper_gvec_4_ptr *fn)
48 if (!check_vec(ctx, 16)) {
52 return gen_vvvv_ptr_vl(ctx, a, 16, fn);
55 static bool gen_vvvv_vl(DisasContext *ctx, arg_vvvv *a, uint32_t oprsz,
56 gen_helper_gvec_4 *fn)
58 tcg_gen_gvec_4_ool(vec_full_offset(a->vd),
59 vec_full_offset(a->vj),
60 vec_full_offset(a->vk),
61 vec_full_offset(a->va),
62 oprsz, ctx->vl / 8, 0, fn);
66 static bool gen_vvvv(DisasContext *ctx, arg_vvvv *a,
67 gen_helper_gvec_4 *fn)
69 if (!check_vec(ctx, 16)) {
73 return gen_vvvv_vl(ctx, a, 16, fn);
76 static bool gen_vvv_ptr_vl(DisasContext *ctx, arg_vvv *a, uint32_t oprsz,
77 gen_helper_gvec_3_ptr *fn)
79 tcg_gen_gvec_3_ptr(vec_full_offset(a->vd),
80 vec_full_offset(a->vj),
81 vec_full_offset(a->vk),
83 oprsz, ctx->vl / 8, 0, fn);
87 static bool gen_vvv_ptr(DisasContext *ctx, arg_vvv *a,
88 gen_helper_gvec_3_ptr *fn)
90 if (!check_vec(ctx, 16)) {
94 return gen_vvv_ptr_vl(ctx, a, 16, fn);
97 static bool gen_vvv_vl(DisasContext *ctx, arg_vvv *a, uint32_t oprsz,
98 gen_helper_gvec_3 *fn)
100 if (!check_vec(ctx, oprsz)) {
104 tcg_gen_gvec_3_ool(vec_full_offset(a->vd),
105 vec_full_offset(a->vj),
106 vec_full_offset(a->vk),
107 oprsz, ctx->vl / 8, 0, fn);
111 static bool gen_vvv(DisasContext *ctx, arg_vvv *a, gen_helper_gvec_3 *fn)
113 return gen_vvv_vl(ctx, a, 16, fn);
116 static bool gen_xxx(DisasContext *ctx, arg_vvv *a, gen_helper_gvec_3 *fn)
118 return gen_vvv_vl(ctx, a, 32, fn);
121 static bool gen_vv_ptr_vl(DisasContext *ctx, arg_vv *a, uint32_t oprsz,
122 gen_helper_gvec_2_ptr *fn)
124 tcg_gen_gvec_2_ptr(vec_full_offset(a->vd),
125 vec_full_offset(a->vj),
127 oprsz, ctx->vl / 8, 0, fn);
131 static bool gen_vv_ptr(DisasContext *ctx, arg_vv *a,
132 gen_helper_gvec_2_ptr *fn)
134 if (!check_vec(ctx, 16)) {
138 return gen_vv_ptr_vl(ctx, a, 16, fn);
141 static bool gen_vv_vl(DisasContext *ctx, arg_vv *a, uint32_t oprsz,
142 gen_helper_gvec_2 *fn)
144 if (!check_vec(ctx, oprsz)) {
148 tcg_gen_gvec_2_ool(vec_full_offset(a->vd),
149 vec_full_offset(a->vj),
150 oprsz, ctx->vl / 8, 0, fn);
154 static bool gen_vv(DisasContext *ctx, arg_vv *a, gen_helper_gvec_2 *fn)
156 return gen_vv_vl(ctx, a, 16, fn);
159 static bool gen_xx(DisasContext *ctx, arg_vv *a, gen_helper_gvec_2 *fn)
161 return gen_vv_vl(ctx, a, 32, fn);
164 static bool gen_vv_i_vl(DisasContext *ctx, arg_vv_i *a, uint32_t oprsz,
165 gen_helper_gvec_2i *fn)
167 if (!check_vec(ctx, oprsz)) {
171 tcg_gen_gvec_2i_ool(vec_full_offset(a->vd),
172 vec_full_offset(a->vj),
173 tcg_constant_i64(a->imm),
174 oprsz, ctx->vl / 8, 0, fn);
178 static bool gen_vv_i(DisasContext *ctx, arg_vv_i *a, gen_helper_gvec_2i *fn)
180 return gen_vv_i_vl(ctx, a, 16, fn);
183 static bool gen_xx_i(DisasContext *ctx, arg_vv_i *a, gen_helper_gvec_2i *fn)
185 return gen_vv_i_vl(ctx, a, 32, fn);
188 static bool gen_cv(DisasContext *ctx, arg_cv *a,
189 void (*func)(TCGv_ptr, TCGv_i32, TCGv_i32))
191 TCGv_i32 vj = tcg_constant_i32(a->vj);
192 TCGv_i32 cd = tcg_constant_i32(a->cd);
194 if (!check_vec(ctx, 16)) {
198 func(cpu_env, cd, vj);
202 static bool gvec_vvv_vl(DisasContext *ctx, arg_vvv *a,
203 uint32_t oprsz, MemOp mop,
204 void (*func)(unsigned, uint32_t, uint32_t,
205 uint32_t, uint32_t, uint32_t))
207 uint32_t vd_ofs = vec_full_offset(a->vd);
208 uint32_t vj_ofs = vec_full_offset(a->vj);
209 uint32_t vk_ofs = vec_full_offset(a->vk);
211 if (!check_vec(ctx, oprsz)) {
215 func(mop, vd_ofs, vj_ofs, vk_ofs, oprsz, ctx->vl / 8);
219 static bool gvec_vvv(DisasContext *ctx, arg_vvv *a, MemOp mop,
220 void (*func)(unsigned, uint32_t, uint32_t,
221 uint32_t, uint32_t, uint32_t))
223 return gvec_vvv_vl(ctx, a, 16, mop, func);
226 static bool gvec_xxx(DisasContext *ctx, arg_vvv *a, MemOp mop,
227 void (*func)(unsigned, uint32_t, uint32_t,
228 uint32_t, uint32_t, uint32_t))
230 return gvec_vvv_vl(ctx, a, 32, mop, func);
233 static bool gvec_vv_vl(DisasContext *ctx, arg_vv *a,
234 uint32_t oprsz, MemOp mop,
235 void (*func)(unsigned, uint32_t, uint32_t,
238 uint32_t vd_ofs = vec_full_offset(a->vd);
239 uint32_t vj_ofs = vec_full_offset(a->vj);
241 if (!check_vec(ctx, oprsz)) {
245 func(mop, vd_ofs, vj_ofs, oprsz, ctx->vl / 8);
250 static bool gvec_vv(DisasContext *ctx, arg_vv *a, MemOp mop,
251 void (*func)(unsigned, uint32_t, uint32_t,
254 return gvec_vv_vl(ctx, a, 16, mop, func);
257 static bool gvec_xx(DisasContext *ctx, arg_vv *a, MemOp mop,
258 void (*func)(unsigned, uint32_t, uint32_t,
261 return gvec_vv_vl(ctx, a, 32, mop, func);
264 static bool gvec_vv_i_vl(DisasContext *ctx, arg_vv_i *a,
265 uint32_t oprsz, MemOp mop,
266 void (*func)(unsigned, uint32_t, uint32_t,
267 int64_t, uint32_t, uint32_t))
269 uint32_t vd_ofs = vec_full_offset(a->vd);
270 uint32_t vj_ofs = vec_full_offset(a->vj);
272 if (!check_vec(ctx, oprsz)) {
276 func(mop, vd_ofs, vj_ofs, a->imm, oprsz, ctx->vl / 8);
280 static bool gvec_vv_i(DisasContext *ctx, arg_vv_i *a, MemOp mop,
281 void (*func)(unsigned, uint32_t, uint32_t,
282 int64_t, uint32_t, uint32_t))
284 return gvec_vv_i_vl(ctx, a, 16, mop, func);
287 static bool gvec_xx_i(DisasContext *ctx, arg_vv_i *a, MemOp mop,
288 void (*func)(unsigned, uint32_t, uint32_t,
289 int64_t, uint32_t, uint32_t))
291 return gvec_vv_i_vl(ctx,a, 32, mop, func);
294 static bool gvec_subi_vl(DisasContext *ctx, arg_vv_i *a,
295 uint32_t oprsz, MemOp mop)
297 uint32_t vd_ofs = vec_full_offset(a->vd);
298 uint32_t vj_ofs = vec_full_offset(a->vj);
300 if (!check_vec(ctx, oprsz)) {
304 tcg_gen_gvec_addi(mop, vd_ofs, vj_ofs, -a->imm, oprsz, ctx->vl / 8);
308 static bool gvec_subi(DisasContext *ctx, arg_vv_i *a, MemOp mop)
310 return gvec_subi_vl(ctx, a, 16, mop);
313 static bool gvec_xsubi(DisasContext *ctx, arg_vv_i *a, MemOp mop)
315 return gvec_subi_vl(ctx, a, 32, mop);
318 TRANS(vadd_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_add)
319 TRANS(vadd_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_add)
320 TRANS(vadd_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_add)
321 TRANS(vadd_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_add)
322 TRANS(xvadd_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_add)
323 TRANS(xvadd_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_add)
324 TRANS(xvadd_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_add)
325 TRANS(xvadd_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_add)
327 static bool gen_vaddsub_q_vl(DisasContext *ctx, arg_vvv *a, uint32_t oprsz,
328 void (*func)(TCGv_i64, TCGv_i64, TCGv_i64,
329 TCGv_i64, TCGv_i64, TCGv_i64))
332 TCGv_i64 rh, rl, ah, al, bh, bl;
334 if (!check_vec(ctx, oprsz)) {
338 rh = tcg_temp_new_i64();
339 rl = tcg_temp_new_i64();
340 ah = tcg_temp_new_i64();
341 al = tcg_temp_new_i64();
342 bh = tcg_temp_new_i64();
343 bl = tcg_temp_new_i64();
345 for (i = 0; i < oprsz / 16; i++) {
346 get_vreg64(ah, a->vj, 1 + i * 2);
347 get_vreg64(al, a->vj, i * 2);
348 get_vreg64(bh, a->vk, 1 + i * 2);
349 get_vreg64(bl, a->vk, i * 2);
351 func(rl, rh, al, ah, bl, bh);
353 set_vreg64(rh, a->vd, 1 + i * 2);
354 set_vreg64(rl, a->vd, i * 2);
359 static bool gen_vaddsub_q(DisasContext *ctx, arg_vvv *a,
360 void (*func)(TCGv_i64, TCGv_i64, TCGv_i64,
361 TCGv_i64, TCGv_i64, TCGv_i64))
363 return gen_vaddsub_q_vl(ctx, a, 16, func);
366 static bool gen_xvaddsub_q(DisasContext *ctx, arg_vvv *a,
367 void (*func)(TCGv_i64, TCGv_i64, TCGv_i64,
368 TCGv_i64, TCGv_i64, TCGv_i64))
370 return gen_vaddsub_q_vl(ctx, a, 32, func);
373 TRANS(vsub_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_sub)
374 TRANS(vsub_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_sub)
375 TRANS(vsub_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_sub)
376 TRANS(vsub_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_sub)
377 TRANS(xvsub_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_sub)
378 TRANS(xvsub_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_sub)
379 TRANS(xvsub_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_sub)
380 TRANS(xvsub_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_sub)
382 TRANS(vadd_q, LSX, gen_vaddsub_q, tcg_gen_add2_i64)
383 TRANS(vsub_q, LSX, gen_vaddsub_q, tcg_gen_sub2_i64)
384 TRANS(xvadd_q, LASX, gen_xvaddsub_q, tcg_gen_add2_i64)
385 TRANS(xvsub_q, LASX, gen_xvaddsub_q, tcg_gen_sub2_i64)
387 TRANS(vaddi_bu, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_addi)
388 TRANS(vaddi_hu, LSX, gvec_vv_i, MO_16, tcg_gen_gvec_addi)
389 TRANS(vaddi_wu, LSX, gvec_vv_i, MO_32, tcg_gen_gvec_addi)
390 TRANS(vaddi_du, LSX, gvec_vv_i, MO_64, tcg_gen_gvec_addi)
391 TRANS(vsubi_bu, LSX, gvec_subi, MO_8)
392 TRANS(vsubi_hu, LSX, gvec_subi, MO_16)
393 TRANS(vsubi_wu, LSX, gvec_subi, MO_32)
394 TRANS(vsubi_du, LSX, gvec_subi, MO_64)
395 TRANS(xvaddi_bu, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_addi)
396 TRANS(xvaddi_hu, LASX, gvec_xx_i, MO_16, tcg_gen_gvec_addi)
397 TRANS(xvaddi_wu, LASX, gvec_xx_i, MO_32, tcg_gen_gvec_addi)
398 TRANS(xvaddi_du, LASX, gvec_xx_i, MO_64, tcg_gen_gvec_addi)
399 TRANS(xvsubi_bu, LASX, gvec_xsubi, MO_8)
400 TRANS(xvsubi_hu, LASX, gvec_xsubi, MO_16)
401 TRANS(xvsubi_wu, LASX, gvec_xsubi, MO_32)
402 TRANS(xvsubi_du, LASX, gvec_xsubi, MO_64)
404 TRANS(vneg_b, LSX, gvec_vv, MO_8, tcg_gen_gvec_neg)
405 TRANS(vneg_h, LSX, gvec_vv, MO_16, tcg_gen_gvec_neg)
406 TRANS(vneg_w, LSX, gvec_vv, MO_32, tcg_gen_gvec_neg)
407 TRANS(vneg_d, LSX, gvec_vv, MO_64, tcg_gen_gvec_neg)
408 TRANS(xvneg_b, LASX, gvec_xx, MO_8, tcg_gen_gvec_neg)
409 TRANS(xvneg_h, LASX, gvec_xx, MO_16, tcg_gen_gvec_neg)
410 TRANS(xvneg_w, LASX, gvec_xx, MO_32, tcg_gen_gvec_neg)
411 TRANS(xvneg_d, LASX, gvec_xx, MO_64, tcg_gen_gvec_neg)
413 TRANS(vsadd_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_ssadd)
414 TRANS(vsadd_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_ssadd)
415 TRANS(vsadd_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_ssadd)
416 TRANS(vsadd_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_ssadd)
417 TRANS(vsadd_bu, LSX, gvec_vvv, MO_8, tcg_gen_gvec_usadd)
418 TRANS(vsadd_hu, LSX, gvec_vvv, MO_16, tcg_gen_gvec_usadd)
419 TRANS(vsadd_wu, LSX, gvec_vvv, MO_32, tcg_gen_gvec_usadd)
420 TRANS(vsadd_du, LSX, gvec_vvv, MO_64, tcg_gen_gvec_usadd)
421 TRANS(vssub_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_sssub)
422 TRANS(vssub_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_sssub)
423 TRANS(vssub_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_sssub)
424 TRANS(vssub_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_sssub)
425 TRANS(vssub_bu, LSX, gvec_vvv, MO_8, tcg_gen_gvec_ussub)
426 TRANS(vssub_hu, LSX, gvec_vvv, MO_16, tcg_gen_gvec_ussub)
427 TRANS(vssub_wu, LSX, gvec_vvv, MO_32, tcg_gen_gvec_ussub)
428 TRANS(vssub_du, LSX, gvec_vvv, MO_64, tcg_gen_gvec_ussub)
430 TRANS(xvsadd_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_ssadd)
431 TRANS(xvsadd_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_ssadd)
432 TRANS(xvsadd_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_ssadd)
433 TRANS(xvsadd_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_ssadd)
434 TRANS(xvsadd_bu, LASX, gvec_xxx, MO_8, tcg_gen_gvec_usadd)
435 TRANS(xvsadd_hu, LASX, gvec_xxx, MO_16, tcg_gen_gvec_usadd)
436 TRANS(xvsadd_wu, LASX, gvec_xxx, MO_32, tcg_gen_gvec_usadd)
437 TRANS(xvsadd_du, LASX, gvec_xxx, MO_64, tcg_gen_gvec_usadd)
438 TRANS(xvssub_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_sssub)
439 TRANS(xvssub_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_sssub)
440 TRANS(xvssub_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_sssub)
441 TRANS(xvssub_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_sssub)
442 TRANS(xvssub_bu, LASX, gvec_xxx, MO_8, tcg_gen_gvec_ussub)
443 TRANS(xvssub_hu, LASX, gvec_xxx, MO_16, tcg_gen_gvec_ussub)
444 TRANS(xvssub_wu, LASX, gvec_xxx, MO_32, tcg_gen_gvec_ussub)
445 TRANS(xvssub_du, LASX, gvec_xxx, MO_64, tcg_gen_gvec_ussub)
447 TRANS(vhaddw_h_b, LSX, gen_vvv, gen_helper_vhaddw_h_b)
448 TRANS(vhaddw_w_h, LSX, gen_vvv, gen_helper_vhaddw_w_h)
449 TRANS(vhaddw_d_w, LSX, gen_vvv, gen_helper_vhaddw_d_w)
450 TRANS(vhaddw_q_d, LSX, gen_vvv, gen_helper_vhaddw_q_d)
451 TRANS(vhaddw_hu_bu, LSX, gen_vvv, gen_helper_vhaddw_hu_bu)
452 TRANS(vhaddw_wu_hu, LSX, gen_vvv, gen_helper_vhaddw_wu_hu)
453 TRANS(vhaddw_du_wu, LSX, gen_vvv, gen_helper_vhaddw_du_wu)
454 TRANS(vhaddw_qu_du, LSX, gen_vvv, gen_helper_vhaddw_qu_du)
455 TRANS(vhsubw_h_b, LSX, gen_vvv, gen_helper_vhsubw_h_b)
456 TRANS(vhsubw_w_h, LSX, gen_vvv, gen_helper_vhsubw_w_h)
457 TRANS(vhsubw_d_w, LSX, gen_vvv, gen_helper_vhsubw_d_w)
458 TRANS(vhsubw_q_d, LSX, gen_vvv, gen_helper_vhsubw_q_d)
459 TRANS(vhsubw_hu_bu, LSX, gen_vvv, gen_helper_vhsubw_hu_bu)
460 TRANS(vhsubw_wu_hu, LSX, gen_vvv, gen_helper_vhsubw_wu_hu)
461 TRANS(vhsubw_du_wu, LSX, gen_vvv, gen_helper_vhsubw_du_wu)
462 TRANS(vhsubw_qu_du, LSX, gen_vvv, gen_helper_vhsubw_qu_du)
464 TRANS(xvhaddw_h_b, LASX, gen_xxx, gen_helper_vhaddw_h_b)
465 TRANS(xvhaddw_w_h, LASX, gen_xxx, gen_helper_vhaddw_w_h)
466 TRANS(xvhaddw_d_w, LASX, gen_xxx, gen_helper_vhaddw_d_w)
467 TRANS(xvhaddw_q_d, LASX, gen_xxx, gen_helper_vhaddw_q_d)
468 TRANS(xvhaddw_hu_bu, LASX, gen_xxx, gen_helper_vhaddw_hu_bu)
469 TRANS(xvhaddw_wu_hu, LASX, gen_xxx, gen_helper_vhaddw_wu_hu)
470 TRANS(xvhaddw_du_wu, LASX, gen_xxx, gen_helper_vhaddw_du_wu)
471 TRANS(xvhaddw_qu_du, LASX, gen_xxx, gen_helper_vhaddw_qu_du)
472 TRANS(xvhsubw_h_b, LASX, gen_xxx, gen_helper_vhsubw_h_b)
473 TRANS(xvhsubw_w_h, LASX, gen_xxx, gen_helper_vhsubw_w_h)
474 TRANS(xvhsubw_d_w, LASX, gen_xxx, gen_helper_vhsubw_d_w)
475 TRANS(xvhsubw_q_d, LASX, gen_xxx, gen_helper_vhsubw_q_d)
476 TRANS(xvhsubw_hu_bu, LASX, gen_xxx, gen_helper_vhsubw_hu_bu)
477 TRANS(xvhsubw_wu_hu, LASX, gen_xxx, gen_helper_vhsubw_wu_hu)
478 TRANS(xvhsubw_du_wu, LASX, gen_xxx, gen_helper_vhsubw_du_wu)
479 TRANS(xvhsubw_qu_du, LASX, gen_xxx, gen_helper_vhsubw_qu_du)
481 static void gen_vaddwev_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
485 int halfbits = 4 << vece;
487 t1 = tcg_temp_new_vec_matching(a);
488 t2 = tcg_temp_new_vec_matching(b);
490 /* Sign-extend the even elements from a */
491 tcg_gen_shli_vec(vece, t1, a, halfbits);
492 tcg_gen_sari_vec(vece, t1, t1, halfbits);
494 /* Sign-extend the even elements from b */
495 tcg_gen_shli_vec(vece, t2, b, halfbits);
496 tcg_gen_sari_vec(vece, t2, t2, halfbits);
498 tcg_gen_add_vec(vece, t, t1, t2);
501 static void gen_vaddwev_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
505 t1 = tcg_temp_new_i32();
506 t2 = tcg_temp_new_i32();
507 tcg_gen_ext16s_i32(t1, a);
508 tcg_gen_ext16s_i32(t2, b);
509 tcg_gen_add_i32(t, t1, t2);
512 static void gen_vaddwev_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
516 t1 = tcg_temp_new_i64();
517 t2 = tcg_temp_new_i64();
518 tcg_gen_ext32s_i64(t1, a);
519 tcg_gen_ext32s_i64(t2, b);
520 tcg_gen_add_i64(t, t1, t2);
523 static void do_vaddwev_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
524 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
526 static const TCGOpcode vecop_list[] = {
527 INDEX_op_shli_vec, INDEX_op_sari_vec, INDEX_op_add_vec, 0
529 static const GVecGen3 op[4] = {
531 .fniv = gen_vaddwev_s,
532 .fno = gen_helper_vaddwev_h_b,
533 .opt_opc = vecop_list,
537 .fni4 = gen_vaddwev_w_h,
538 .fniv = gen_vaddwev_s,
539 .fno = gen_helper_vaddwev_w_h,
540 .opt_opc = vecop_list,
544 .fni8 = gen_vaddwev_d_w,
545 .fniv = gen_vaddwev_s,
546 .fno = gen_helper_vaddwev_d_w,
547 .opt_opc = vecop_list,
551 .fno = gen_helper_vaddwev_q_d,
556 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
559 TRANS(vaddwev_h_b, LSX, gvec_vvv, MO_8, do_vaddwev_s)
560 TRANS(vaddwev_w_h, LSX, gvec_vvv, MO_16, do_vaddwev_s)
561 TRANS(vaddwev_d_w, LSX, gvec_vvv, MO_32, do_vaddwev_s)
562 TRANS(vaddwev_q_d, LSX, gvec_vvv, MO_64, do_vaddwev_s)
563 TRANS(xvaddwev_h_b, LASX, gvec_xxx, MO_8, do_vaddwev_s)
564 TRANS(xvaddwev_w_h, LASX, gvec_xxx, MO_16, do_vaddwev_s)
565 TRANS(xvaddwev_d_w, LASX, gvec_xxx, MO_32, do_vaddwev_s)
566 TRANS(xvaddwev_q_d, LASX, gvec_xxx, MO_64, do_vaddwev_s)
568 static void gen_vaddwod_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
572 t1 = tcg_temp_new_i32();
573 t2 = tcg_temp_new_i32();
574 tcg_gen_sari_i32(t1, a, 16);
575 tcg_gen_sari_i32(t2, b, 16);
576 tcg_gen_add_i32(t, t1, t2);
579 static void gen_vaddwod_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
583 t1 = tcg_temp_new_i64();
584 t2 = tcg_temp_new_i64();
585 tcg_gen_sari_i64(t1, a, 32);
586 tcg_gen_sari_i64(t2, b, 32);
587 tcg_gen_add_i64(t, t1, t2);
590 static void gen_vaddwod_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
594 int halfbits = 4 << vece;
596 t1 = tcg_temp_new_vec_matching(a);
597 t2 = tcg_temp_new_vec_matching(b);
599 /* Sign-extend the odd elements for vector */
600 tcg_gen_sari_vec(vece, t1, a, halfbits);
601 tcg_gen_sari_vec(vece, t2, b, halfbits);
603 tcg_gen_add_vec(vece, t, t1, t2);
606 static void do_vaddwod_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
607 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
609 static const TCGOpcode vecop_list[] = {
610 INDEX_op_sari_vec, INDEX_op_add_vec, 0
612 static const GVecGen3 op[4] = {
614 .fniv = gen_vaddwod_s,
615 .fno = gen_helper_vaddwod_h_b,
616 .opt_opc = vecop_list,
620 .fni4 = gen_vaddwod_w_h,
621 .fniv = gen_vaddwod_s,
622 .fno = gen_helper_vaddwod_w_h,
623 .opt_opc = vecop_list,
627 .fni8 = gen_vaddwod_d_w,
628 .fniv = gen_vaddwod_s,
629 .fno = gen_helper_vaddwod_d_w,
630 .opt_opc = vecop_list,
634 .fno = gen_helper_vaddwod_q_d,
639 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
642 TRANS(vaddwod_h_b, LSX, gvec_vvv, MO_8, do_vaddwod_s)
643 TRANS(vaddwod_w_h, LSX, gvec_vvv, MO_16, do_vaddwod_s)
644 TRANS(vaddwod_d_w, LSX, gvec_vvv, MO_32, do_vaddwod_s)
645 TRANS(vaddwod_q_d, LSX, gvec_vvv, MO_64, do_vaddwod_s)
646 TRANS(xvaddwod_h_b, LASX, gvec_xxx, MO_8, do_vaddwod_s)
647 TRANS(xvaddwod_w_h, LASX, gvec_xxx, MO_16, do_vaddwod_s)
648 TRANS(xvaddwod_d_w, LASX, gvec_xxx, MO_32, do_vaddwod_s)
649 TRANS(xvaddwod_q_d, LASX, gvec_xxx, MO_64, do_vaddwod_s)
652 static void gen_vsubwev_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
656 int halfbits = 4 << vece;
658 t1 = tcg_temp_new_vec_matching(a);
659 t2 = tcg_temp_new_vec_matching(b);
661 /* Sign-extend the even elements from a */
662 tcg_gen_shli_vec(vece, t1, a, halfbits);
663 tcg_gen_sari_vec(vece, t1, t1, halfbits);
665 /* Sign-extend the even elements from b */
666 tcg_gen_shli_vec(vece, t2, b, halfbits);
667 tcg_gen_sari_vec(vece, t2, t2, halfbits);
669 tcg_gen_sub_vec(vece, t, t1, t2);
672 static void gen_vsubwev_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
676 t1 = tcg_temp_new_i32();
677 t2 = tcg_temp_new_i32();
678 tcg_gen_ext16s_i32(t1, a);
679 tcg_gen_ext16s_i32(t2, b);
680 tcg_gen_sub_i32(t, t1, t2);
683 static void gen_vsubwev_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
687 t1 = tcg_temp_new_i64();
688 t2 = tcg_temp_new_i64();
689 tcg_gen_ext32s_i64(t1, a);
690 tcg_gen_ext32s_i64(t2, b);
691 tcg_gen_sub_i64(t, t1, t2);
694 static void do_vsubwev_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
695 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
697 static const TCGOpcode vecop_list[] = {
698 INDEX_op_shli_vec, INDEX_op_sari_vec, INDEX_op_sub_vec, 0
700 static const GVecGen3 op[4] = {
702 .fniv = gen_vsubwev_s,
703 .fno = gen_helper_vsubwev_h_b,
704 .opt_opc = vecop_list,
708 .fni4 = gen_vsubwev_w_h,
709 .fniv = gen_vsubwev_s,
710 .fno = gen_helper_vsubwev_w_h,
711 .opt_opc = vecop_list,
715 .fni8 = gen_vsubwev_d_w,
716 .fniv = gen_vsubwev_s,
717 .fno = gen_helper_vsubwev_d_w,
718 .opt_opc = vecop_list,
722 .fno = gen_helper_vsubwev_q_d,
727 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
730 TRANS(vsubwev_h_b, LSX, gvec_vvv, MO_8, do_vsubwev_s)
731 TRANS(vsubwev_w_h, LSX, gvec_vvv, MO_16, do_vsubwev_s)
732 TRANS(vsubwev_d_w, LSX, gvec_vvv, MO_32, do_vsubwev_s)
733 TRANS(vsubwev_q_d, LSX, gvec_vvv, MO_64, do_vsubwev_s)
734 TRANS(xvsubwev_h_b, LASX, gvec_xxx, MO_8, do_vsubwev_s)
735 TRANS(xvsubwev_w_h, LASX, gvec_xxx, MO_16, do_vsubwev_s)
736 TRANS(xvsubwev_d_w, LASX, gvec_xxx, MO_32, do_vsubwev_s)
737 TRANS(xvsubwev_q_d, LASX, gvec_xxx, MO_64, do_vsubwev_s)
739 static void gen_vsubwod_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
743 int halfbits = 4 << vece;
745 t1 = tcg_temp_new_vec_matching(a);
746 t2 = tcg_temp_new_vec_matching(b);
748 /* Sign-extend the odd elements for vector */
749 tcg_gen_sari_vec(vece, t1, a, halfbits);
750 tcg_gen_sari_vec(vece, t2, b, halfbits);
752 tcg_gen_sub_vec(vece, t, t1, t2);
755 static void gen_vsubwod_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
759 t1 = tcg_temp_new_i32();
760 t2 = tcg_temp_new_i32();
761 tcg_gen_sari_i32(t1, a, 16);
762 tcg_gen_sari_i32(t2, b, 16);
763 tcg_gen_sub_i32(t, t1, t2);
766 static void gen_vsubwod_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
770 t1 = tcg_temp_new_i64();
771 t2 = tcg_temp_new_i64();
772 tcg_gen_sari_i64(t1, a, 32);
773 tcg_gen_sari_i64(t2, b, 32);
774 tcg_gen_sub_i64(t, t1, t2);
777 static void do_vsubwod_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
778 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
780 static const TCGOpcode vecop_list[] = {
781 INDEX_op_sari_vec, INDEX_op_sub_vec, 0
783 static const GVecGen3 op[4] = {
785 .fniv = gen_vsubwod_s,
786 .fno = gen_helper_vsubwod_h_b,
787 .opt_opc = vecop_list,
791 .fni4 = gen_vsubwod_w_h,
792 .fniv = gen_vsubwod_s,
793 .fno = gen_helper_vsubwod_w_h,
794 .opt_opc = vecop_list,
798 .fni8 = gen_vsubwod_d_w,
799 .fniv = gen_vsubwod_s,
800 .fno = gen_helper_vsubwod_d_w,
801 .opt_opc = vecop_list,
805 .fno = gen_helper_vsubwod_q_d,
810 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
813 TRANS(vsubwod_h_b, LSX, gvec_vvv, MO_8, do_vsubwod_s)
814 TRANS(vsubwod_w_h, LSX, gvec_vvv, MO_16, do_vsubwod_s)
815 TRANS(vsubwod_d_w, LSX, gvec_vvv, MO_32, do_vsubwod_s)
816 TRANS(vsubwod_q_d, LSX, gvec_vvv, MO_64, do_vsubwod_s)
817 TRANS(xvsubwod_h_b, LASX, gvec_xxx, MO_8, do_vsubwod_s)
818 TRANS(xvsubwod_w_h, LASX, gvec_xxx, MO_16, do_vsubwod_s)
819 TRANS(xvsubwod_d_w, LASX, gvec_xxx, MO_32, do_vsubwod_s)
820 TRANS(xvsubwod_q_d, LASX, gvec_xxx, MO_64, do_vsubwod_s)
822 static void gen_vaddwev_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
826 t1 = tcg_temp_new_vec_matching(a);
827 t2 = tcg_temp_new_vec_matching(b);
828 t3 = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
829 tcg_gen_and_vec(vece, t1, a, t3);
830 tcg_gen_and_vec(vece, t2, b, t3);
831 tcg_gen_add_vec(vece, t, t1, t2);
834 static void gen_vaddwev_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
838 t1 = tcg_temp_new_i32();
839 t2 = tcg_temp_new_i32();
840 tcg_gen_ext16u_i32(t1, a);
841 tcg_gen_ext16u_i32(t2, b);
842 tcg_gen_add_i32(t, t1, t2);
845 static void gen_vaddwev_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
849 t1 = tcg_temp_new_i64();
850 t2 = tcg_temp_new_i64();
851 tcg_gen_ext32u_i64(t1, a);
852 tcg_gen_ext32u_i64(t2, b);
853 tcg_gen_add_i64(t, t1, t2);
856 static void do_vaddwev_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
857 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
859 static const TCGOpcode vecop_list[] = {
862 static const GVecGen3 op[4] = {
864 .fniv = gen_vaddwev_u,
865 .fno = gen_helper_vaddwev_h_bu,
866 .opt_opc = vecop_list,
870 .fni4 = gen_vaddwev_w_hu,
871 .fniv = gen_vaddwev_u,
872 .fno = gen_helper_vaddwev_w_hu,
873 .opt_opc = vecop_list,
877 .fni8 = gen_vaddwev_d_wu,
878 .fniv = gen_vaddwev_u,
879 .fno = gen_helper_vaddwev_d_wu,
880 .opt_opc = vecop_list,
884 .fno = gen_helper_vaddwev_q_du,
889 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
892 TRANS(vaddwev_h_bu, LSX, gvec_vvv, MO_8, do_vaddwev_u)
893 TRANS(vaddwev_w_hu, LSX, gvec_vvv, MO_16, do_vaddwev_u)
894 TRANS(vaddwev_d_wu, LSX, gvec_vvv, MO_32, do_vaddwev_u)
895 TRANS(vaddwev_q_du, LSX, gvec_vvv, MO_64, do_vaddwev_u)
896 TRANS(xvaddwev_h_bu, LASX, gvec_xxx, MO_8, do_vaddwev_u)
897 TRANS(xvaddwev_w_hu, LASX, gvec_xxx, MO_16, do_vaddwev_u)
898 TRANS(xvaddwev_d_wu, LASX, gvec_xxx, MO_32, do_vaddwev_u)
899 TRANS(xvaddwev_q_du, LASX, gvec_xxx, MO_64, do_vaddwev_u)
901 static void gen_vaddwod_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
905 int halfbits = 4 << vece;
907 t1 = tcg_temp_new_vec_matching(a);
908 t2 = tcg_temp_new_vec_matching(b);
910 /* Zero-extend the odd elements for vector */
911 tcg_gen_shri_vec(vece, t1, a, halfbits);
912 tcg_gen_shri_vec(vece, t2, b, halfbits);
914 tcg_gen_add_vec(vece, t, t1, t2);
917 static void gen_vaddwod_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
921 t1 = tcg_temp_new_i32();
922 t2 = tcg_temp_new_i32();
923 tcg_gen_shri_i32(t1, a, 16);
924 tcg_gen_shri_i32(t2, b, 16);
925 tcg_gen_add_i32(t, t1, t2);
928 static void gen_vaddwod_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
932 t1 = tcg_temp_new_i64();
933 t2 = tcg_temp_new_i64();
934 tcg_gen_shri_i64(t1, a, 32);
935 tcg_gen_shri_i64(t2, b, 32);
936 tcg_gen_add_i64(t, t1, t2);
939 static void do_vaddwod_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
940 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
942 static const TCGOpcode vecop_list[] = {
943 INDEX_op_shri_vec, INDEX_op_add_vec, 0
945 static const GVecGen3 op[4] = {
947 .fniv = gen_vaddwod_u,
948 .fno = gen_helper_vaddwod_h_bu,
949 .opt_opc = vecop_list,
953 .fni4 = gen_vaddwod_w_hu,
954 .fniv = gen_vaddwod_u,
955 .fno = gen_helper_vaddwod_w_hu,
956 .opt_opc = vecop_list,
960 .fni8 = gen_vaddwod_d_wu,
961 .fniv = gen_vaddwod_u,
962 .fno = gen_helper_vaddwod_d_wu,
963 .opt_opc = vecop_list,
967 .fno = gen_helper_vaddwod_q_du,
972 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
975 TRANS(vaddwod_h_bu, LSX, gvec_vvv, MO_8, do_vaddwod_u)
976 TRANS(vaddwod_w_hu, LSX, gvec_vvv, MO_16, do_vaddwod_u)
977 TRANS(vaddwod_d_wu, LSX, gvec_vvv, MO_32, do_vaddwod_u)
978 TRANS(vaddwod_q_du, LSX, gvec_vvv, MO_64, do_vaddwod_u)
979 TRANS(xvaddwod_h_bu, LASX, gvec_xxx, MO_8, do_vaddwod_u)
980 TRANS(xvaddwod_w_hu, LASX, gvec_xxx, MO_16, do_vaddwod_u)
981 TRANS(xvaddwod_d_wu, LASX, gvec_xxx, MO_32, do_vaddwod_u)
982 TRANS(xvaddwod_q_du, LASX, gvec_xxx, MO_64, do_vaddwod_u)
984 static void gen_vsubwev_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
988 t1 = tcg_temp_new_vec_matching(a);
989 t2 = tcg_temp_new_vec_matching(b);
990 t3 = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
991 tcg_gen_and_vec(vece, t1, a, t3);
992 tcg_gen_and_vec(vece, t2, b, t3);
993 tcg_gen_sub_vec(vece, t, t1, t2);
996 static void gen_vsubwev_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1000 t1 = tcg_temp_new_i32();
1001 t2 = tcg_temp_new_i32();
1002 tcg_gen_ext16u_i32(t1, a);
1003 tcg_gen_ext16u_i32(t2, b);
1004 tcg_gen_sub_i32(t, t1, t2);
1007 static void gen_vsubwev_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1011 t1 = tcg_temp_new_i64();
1012 t2 = tcg_temp_new_i64();
1013 tcg_gen_ext32u_i64(t1, a);
1014 tcg_gen_ext32u_i64(t2, b);
1015 tcg_gen_sub_i64(t, t1, t2);
1018 static void do_vsubwev_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1019 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1021 static const TCGOpcode vecop_list[] = {
1024 static const GVecGen3 op[4] = {
1026 .fniv = gen_vsubwev_u,
1027 .fno = gen_helper_vsubwev_h_bu,
1028 .opt_opc = vecop_list,
1032 .fni4 = gen_vsubwev_w_hu,
1033 .fniv = gen_vsubwev_u,
1034 .fno = gen_helper_vsubwev_w_hu,
1035 .opt_opc = vecop_list,
1039 .fni8 = gen_vsubwev_d_wu,
1040 .fniv = gen_vsubwev_u,
1041 .fno = gen_helper_vsubwev_d_wu,
1042 .opt_opc = vecop_list,
1046 .fno = gen_helper_vsubwev_q_du,
1051 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1054 TRANS(vsubwev_h_bu, LSX, gvec_vvv, MO_8, do_vsubwev_u)
1055 TRANS(vsubwev_w_hu, LSX, gvec_vvv, MO_16, do_vsubwev_u)
1056 TRANS(vsubwev_d_wu, LSX, gvec_vvv, MO_32, do_vsubwev_u)
1057 TRANS(vsubwev_q_du, LSX, gvec_vvv, MO_64, do_vsubwev_u)
1058 TRANS(xvsubwev_h_bu, LASX, gvec_xxx, MO_8, do_vsubwev_u)
1059 TRANS(xvsubwev_w_hu, LASX, gvec_xxx, MO_16, do_vsubwev_u)
1060 TRANS(xvsubwev_d_wu, LASX, gvec_xxx, MO_32, do_vsubwev_u)
1061 TRANS(xvsubwev_q_du, LASX, gvec_xxx, MO_64, do_vsubwev_u)
1063 static void gen_vsubwod_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1067 int halfbits = 4 << vece;
1069 t1 = tcg_temp_new_vec_matching(a);
1070 t2 = tcg_temp_new_vec_matching(b);
1072 /* Zero-extend the odd elements for vector */
1073 tcg_gen_shri_vec(vece, t1, a, halfbits);
1074 tcg_gen_shri_vec(vece, t2, b, halfbits);
1076 tcg_gen_sub_vec(vece, t, t1, t2);
1079 static void gen_vsubwod_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1083 t1 = tcg_temp_new_i32();
1084 t2 = tcg_temp_new_i32();
1085 tcg_gen_shri_i32(t1, a, 16);
1086 tcg_gen_shri_i32(t2, b, 16);
1087 tcg_gen_sub_i32(t, t1, t2);
1090 static void gen_vsubwod_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1094 t1 = tcg_temp_new_i64();
1095 t2 = tcg_temp_new_i64();
1096 tcg_gen_shri_i64(t1, a, 32);
1097 tcg_gen_shri_i64(t2, b, 32);
1098 tcg_gen_sub_i64(t, t1, t2);
1101 static void do_vsubwod_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1102 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1104 static const TCGOpcode vecop_list[] = {
1105 INDEX_op_shri_vec, INDEX_op_sub_vec, 0
1107 static const GVecGen3 op[4] = {
1109 .fniv = gen_vsubwod_u,
1110 .fno = gen_helper_vsubwod_h_bu,
1111 .opt_opc = vecop_list,
1115 .fni4 = gen_vsubwod_w_hu,
1116 .fniv = gen_vsubwod_u,
1117 .fno = gen_helper_vsubwod_w_hu,
1118 .opt_opc = vecop_list,
1122 .fni8 = gen_vsubwod_d_wu,
1123 .fniv = gen_vsubwod_u,
1124 .fno = gen_helper_vsubwod_d_wu,
1125 .opt_opc = vecop_list,
1129 .fno = gen_helper_vsubwod_q_du,
1134 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1137 TRANS(vsubwod_h_bu, LSX, gvec_vvv, MO_8, do_vsubwod_u)
1138 TRANS(vsubwod_w_hu, LSX, gvec_vvv, MO_16, do_vsubwod_u)
1139 TRANS(vsubwod_d_wu, LSX, gvec_vvv, MO_32, do_vsubwod_u)
1140 TRANS(vsubwod_q_du, LSX, gvec_vvv, MO_64, do_vsubwod_u)
1141 TRANS(xvsubwod_h_bu, LASX, gvec_xxx, MO_8, do_vsubwod_u)
1142 TRANS(xvsubwod_w_hu, LASX, gvec_xxx, MO_16, do_vsubwod_u)
1143 TRANS(xvsubwod_d_wu, LASX, gvec_xxx, MO_32, do_vsubwod_u)
1144 TRANS(xvsubwod_q_du, LASX, gvec_xxx, MO_64, do_vsubwod_u)
1146 static void gen_vaddwev_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1148 TCGv_vec t1, t2, t3;
1150 int halfbits = 4 << vece;
1152 t1 = tcg_temp_new_vec_matching(a);
1153 t2 = tcg_temp_new_vec_matching(b);
1154 t3 = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, halfbits));
1156 /* Zero-extend the even elements from a */
1157 tcg_gen_and_vec(vece, t1, a, t3);
1159 /* Sign-extend the even elements from b */
1160 tcg_gen_shli_vec(vece, t2, b, halfbits);
1161 tcg_gen_sari_vec(vece, t2, t2, halfbits);
1163 tcg_gen_add_vec(vece, t, t1, t2);
1166 static void gen_vaddwev_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1170 t1 = tcg_temp_new_i32();
1171 t2 = tcg_temp_new_i32();
1172 tcg_gen_ext16u_i32(t1, a);
1173 tcg_gen_ext16s_i32(t2, b);
1174 tcg_gen_add_i32(t, t1, t2);
1177 static void gen_vaddwev_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1181 t1 = tcg_temp_new_i64();
1182 t2 = tcg_temp_new_i64();
1183 tcg_gen_ext32u_i64(t1, a);
1184 tcg_gen_ext32s_i64(t2, b);
1185 tcg_gen_add_i64(t, t1, t2);
1188 static void do_vaddwev_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1189 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1191 static const TCGOpcode vecop_list[] = {
1192 INDEX_op_shli_vec, INDEX_op_sari_vec, INDEX_op_add_vec, 0
1194 static const GVecGen3 op[4] = {
1196 .fniv = gen_vaddwev_u_s,
1197 .fno = gen_helper_vaddwev_h_bu_b,
1198 .opt_opc = vecop_list,
1202 .fni4 = gen_vaddwev_w_hu_h,
1203 .fniv = gen_vaddwev_u_s,
1204 .fno = gen_helper_vaddwev_w_hu_h,
1205 .opt_opc = vecop_list,
1209 .fni8 = gen_vaddwev_d_wu_w,
1210 .fniv = gen_vaddwev_u_s,
1211 .fno = gen_helper_vaddwev_d_wu_w,
1212 .opt_opc = vecop_list,
1216 .fno = gen_helper_vaddwev_q_du_d,
1221 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1224 TRANS(vaddwev_h_bu_b, LSX, gvec_vvv, MO_8, do_vaddwev_u_s)
1225 TRANS(vaddwev_w_hu_h, LSX, gvec_vvv, MO_16, do_vaddwev_u_s)
1226 TRANS(vaddwev_d_wu_w, LSX, gvec_vvv, MO_32, do_vaddwev_u_s)
1227 TRANS(vaddwev_q_du_d, LSX, gvec_vvv, MO_64, do_vaddwev_u_s)
1228 TRANS(xvaddwev_h_bu_b, LASX, gvec_xxx, MO_8, do_vaddwev_u_s)
1229 TRANS(xvaddwev_w_hu_h, LASX, gvec_xxx, MO_16, do_vaddwev_u_s)
1230 TRANS(xvaddwev_d_wu_w, LASX, gvec_xxx, MO_32, do_vaddwev_u_s)
1231 TRANS(xvaddwev_q_du_d, LASX, gvec_xxx, MO_64, do_vaddwev_u_s)
1233 static void gen_vaddwod_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1237 int halfbits = 4 << vece;
1239 t1 = tcg_temp_new_vec_matching(a);
1240 t2 = tcg_temp_new_vec_matching(b);
1242 /* Zero-extend the odd elements from a */
1243 tcg_gen_shri_vec(vece, t1, a, halfbits);
1244 /* Sign-extend the odd elements from b */
1245 tcg_gen_sari_vec(vece, t2, b, halfbits);
1247 tcg_gen_add_vec(vece, t, t1, t2);
1250 static void gen_vaddwod_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1254 t1 = tcg_temp_new_i32();
1255 t2 = tcg_temp_new_i32();
1256 tcg_gen_shri_i32(t1, a, 16);
1257 tcg_gen_sari_i32(t2, b, 16);
1258 tcg_gen_add_i32(t, t1, t2);
1261 static void gen_vaddwod_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1265 t1 = tcg_temp_new_i64();
1266 t2 = tcg_temp_new_i64();
1267 tcg_gen_shri_i64(t1, a, 32);
1268 tcg_gen_sari_i64(t2, b, 32);
1269 tcg_gen_add_i64(t, t1, t2);
1272 static void do_vaddwod_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1273 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1275 static const TCGOpcode vecop_list[] = {
1276 INDEX_op_shri_vec, INDEX_op_sari_vec, INDEX_op_add_vec, 0
1278 static const GVecGen3 op[4] = {
1280 .fniv = gen_vaddwod_u_s,
1281 .fno = gen_helper_vaddwod_h_bu_b,
1282 .opt_opc = vecop_list,
1286 .fni4 = gen_vaddwod_w_hu_h,
1287 .fniv = gen_vaddwod_u_s,
1288 .fno = gen_helper_vaddwod_w_hu_h,
1289 .opt_opc = vecop_list,
1293 .fni8 = gen_vaddwod_d_wu_w,
1294 .fniv = gen_vaddwod_u_s,
1295 .fno = gen_helper_vaddwod_d_wu_w,
1296 .opt_opc = vecop_list,
1300 .fno = gen_helper_vaddwod_q_du_d,
1305 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1308 TRANS(vaddwod_h_bu_b, LSX, gvec_vvv, MO_8, do_vaddwod_u_s)
1309 TRANS(vaddwod_w_hu_h, LSX, gvec_vvv, MO_16, do_vaddwod_u_s)
1310 TRANS(vaddwod_d_wu_w, LSX, gvec_vvv, MO_32, do_vaddwod_u_s)
1311 TRANS(vaddwod_q_du_d, LSX, gvec_vvv, MO_64, do_vaddwod_u_s)
1312 TRANS(xvaddwod_h_bu_b, LSX, gvec_xxx, MO_8, do_vaddwod_u_s)
1313 TRANS(xvaddwod_w_hu_h, LSX, gvec_xxx, MO_16, do_vaddwod_u_s)
1314 TRANS(xvaddwod_d_wu_w, LSX, gvec_xxx, MO_32, do_vaddwod_u_s)
1315 TRANS(xvaddwod_q_du_d, LSX, gvec_xxx, MO_64, do_vaddwod_u_s)
1317 static void do_vavg(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
1318 void (*gen_shr_vec)(unsigned, TCGv_vec,
1320 void (*gen_round_vec)(unsigned, TCGv_vec,
1321 TCGv_vec, TCGv_vec))
1323 TCGv_vec tmp = tcg_temp_new_vec_matching(t);
1324 gen_round_vec(vece, tmp, a, b);
1325 tcg_gen_and_vec(vece, tmp, tmp, tcg_constant_vec_matching(t, vece, 1));
1326 gen_shr_vec(vece, a, a, 1);
1327 gen_shr_vec(vece, b, b, 1);
1328 tcg_gen_add_vec(vece, t, a, b);
1329 tcg_gen_add_vec(vece, t, t, tmp);
1332 static void gen_vavg_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1334 do_vavg(vece, t, a, b, tcg_gen_sari_vec, tcg_gen_and_vec);
1337 static void gen_vavg_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1339 do_vavg(vece, t, a, b, tcg_gen_shri_vec, tcg_gen_and_vec);
1342 static void gen_vavgr_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1344 do_vavg(vece, t, a, b, tcg_gen_sari_vec, tcg_gen_or_vec);
1347 static void gen_vavgr_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1349 do_vavg(vece, t, a, b, tcg_gen_shri_vec, tcg_gen_or_vec);
1352 static void do_vavg_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1353 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1355 static const TCGOpcode vecop_list[] = {
1356 INDEX_op_sari_vec, INDEX_op_add_vec, 0
1358 static const GVecGen3 op[4] = {
1361 .fno = gen_helper_vavg_b,
1362 .opt_opc = vecop_list,
1367 .fno = gen_helper_vavg_h,
1368 .opt_opc = vecop_list,
1373 .fno = gen_helper_vavg_w,
1374 .opt_opc = vecop_list,
1379 .fno = gen_helper_vavg_d,
1380 .opt_opc = vecop_list,
1385 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1388 static void do_vavg_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1389 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1391 static const TCGOpcode vecop_list[] = {
1392 INDEX_op_shri_vec, INDEX_op_add_vec, 0
1394 static const GVecGen3 op[4] = {
1397 .fno = gen_helper_vavg_bu,
1398 .opt_opc = vecop_list,
1403 .fno = gen_helper_vavg_hu,
1404 .opt_opc = vecop_list,
1409 .fno = gen_helper_vavg_wu,
1410 .opt_opc = vecop_list,
1415 .fno = gen_helper_vavg_du,
1416 .opt_opc = vecop_list,
1421 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1424 TRANS(vavg_b, LSX, gvec_vvv, MO_8, do_vavg_s)
1425 TRANS(vavg_h, LSX, gvec_vvv, MO_16, do_vavg_s)
1426 TRANS(vavg_w, LSX, gvec_vvv, MO_32, do_vavg_s)
1427 TRANS(vavg_d, LSX, gvec_vvv, MO_64, do_vavg_s)
1428 TRANS(vavg_bu, LSX, gvec_vvv, MO_8, do_vavg_u)
1429 TRANS(vavg_hu, LSX, gvec_vvv, MO_16, do_vavg_u)
1430 TRANS(vavg_wu, LSX, gvec_vvv, MO_32, do_vavg_u)
1431 TRANS(vavg_du, LSX, gvec_vvv, MO_64, do_vavg_u)
1432 TRANS(xvavg_b, LASX, gvec_xxx, MO_8, do_vavg_s)
1433 TRANS(xvavg_h, LASX, gvec_xxx, MO_16, do_vavg_s)
1434 TRANS(xvavg_w, LASX, gvec_xxx, MO_32, do_vavg_s)
1435 TRANS(xvavg_d, LASX, gvec_xxx, MO_64, do_vavg_s)
1436 TRANS(xvavg_bu, LASX, gvec_xxx, MO_8, do_vavg_u)
1437 TRANS(xvavg_hu, LASX, gvec_xxx, MO_16, do_vavg_u)
1438 TRANS(xvavg_wu, LASX, gvec_xxx, MO_32, do_vavg_u)
1439 TRANS(xvavg_du, LASX, gvec_xxx, MO_64, do_vavg_u)
1441 static void do_vavgr_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1442 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1444 static const TCGOpcode vecop_list[] = {
1445 INDEX_op_sari_vec, INDEX_op_add_vec, 0
1447 static const GVecGen3 op[4] = {
1449 .fniv = gen_vavgr_s,
1450 .fno = gen_helper_vavgr_b,
1451 .opt_opc = vecop_list,
1455 .fniv = gen_vavgr_s,
1456 .fno = gen_helper_vavgr_h,
1457 .opt_opc = vecop_list,
1461 .fniv = gen_vavgr_s,
1462 .fno = gen_helper_vavgr_w,
1463 .opt_opc = vecop_list,
1467 .fniv = gen_vavgr_s,
1468 .fno = gen_helper_vavgr_d,
1469 .opt_opc = vecop_list,
1474 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1477 static void do_vavgr_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1478 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1480 static const TCGOpcode vecop_list[] = {
1481 INDEX_op_shri_vec, INDEX_op_add_vec, 0
1483 static const GVecGen3 op[4] = {
1485 .fniv = gen_vavgr_u,
1486 .fno = gen_helper_vavgr_bu,
1487 .opt_opc = vecop_list,
1491 .fniv = gen_vavgr_u,
1492 .fno = gen_helper_vavgr_hu,
1493 .opt_opc = vecop_list,
1497 .fniv = gen_vavgr_u,
1498 .fno = gen_helper_vavgr_wu,
1499 .opt_opc = vecop_list,
1503 .fniv = gen_vavgr_u,
1504 .fno = gen_helper_vavgr_du,
1505 .opt_opc = vecop_list,
1510 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1513 TRANS(vavgr_b, LSX, gvec_vvv, MO_8, do_vavgr_s)
1514 TRANS(vavgr_h, LSX, gvec_vvv, MO_16, do_vavgr_s)
1515 TRANS(vavgr_w, LSX, gvec_vvv, MO_32, do_vavgr_s)
1516 TRANS(vavgr_d, LSX, gvec_vvv, MO_64, do_vavgr_s)
1517 TRANS(vavgr_bu, LSX, gvec_vvv, MO_8, do_vavgr_u)
1518 TRANS(vavgr_hu, LSX, gvec_vvv, MO_16, do_vavgr_u)
1519 TRANS(vavgr_wu, LSX, gvec_vvv, MO_32, do_vavgr_u)
1520 TRANS(vavgr_du, LSX, gvec_vvv, MO_64, do_vavgr_u)
1521 TRANS(xvavgr_b, LASX, gvec_xxx, MO_8, do_vavgr_s)
1522 TRANS(xvavgr_h, LASX, gvec_xxx, MO_16, do_vavgr_s)
1523 TRANS(xvavgr_w, LASX, gvec_xxx, MO_32, do_vavgr_s)
1524 TRANS(xvavgr_d, LASX, gvec_xxx, MO_64, do_vavgr_s)
1525 TRANS(xvavgr_bu, LASX, gvec_xxx, MO_8, do_vavgr_u)
1526 TRANS(xvavgr_hu, LASX, gvec_xxx, MO_16, do_vavgr_u)
1527 TRANS(xvavgr_wu, LASX, gvec_xxx, MO_32, do_vavgr_u)
1528 TRANS(xvavgr_du, LASX, gvec_xxx, MO_64, do_vavgr_u)
1530 static void gen_vabsd_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1532 tcg_gen_smax_vec(vece, t, a, b);
1533 tcg_gen_smin_vec(vece, a, a, b);
1534 tcg_gen_sub_vec(vece, t, t, a);
1537 static void do_vabsd_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1538 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1540 static const TCGOpcode vecop_list[] = {
1541 INDEX_op_smax_vec, INDEX_op_smin_vec, INDEX_op_sub_vec, 0
1543 static const GVecGen3 op[4] = {
1545 .fniv = gen_vabsd_s,
1546 .fno = gen_helper_vabsd_b,
1547 .opt_opc = vecop_list,
1551 .fniv = gen_vabsd_s,
1552 .fno = gen_helper_vabsd_h,
1553 .opt_opc = vecop_list,
1557 .fniv = gen_vabsd_s,
1558 .fno = gen_helper_vabsd_w,
1559 .opt_opc = vecop_list,
1563 .fniv = gen_vabsd_s,
1564 .fno = gen_helper_vabsd_d,
1565 .opt_opc = vecop_list,
1570 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1573 static void gen_vabsd_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1575 tcg_gen_umax_vec(vece, t, a, b);
1576 tcg_gen_umin_vec(vece, a, a, b);
1577 tcg_gen_sub_vec(vece, t, t, a);
1580 static void do_vabsd_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1581 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1583 static const TCGOpcode vecop_list[] = {
1584 INDEX_op_umax_vec, INDEX_op_umin_vec, INDEX_op_sub_vec, 0
1586 static const GVecGen3 op[4] = {
1588 .fniv = gen_vabsd_u,
1589 .fno = gen_helper_vabsd_bu,
1590 .opt_opc = vecop_list,
1594 .fniv = gen_vabsd_u,
1595 .fno = gen_helper_vabsd_hu,
1596 .opt_opc = vecop_list,
1600 .fniv = gen_vabsd_u,
1601 .fno = gen_helper_vabsd_wu,
1602 .opt_opc = vecop_list,
1606 .fniv = gen_vabsd_u,
1607 .fno = gen_helper_vabsd_du,
1608 .opt_opc = vecop_list,
1613 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1616 TRANS(vabsd_b, LSX, gvec_vvv, MO_8, do_vabsd_s)
1617 TRANS(vabsd_h, LSX, gvec_vvv, MO_16, do_vabsd_s)
1618 TRANS(vabsd_w, LSX, gvec_vvv, MO_32, do_vabsd_s)
1619 TRANS(vabsd_d, LSX, gvec_vvv, MO_64, do_vabsd_s)
1620 TRANS(vabsd_bu, LSX, gvec_vvv, MO_8, do_vabsd_u)
1621 TRANS(vabsd_hu, LSX, gvec_vvv, MO_16, do_vabsd_u)
1622 TRANS(vabsd_wu, LSX, gvec_vvv, MO_32, do_vabsd_u)
1623 TRANS(vabsd_du, LSX, gvec_vvv, MO_64, do_vabsd_u)
1624 TRANS(xvabsd_b, LASX, gvec_xxx, MO_8, do_vabsd_s)
1625 TRANS(xvabsd_h, LASX, gvec_xxx, MO_16, do_vabsd_s)
1626 TRANS(xvabsd_w, LASX, gvec_xxx, MO_32, do_vabsd_s)
1627 TRANS(xvabsd_d, LASX, gvec_xxx, MO_64, do_vabsd_s)
1628 TRANS(xvabsd_bu, LASX, gvec_xxx, MO_8, do_vabsd_u)
1629 TRANS(xvabsd_hu, LASX, gvec_xxx, MO_16, do_vabsd_u)
1630 TRANS(xvabsd_wu, LASX, gvec_xxx, MO_32, do_vabsd_u)
1631 TRANS(xvabsd_du, LASX, gvec_xxx, MO_64, do_vabsd_u)
1633 static void gen_vadda(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
1637 t1 = tcg_temp_new_vec_matching(a);
1638 t2 = tcg_temp_new_vec_matching(b);
1640 tcg_gen_abs_vec(vece, t1, a);
1641 tcg_gen_abs_vec(vece, t2, b);
1642 tcg_gen_add_vec(vece, t, t1, t2);
1645 static void do_vadda(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1646 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1648 static const TCGOpcode vecop_list[] = {
1649 INDEX_op_abs_vec, INDEX_op_add_vec, 0
1651 static const GVecGen3 op[4] = {
1654 .fno = gen_helper_vadda_b,
1655 .opt_opc = vecop_list,
1660 .fno = gen_helper_vadda_h,
1661 .opt_opc = vecop_list,
1666 .fno = gen_helper_vadda_w,
1667 .opt_opc = vecop_list,
1672 .fno = gen_helper_vadda_d,
1673 .opt_opc = vecop_list,
1678 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1681 TRANS(vadda_b, LSX, gvec_vvv, MO_8, do_vadda)
1682 TRANS(vadda_h, LSX, gvec_vvv, MO_16, do_vadda)
1683 TRANS(vadda_w, LSX, gvec_vvv, MO_32, do_vadda)
1684 TRANS(vadda_d, LSX, gvec_vvv, MO_64, do_vadda)
1685 TRANS(xvadda_b, LASX, gvec_xxx, MO_8, do_vadda)
1686 TRANS(xvadda_h, LASX, gvec_xxx, MO_16, do_vadda)
1687 TRANS(xvadda_w, LASX, gvec_xxx, MO_32, do_vadda)
1688 TRANS(xvadda_d, LASX, gvec_xxx, MO_64, do_vadda)
1690 TRANS(vmax_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_smax)
1691 TRANS(vmax_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_smax)
1692 TRANS(vmax_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_smax)
1693 TRANS(vmax_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_smax)
1694 TRANS(vmax_bu, LSX, gvec_vvv, MO_8, tcg_gen_gvec_umax)
1695 TRANS(vmax_hu, LSX, gvec_vvv, MO_16, tcg_gen_gvec_umax)
1696 TRANS(vmax_wu, LSX, gvec_vvv, MO_32, tcg_gen_gvec_umax)
1697 TRANS(vmax_du, LSX, gvec_vvv, MO_64, tcg_gen_gvec_umax)
1698 TRANS(xvmax_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_smax)
1699 TRANS(xvmax_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_smax)
1700 TRANS(xvmax_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_smax)
1701 TRANS(xvmax_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_smax)
1702 TRANS(xvmax_bu, LASX, gvec_xxx, MO_8, tcg_gen_gvec_umax)
1703 TRANS(xvmax_hu, LASX, gvec_xxx, MO_16, tcg_gen_gvec_umax)
1704 TRANS(xvmax_wu, LASX, gvec_xxx, MO_32, tcg_gen_gvec_umax)
1705 TRANS(xvmax_du, LASX, gvec_xxx, MO_64, tcg_gen_gvec_umax)
1707 TRANS(vmin_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_smin)
1708 TRANS(vmin_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_smin)
1709 TRANS(vmin_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_smin)
1710 TRANS(vmin_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_smin)
1711 TRANS(vmin_bu, LSX, gvec_vvv, MO_8, tcg_gen_gvec_umin)
1712 TRANS(vmin_hu, LSX, gvec_vvv, MO_16, tcg_gen_gvec_umin)
1713 TRANS(vmin_wu, LSX, gvec_vvv, MO_32, tcg_gen_gvec_umin)
1714 TRANS(vmin_du, LSX, gvec_vvv, MO_64, tcg_gen_gvec_umin)
1715 TRANS(xvmin_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_smin)
1716 TRANS(xvmin_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_smin)
1717 TRANS(xvmin_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_smin)
1718 TRANS(xvmin_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_smin)
1719 TRANS(xvmin_bu, LASX, gvec_xxx, MO_8, tcg_gen_gvec_umin)
1720 TRANS(xvmin_hu, LASX, gvec_xxx, MO_16, tcg_gen_gvec_umin)
1721 TRANS(xvmin_wu, LASX, gvec_xxx, MO_32, tcg_gen_gvec_umin)
1722 TRANS(xvmin_du, LASX, gvec_xxx, MO_64, tcg_gen_gvec_umin)
1724 static void gen_vmini_s(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
1726 tcg_gen_smin_vec(vece, t, a, tcg_constant_vec_matching(t, vece, imm));
1729 static void gen_vmini_u(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
1731 tcg_gen_umin_vec(vece, t, a, tcg_constant_vec_matching(t, vece, imm));
1734 static void gen_vmaxi_s(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
1736 tcg_gen_smax_vec(vece, t, a, tcg_constant_vec_matching(t, vece, imm));
1739 static void gen_vmaxi_u(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
1741 tcg_gen_umax_vec(vece, t, a, tcg_constant_vec_matching(t, vece, imm));
1744 static void do_vmini_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1745 int64_t imm, uint32_t oprsz, uint32_t maxsz)
1747 static const TCGOpcode vecop_list[] = {
1748 INDEX_op_smin_vec, 0
1750 static const GVecGen2i op[4] = {
1752 .fniv = gen_vmini_s,
1753 .fnoi = gen_helper_vmini_b,
1754 .opt_opc = vecop_list,
1758 .fniv = gen_vmini_s,
1759 .fnoi = gen_helper_vmini_h,
1760 .opt_opc = vecop_list,
1764 .fniv = gen_vmini_s,
1765 .fnoi = gen_helper_vmini_w,
1766 .opt_opc = vecop_list,
1770 .fniv = gen_vmini_s,
1771 .fnoi = gen_helper_vmini_d,
1772 .opt_opc = vecop_list,
1777 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
1780 static void do_vmini_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1781 int64_t imm, uint32_t oprsz, uint32_t maxsz)
1783 static const TCGOpcode vecop_list[] = {
1784 INDEX_op_umin_vec, 0
1786 static const GVecGen2i op[4] = {
1788 .fniv = gen_vmini_u,
1789 .fnoi = gen_helper_vmini_bu,
1790 .opt_opc = vecop_list,
1794 .fniv = gen_vmini_u,
1795 .fnoi = gen_helper_vmini_hu,
1796 .opt_opc = vecop_list,
1800 .fniv = gen_vmini_u,
1801 .fnoi = gen_helper_vmini_wu,
1802 .opt_opc = vecop_list,
1806 .fniv = gen_vmini_u,
1807 .fnoi = gen_helper_vmini_du,
1808 .opt_opc = vecop_list,
1813 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
1816 TRANS(vmini_b, LSX, gvec_vv_i, MO_8, do_vmini_s)
1817 TRANS(vmini_h, LSX, gvec_vv_i, MO_16, do_vmini_s)
1818 TRANS(vmini_w, LSX, gvec_vv_i, MO_32, do_vmini_s)
1819 TRANS(vmini_d, LSX, gvec_vv_i, MO_64, do_vmini_s)
1820 TRANS(vmini_bu, LSX, gvec_vv_i, MO_8, do_vmini_u)
1821 TRANS(vmini_hu, LSX, gvec_vv_i, MO_16, do_vmini_u)
1822 TRANS(vmini_wu, LSX, gvec_vv_i, MO_32, do_vmini_u)
1823 TRANS(vmini_du, LSX, gvec_vv_i, MO_64, do_vmini_u)
1824 TRANS(xvmini_b, LASX, gvec_xx_i, MO_8, do_vmini_s)
1825 TRANS(xvmini_h, LASX, gvec_xx_i, MO_16, do_vmini_s)
1826 TRANS(xvmini_w, LASX, gvec_xx_i, MO_32, do_vmini_s)
1827 TRANS(xvmini_d, LASX, gvec_xx_i, MO_64, do_vmini_s)
1828 TRANS(xvmini_bu, LASX, gvec_xx_i, MO_8, do_vmini_u)
1829 TRANS(xvmini_hu, LASX, gvec_xx_i, MO_16, do_vmini_u)
1830 TRANS(xvmini_wu, LASX, gvec_xx_i, MO_32, do_vmini_u)
1831 TRANS(xvmini_du, LASX, gvec_xx_i, MO_64, do_vmini_u)
1833 static void do_vmaxi_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1834 int64_t imm, uint32_t oprsz, uint32_t maxsz)
1836 static const TCGOpcode vecop_list[] = {
1837 INDEX_op_smax_vec, 0
1839 static const GVecGen2i op[4] = {
1841 .fniv = gen_vmaxi_s,
1842 .fnoi = gen_helper_vmaxi_b,
1843 .opt_opc = vecop_list,
1847 .fniv = gen_vmaxi_s,
1848 .fnoi = gen_helper_vmaxi_h,
1849 .opt_opc = vecop_list,
1853 .fniv = gen_vmaxi_s,
1854 .fnoi = gen_helper_vmaxi_w,
1855 .opt_opc = vecop_list,
1859 .fniv = gen_vmaxi_s,
1860 .fnoi = gen_helper_vmaxi_d,
1861 .opt_opc = vecop_list,
1866 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
1869 static void do_vmaxi_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1870 int64_t imm, uint32_t oprsz, uint32_t maxsz)
1872 static const TCGOpcode vecop_list[] = {
1873 INDEX_op_umax_vec, 0
1875 static const GVecGen2i op[4] = {
1877 .fniv = gen_vmaxi_u,
1878 .fnoi = gen_helper_vmaxi_bu,
1879 .opt_opc = vecop_list,
1883 .fniv = gen_vmaxi_u,
1884 .fnoi = gen_helper_vmaxi_hu,
1885 .opt_opc = vecop_list,
1889 .fniv = gen_vmaxi_u,
1890 .fnoi = gen_helper_vmaxi_wu,
1891 .opt_opc = vecop_list,
1895 .fniv = gen_vmaxi_u,
1896 .fnoi = gen_helper_vmaxi_du,
1897 .opt_opc = vecop_list,
1902 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
1905 TRANS(vmaxi_b, LSX, gvec_vv_i, MO_8, do_vmaxi_s)
1906 TRANS(vmaxi_h, LSX, gvec_vv_i, MO_16, do_vmaxi_s)
1907 TRANS(vmaxi_w, LSX, gvec_vv_i, MO_32, do_vmaxi_s)
1908 TRANS(vmaxi_d, LSX, gvec_vv_i, MO_64, do_vmaxi_s)
1909 TRANS(vmaxi_bu, LSX, gvec_vv_i, MO_8, do_vmaxi_u)
1910 TRANS(vmaxi_hu, LSX, gvec_vv_i, MO_16, do_vmaxi_u)
1911 TRANS(vmaxi_wu, LSX, gvec_vv_i, MO_32, do_vmaxi_u)
1912 TRANS(vmaxi_du, LSX, gvec_vv_i, MO_64, do_vmaxi_u)
1913 TRANS(xvmaxi_b, LASX, gvec_xx_i, MO_8, do_vmaxi_s)
1914 TRANS(xvmaxi_h, LASX, gvec_xx_i, MO_16, do_vmaxi_s)
1915 TRANS(xvmaxi_w, LASX, gvec_xx_i, MO_32, do_vmaxi_s)
1916 TRANS(xvmaxi_d, LASX, gvec_xx_i, MO_64, do_vmaxi_s)
1917 TRANS(xvmaxi_bu, LASX, gvec_xx_i, MO_8, do_vmaxi_u)
1918 TRANS(xvmaxi_hu, LASX, gvec_xx_i, MO_16, do_vmaxi_u)
1919 TRANS(xvmaxi_wu, LASX, gvec_xx_i, MO_32, do_vmaxi_u)
1920 TRANS(xvmaxi_du, LASX, gvec_xx_i, MO_64, do_vmaxi_u)
1922 TRANS(vmul_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_mul)
1923 TRANS(vmul_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_mul)
1924 TRANS(vmul_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_mul)
1925 TRANS(vmul_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_mul)
1926 TRANS(xvmul_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_mul)
1927 TRANS(xvmul_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_mul)
1928 TRANS(xvmul_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_mul)
1929 TRANS(xvmul_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_mul)
1931 static void gen_vmuh_w(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1933 TCGv_i32 discard = tcg_temp_new_i32();
1934 tcg_gen_muls2_i32(discard, t, a, b);
1937 static void gen_vmuh_d(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1939 TCGv_i64 discard = tcg_temp_new_i64();
1940 tcg_gen_muls2_i64(discard, t, a, b);
1943 static void do_vmuh_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1944 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1946 static const GVecGen3 op[4] = {
1948 .fno = gen_helper_vmuh_b,
1952 .fno = gen_helper_vmuh_h,
1957 .fno = gen_helper_vmuh_w,
1962 .fno = gen_helper_vmuh_d,
1967 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
1970 TRANS(vmuh_b, LSX, gvec_vvv, MO_8, do_vmuh_s)
1971 TRANS(vmuh_h, LSX, gvec_vvv, MO_16, do_vmuh_s)
1972 TRANS(vmuh_w, LSX, gvec_vvv, MO_32, do_vmuh_s)
1973 TRANS(vmuh_d, LSX, gvec_vvv, MO_64, do_vmuh_s)
1974 TRANS(xvmuh_b, LASX, gvec_xxx, MO_8, do_vmuh_s)
1975 TRANS(xvmuh_h, LASX, gvec_xxx, MO_16, do_vmuh_s)
1976 TRANS(xvmuh_w, LASX, gvec_xxx, MO_32, do_vmuh_s)
1977 TRANS(xvmuh_d, LASX, gvec_xxx, MO_64, do_vmuh_s)
1979 static void gen_vmuh_wu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
1981 TCGv_i32 discard = tcg_temp_new_i32();
1982 tcg_gen_mulu2_i32(discard, t, a, b);
1985 static void gen_vmuh_du(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
1987 TCGv_i64 discard = tcg_temp_new_i64();
1988 tcg_gen_mulu2_i64(discard, t, a, b);
1991 static void do_vmuh_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
1992 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
1994 static const GVecGen3 op[4] = {
1996 .fno = gen_helper_vmuh_bu,
2000 .fno = gen_helper_vmuh_hu,
2004 .fni4 = gen_vmuh_wu,
2005 .fno = gen_helper_vmuh_wu,
2009 .fni8 = gen_vmuh_du,
2010 .fno = gen_helper_vmuh_du,
2015 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2018 TRANS(vmuh_bu, LSX, gvec_vvv, MO_8, do_vmuh_u)
2019 TRANS(vmuh_hu, LSX, gvec_vvv, MO_16, do_vmuh_u)
2020 TRANS(vmuh_wu, LSX, gvec_vvv, MO_32, do_vmuh_u)
2021 TRANS(vmuh_du, LSX, gvec_vvv, MO_64, do_vmuh_u)
2022 TRANS(xvmuh_bu, LASX, gvec_xxx, MO_8, do_vmuh_u)
2023 TRANS(xvmuh_hu, LASX, gvec_xxx, MO_16, do_vmuh_u)
2024 TRANS(xvmuh_wu, LASX, gvec_xxx, MO_32, do_vmuh_u)
2025 TRANS(xvmuh_du, LASX, gvec_xxx, MO_64, do_vmuh_u)
2027 static void gen_vmulwev_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2030 int halfbits = 4 << vece;
2032 t1 = tcg_temp_new_vec_matching(a);
2033 t2 = tcg_temp_new_vec_matching(b);
2034 tcg_gen_shli_vec(vece, t1, a, halfbits);
2035 tcg_gen_sari_vec(vece, t1, t1, halfbits);
2036 tcg_gen_shli_vec(vece, t2, b, halfbits);
2037 tcg_gen_sari_vec(vece, t2, t2, halfbits);
2038 tcg_gen_mul_vec(vece, t, t1, t2);
2041 static void gen_vmulwev_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2045 t1 = tcg_temp_new_i32();
2046 t2 = tcg_temp_new_i32();
2047 tcg_gen_ext16s_i32(t1, a);
2048 tcg_gen_ext16s_i32(t2, b);
2049 tcg_gen_mul_i32(t, t1, t2);
2052 static void gen_vmulwev_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2056 t1 = tcg_temp_new_i64();
2057 t2 = tcg_temp_new_i64();
2058 tcg_gen_ext32s_i64(t1, a);
2059 tcg_gen_ext32s_i64(t2, b);
2060 tcg_gen_mul_i64(t, t1, t2);
2063 static void do_vmulwev_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2064 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2066 static const TCGOpcode vecop_list[] = {
2067 INDEX_op_shli_vec, INDEX_op_sari_vec, INDEX_op_mul_vec, 0
2069 static const GVecGen3 op[3] = {
2071 .fniv = gen_vmulwev_s,
2072 .fno = gen_helper_vmulwev_h_b,
2073 .opt_opc = vecop_list,
2077 .fni4 = gen_vmulwev_w_h,
2078 .fniv = gen_vmulwev_s,
2079 .fno = gen_helper_vmulwev_w_h,
2080 .opt_opc = vecop_list,
2084 .fni8 = gen_vmulwev_d_w,
2085 .fniv = gen_vmulwev_s,
2086 .fno = gen_helper_vmulwev_d_w,
2087 .opt_opc = vecop_list,
2092 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2095 TRANS(vmulwev_h_b, LSX, gvec_vvv, MO_8, do_vmulwev_s)
2096 TRANS(vmulwev_w_h, LSX, gvec_vvv, MO_16, do_vmulwev_s)
2097 TRANS(vmulwev_d_w, LSX, gvec_vvv, MO_32, do_vmulwev_s)
2098 TRANS(xvmulwev_h_b, LASX, gvec_xxx, MO_8, do_vmulwev_s)
2099 TRANS(xvmulwev_w_h, LASX, gvec_xxx, MO_16, do_vmulwev_s)
2100 TRANS(xvmulwev_d_w, LASX, gvec_xxx, MO_32, do_vmulwev_s)
2102 static void tcg_gen_mulus2_i64(TCGv_i64 rl, TCGv_i64 rh,
2103 TCGv_i64 arg1, TCGv_i64 arg2)
2105 tcg_gen_mulsu2_i64(rl, rh, arg2, arg1);
2108 static bool gen_vmul_q_vl(DisasContext *ctx,
2109 arg_vvv *a, uint32_t oprsz, int idx1, int idx2,
2110 void (*func)(TCGv_i64, TCGv_i64,
2111 TCGv_i64, TCGv_i64))
2113 TCGv_i64 rh, rl, arg1, arg2;
2116 if (!check_vec(ctx, oprsz)) {
2120 rh = tcg_temp_new_i64();
2121 rl = tcg_temp_new_i64();
2122 arg1 = tcg_temp_new_i64();
2123 arg2 = tcg_temp_new_i64();
2125 for (i = 0; i < oprsz / 16; i++) {
2126 get_vreg64(arg1, a->vj, 2 * i + idx1);
2127 get_vreg64(arg2, a->vk, 2 * i + idx2);
2129 func(rl, rh, arg1, arg2);
2131 set_vreg64(rh, a->vd, 2 * i + 1);
2132 set_vreg64(rl, a->vd, 2 * i);
2138 static bool gen_vmul_q(DisasContext *ctx, arg_vvv *a, int idx1, int idx2,
2139 void (*func)(TCGv_i64, TCGv_i64,
2140 TCGv_i64, TCGv_i64))
2142 return gen_vmul_q_vl(ctx, a, 16, idx1, idx2, func);
2145 static bool gen_xvmul_q(DisasContext *ctx, arg_vvv *a, int idx1, int idx2,
2146 void (*func)(TCGv_i64, TCGv_i64,
2147 TCGv_i64, TCGv_i64))
2149 return gen_vmul_q_vl(ctx, a, 32, idx1, idx2, func);
2152 TRANS(vmulwev_q_d, LSX, gen_vmul_q, 0, 0, tcg_gen_muls2_i64)
2153 TRANS(vmulwod_q_d, LSX, gen_vmul_q, 1, 1, tcg_gen_muls2_i64)
2154 TRANS(vmulwev_q_du, LSX, gen_vmul_q, 0, 0, tcg_gen_mulu2_i64)
2155 TRANS(vmulwod_q_du, LSX, gen_vmul_q, 1, 1, tcg_gen_mulu2_i64)
2156 TRANS(vmulwev_q_du_d, LSX, gen_vmul_q, 0, 0, tcg_gen_mulus2_i64)
2157 TRANS(vmulwod_q_du_d, LSX, gen_vmul_q, 1, 1, tcg_gen_mulus2_i64)
2158 TRANS(xvmulwev_q_d, LASX, gen_xvmul_q, 0, 0, tcg_gen_muls2_i64)
2159 TRANS(xvmulwod_q_d, LASX, gen_xvmul_q, 1, 1, tcg_gen_muls2_i64)
2160 TRANS(xvmulwev_q_du, LASX, gen_xvmul_q, 0, 0, tcg_gen_mulu2_i64)
2161 TRANS(xvmulwod_q_du, LASX, gen_xvmul_q, 1, 1, tcg_gen_mulu2_i64)
2162 TRANS(xvmulwev_q_du_d, LASX, gen_xvmul_q, 0, 0, tcg_gen_mulus2_i64)
2163 TRANS(xvmulwod_q_du_d, LASX, gen_xvmul_q, 1, 1, tcg_gen_mulus2_i64)
2165 static void gen_vmulwod_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2168 int halfbits = 4 << vece;
2170 t1 = tcg_temp_new_vec_matching(a);
2171 t2 = tcg_temp_new_vec_matching(b);
2172 tcg_gen_sari_vec(vece, t1, a, halfbits);
2173 tcg_gen_sari_vec(vece, t2, b, halfbits);
2174 tcg_gen_mul_vec(vece, t, t1, t2);
2177 static void gen_vmulwod_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2181 t1 = tcg_temp_new_i32();
2182 t2 = tcg_temp_new_i32();
2183 tcg_gen_sari_i32(t1, a, 16);
2184 tcg_gen_sari_i32(t2, b, 16);
2185 tcg_gen_mul_i32(t, t1, t2);
2188 static void gen_vmulwod_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2192 t1 = tcg_temp_new_i64();
2193 t2 = tcg_temp_new_i64();
2194 tcg_gen_sari_i64(t1, a, 32);
2195 tcg_gen_sari_i64(t2, b, 32);
2196 tcg_gen_mul_i64(t, t1, t2);
2199 static void do_vmulwod_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2200 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2202 static const TCGOpcode vecop_list[] = {
2203 INDEX_op_sari_vec, INDEX_op_mul_vec, 0
2205 static const GVecGen3 op[3] = {
2207 .fniv = gen_vmulwod_s,
2208 .fno = gen_helper_vmulwod_h_b,
2209 .opt_opc = vecop_list,
2213 .fni4 = gen_vmulwod_w_h,
2214 .fniv = gen_vmulwod_s,
2215 .fno = gen_helper_vmulwod_w_h,
2216 .opt_opc = vecop_list,
2220 .fni8 = gen_vmulwod_d_w,
2221 .fniv = gen_vmulwod_s,
2222 .fno = gen_helper_vmulwod_d_w,
2223 .opt_opc = vecop_list,
2228 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2231 TRANS(vmulwod_h_b, LSX, gvec_vvv, MO_8, do_vmulwod_s)
2232 TRANS(vmulwod_w_h, LSX, gvec_vvv, MO_16, do_vmulwod_s)
2233 TRANS(vmulwod_d_w, LSX, gvec_vvv, MO_32, do_vmulwod_s)
2234 TRANS(xvmulwod_h_b, LASX, gvec_xxx, MO_8, do_vmulwod_s)
2235 TRANS(xvmulwod_w_h, LASX, gvec_xxx, MO_16, do_vmulwod_s)
2236 TRANS(xvmulwod_d_w, LASX, gvec_xxx, MO_32, do_vmulwod_s)
2238 static void gen_vmulwev_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2240 TCGv_vec t1, t2, mask;
2242 t1 = tcg_temp_new_vec_matching(a);
2243 t2 = tcg_temp_new_vec_matching(b);
2244 mask = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
2245 tcg_gen_and_vec(vece, t1, a, mask);
2246 tcg_gen_and_vec(vece, t2, b, mask);
2247 tcg_gen_mul_vec(vece, t, t1, t2);
2250 static void gen_vmulwev_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2254 t1 = tcg_temp_new_i32();
2255 t2 = tcg_temp_new_i32();
2256 tcg_gen_ext16u_i32(t1, a);
2257 tcg_gen_ext16u_i32(t2, b);
2258 tcg_gen_mul_i32(t, t1, t2);
2261 static void gen_vmulwev_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2265 t1 = tcg_temp_new_i64();
2266 t2 = tcg_temp_new_i64();
2267 tcg_gen_ext32u_i64(t1, a);
2268 tcg_gen_ext32u_i64(t2, b);
2269 tcg_gen_mul_i64(t, t1, t2);
2272 static void do_vmulwev_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2273 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2275 static const TCGOpcode vecop_list[] = {
2278 static const GVecGen3 op[3] = {
2280 .fniv = gen_vmulwev_u,
2281 .fno = gen_helper_vmulwev_h_bu,
2282 .opt_opc = vecop_list,
2286 .fni4 = gen_vmulwev_w_hu,
2287 .fniv = gen_vmulwev_u,
2288 .fno = gen_helper_vmulwev_w_hu,
2289 .opt_opc = vecop_list,
2293 .fni8 = gen_vmulwev_d_wu,
2294 .fniv = gen_vmulwev_u,
2295 .fno = gen_helper_vmulwev_d_wu,
2296 .opt_opc = vecop_list,
2301 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2304 TRANS(vmulwev_h_bu, LSX, gvec_vvv, MO_8, do_vmulwev_u)
2305 TRANS(vmulwev_w_hu, LSX, gvec_vvv, MO_16, do_vmulwev_u)
2306 TRANS(vmulwev_d_wu, LSX, gvec_vvv, MO_32, do_vmulwev_u)
2307 TRANS(xvmulwev_h_bu, LASX, gvec_xxx, MO_8, do_vmulwev_u)
2308 TRANS(xvmulwev_w_hu, LASX, gvec_xxx, MO_16, do_vmulwev_u)
2309 TRANS(xvmulwev_d_wu, LASX, gvec_xxx, MO_32, do_vmulwev_u)
2311 static void gen_vmulwod_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2314 int halfbits = 4 << vece;
2316 t1 = tcg_temp_new_vec_matching(a);
2317 t2 = tcg_temp_new_vec_matching(b);
2318 tcg_gen_shri_vec(vece, t1, a, halfbits);
2319 tcg_gen_shri_vec(vece, t2, b, halfbits);
2320 tcg_gen_mul_vec(vece, t, t1, t2);
2323 static void gen_vmulwod_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2327 t1 = tcg_temp_new_i32();
2328 t2 = tcg_temp_new_i32();
2329 tcg_gen_shri_i32(t1, a, 16);
2330 tcg_gen_shri_i32(t2, b, 16);
2331 tcg_gen_mul_i32(t, t1, t2);
2334 static void gen_vmulwod_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2338 t1 = tcg_temp_new_i64();
2339 t2 = tcg_temp_new_i64();
2340 tcg_gen_shri_i64(t1, a, 32);
2341 tcg_gen_shri_i64(t2, b, 32);
2342 tcg_gen_mul_i64(t, t1, t2);
2345 static void do_vmulwod_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2346 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2348 static const TCGOpcode vecop_list[] = {
2349 INDEX_op_shri_vec, INDEX_op_mul_vec, 0
2351 static const GVecGen3 op[3] = {
2353 .fniv = gen_vmulwod_u,
2354 .fno = gen_helper_vmulwod_h_bu,
2355 .opt_opc = vecop_list,
2359 .fni4 = gen_vmulwod_w_hu,
2360 .fniv = gen_vmulwod_u,
2361 .fno = gen_helper_vmulwod_w_hu,
2362 .opt_opc = vecop_list,
2366 .fni8 = gen_vmulwod_d_wu,
2367 .fniv = gen_vmulwod_u,
2368 .fno = gen_helper_vmulwod_d_wu,
2369 .opt_opc = vecop_list,
2374 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2377 TRANS(vmulwod_h_bu, LSX, gvec_vvv, MO_8, do_vmulwod_u)
2378 TRANS(vmulwod_w_hu, LSX, gvec_vvv, MO_16, do_vmulwod_u)
2379 TRANS(vmulwod_d_wu, LSX, gvec_vvv, MO_32, do_vmulwod_u)
2380 TRANS(xvmulwod_h_bu, LASX, gvec_xxx, MO_8, do_vmulwod_u)
2381 TRANS(xvmulwod_w_hu, LASX, gvec_xxx, MO_16, do_vmulwod_u)
2382 TRANS(xvmulwod_d_wu, LASX, gvec_xxx, MO_32, do_vmulwod_u)
2384 static void gen_vmulwev_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2386 TCGv_vec t1, t2, mask;
2387 int halfbits = 4 << vece;
2389 t1 = tcg_temp_new_vec_matching(a);
2390 t2 = tcg_temp_new_vec_matching(b);
2391 mask = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
2392 tcg_gen_and_vec(vece, t1, a, mask);
2393 tcg_gen_shli_vec(vece, t2, b, halfbits);
2394 tcg_gen_sari_vec(vece, t2, t2, halfbits);
2395 tcg_gen_mul_vec(vece, t, t1, t2);
2398 static void gen_vmulwev_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2402 t1 = tcg_temp_new_i32();
2403 t2 = tcg_temp_new_i32();
2404 tcg_gen_ext16u_i32(t1, a);
2405 tcg_gen_ext16s_i32(t2, b);
2406 tcg_gen_mul_i32(t, t1, t2);
2409 static void gen_vmulwev_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2413 t1 = tcg_temp_new_i64();
2414 t2 = tcg_temp_new_i64();
2415 tcg_gen_ext32u_i64(t1, a);
2416 tcg_gen_ext32s_i64(t2, b);
2417 tcg_gen_mul_i64(t, t1, t2);
2420 static void do_vmulwev_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2421 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2423 static const TCGOpcode vecop_list[] = {
2424 INDEX_op_shli_vec, INDEX_op_sari_vec, INDEX_op_mul_vec, 0
2426 static const GVecGen3 op[3] = {
2428 .fniv = gen_vmulwev_u_s,
2429 .fno = gen_helper_vmulwev_h_bu_b,
2430 .opt_opc = vecop_list,
2434 .fni4 = gen_vmulwev_w_hu_h,
2435 .fniv = gen_vmulwev_u_s,
2436 .fno = gen_helper_vmulwev_w_hu_h,
2437 .opt_opc = vecop_list,
2441 .fni8 = gen_vmulwev_d_wu_w,
2442 .fniv = gen_vmulwev_u_s,
2443 .fno = gen_helper_vmulwev_d_wu_w,
2444 .opt_opc = vecop_list,
2449 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2452 TRANS(vmulwev_h_bu_b, LSX, gvec_vvv, MO_8, do_vmulwev_u_s)
2453 TRANS(vmulwev_w_hu_h, LSX, gvec_vvv, MO_16, do_vmulwev_u_s)
2454 TRANS(vmulwev_d_wu_w, LSX, gvec_vvv, MO_32, do_vmulwev_u_s)
2455 TRANS(xvmulwev_h_bu_b, LASX, gvec_xxx, MO_8, do_vmulwev_u_s)
2456 TRANS(xvmulwev_w_hu_h, LASX, gvec_xxx, MO_16, do_vmulwev_u_s)
2457 TRANS(xvmulwev_d_wu_w, LASX, gvec_xxx, MO_32, do_vmulwev_u_s)
2459 static void gen_vmulwod_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2462 int halfbits = 4 << vece;
2464 t1 = tcg_temp_new_vec_matching(a);
2465 t2 = tcg_temp_new_vec_matching(b);
2466 tcg_gen_shri_vec(vece, t1, a, halfbits);
2467 tcg_gen_sari_vec(vece, t2, b, halfbits);
2468 tcg_gen_mul_vec(vece, t, t1, t2);
2471 static void gen_vmulwod_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2475 t1 = tcg_temp_new_i32();
2476 t2 = tcg_temp_new_i32();
2477 tcg_gen_shri_i32(t1, a, 16);
2478 tcg_gen_sari_i32(t2, b, 16);
2479 tcg_gen_mul_i32(t, t1, t2);
2481 static void gen_vmulwod_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2485 t1 = tcg_temp_new_i64();
2486 t2 = tcg_temp_new_i64();
2487 tcg_gen_shri_i64(t1, a, 32);
2488 tcg_gen_sari_i64(t2, b, 32);
2489 tcg_gen_mul_i64(t, t1, t2);
2492 static void do_vmulwod_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2493 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2495 static const TCGOpcode vecop_list[] = {
2496 INDEX_op_shri_vec, INDEX_op_sari_vec, INDEX_op_mul_vec, 0
2498 static const GVecGen3 op[3] = {
2500 .fniv = gen_vmulwod_u_s,
2501 .fno = gen_helper_vmulwod_h_bu_b,
2502 .opt_opc = vecop_list,
2506 .fni4 = gen_vmulwod_w_hu_h,
2507 .fniv = gen_vmulwod_u_s,
2508 .fno = gen_helper_vmulwod_w_hu_h,
2509 .opt_opc = vecop_list,
2513 .fni8 = gen_vmulwod_d_wu_w,
2514 .fniv = gen_vmulwod_u_s,
2515 .fno = gen_helper_vmulwod_d_wu_w,
2516 .opt_opc = vecop_list,
2521 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2524 TRANS(vmulwod_h_bu_b, LSX, gvec_vvv, MO_8, do_vmulwod_u_s)
2525 TRANS(vmulwod_w_hu_h, LSX, gvec_vvv, MO_16, do_vmulwod_u_s)
2526 TRANS(vmulwod_d_wu_w, LSX, gvec_vvv, MO_32, do_vmulwod_u_s)
2527 TRANS(xvmulwod_h_bu_b, LASX, gvec_xxx, MO_8, do_vmulwod_u_s)
2528 TRANS(xvmulwod_w_hu_h, LASX, gvec_xxx, MO_16, do_vmulwod_u_s)
2529 TRANS(xvmulwod_d_wu_w, LASX, gvec_xxx, MO_32, do_vmulwod_u_s)
2531 static void gen_vmadd(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2535 t1 = tcg_temp_new_vec_matching(t);
2536 tcg_gen_mul_vec(vece, t1, a, b);
2537 tcg_gen_add_vec(vece, t, t, t1);
2540 static void gen_vmadd_w(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2544 t1 = tcg_temp_new_i32();
2545 tcg_gen_mul_i32(t1, a, b);
2546 tcg_gen_add_i32(t, t, t1);
2549 static void gen_vmadd_d(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2553 t1 = tcg_temp_new_i64();
2554 tcg_gen_mul_i64(t1, a, b);
2555 tcg_gen_add_i64(t, t, t1);
2558 static void do_vmadd(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2559 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2561 static const TCGOpcode vecop_list[] = {
2562 INDEX_op_mul_vec, INDEX_op_add_vec, 0
2564 static const GVecGen3 op[4] = {
2567 .fno = gen_helper_vmadd_b,
2569 .opt_opc = vecop_list,
2574 .fno = gen_helper_vmadd_h,
2576 .opt_opc = vecop_list,
2580 .fni4 = gen_vmadd_w,
2582 .fno = gen_helper_vmadd_w,
2584 .opt_opc = vecop_list,
2588 .fni8 = gen_vmadd_d,
2590 .fno = gen_helper_vmadd_d,
2592 .opt_opc = vecop_list,
2597 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2600 TRANS(vmadd_b, LSX, gvec_vvv, MO_8, do_vmadd)
2601 TRANS(vmadd_h, LSX, gvec_vvv, MO_16, do_vmadd)
2602 TRANS(vmadd_w, LSX, gvec_vvv, MO_32, do_vmadd)
2603 TRANS(vmadd_d, LSX, gvec_vvv, MO_64, do_vmadd)
2604 TRANS(xvmadd_b, LASX, gvec_xxx, MO_8, do_vmadd)
2605 TRANS(xvmadd_h, LASX, gvec_xxx, MO_16, do_vmadd)
2606 TRANS(xvmadd_w, LASX, gvec_xxx, MO_32, do_vmadd)
2607 TRANS(xvmadd_d, LASX, gvec_xxx, MO_64, do_vmadd)
2609 static void gen_vmsub(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2613 t1 = tcg_temp_new_vec_matching(t);
2614 tcg_gen_mul_vec(vece, t1, a, b);
2615 tcg_gen_sub_vec(vece, t, t, t1);
2618 static void gen_vmsub_w(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2622 t1 = tcg_temp_new_i32();
2623 tcg_gen_mul_i32(t1, a, b);
2624 tcg_gen_sub_i32(t, t, t1);
2627 static void gen_vmsub_d(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2631 t1 = tcg_temp_new_i64();
2632 tcg_gen_mul_i64(t1, a, b);
2633 tcg_gen_sub_i64(t, t, t1);
2636 static void do_vmsub(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2637 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2639 static const TCGOpcode vecop_list[] = {
2640 INDEX_op_mul_vec, INDEX_op_sub_vec, 0
2642 static const GVecGen3 op[4] = {
2645 .fno = gen_helper_vmsub_b,
2647 .opt_opc = vecop_list,
2652 .fno = gen_helper_vmsub_h,
2654 .opt_opc = vecop_list,
2658 .fni4 = gen_vmsub_w,
2660 .fno = gen_helper_vmsub_w,
2662 .opt_opc = vecop_list,
2666 .fni8 = gen_vmsub_d,
2668 .fno = gen_helper_vmsub_d,
2670 .opt_opc = vecop_list,
2675 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2678 TRANS(vmsub_b, LSX, gvec_vvv, MO_8, do_vmsub)
2679 TRANS(vmsub_h, LSX, gvec_vvv, MO_16, do_vmsub)
2680 TRANS(vmsub_w, LSX, gvec_vvv, MO_32, do_vmsub)
2681 TRANS(vmsub_d, LSX, gvec_vvv, MO_64, do_vmsub)
2682 TRANS(xvmsub_b, LASX, gvec_xxx, MO_8, do_vmsub)
2683 TRANS(xvmsub_h, LASX, gvec_xxx, MO_16, do_vmsub)
2684 TRANS(xvmsub_w, LASX, gvec_xxx, MO_32, do_vmsub)
2685 TRANS(xvmsub_d, LASX, gvec_xxx, MO_64, do_vmsub)
2687 static void gen_vmaddwev_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2689 TCGv_vec t1, t2, t3;
2690 int halfbits = 4 << vece;
2692 t1 = tcg_temp_new_vec_matching(a);
2693 t2 = tcg_temp_new_vec_matching(b);
2694 t3 = tcg_temp_new_vec_matching(t);
2695 tcg_gen_shli_vec(vece, t1, a, halfbits);
2696 tcg_gen_sari_vec(vece, t1, t1, halfbits);
2697 tcg_gen_shli_vec(vece, t2, b, halfbits);
2698 tcg_gen_sari_vec(vece, t2, t2, halfbits);
2699 tcg_gen_mul_vec(vece, t3, t1, t2);
2700 tcg_gen_add_vec(vece, t, t, t3);
2703 static void gen_vmaddwev_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2707 t1 = tcg_temp_new_i32();
2708 gen_vmulwev_w_h(t1, a, b);
2709 tcg_gen_add_i32(t, t, t1);
2712 static void gen_vmaddwev_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2716 t1 = tcg_temp_new_i64();
2717 gen_vmulwev_d_w(t1, a, b);
2718 tcg_gen_add_i64(t, t, t1);
2721 static void do_vmaddwev_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2722 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2724 static const TCGOpcode vecop_list[] = {
2725 INDEX_op_shli_vec, INDEX_op_sari_vec,
2726 INDEX_op_mul_vec, INDEX_op_add_vec, 0
2728 static const GVecGen3 op[3] = {
2730 .fniv = gen_vmaddwev_s,
2731 .fno = gen_helper_vmaddwev_h_b,
2733 .opt_opc = vecop_list,
2737 .fni4 = gen_vmaddwev_w_h,
2738 .fniv = gen_vmaddwev_s,
2739 .fno = gen_helper_vmaddwev_w_h,
2741 .opt_opc = vecop_list,
2745 .fni8 = gen_vmaddwev_d_w,
2746 .fniv = gen_vmaddwev_s,
2747 .fno = gen_helper_vmaddwev_d_w,
2749 .opt_opc = vecop_list,
2754 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2757 TRANS(vmaddwev_h_b, LSX, gvec_vvv, MO_8, do_vmaddwev_s)
2758 TRANS(vmaddwev_w_h, LSX, gvec_vvv, MO_16, do_vmaddwev_s)
2759 TRANS(vmaddwev_d_w, LSX, gvec_vvv, MO_32, do_vmaddwev_s)
2760 TRANS(xvmaddwev_h_b, LASX, gvec_xxx, MO_8, do_vmaddwev_s)
2761 TRANS(xvmaddwev_w_h, LASX, gvec_xxx, MO_16, do_vmaddwev_s)
2762 TRANS(xvmaddwev_d_w, LASX, gvec_xxx, MO_32, do_vmaddwev_s)
2764 static bool gen_vmadd_q_vl(DisasContext * ctx,
2765 arg_vvv *a, uint32_t oprsz, int idx1, int idx2,
2766 void (*func)(TCGv_i64, TCGv_i64,
2767 TCGv_i64, TCGv_i64))
2769 TCGv_i64 rh, rl, arg1, arg2, th, tl;
2772 if (!check_vec(ctx, oprsz)) {
2776 rh = tcg_temp_new_i64();
2777 rl = tcg_temp_new_i64();
2778 arg1 = tcg_temp_new_i64();
2779 arg2 = tcg_temp_new_i64();
2780 th = tcg_temp_new_i64();
2781 tl = tcg_temp_new_i64();
2783 for (i = 0; i < oprsz / 16; i++) {
2784 get_vreg64(arg1, a->vj, 2 * i + idx1);
2785 get_vreg64(arg2, a->vk, 2 * i + idx2);
2786 get_vreg64(rh, a->vd, 2 * i + 1);
2787 get_vreg64(rl, a->vd, 2 * i);
2789 func(tl, th, arg1, arg2);
2790 tcg_gen_add2_i64(rl, rh, rl, rh, tl, th);
2792 set_vreg64(rh, a->vd, 2 * i + 1);
2793 set_vreg64(rl, a->vd, 2 * i);
2799 static bool gen_vmadd_q(DisasContext *ctx, arg_vvv *a, int idx1, int idx2,
2800 void (*func)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64))
2802 return gen_vmadd_q_vl(ctx, a, 16, idx1, idx2, func);
2805 static bool gen_xvmadd_q(DisasContext *ctx, arg_vvv *a, int idx1, int idx2,
2806 void (*func)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64))
2808 return gen_vmadd_q_vl(ctx, a, 32, idx1, idx2, func);
2811 TRANS(vmaddwev_q_d, LSX, gen_vmadd_q, 0, 0, tcg_gen_muls2_i64)
2812 TRANS(vmaddwod_q_d, LSX, gen_vmadd_q, 1, 1, tcg_gen_muls2_i64)
2813 TRANS(vmaddwev_q_du, LSX, gen_vmadd_q, 0, 0, tcg_gen_mulu2_i64)
2814 TRANS(vmaddwod_q_du, LSX, gen_vmadd_q, 1, 1, tcg_gen_mulu2_i64)
2815 TRANS(vmaddwev_q_du_d, LSX, gen_vmadd_q, 0, 0, tcg_gen_mulus2_i64)
2816 TRANS(vmaddwod_q_du_d, LSX, gen_vmadd_q, 1, 1, tcg_gen_mulus2_i64)
2817 TRANS(xvmaddwev_q_d, LASX, gen_xvmadd_q, 0, 0, tcg_gen_muls2_i64)
2818 TRANS(xvmaddwod_q_d, LASX, gen_xvmadd_q, 1, 1, tcg_gen_muls2_i64)
2819 TRANS(xvmaddwev_q_du, LASX, gen_xvmadd_q, 0, 0, tcg_gen_mulu2_i64)
2820 TRANS(xvmaddwod_q_du, LASX, gen_xvmadd_q, 1, 1, tcg_gen_mulu2_i64)
2821 TRANS(xvmaddwev_q_du_d, LASX, gen_xvmadd_q, 0, 0, tcg_gen_mulus2_i64)
2822 TRANS(xvmaddwod_q_du_d, LASX, gen_xvmadd_q, 1, 1, tcg_gen_mulus2_i64)
2824 static void gen_vmaddwod_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2826 TCGv_vec t1, t2, t3;
2827 int halfbits = 4 << vece;
2829 t1 = tcg_temp_new_vec_matching(a);
2830 t2 = tcg_temp_new_vec_matching(b);
2831 t3 = tcg_temp_new_vec_matching(t);
2832 tcg_gen_sari_vec(vece, t1, a, halfbits);
2833 tcg_gen_sari_vec(vece, t2, b, halfbits);
2834 tcg_gen_mul_vec(vece, t3, t1, t2);
2835 tcg_gen_add_vec(vece, t, t, t3);
2838 static void gen_vmaddwod_w_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2842 t1 = tcg_temp_new_i32();
2843 gen_vmulwod_w_h(t1, a, b);
2844 tcg_gen_add_i32(t, t, t1);
2847 static void gen_vmaddwod_d_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2851 t1 = tcg_temp_new_i64();
2852 gen_vmulwod_d_w(t1, a, b);
2853 tcg_gen_add_i64(t, t, t1);
2856 static void do_vmaddwod_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2857 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2859 static const TCGOpcode vecop_list[] = {
2860 INDEX_op_sari_vec, INDEX_op_mul_vec, INDEX_op_add_vec, 0
2862 static const GVecGen3 op[3] = {
2864 .fniv = gen_vmaddwod_s,
2865 .fno = gen_helper_vmaddwod_h_b,
2867 .opt_opc = vecop_list,
2871 .fni4 = gen_vmaddwod_w_h,
2872 .fniv = gen_vmaddwod_s,
2873 .fno = gen_helper_vmaddwod_w_h,
2875 .opt_opc = vecop_list,
2879 .fni8 = gen_vmaddwod_d_w,
2880 .fniv = gen_vmaddwod_s,
2881 .fno = gen_helper_vmaddwod_d_w,
2883 .opt_opc = vecop_list,
2888 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2891 TRANS(vmaddwod_h_b, LSX, gvec_vvv, MO_8, do_vmaddwod_s)
2892 TRANS(vmaddwod_w_h, LSX, gvec_vvv, MO_16, do_vmaddwod_s)
2893 TRANS(vmaddwod_d_w, LSX, gvec_vvv, MO_32, do_vmaddwod_s)
2894 TRANS(xvmaddwod_h_b, LASX, gvec_xxx, MO_8, do_vmaddwod_s)
2895 TRANS(xvmaddwod_w_h, LASX, gvec_xxx, MO_16, do_vmaddwod_s)
2896 TRANS(xvmaddwod_d_w, LASX, gvec_xxx, MO_32, do_vmaddwod_s)
2898 static void gen_vmaddwev_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2900 TCGv_vec t1, t2, mask;
2902 t1 = tcg_temp_new_vec_matching(t);
2903 t2 = tcg_temp_new_vec_matching(b);
2904 mask = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
2905 tcg_gen_and_vec(vece, t1, a, mask);
2906 tcg_gen_and_vec(vece, t2, b, mask);
2907 tcg_gen_mul_vec(vece, t1, t1, t2);
2908 tcg_gen_add_vec(vece, t, t, t1);
2911 static void gen_vmaddwev_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2915 t1 = tcg_temp_new_i32();
2916 gen_vmulwev_w_hu(t1, a, b);
2917 tcg_gen_add_i32(t, t, t1);
2920 static void gen_vmaddwev_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2924 t1 = tcg_temp_new_i64();
2925 gen_vmulwev_d_wu(t1, a, b);
2926 tcg_gen_add_i64(t, t, t1);
2929 static void do_vmaddwev_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
2930 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
2932 static const TCGOpcode vecop_list[] = {
2933 INDEX_op_mul_vec, INDEX_op_add_vec, 0
2935 static const GVecGen3 op[3] = {
2937 .fniv = gen_vmaddwev_u,
2938 .fno = gen_helper_vmaddwev_h_bu,
2940 .opt_opc = vecop_list,
2944 .fni4 = gen_vmaddwev_w_hu,
2945 .fniv = gen_vmaddwev_u,
2946 .fno = gen_helper_vmaddwev_w_hu,
2948 .opt_opc = vecop_list,
2952 .fni8 = gen_vmaddwev_d_wu,
2953 .fniv = gen_vmaddwev_u,
2954 .fno = gen_helper_vmaddwev_d_wu,
2956 .opt_opc = vecop_list,
2961 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
2964 TRANS(vmaddwev_h_bu, LSX, gvec_vvv, MO_8, do_vmaddwev_u)
2965 TRANS(vmaddwev_w_hu, LSX, gvec_vvv, MO_16, do_vmaddwev_u)
2966 TRANS(vmaddwev_d_wu, LSX, gvec_vvv, MO_32, do_vmaddwev_u)
2967 TRANS(xvmaddwev_h_bu, LASX, gvec_xxx, MO_8, do_vmaddwev_u)
2968 TRANS(xvmaddwev_w_hu, LASX, gvec_xxx, MO_16, do_vmaddwev_u)
2969 TRANS(xvmaddwev_d_wu, LASX, gvec_xxx, MO_32, do_vmaddwev_u)
2971 static void gen_vmaddwod_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
2973 TCGv_vec t1, t2, t3;
2974 int halfbits = 4 << vece;
2976 t1 = tcg_temp_new_vec_matching(a);
2977 t2 = tcg_temp_new_vec_matching(b);
2978 t3 = tcg_temp_new_vec_matching(t);
2979 tcg_gen_shri_vec(vece, t1, a, halfbits);
2980 tcg_gen_shri_vec(vece, t2, b, halfbits);
2981 tcg_gen_mul_vec(vece, t3, t1, t2);
2982 tcg_gen_add_vec(vece, t, t, t3);
2985 static void gen_vmaddwod_w_hu(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
2989 t1 = tcg_temp_new_i32();
2990 gen_vmulwod_w_hu(t1, a, b);
2991 tcg_gen_add_i32(t, t, t1);
2994 static void gen_vmaddwod_d_wu(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
2998 t1 = tcg_temp_new_i64();
2999 gen_vmulwod_d_wu(t1, a, b);
3000 tcg_gen_add_i64(t, t, t1);
3003 static void do_vmaddwod_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3004 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
3006 static const TCGOpcode vecop_list[] = {
3007 INDEX_op_shri_vec, INDEX_op_mul_vec, INDEX_op_add_vec, 0
3009 static const GVecGen3 op[3] = {
3011 .fniv = gen_vmaddwod_u,
3012 .fno = gen_helper_vmaddwod_h_bu,
3014 .opt_opc = vecop_list,
3018 .fni4 = gen_vmaddwod_w_hu,
3019 .fniv = gen_vmaddwod_u,
3020 .fno = gen_helper_vmaddwod_w_hu,
3022 .opt_opc = vecop_list,
3026 .fni8 = gen_vmaddwod_d_wu,
3027 .fniv = gen_vmaddwod_u,
3028 .fno = gen_helper_vmaddwod_d_wu,
3030 .opt_opc = vecop_list,
3035 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
3038 TRANS(vmaddwod_h_bu, LSX, gvec_vvv, MO_8, do_vmaddwod_u)
3039 TRANS(vmaddwod_w_hu, LSX, gvec_vvv, MO_16, do_vmaddwod_u)
3040 TRANS(vmaddwod_d_wu, LSX, gvec_vvv, MO_32, do_vmaddwod_u)
3041 TRANS(xvmaddwod_h_bu, LASX, gvec_xxx, MO_8, do_vmaddwod_u)
3042 TRANS(xvmaddwod_w_hu, LASX, gvec_xxx, MO_16, do_vmaddwod_u)
3043 TRANS(xvmaddwod_d_wu, LASX, gvec_xxx, MO_32, do_vmaddwod_u)
3045 static void gen_vmaddwev_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3047 TCGv_vec t1, t2, mask;
3048 int halfbits = 4 << vece;
3050 t1 = tcg_temp_new_vec_matching(a);
3051 t2 = tcg_temp_new_vec_matching(b);
3052 mask = tcg_constant_vec_matching(t, vece, MAKE_64BIT_MASK(0, 4 << vece));
3053 tcg_gen_and_vec(vece, t1, a, mask);
3054 tcg_gen_shli_vec(vece, t2, b, halfbits);
3055 tcg_gen_sari_vec(vece, t2, t2, halfbits);
3056 tcg_gen_mul_vec(vece, t1, t1, t2);
3057 tcg_gen_add_vec(vece, t, t, t1);
3060 static void gen_vmaddwev_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
3064 t1 = tcg_temp_new_i32();
3065 gen_vmulwev_w_hu_h(t1, a, b);
3066 tcg_gen_add_i32(t, t, t1);
3069 static void gen_vmaddwev_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
3073 t1 = tcg_temp_new_i64();
3074 gen_vmulwev_d_wu_w(t1, a, b);
3075 tcg_gen_add_i64(t, t, t1);
3078 static void do_vmaddwev_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3079 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
3081 static const TCGOpcode vecop_list[] = {
3082 INDEX_op_shli_vec, INDEX_op_sari_vec,
3083 INDEX_op_mul_vec, INDEX_op_add_vec, 0
3085 static const GVecGen3 op[3] = {
3087 .fniv = gen_vmaddwev_u_s,
3088 .fno = gen_helper_vmaddwev_h_bu_b,
3090 .opt_opc = vecop_list,
3094 .fni4 = gen_vmaddwev_w_hu_h,
3095 .fniv = gen_vmaddwev_u_s,
3096 .fno = gen_helper_vmaddwev_w_hu_h,
3098 .opt_opc = vecop_list,
3102 .fni8 = gen_vmaddwev_d_wu_w,
3103 .fniv = gen_vmaddwev_u_s,
3104 .fno = gen_helper_vmaddwev_d_wu_w,
3106 .opt_opc = vecop_list,
3111 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
3114 TRANS(vmaddwev_h_bu_b, LSX, gvec_vvv, MO_8, do_vmaddwev_u_s)
3115 TRANS(vmaddwev_w_hu_h, LSX, gvec_vvv, MO_16, do_vmaddwev_u_s)
3116 TRANS(vmaddwev_d_wu_w, LSX, gvec_vvv, MO_32, do_vmaddwev_u_s)
3117 TRANS(xvmaddwev_h_bu_b, LASX, gvec_xxx, MO_8, do_vmaddwev_u_s)
3118 TRANS(xvmaddwev_w_hu_h, LASX, gvec_xxx, MO_16, do_vmaddwev_u_s)
3119 TRANS(xvmaddwev_d_wu_w, LASX, gvec_xxx, MO_32, do_vmaddwev_u_s)
3121 static void gen_vmaddwod_u_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3123 TCGv_vec t1, t2, t3;
3124 int halfbits = 4 << vece;
3126 t1 = tcg_temp_new_vec_matching(a);
3127 t2 = tcg_temp_new_vec_matching(b);
3128 t3 = tcg_temp_new_vec_matching(t);
3129 tcg_gen_shri_vec(vece, t1, a, halfbits);
3130 tcg_gen_sari_vec(vece, t2, b, halfbits);
3131 tcg_gen_mul_vec(vece, t3, t1, t2);
3132 tcg_gen_add_vec(vece, t, t, t3);
3135 static void gen_vmaddwod_w_hu_h(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b)
3139 t1 = tcg_temp_new_i32();
3140 gen_vmulwod_w_hu_h(t1, a, b);
3141 tcg_gen_add_i32(t, t, t1);
3144 static void gen_vmaddwod_d_wu_w(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b)
3148 t1 = tcg_temp_new_i64();
3149 gen_vmulwod_d_wu_w(t1, a, b);
3150 tcg_gen_add_i64(t, t, t1);
3153 static void do_vmaddwod_u_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3154 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
3156 static const TCGOpcode vecop_list[] = {
3157 INDEX_op_shri_vec, INDEX_op_sari_vec,
3158 INDEX_op_mul_vec, INDEX_op_add_vec, 0
3160 static const GVecGen3 op[3] = {
3162 .fniv = gen_vmaddwod_u_s,
3163 .fno = gen_helper_vmaddwod_h_bu_b,
3165 .opt_opc = vecop_list,
3169 .fni4 = gen_vmaddwod_w_hu_h,
3170 .fniv = gen_vmaddwod_u_s,
3171 .fno = gen_helper_vmaddwod_w_hu_h,
3173 .opt_opc = vecop_list,
3177 .fni8 = gen_vmaddwod_d_wu_w,
3178 .fniv = gen_vmaddwod_u_s,
3179 .fno = gen_helper_vmaddwod_d_wu_w,
3181 .opt_opc = vecop_list,
3186 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
3189 TRANS(vmaddwod_h_bu_b, LSX, gvec_vvv, MO_8, do_vmaddwod_u_s)
3190 TRANS(vmaddwod_w_hu_h, LSX, gvec_vvv, MO_16, do_vmaddwod_u_s)
3191 TRANS(vmaddwod_d_wu_w, LSX, gvec_vvv, MO_32, do_vmaddwod_u_s)
3192 TRANS(xvmaddwod_h_bu_b, LASX, gvec_xxx, MO_8, do_vmaddwod_u_s)
3193 TRANS(xvmaddwod_w_hu_h, LASX, gvec_xxx, MO_16, do_vmaddwod_u_s)
3194 TRANS(xvmaddwod_d_wu_w, LASX, gvec_xxx, MO_32, do_vmaddwod_u_s)
3196 TRANS(vdiv_b, LSX, gen_vvv, gen_helper_vdiv_b)
3197 TRANS(vdiv_h, LSX, gen_vvv, gen_helper_vdiv_h)
3198 TRANS(vdiv_w, LSX, gen_vvv, gen_helper_vdiv_w)
3199 TRANS(vdiv_d, LSX, gen_vvv, gen_helper_vdiv_d)
3200 TRANS(vdiv_bu, LSX, gen_vvv, gen_helper_vdiv_bu)
3201 TRANS(vdiv_hu, LSX, gen_vvv, gen_helper_vdiv_hu)
3202 TRANS(vdiv_wu, LSX, gen_vvv, gen_helper_vdiv_wu)
3203 TRANS(vdiv_du, LSX, gen_vvv, gen_helper_vdiv_du)
3204 TRANS(vmod_b, LSX, gen_vvv, gen_helper_vmod_b)
3205 TRANS(vmod_h, LSX, gen_vvv, gen_helper_vmod_h)
3206 TRANS(vmod_w, LSX, gen_vvv, gen_helper_vmod_w)
3207 TRANS(vmod_d, LSX, gen_vvv, gen_helper_vmod_d)
3208 TRANS(vmod_bu, LSX, gen_vvv, gen_helper_vmod_bu)
3209 TRANS(vmod_hu, LSX, gen_vvv, gen_helper_vmod_hu)
3210 TRANS(vmod_wu, LSX, gen_vvv, gen_helper_vmod_wu)
3211 TRANS(vmod_du, LSX, gen_vvv, gen_helper_vmod_du)
3212 TRANS(xvdiv_b, LASX, gen_xxx, gen_helper_vdiv_b)
3213 TRANS(xvdiv_h, LASX, gen_xxx, gen_helper_vdiv_h)
3214 TRANS(xvdiv_w, LASX, gen_xxx, gen_helper_vdiv_w)
3215 TRANS(xvdiv_d, LASX, gen_xxx, gen_helper_vdiv_d)
3216 TRANS(xvdiv_bu, LASX, gen_xxx, gen_helper_vdiv_bu)
3217 TRANS(xvdiv_hu, LASX, gen_xxx, gen_helper_vdiv_hu)
3218 TRANS(xvdiv_wu, LASX, gen_xxx, gen_helper_vdiv_wu)
3219 TRANS(xvdiv_du, LASX, gen_xxx, gen_helper_vdiv_du)
3220 TRANS(xvmod_b, LASX, gen_xxx, gen_helper_vmod_b)
3221 TRANS(xvmod_h, LASX, gen_xxx, gen_helper_vmod_h)
3222 TRANS(xvmod_w, LASX, gen_xxx, gen_helper_vmod_w)
3223 TRANS(xvmod_d, LASX, gen_xxx, gen_helper_vmod_d)
3224 TRANS(xvmod_bu, LASX, gen_xxx, gen_helper_vmod_bu)
3225 TRANS(xvmod_hu, LASX, gen_xxx, gen_helper_vmod_hu)
3226 TRANS(xvmod_wu, LASX, gen_xxx, gen_helper_vmod_wu)
3227 TRANS(xvmod_du, LASX, gen_xxx, gen_helper_vmod_du)
3229 static void gen_vsat_s(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec max)
3233 min = tcg_temp_new_vec_matching(t);
3234 tcg_gen_not_vec(vece, min, max);
3235 tcg_gen_smax_vec(vece, t, a, min);
3236 tcg_gen_smin_vec(vece, t, t, max);
3239 static void do_vsat_s(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3240 int64_t imm, uint32_t oprsz, uint32_t maxsz)
3242 static const TCGOpcode vecop_list[] = {
3243 INDEX_op_smax_vec, INDEX_op_smin_vec, 0
3245 static const GVecGen2s op[4] = {
3248 .fno = gen_helper_vsat_b,
3249 .opt_opc = vecop_list,
3254 .fno = gen_helper_vsat_h,
3255 .opt_opc = vecop_list,
3260 .fno = gen_helper_vsat_w,
3261 .opt_opc = vecop_list,
3266 .fno = gen_helper_vsat_d,
3267 .opt_opc = vecop_list,
3272 tcg_gen_gvec_2s(vd_ofs, vj_ofs, oprsz, maxsz,
3273 tcg_constant_i64((1ll<< imm) -1), &op[vece]);
3276 TRANS(vsat_b, LSX, gvec_vv_i, MO_8, do_vsat_s)
3277 TRANS(vsat_h, LSX, gvec_vv_i, MO_16, do_vsat_s)
3278 TRANS(vsat_w, LSX, gvec_vv_i, MO_32, do_vsat_s)
3279 TRANS(vsat_d, LSX, gvec_vv_i, MO_64, do_vsat_s)
3280 TRANS(xvsat_b, LASX, gvec_xx_i, MO_8, do_vsat_s)
3281 TRANS(xvsat_h, LASX, gvec_xx_i, MO_16, do_vsat_s)
3282 TRANS(xvsat_w, LASX, gvec_xx_i, MO_32, do_vsat_s)
3283 TRANS(xvsat_d, LASX, gvec_xx_i, MO_64, do_vsat_s)
3285 static void gen_vsat_u(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec max)
3287 tcg_gen_umin_vec(vece, t, a, max);
3290 static void do_vsat_u(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3291 int64_t imm, uint32_t oprsz, uint32_t maxsz)
3294 static const TCGOpcode vecop_list[] = {
3295 INDEX_op_umin_vec, 0
3297 static const GVecGen2s op[4] = {
3300 .fno = gen_helper_vsat_bu,
3301 .opt_opc = vecop_list,
3306 .fno = gen_helper_vsat_hu,
3307 .opt_opc = vecop_list,
3312 .fno = gen_helper_vsat_wu,
3313 .opt_opc = vecop_list,
3318 .fno = gen_helper_vsat_du,
3319 .opt_opc = vecop_list,
3324 max = (imm == 0x3f) ? UINT64_MAX : (1ull << (imm + 1)) - 1;
3325 tcg_gen_gvec_2s(vd_ofs, vj_ofs, oprsz, maxsz,
3326 tcg_constant_i64(max), &op[vece]);
3329 TRANS(vsat_bu, LSX, gvec_vv_i, MO_8, do_vsat_u)
3330 TRANS(vsat_hu, LSX, gvec_vv_i, MO_16, do_vsat_u)
3331 TRANS(vsat_wu, LSX, gvec_vv_i, MO_32, do_vsat_u)
3332 TRANS(vsat_du, LSX, gvec_vv_i, MO_64, do_vsat_u)
3333 TRANS(xvsat_bu, LASX, gvec_xx_i, MO_8, do_vsat_u)
3334 TRANS(xvsat_hu, LASX, gvec_xx_i, MO_16, do_vsat_u)
3335 TRANS(xvsat_wu, LASX, gvec_xx_i, MO_32, do_vsat_u)
3336 TRANS(xvsat_du, LASX, gvec_xx_i, MO_64, do_vsat_u)
3338 TRANS(vexth_h_b, LSX, gen_vv, gen_helper_vexth_h_b)
3339 TRANS(vexth_w_h, LSX, gen_vv, gen_helper_vexth_w_h)
3340 TRANS(vexth_d_w, LSX, gen_vv, gen_helper_vexth_d_w)
3341 TRANS(vexth_q_d, LSX, gen_vv, gen_helper_vexth_q_d)
3342 TRANS(vexth_hu_bu, LSX, gen_vv, gen_helper_vexth_hu_bu)
3343 TRANS(vexth_wu_hu, LSX, gen_vv, gen_helper_vexth_wu_hu)
3344 TRANS(vexth_du_wu, LSX, gen_vv, gen_helper_vexth_du_wu)
3345 TRANS(vexth_qu_du, LSX, gen_vv, gen_helper_vexth_qu_du)
3346 TRANS(xvexth_h_b, LASX, gen_xx, gen_helper_vexth_h_b)
3347 TRANS(xvexth_w_h, LASX, gen_xx, gen_helper_vexth_w_h)
3348 TRANS(xvexth_d_w, LASX, gen_xx, gen_helper_vexth_d_w)
3349 TRANS(xvexth_q_d, LASX, gen_xx, gen_helper_vexth_q_d)
3350 TRANS(xvexth_hu_bu, LASX, gen_xx, gen_helper_vexth_hu_bu)
3351 TRANS(xvexth_wu_hu, LASX, gen_xx, gen_helper_vexth_wu_hu)
3352 TRANS(xvexth_du_wu, LASX, gen_xx, gen_helper_vexth_du_wu)
3353 TRANS(xvexth_qu_du, LASX, gen_xx, gen_helper_vexth_qu_du)
3355 TRANS(vext2xv_h_b, LASX, gen_xx, gen_helper_vext2xv_h_b)
3356 TRANS(vext2xv_w_b, LASX, gen_xx, gen_helper_vext2xv_w_b)
3357 TRANS(vext2xv_d_b, LASX, gen_xx, gen_helper_vext2xv_d_b)
3358 TRANS(vext2xv_w_h, LASX, gen_xx, gen_helper_vext2xv_w_h)
3359 TRANS(vext2xv_d_h, LASX, gen_xx, gen_helper_vext2xv_d_h)
3360 TRANS(vext2xv_d_w, LASX, gen_xx, gen_helper_vext2xv_d_w)
3361 TRANS(vext2xv_hu_bu, LASX, gen_xx, gen_helper_vext2xv_hu_bu)
3362 TRANS(vext2xv_wu_bu, LASX, gen_xx, gen_helper_vext2xv_wu_bu)
3363 TRANS(vext2xv_du_bu, LASX, gen_xx, gen_helper_vext2xv_du_bu)
3364 TRANS(vext2xv_wu_hu, LASX, gen_xx, gen_helper_vext2xv_wu_hu)
3365 TRANS(vext2xv_du_hu, LASX, gen_xx, gen_helper_vext2xv_du_hu)
3366 TRANS(vext2xv_du_wu, LASX, gen_xx, gen_helper_vext2xv_du_wu)
3368 static void gen_vsigncov(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3372 t1 = tcg_temp_new_vec_matching(t);
3373 zero = tcg_constant_vec_matching(t, vece, 0);
3375 tcg_gen_neg_vec(vece, t1, b);
3376 tcg_gen_cmpsel_vec(TCG_COND_LT, vece, t, a, zero, t1, b);
3377 tcg_gen_cmpsel_vec(TCG_COND_EQ, vece, t, a, zero, zero, t);
3380 static void do_vsigncov(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3381 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
3383 static const TCGOpcode vecop_list[] = {
3384 INDEX_op_neg_vec, INDEX_op_cmpsel_vec, 0
3386 static const GVecGen3 op[4] = {
3388 .fniv = gen_vsigncov,
3389 .fno = gen_helper_vsigncov_b,
3390 .opt_opc = vecop_list,
3394 .fniv = gen_vsigncov,
3395 .fno = gen_helper_vsigncov_h,
3396 .opt_opc = vecop_list,
3400 .fniv = gen_vsigncov,
3401 .fno = gen_helper_vsigncov_w,
3402 .opt_opc = vecop_list,
3406 .fniv = gen_vsigncov,
3407 .fno = gen_helper_vsigncov_d,
3408 .opt_opc = vecop_list,
3413 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
3416 TRANS(vsigncov_b, LSX, gvec_vvv, MO_8, do_vsigncov)
3417 TRANS(vsigncov_h, LSX, gvec_vvv, MO_16, do_vsigncov)
3418 TRANS(vsigncov_w, LSX, gvec_vvv, MO_32, do_vsigncov)
3419 TRANS(vsigncov_d, LSX, gvec_vvv, MO_64, do_vsigncov)
3420 TRANS(xvsigncov_b, LASX, gvec_xxx, MO_8, do_vsigncov)
3421 TRANS(xvsigncov_h, LASX, gvec_xxx, MO_16, do_vsigncov)
3422 TRANS(xvsigncov_w, LASX, gvec_xxx, MO_32, do_vsigncov)
3423 TRANS(xvsigncov_d, LASX, gvec_xxx, MO_64, do_vsigncov)
3425 TRANS(vmskltz_b, LSX, gen_vv, gen_helper_vmskltz_b)
3426 TRANS(vmskltz_h, LSX, gen_vv, gen_helper_vmskltz_h)
3427 TRANS(vmskltz_w, LSX, gen_vv, gen_helper_vmskltz_w)
3428 TRANS(vmskltz_d, LSX, gen_vv, gen_helper_vmskltz_d)
3429 TRANS(vmskgez_b, LSX, gen_vv, gen_helper_vmskgez_b)
3430 TRANS(vmsknz_b, LSX, gen_vv, gen_helper_vmsknz_b)
3431 TRANS(xvmskltz_b, LASX, gen_xx, gen_helper_vmskltz_b)
3432 TRANS(xvmskltz_h, LASX, gen_xx, gen_helper_vmskltz_h)
3433 TRANS(xvmskltz_w, LASX, gen_xx, gen_helper_vmskltz_w)
3434 TRANS(xvmskltz_d, LASX, gen_xx, gen_helper_vmskltz_d)
3435 TRANS(xvmskgez_b, LASX, gen_xx, gen_helper_vmskgez_b)
3436 TRANS(xvmsknz_b, LASX, gen_xx, gen_helper_vmsknz_b)
3438 #define EXPAND_BYTE(bit) ((uint64_t)(bit ? 0xff : 0))
3440 static uint64_t vldi_get_value(DisasContext *ctx, uint32_t imm)
3446 * imm bit [11:8] is mode, mode value is 0-12.
3447 * other values are invalid.
3449 mode = (imm >> 8) & 0xf;
3453 /* data: {2{24'0, imm[7:0]}} */
3454 data = (t << 32) | t ;
3457 /* data: {2{16'0, imm[7:0], 8'0}} */
3458 data = (t << 24) | (t << 8);
3461 /* data: {2{8'0, imm[7:0], 16'0}} */
3462 data = (t << 48) | (t << 16);
3465 /* data: {2{imm[7:0], 24'0}} */
3466 data = (t << 56) | (t << 24);
3469 /* data: {4{8'0, imm[7:0]}} */
3470 data = (t << 48) | (t << 32) | (t << 16) | t;
3473 /* data: {4{imm[7:0], 8'0}} */
3474 data = (t << 56) |(t << 40) | (t << 24) | (t << 8);
3477 /* data: {2{16'0, imm[7:0], 8'1}} */
3478 data = (t << 40) | ((uint64_t)0xff << 32) | (t << 8) | 0xff;
3481 /* data: {2{8'0, imm[7:0], 16'1}} */
3482 data = (t << 48) | ((uint64_t)0xffff << 32) | (t << 16) | 0xffff;
3485 /* data: {8{imm[7:0]}} */
3486 data =(t << 56) | (t << 48) | (t << 40) | (t << 32) |
3487 (t << 24) | (t << 16) | (t << 8) | t;
3490 /* data: {{8{imm[7]}, ..., 8{imm[0]}}} */
3492 uint64_t b0,b1,b2,b3,b4,b5,b6,b7;
3494 b1 = (t & 0x2) >> 1;
3495 b2 = (t & 0x4) >> 2;
3496 b3 = (t & 0x8) >> 3;
3497 b4 = (t & 0x10) >> 4;
3498 b5 = (t & 0x20) >> 5;
3499 b6 = (t & 0x40) >> 6;
3500 b7 = (t & 0x80) >> 7;
3501 data = (EXPAND_BYTE(b7) << 56) |
3502 (EXPAND_BYTE(b6) << 48) |
3503 (EXPAND_BYTE(b5) << 40) |
3504 (EXPAND_BYTE(b4) << 32) |
3505 (EXPAND_BYTE(b3) << 24) |
3506 (EXPAND_BYTE(b2) << 16) |
3507 (EXPAND_BYTE(b1) << 8) |
3512 /* data: {2{imm[7], ~imm[6], {5{imm[6]}}, imm[5:0], 19'0}} */
3516 b6 = (imm & 0x40) >> 6;
3517 b7 = (imm & 0x80) >> 7;
3519 t1 = (b7 << 6) | ((1-b6) << 5) | (uint64_t)(b6 ? 0x1f : 0);
3520 data = (t1 << 57) | (t0 << 51) | (t1 << 25) | (t0 << 19);
3524 /* data: {32'0, imm[7], ~{imm[6]}, 5{imm[6]}, imm[5:0], 19'0} */
3528 b6 = (imm & 0x40) >> 6;
3529 b7 = (imm & 0x80) >> 7;
3531 t1 = (b7 << 6) | ((1-b6) << 5) | (b6 ? 0x1f : 0);
3532 data = (t1 << 25) | (t0 << 19);
3536 /* data: {imm[7], ~imm[6], 8{imm[6]}, imm[5:0], 48'0} */
3540 b6 = (imm & 0x40) >> 6;
3541 b7 = (imm & 0x80) >> 7;
3543 t1 = (b7 << 9) | ((1-b6) << 8) | (b6 ? 0xff : 0);
3544 data = (t1 << 54) | (t0 << 48);
3548 generate_exception(ctx, EXCCODE_INE);
3549 g_assert_not_reached();
3554 static bool gen_vldi(DisasContext *ctx, arg_vldi *a, uint32_t oprsz)
3559 if (!check_vec(ctx, oprsz)) {
3563 sel = (a->imm >> 12) & 0x1;
3566 value = vldi_get_value(ctx, a->imm);
3569 value = ((int32_t)(a->imm << 22)) >> 22;
3570 vece = (a->imm >> 10) & 0x3;
3573 tcg_gen_gvec_dup_i64(vece, vec_full_offset(a->vd), oprsz, ctx->vl/8,
3574 tcg_constant_i64(value));
3578 TRANS(vldi, LSX, gen_vldi, 16)
3579 TRANS(xvldi, LASX, gen_vldi, 32)
3581 static bool gen_vandn_v(DisasContext *ctx, arg_vvv *a, uint32_t oprsz)
3583 uint32_t vd_ofs, vj_ofs, vk_ofs;
3585 if (!check_vec(ctx, oprsz)) {
3589 vd_ofs = vec_full_offset(a->vd);
3590 vj_ofs = vec_full_offset(a->vj);
3591 vk_ofs = vec_full_offset(a->vk);
3593 tcg_gen_gvec_andc(MO_64, vd_ofs, vk_ofs, vj_ofs, oprsz, ctx->vl / 8);
3597 static void gen_vnori(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
3601 t1 = tcg_constant_vec_matching(t, vece, imm);
3602 tcg_gen_nor_vec(vece, t, a, t1);
3605 static void gen_vnori_b(TCGv_i64 t, TCGv_i64 a, int64_t imm)
3607 tcg_gen_movi_i64(t, dup_const(MO_8, imm));
3608 tcg_gen_nor_i64(t, a, t);
3611 static void do_vnori_b(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3612 int64_t imm, uint32_t oprsz, uint32_t maxsz)
3614 static const TCGOpcode vecop_list[] = {
3617 static const GVecGen2i op = {
3618 .fni8 = gen_vnori_b,
3620 .fnoi = gen_helper_vnori_b,
3621 .opt_opc = vecop_list,
3625 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op);
3628 TRANS(vand_v, LSX, gvec_vvv, MO_64, tcg_gen_gvec_and)
3629 TRANS(vor_v, LSX, gvec_vvv, MO_64, tcg_gen_gvec_or)
3630 TRANS(vxor_v, LSX, gvec_vvv, MO_64, tcg_gen_gvec_xor)
3631 TRANS(vnor_v, LSX, gvec_vvv, MO_64, tcg_gen_gvec_nor)
3632 TRANS(vandn_v, LSX, gen_vandn_v, 16)
3633 TRANS(vorn_v, LSX, gvec_vvv, MO_64, tcg_gen_gvec_orc)
3634 TRANS(vandi_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_andi)
3635 TRANS(vori_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_ori)
3636 TRANS(vxori_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_xori)
3637 TRANS(vnori_b, LSX, gvec_vv_i, MO_8, do_vnori_b)
3638 TRANS(xvand_v, LASX, gvec_xxx, MO_64, tcg_gen_gvec_and)
3639 TRANS(xvor_v, LASX, gvec_xxx, MO_64, tcg_gen_gvec_or)
3640 TRANS(xvxor_v, LASX, gvec_xxx, MO_64, tcg_gen_gvec_xor)
3641 TRANS(xvnor_v, LASX, gvec_xxx, MO_64, tcg_gen_gvec_nor)
3642 TRANS(xvandn_v, LASX, gen_vandn_v, 32)
3643 TRANS(xvorn_v, LASX, gvec_xxx, MO_64, tcg_gen_gvec_orc)
3644 TRANS(xvandi_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_andi)
3645 TRANS(xvori_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_ori)
3646 TRANS(xvxori_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_xori)
3647 TRANS(xvnori_b, LASX, gvec_xx_i, MO_8, do_vnori_b)
3649 TRANS(vsll_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_shlv)
3650 TRANS(vsll_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_shlv)
3651 TRANS(vsll_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_shlv)
3652 TRANS(vsll_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_shlv)
3653 TRANS(vslli_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_shli)
3654 TRANS(vslli_h, LSX, gvec_vv_i, MO_16, tcg_gen_gvec_shli)
3655 TRANS(vslli_w, LSX, gvec_vv_i, MO_32, tcg_gen_gvec_shli)
3656 TRANS(vslli_d, LSX, gvec_vv_i, MO_64, tcg_gen_gvec_shli)
3657 TRANS(xvsll_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_shlv)
3658 TRANS(xvsll_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_shlv)
3659 TRANS(xvsll_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_shlv)
3660 TRANS(xvsll_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_shlv)
3661 TRANS(xvslli_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_shli)
3662 TRANS(xvslli_h, LASX, gvec_xx_i, MO_16, tcg_gen_gvec_shli)
3663 TRANS(xvslli_w, LASX, gvec_xx_i, MO_32, tcg_gen_gvec_shli)
3664 TRANS(xvslli_d, LASX, gvec_xx_i, MO_64, tcg_gen_gvec_shli)
3666 TRANS(vsrl_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_shrv)
3667 TRANS(vsrl_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_shrv)
3668 TRANS(vsrl_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_shrv)
3669 TRANS(vsrl_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_shrv)
3670 TRANS(vsrli_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_shri)
3671 TRANS(vsrli_h, LSX, gvec_vv_i, MO_16, tcg_gen_gvec_shri)
3672 TRANS(vsrli_w, LSX, gvec_vv_i, MO_32, tcg_gen_gvec_shri)
3673 TRANS(vsrli_d, LSX, gvec_vv_i, MO_64, tcg_gen_gvec_shri)
3674 TRANS(xvsrl_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_shrv)
3675 TRANS(xvsrl_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_shrv)
3676 TRANS(xvsrl_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_shrv)
3677 TRANS(xvsrl_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_shrv)
3678 TRANS(xvsrli_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_shri)
3679 TRANS(xvsrli_h, LASX, gvec_xx_i, MO_16, tcg_gen_gvec_shri)
3680 TRANS(xvsrli_w, LASX, gvec_xx_i, MO_32, tcg_gen_gvec_shri)
3681 TRANS(xvsrli_d, LASX, gvec_xx_i, MO_64, tcg_gen_gvec_shri)
3683 TRANS(vsra_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_sarv)
3684 TRANS(vsra_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_sarv)
3685 TRANS(vsra_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_sarv)
3686 TRANS(vsra_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_sarv)
3687 TRANS(vsrai_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_sari)
3688 TRANS(vsrai_h, LSX, gvec_vv_i, MO_16, tcg_gen_gvec_sari)
3689 TRANS(vsrai_w, LSX, gvec_vv_i, MO_32, tcg_gen_gvec_sari)
3690 TRANS(vsrai_d, LSX, gvec_vv_i, MO_64, tcg_gen_gvec_sari)
3691 TRANS(xvsra_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_sarv)
3692 TRANS(xvsra_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_sarv)
3693 TRANS(xvsra_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_sarv)
3694 TRANS(xvsra_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_sarv)
3695 TRANS(xvsrai_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_sari)
3696 TRANS(xvsrai_h, LASX, gvec_xx_i, MO_16, tcg_gen_gvec_sari)
3697 TRANS(xvsrai_w, LASX, gvec_xx_i, MO_32, tcg_gen_gvec_sari)
3698 TRANS(xvsrai_d, LASX, gvec_xx_i, MO_64, tcg_gen_gvec_sari)
3700 TRANS(vrotr_b, LSX, gvec_vvv, MO_8, tcg_gen_gvec_rotrv)
3701 TRANS(vrotr_h, LSX, gvec_vvv, MO_16, tcg_gen_gvec_rotrv)
3702 TRANS(vrotr_w, LSX, gvec_vvv, MO_32, tcg_gen_gvec_rotrv)
3703 TRANS(vrotr_d, LSX, gvec_vvv, MO_64, tcg_gen_gvec_rotrv)
3704 TRANS(vrotri_b, LSX, gvec_vv_i, MO_8, tcg_gen_gvec_rotri)
3705 TRANS(vrotri_h, LSX, gvec_vv_i, MO_16, tcg_gen_gvec_rotri)
3706 TRANS(vrotri_w, LSX, gvec_vv_i, MO_32, tcg_gen_gvec_rotri)
3707 TRANS(vrotri_d, LSX, gvec_vv_i, MO_64, tcg_gen_gvec_rotri)
3708 TRANS(xvrotr_b, LASX, gvec_xxx, MO_8, tcg_gen_gvec_rotrv)
3709 TRANS(xvrotr_h, LASX, gvec_xxx, MO_16, tcg_gen_gvec_rotrv)
3710 TRANS(xvrotr_w, LASX, gvec_xxx, MO_32, tcg_gen_gvec_rotrv)
3711 TRANS(xvrotr_d, LASX, gvec_xxx, MO_64, tcg_gen_gvec_rotrv)
3712 TRANS(xvrotri_b, LASX, gvec_xx_i, MO_8, tcg_gen_gvec_rotri)
3713 TRANS(xvrotri_h, LASX, gvec_xx_i, MO_16, tcg_gen_gvec_rotri)
3714 TRANS(xvrotri_w, LASX, gvec_xx_i, MO_32, tcg_gen_gvec_rotri)
3715 TRANS(xvrotri_d, LASX, gvec_xx_i, MO_64, tcg_gen_gvec_rotri)
3717 TRANS(vsllwil_h_b, LSX, gen_vv_i, gen_helper_vsllwil_h_b)
3718 TRANS(vsllwil_w_h, LSX, gen_vv_i, gen_helper_vsllwil_w_h)
3719 TRANS(vsllwil_d_w, LSX, gen_vv_i, gen_helper_vsllwil_d_w)
3720 TRANS(vextl_q_d, LSX, gen_vv, gen_helper_vextl_q_d)
3721 TRANS(vsllwil_hu_bu, LSX, gen_vv_i, gen_helper_vsllwil_hu_bu)
3722 TRANS(vsllwil_wu_hu, LSX, gen_vv_i, gen_helper_vsllwil_wu_hu)
3723 TRANS(vsllwil_du_wu, LSX, gen_vv_i, gen_helper_vsllwil_du_wu)
3724 TRANS(vextl_qu_du, LSX, gen_vv, gen_helper_vextl_qu_du)
3725 TRANS(xvsllwil_h_b, LASX, gen_xx_i, gen_helper_vsllwil_h_b)
3726 TRANS(xvsllwil_w_h, LASX, gen_xx_i, gen_helper_vsllwil_w_h)
3727 TRANS(xvsllwil_d_w, LASX, gen_xx_i, gen_helper_vsllwil_d_w)
3728 TRANS(xvextl_q_d, LASX, gen_xx, gen_helper_vextl_q_d)
3729 TRANS(xvsllwil_hu_bu, LASX, gen_xx_i, gen_helper_vsllwil_hu_bu)
3730 TRANS(xvsllwil_wu_hu, LASX, gen_xx_i, gen_helper_vsllwil_wu_hu)
3731 TRANS(xvsllwil_du_wu, LASX, gen_xx_i, gen_helper_vsllwil_du_wu)
3732 TRANS(xvextl_qu_du, LASX, gen_xx, gen_helper_vextl_qu_du)
3734 TRANS(vsrlr_b, LSX, gen_vvv, gen_helper_vsrlr_b)
3735 TRANS(vsrlr_h, LSX, gen_vvv, gen_helper_vsrlr_h)
3736 TRANS(vsrlr_w, LSX, gen_vvv, gen_helper_vsrlr_w)
3737 TRANS(vsrlr_d, LSX, gen_vvv, gen_helper_vsrlr_d)
3738 TRANS(vsrlri_b, LSX, gen_vv_i, gen_helper_vsrlri_b)
3739 TRANS(vsrlri_h, LSX, gen_vv_i, gen_helper_vsrlri_h)
3740 TRANS(vsrlri_w, LSX, gen_vv_i, gen_helper_vsrlri_w)
3741 TRANS(vsrlri_d, LSX, gen_vv_i, gen_helper_vsrlri_d)
3742 TRANS(xvsrlr_b, LASX, gen_xxx, gen_helper_vsrlr_b)
3743 TRANS(xvsrlr_h, LASX, gen_xxx, gen_helper_vsrlr_h)
3744 TRANS(xvsrlr_w, LASX, gen_xxx, gen_helper_vsrlr_w)
3745 TRANS(xvsrlr_d, LASX, gen_xxx, gen_helper_vsrlr_d)
3746 TRANS(xvsrlri_b, LASX, gen_xx_i, gen_helper_vsrlri_b)
3747 TRANS(xvsrlri_h, LASX, gen_xx_i, gen_helper_vsrlri_h)
3748 TRANS(xvsrlri_w, LASX, gen_xx_i, gen_helper_vsrlri_w)
3749 TRANS(xvsrlri_d, LASX, gen_xx_i, gen_helper_vsrlri_d)
3751 TRANS(vsrar_b, LSX, gen_vvv, gen_helper_vsrar_b)
3752 TRANS(vsrar_h, LSX, gen_vvv, gen_helper_vsrar_h)
3753 TRANS(vsrar_w, LSX, gen_vvv, gen_helper_vsrar_w)
3754 TRANS(vsrar_d, LSX, gen_vvv, gen_helper_vsrar_d)
3755 TRANS(vsrari_b, LSX, gen_vv_i, gen_helper_vsrari_b)
3756 TRANS(vsrari_h, LSX, gen_vv_i, gen_helper_vsrari_h)
3757 TRANS(vsrari_w, LSX, gen_vv_i, gen_helper_vsrari_w)
3758 TRANS(vsrari_d, LSX, gen_vv_i, gen_helper_vsrari_d)
3759 TRANS(xvsrar_b, LASX, gen_xxx, gen_helper_vsrar_b)
3760 TRANS(xvsrar_h, LASX, gen_xxx, gen_helper_vsrar_h)
3761 TRANS(xvsrar_w, LASX, gen_xxx, gen_helper_vsrar_w)
3762 TRANS(xvsrar_d, LASX, gen_xxx, gen_helper_vsrar_d)
3763 TRANS(xvsrari_b, LASX, gen_xx_i, gen_helper_vsrari_b)
3764 TRANS(xvsrari_h, LASX, gen_xx_i, gen_helper_vsrari_h)
3765 TRANS(xvsrari_w, LASX, gen_xx_i, gen_helper_vsrari_w)
3766 TRANS(xvsrari_d, LASX, gen_xx_i, gen_helper_vsrari_d)
3768 TRANS(vsrln_b_h, LSX, gen_vvv, gen_helper_vsrln_b_h)
3769 TRANS(vsrln_h_w, LSX, gen_vvv, gen_helper_vsrln_h_w)
3770 TRANS(vsrln_w_d, LSX, gen_vvv, gen_helper_vsrln_w_d)
3771 TRANS(vsran_b_h, LSX, gen_vvv, gen_helper_vsran_b_h)
3772 TRANS(vsran_h_w, LSX, gen_vvv, gen_helper_vsran_h_w)
3773 TRANS(vsran_w_d, LSX, gen_vvv, gen_helper_vsran_w_d)
3774 TRANS(xvsrln_b_h, LASX, gen_xxx, gen_helper_vsrln_b_h)
3775 TRANS(xvsrln_h_w, LASX, gen_xxx, gen_helper_vsrln_h_w)
3776 TRANS(xvsrln_w_d, LASX, gen_xxx, gen_helper_vsrln_w_d)
3777 TRANS(xvsran_b_h, LASX, gen_xxx, gen_helper_vsran_b_h)
3778 TRANS(xvsran_h_w, LASX, gen_xxx, gen_helper_vsran_h_w)
3779 TRANS(xvsran_w_d, LASX, gen_xxx, gen_helper_vsran_w_d)
3781 TRANS(vsrlni_b_h, LSX, gen_vv_i, gen_helper_vsrlni_b_h)
3782 TRANS(vsrlni_h_w, LSX, gen_vv_i, gen_helper_vsrlni_h_w)
3783 TRANS(vsrlni_w_d, LSX, gen_vv_i, gen_helper_vsrlni_w_d)
3784 TRANS(vsrlni_d_q, LSX, gen_vv_i, gen_helper_vsrlni_d_q)
3785 TRANS(vsrani_b_h, LSX, gen_vv_i, gen_helper_vsrani_b_h)
3786 TRANS(vsrani_h_w, LSX, gen_vv_i, gen_helper_vsrani_h_w)
3787 TRANS(vsrani_w_d, LSX, gen_vv_i, gen_helper_vsrani_w_d)
3788 TRANS(vsrani_d_q, LSX, gen_vv_i, gen_helper_vsrani_d_q)
3789 TRANS(xvsrlni_b_h, LASX, gen_xx_i, gen_helper_vsrlni_b_h)
3790 TRANS(xvsrlni_h_w, LASX, gen_xx_i, gen_helper_vsrlni_h_w)
3791 TRANS(xvsrlni_w_d, LASX, gen_xx_i, gen_helper_vsrlni_w_d)
3792 TRANS(xvsrlni_d_q, LASX, gen_xx_i, gen_helper_vsrlni_d_q)
3793 TRANS(xvsrani_b_h, LASX, gen_xx_i, gen_helper_vsrani_b_h)
3794 TRANS(xvsrani_h_w, LASX, gen_xx_i, gen_helper_vsrani_h_w)
3795 TRANS(xvsrani_w_d, LASX, gen_xx_i, gen_helper_vsrani_w_d)
3796 TRANS(xvsrani_d_q, LASX, gen_xx_i, gen_helper_vsrani_d_q)
3798 TRANS(vsrlrn_b_h, LSX, gen_vvv, gen_helper_vsrlrn_b_h)
3799 TRANS(vsrlrn_h_w, LSX, gen_vvv, gen_helper_vsrlrn_h_w)
3800 TRANS(vsrlrn_w_d, LSX, gen_vvv, gen_helper_vsrlrn_w_d)
3801 TRANS(vsrarn_b_h, LSX, gen_vvv, gen_helper_vsrarn_b_h)
3802 TRANS(vsrarn_h_w, LSX, gen_vvv, gen_helper_vsrarn_h_w)
3803 TRANS(vsrarn_w_d, LSX, gen_vvv, gen_helper_vsrarn_w_d)
3804 TRANS(xvsrlrn_b_h, LASX, gen_xxx, gen_helper_vsrlrn_b_h)
3805 TRANS(xvsrlrn_h_w, LASX, gen_xxx, gen_helper_vsrlrn_h_w)
3806 TRANS(xvsrlrn_w_d, LASX, gen_xxx, gen_helper_vsrlrn_w_d)
3807 TRANS(xvsrarn_b_h, LASX, gen_xxx, gen_helper_vsrarn_b_h)
3808 TRANS(xvsrarn_h_w, LASX, gen_xxx, gen_helper_vsrarn_h_w)
3809 TRANS(xvsrarn_w_d, LASX, gen_xxx, gen_helper_vsrarn_w_d)
3811 TRANS(vsrlrni_b_h, LSX, gen_vv_i, gen_helper_vsrlrni_b_h)
3812 TRANS(vsrlrni_h_w, LSX, gen_vv_i, gen_helper_vsrlrni_h_w)
3813 TRANS(vsrlrni_w_d, LSX, gen_vv_i, gen_helper_vsrlrni_w_d)
3814 TRANS(vsrlrni_d_q, LSX, gen_vv_i, gen_helper_vsrlrni_d_q)
3815 TRANS(vsrarni_b_h, LSX, gen_vv_i, gen_helper_vsrarni_b_h)
3816 TRANS(vsrarni_h_w, LSX, gen_vv_i, gen_helper_vsrarni_h_w)
3817 TRANS(vsrarni_w_d, LSX, gen_vv_i, gen_helper_vsrarni_w_d)
3818 TRANS(vsrarni_d_q, LSX, gen_vv_i, gen_helper_vsrarni_d_q)
3819 TRANS(xvsrlrni_b_h, LASX, gen_xx_i, gen_helper_vsrlrni_b_h)
3820 TRANS(xvsrlrni_h_w, LASX, gen_xx_i, gen_helper_vsrlrni_h_w)
3821 TRANS(xvsrlrni_w_d, LASX, gen_xx_i, gen_helper_vsrlrni_w_d)
3822 TRANS(xvsrlrni_d_q, LASX, gen_xx_i, gen_helper_vsrlrni_d_q)
3823 TRANS(xvsrarni_b_h, LASX, gen_xx_i, gen_helper_vsrarni_b_h)
3824 TRANS(xvsrarni_h_w, LASX, gen_xx_i, gen_helper_vsrarni_h_w)
3825 TRANS(xvsrarni_w_d, LASX, gen_xx_i, gen_helper_vsrarni_w_d)
3826 TRANS(xvsrarni_d_q, LASX, gen_xx_i, gen_helper_vsrarni_d_q)
3828 TRANS(vssrln_b_h, LSX, gen_vvv, gen_helper_vssrln_b_h)
3829 TRANS(vssrln_h_w, LSX, gen_vvv, gen_helper_vssrln_h_w)
3830 TRANS(vssrln_w_d, LSX, gen_vvv, gen_helper_vssrln_w_d)
3831 TRANS(vssran_b_h, LSX, gen_vvv, gen_helper_vssran_b_h)
3832 TRANS(vssran_h_w, LSX, gen_vvv, gen_helper_vssran_h_w)
3833 TRANS(vssran_w_d, LSX, gen_vvv, gen_helper_vssran_w_d)
3834 TRANS(vssrln_bu_h, LSX, gen_vvv, gen_helper_vssrln_bu_h)
3835 TRANS(vssrln_hu_w, LSX, gen_vvv, gen_helper_vssrln_hu_w)
3836 TRANS(vssrln_wu_d, LSX, gen_vvv, gen_helper_vssrln_wu_d)
3837 TRANS(vssran_bu_h, LSX, gen_vvv, gen_helper_vssran_bu_h)
3838 TRANS(vssran_hu_w, LSX, gen_vvv, gen_helper_vssran_hu_w)
3839 TRANS(vssran_wu_d, LSX, gen_vvv, gen_helper_vssran_wu_d)
3840 TRANS(xvssrln_b_h, LASX, gen_xxx, gen_helper_vssrln_b_h)
3841 TRANS(xvssrln_h_w, LASX, gen_xxx, gen_helper_vssrln_h_w)
3842 TRANS(xvssrln_w_d, LASX, gen_xxx, gen_helper_vssrln_w_d)
3843 TRANS(xvssran_b_h, LASX, gen_xxx, gen_helper_vssran_b_h)
3844 TRANS(xvssran_h_w, LASX, gen_xxx, gen_helper_vssran_h_w)
3845 TRANS(xvssran_w_d, LASX, gen_xxx, gen_helper_vssran_w_d)
3846 TRANS(xvssrln_bu_h, LASX, gen_xxx, gen_helper_vssrln_bu_h)
3847 TRANS(xvssrln_hu_w, LASX, gen_xxx, gen_helper_vssrln_hu_w)
3848 TRANS(xvssrln_wu_d, LASX, gen_xxx, gen_helper_vssrln_wu_d)
3849 TRANS(xvssran_bu_h, LASX, gen_xxx, gen_helper_vssran_bu_h)
3850 TRANS(xvssran_hu_w, LASX, gen_xxx, gen_helper_vssran_hu_w)
3851 TRANS(xvssran_wu_d, LASX, gen_xxx, gen_helper_vssran_wu_d)
3853 TRANS(vssrlni_b_h, LSX, gen_vv_i, gen_helper_vssrlni_b_h)
3854 TRANS(vssrlni_h_w, LSX, gen_vv_i, gen_helper_vssrlni_h_w)
3855 TRANS(vssrlni_w_d, LSX, gen_vv_i, gen_helper_vssrlni_w_d)
3856 TRANS(vssrlni_d_q, LSX, gen_vv_i, gen_helper_vssrlni_d_q)
3857 TRANS(vssrani_b_h, LSX, gen_vv_i, gen_helper_vssrani_b_h)
3858 TRANS(vssrani_h_w, LSX, gen_vv_i, gen_helper_vssrani_h_w)
3859 TRANS(vssrani_w_d, LSX, gen_vv_i, gen_helper_vssrani_w_d)
3860 TRANS(vssrani_d_q, LSX, gen_vv_i, gen_helper_vssrani_d_q)
3861 TRANS(vssrlni_bu_h, LSX, gen_vv_i, gen_helper_vssrlni_bu_h)
3862 TRANS(vssrlni_hu_w, LSX, gen_vv_i, gen_helper_vssrlni_hu_w)
3863 TRANS(vssrlni_wu_d, LSX, gen_vv_i, gen_helper_vssrlni_wu_d)
3864 TRANS(vssrlni_du_q, LSX, gen_vv_i, gen_helper_vssrlni_du_q)
3865 TRANS(vssrani_bu_h, LSX, gen_vv_i, gen_helper_vssrani_bu_h)
3866 TRANS(vssrani_hu_w, LSX, gen_vv_i, gen_helper_vssrani_hu_w)
3867 TRANS(vssrani_wu_d, LSX, gen_vv_i, gen_helper_vssrani_wu_d)
3868 TRANS(vssrani_du_q, LSX, gen_vv_i, gen_helper_vssrani_du_q)
3869 TRANS(xvssrlni_b_h, LASX, gen_xx_i, gen_helper_vssrlni_b_h)
3870 TRANS(xvssrlni_h_w, LASX, gen_xx_i, gen_helper_vssrlni_h_w)
3871 TRANS(xvssrlni_w_d, LASX, gen_xx_i, gen_helper_vssrlni_w_d)
3872 TRANS(xvssrlni_d_q, LASX, gen_xx_i, gen_helper_vssrlni_d_q)
3873 TRANS(xvssrani_b_h, LASX, gen_xx_i, gen_helper_vssrani_b_h)
3874 TRANS(xvssrani_h_w, LASX, gen_xx_i, gen_helper_vssrani_h_w)
3875 TRANS(xvssrani_w_d, LASX, gen_xx_i, gen_helper_vssrani_w_d)
3876 TRANS(xvssrani_d_q, LASX, gen_xx_i, gen_helper_vssrani_d_q)
3877 TRANS(xvssrlni_bu_h, LASX, gen_xx_i, gen_helper_vssrlni_bu_h)
3878 TRANS(xvssrlni_hu_w, LASX, gen_xx_i, gen_helper_vssrlni_hu_w)
3879 TRANS(xvssrlni_wu_d, LASX, gen_xx_i, gen_helper_vssrlni_wu_d)
3880 TRANS(xvssrlni_du_q, LASX, gen_xx_i, gen_helper_vssrlni_du_q)
3881 TRANS(xvssrani_bu_h, LASX, gen_xx_i, gen_helper_vssrani_bu_h)
3882 TRANS(xvssrani_hu_w, LASX, gen_xx_i, gen_helper_vssrani_hu_w)
3883 TRANS(xvssrani_wu_d, LASX, gen_xx_i, gen_helper_vssrani_wu_d)
3884 TRANS(xvssrani_du_q, LASX, gen_xx_i, gen_helper_vssrani_du_q)
3886 TRANS(vssrlrn_b_h, LSX, gen_vvv, gen_helper_vssrlrn_b_h)
3887 TRANS(vssrlrn_h_w, LSX, gen_vvv, gen_helper_vssrlrn_h_w)
3888 TRANS(vssrlrn_w_d, LSX, gen_vvv, gen_helper_vssrlrn_w_d)
3889 TRANS(vssrarn_b_h, LSX, gen_vvv, gen_helper_vssrarn_b_h)
3890 TRANS(vssrarn_h_w, LSX, gen_vvv, gen_helper_vssrarn_h_w)
3891 TRANS(vssrarn_w_d, LSX, gen_vvv, gen_helper_vssrarn_w_d)
3892 TRANS(vssrlrn_bu_h, LSX, gen_vvv, gen_helper_vssrlrn_bu_h)
3893 TRANS(vssrlrn_hu_w, LSX, gen_vvv, gen_helper_vssrlrn_hu_w)
3894 TRANS(vssrlrn_wu_d, LSX, gen_vvv, gen_helper_vssrlrn_wu_d)
3895 TRANS(vssrarn_bu_h, LSX, gen_vvv, gen_helper_vssrarn_bu_h)
3896 TRANS(vssrarn_hu_w, LSX, gen_vvv, gen_helper_vssrarn_hu_w)
3897 TRANS(vssrarn_wu_d, LSX, gen_vvv, gen_helper_vssrarn_wu_d)
3898 TRANS(xvssrlrn_b_h, LASX, gen_xxx, gen_helper_vssrlrn_b_h)
3899 TRANS(xvssrlrn_h_w, LASX, gen_xxx, gen_helper_vssrlrn_h_w)
3900 TRANS(xvssrlrn_w_d, LASX, gen_xxx, gen_helper_vssrlrn_w_d)
3901 TRANS(xvssrarn_b_h, LASX, gen_xxx, gen_helper_vssrarn_b_h)
3902 TRANS(xvssrarn_h_w, LASX, gen_xxx, gen_helper_vssrarn_h_w)
3903 TRANS(xvssrarn_w_d, LASX, gen_xxx, gen_helper_vssrarn_w_d)
3904 TRANS(xvssrlrn_bu_h, LASX, gen_xxx, gen_helper_vssrlrn_bu_h)
3905 TRANS(xvssrlrn_hu_w, LASX, gen_xxx, gen_helper_vssrlrn_hu_w)
3906 TRANS(xvssrlrn_wu_d, LASX, gen_xxx, gen_helper_vssrlrn_wu_d)
3907 TRANS(xvssrarn_bu_h, LASX, gen_xxx, gen_helper_vssrarn_bu_h)
3908 TRANS(xvssrarn_hu_w, LASX, gen_xxx, gen_helper_vssrarn_hu_w)
3909 TRANS(xvssrarn_wu_d, LASX, gen_xxx, gen_helper_vssrarn_wu_d)
3911 TRANS(vssrlrni_b_h, LSX, gen_vv_i, gen_helper_vssrlrni_b_h)
3912 TRANS(vssrlrni_h_w, LSX, gen_vv_i, gen_helper_vssrlrni_h_w)
3913 TRANS(vssrlrni_w_d, LSX, gen_vv_i, gen_helper_vssrlrni_w_d)
3914 TRANS(vssrlrni_d_q, LSX, gen_vv_i, gen_helper_vssrlrni_d_q)
3915 TRANS(vssrarni_b_h, LSX, gen_vv_i, gen_helper_vssrarni_b_h)
3916 TRANS(vssrarni_h_w, LSX, gen_vv_i, gen_helper_vssrarni_h_w)
3917 TRANS(vssrarni_w_d, LSX, gen_vv_i, gen_helper_vssrarni_w_d)
3918 TRANS(vssrarni_d_q, LSX, gen_vv_i, gen_helper_vssrarni_d_q)
3919 TRANS(vssrlrni_bu_h, LSX, gen_vv_i, gen_helper_vssrlrni_bu_h)
3920 TRANS(vssrlrni_hu_w, LSX, gen_vv_i, gen_helper_vssrlrni_hu_w)
3921 TRANS(vssrlrni_wu_d, LSX, gen_vv_i, gen_helper_vssrlrni_wu_d)
3922 TRANS(vssrlrni_du_q, LSX, gen_vv_i, gen_helper_vssrlrni_du_q)
3923 TRANS(vssrarni_bu_h, LSX, gen_vv_i, gen_helper_vssrarni_bu_h)
3924 TRANS(vssrarni_hu_w, LSX, gen_vv_i, gen_helper_vssrarni_hu_w)
3925 TRANS(vssrarni_wu_d, LSX, gen_vv_i, gen_helper_vssrarni_wu_d)
3926 TRANS(vssrarni_du_q, LSX, gen_vv_i, gen_helper_vssrarni_du_q)
3927 TRANS(xvssrlrni_b_h, LASX, gen_xx_i, gen_helper_vssrlrni_b_h)
3928 TRANS(xvssrlrni_h_w, LASX, gen_xx_i, gen_helper_vssrlrni_h_w)
3929 TRANS(xvssrlrni_w_d, LASX, gen_xx_i, gen_helper_vssrlrni_w_d)
3930 TRANS(xvssrlrni_d_q, LASX, gen_xx_i, gen_helper_vssrlrni_d_q)
3931 TRANS(xvssrarni_b_h, LASX, gen_xx_i, gen_helper_vssrarni_b_h)
3932 TRANS(xvssrarni_h_w, LASX, gen_xx_i, gen_helper_vssrarni_h_w)
3933 TRANS(xvssrarni_w_d, LASX, gen_xx_i, gen_helper_vssrarni_w_d)
3934 TRANS(xvssrarni_d_q, LASX, gen_xx_i, gen_helper_vssrarni_d_q)
3935 TRANS(xvssrlrni_bu_h, LASX, gen_xx_i, gen_helper_vssrlrni_bu_h)
3936 TRANS(xvssrlrni_hu_w, LASX, gen_xx_i, gen_helper_vssrlrni_hu_w)
3937 TRANS(xvssrlrni_wu_d, LASX, gen_xx_i, gen_helper_vssrlrni_wu_d)
3938 TRANS(xvssrlrni_du_q, LASX, gen_xx_i, gen_helper_vssrlrni_du_q)
3939 TRANS(xvssrarni_bu_h, LASX, gen_xx_i, gen_helper_vssrarni_bu_h)
3940 TRANS(xvssrarni_hu_w, LASX, gen_xx_i, gen_helper_vssrarni_hu_w)
3941 TRANS(xvssrarni_wu_d, LASX, gen_xx_i, gen_helper_vssrarni_wu_d)
3942 TRANS(xvssrarni_du_q, LASX, gen_xx_i, gen_helper_vssrarni_du_q)
3944 TRANS(vclo_b, LSX, gen_vv, gen_helper_vclo_b)
3945 TRANS(vclo_h, LSX, gen_vv, gen_helper_vclo_h)
3946 TRANS(vclo_w, LSX, gen_vv, gen_helper_vclo_w)
3947 TRANS(vclo_d, LSX, gen_vv, gen_helper_vclo_d)
3948 TRANS(vclz_b, LSX, gen_vv, gen_helper_vclz_b)
3949 TRANS(vclz_h, LSX, gen_vv, gen_helper_vclz_h)
3950 TRANS(vclz_w, LSX, gen_vv, gen_helper_vclz_w)
3951 TRANS(vclz_d, LSX, gen_vv, gen_helper_vclz_d)
3952 TRANS(xvclo_b, LASX, gen_xx, gen_helper_vclo_b)
3953 TRANS(xvclo_h, LASX, gen_xx, gen_helper_vclo_h)
3954 TRANS(xvclo_w, LASX, gen_xx, gen_helper_vclo_w)
3955 TRANS(xvclo_d, LASX, gen_xx, gen_helper_vclo_d)
3956 TRANS(xvclz_b, LASX, gen_xx, gen_helper_vclz_b)
3957 TRANS(xvclz_h, LASX, gen_xx, gen_helper_vclz_h)
3958 TRANS(xvclz_w, LASX, gen_xx, gen_helper_vclz_w)
3959 TRANS(xvclz_d, LASX, gen_xx, gen_helper_vclz_d)
3961 TRANS(vpcnt_b, LSX, gen_vv, gen_helper_vpcnt_b)
3962 TRANS(vpcnt_h, LSX, gen_vv, gen_helper_vpcnt_h)
3963 TRANS(vpcnt_w, LSX, gen_vv, gen_helper_vpcnt_w)
3964 TRANS(vpcnt_d, LSX, gen_vv, gen_helper_vpcnt_d)
3966 static void do_vbit(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b,
3967 void (*func)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec))
3969 TCGv_vec mask, lsh, t1, one;
3971 lsh = tcg_temp_new_vec_matching(t);
3972 t1 = tcg_temp_new_vec_matching(t);
3973 mask = tcg_constant_vec_matching(t, vece, (8 << vece) - 1);
3974 one = tcg_constant_vec_matching(t, vece, 1);
3976 tcg_gen_and_vec(vece, lsh, b, mask);
3977 tcg_gen_shlv_vec(vece, t1, one, lsh);
3978 func(vece, t, a, t1);
3981 static void gen_vbitclr(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3983 do_vbit(vece, t, a, b, tcg_gen_andc_vec);
3986 static void gen_vbitset(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3988 do_vbit(vece, t, a, b, tcg_gen_or_vec);
3991 static void gen_vbitrev(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b)
3993 do_vbit(vece, t, a, b, tcg_gen_xor_vec);
3996 static void do_vbitclr(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
3997 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
3999 static const TCGOpcode vecop_list[] = {
4000 INDEX_op_shlv_vec, INDEX_op_andc_vec, 0
4002 static const GVecGen3 op[4] = {
4004 .fniv = gen_vbitclr,
4005 .fno = gen_helper_vbitclr_b,
4006 .opt_opc = vecop_list,
4010 .fniv = gen_vbitclr,
4011 .fno = gen_helper_vbitclr_h,
4012 .opt_opc = vecop_list,
4016 .fniv = gen_vbitclr,
4017 .fno = gen_helper_vbitclr_w,
4018 .opt_opc = vecop_list,
4022 .fniv = gen_vbitclr,
4023 .fno = gen_helper_vbitclr_d,
4024 .opt_opc = vecop_list,
4029 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
4032 TRANS(vbitclr_b, LSX, gvec_vvv, MO_8, do_vbitclr)
4033 TRANS(vbitclr_h, LSX, gvec_vvv, MO_16, do_vbitclr)
4034 TRANS(vbitclr_w, LSX, gvec_vvv, MO_32, do_vbitclr)
4035 TRANS(vbitclr_d, LSX, gvec_vvv, MO_64, do_vbitclr)
4037 static void do_vbiti(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm,
4038 void (*func)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec))
4043 lsh = imm & ((8 << vece) -1);
4044 t1 = tcg_temp_new_vec_matching(t);
4045 one = tcg_constant_vec_matching(t, vece, 1);
4047 tcg_gen_shli_vec(vece, t1, one, lsh);
4048 func(vece, t, a, t1);
4051 static void gen_vbitclri(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4053 do_vbiti(vece, t, a, imm, tcg_gen_andc_vec);
4056 static void gen_vbitseti(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4058 do_vbiti(vece, t, a, imm, tcg_gen_or_vec);
4061 static void gen_vbitrevi(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4063 do_vbiti(vece, t, a, imm, tcg_gen_xor_vec);
4066 static void do_vbitclri(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
4067 int64_t imm, uint32_t oprsz, uint32_t maxsz)
4069 static const TCGOpcode vecop_list[] = {
4070 INDEX_op_shli_vec, INDEX_op_andc_vec, 0
4072 static const GVecGen2i op[4] = {
4074 .fniv = gen_vbitclri,
4075 .fnoi = gen_helper_vbitclri_b,
4076 .opt_opc = vecop_list,
4080 .fniv = gen_vbitclri,
4081 .fnoi = gen_helper_vbitclri_h,
4082 .opt_opc = vecop_list,
4086 .fniv = gen_vbitclri,
4087 .fnoi = gen_helper_vbitclri_w,
4088 .opt_opc = vecop_list,
4092 .fniv = gen_vbitclri,
4093 .fnoi = gen_helper_vbitclri_d,
4094 .opt_opc = vecop_list,
4099 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
4102 TRANS(vbitclri_b, LSX, gvec_vv_i, MO_8, do_vbitclri)
4103 TRANS(vbitclri_h, LSX, gvec_vv_i, MO_16, do_vbitclri)
4104 TRANS(vbitclri_w, LSX, gvec_vv_i, MO_32, do_vbitclri)
4105 TRANS(vbitclri_d, LSX, gvec_vv_i, MO_64, do_vbitclri)
4107 static void do_vbitset(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
4108 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
4110 static const TCGOpcode vecop_list[] = {
4111 INDEX_op_shlv_vec, 0
4113 static const GVecGen3 op[4] = {
4115 .fniv = gen_vbitset,
4116 .fno = gen_helper_vbitset_b,
4117 .opt_opc = vecop_list,
4121 .fniv = gen_vbitset,
4122 .fno = gen_helper_vbitset_h,
4123 .opt_opc = vecop_list,
4127 .fniv = gen_vbitset,
4128 .fno = gen_helper_vbitset_w,
4129 .opt_opc = vecop_list,
4133 .fniv = gen_vbitset,
4134 .fno = gen_helper_vbitset_d,
4135 .opt_opc = vecop_list,
4140 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
4143 TRANS(vbitset_b, LSX, gvec_vvv, MO_8, do_vbitset)
4144 TRANS(vbitset_h, LSX, gvec_vvv, MO_16, do_vbitset)
4145 TRANS(vbitset_w, LSX, gvec_vvv, MO_32, do_vbitset)
4146 TRANS(vbitset_d, LSX, gvec_vvv, MO_64, do_vbitset)
4148 static void do_vbitseti(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
4149 int64_t imm, uint32_t oprsz, uint32_t maxsz)
4151 static const TCGOpcode vecop_list[] = {
4152 INDEX_op_shli_vec, 0
4154 static const GVecGen2i op[4] = {
4156 .fniv = gen_vbitseti,
4157 .fnoi = gen_helper_vbitseti_b,
4158 .opt_opc = vecop_list,
4162 .fniv = gen_vbitseti,
4163 .fnoi = gen_helper_vbitseti_h,
4164 .opt_opc = vecop_list,
4168 .fniv = gen_vbitseti,
4169 .fnoi = gen_helper_vbitseti_w,
4170 .opt_opc = vecop_list,
4174 .fniv = gen_vbitseti,
4175 .fnoi = gen_helper_vbitseti_d,
4176 .opt_opc = vecop_list,
4181 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
4184 TRANS(vbitseti_b, LSX, gvec_vv_i, MO_8, do_vbitseti)
4185 TRANS(vbitseti_h, LSX, gvec_vv_i, MO_16, do_vbitseti)
4186 TRANS(vbitseti_w, LSX, gvec_vv_i, MO_32, do_vbitseti)
4187 TRANS(vbitseti_d, LSX, gvec_vv_i, MO_64, do_vbitseti)
4189 static void do_vbitrev(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
4190 uint32_t vk_ofs, uint32_t oprsz, uint32_t maxsz)
4192 static const TCGOpcode vecop_list[] = {
4193 INDEX_op_shlv_vec, 0
4195 static const GVecGen3 op[4] = {
4197 .fniv = gen_vbitrev,
4198 .fno = gen_helper_vbitrev_b,
4199 .opt_opc = vecop_list,
4203 .fniv = gen_vbitrev,
4204 .fno = gen_helper_vbitrev_h,
4205 .opt_opc = vecop_list,
4209 .fniv = gen_vbitrev,
4210 .fno = gen_helper_vbitrev_w,
4211 .opt_opc = vecop_list,
4215 .fniv = gen_vbitrev,
4216 .fno = gen_helper_vbitrev_d,
4217 .opt_opc = vecop_list,
4222 tcg_gen_gvec_3(vd_ofs, vj_ofs, vk_ofs, oprsz, maxsz, &op[vece]);
4225 TRANS(vbitrev_b, LSX, gvec_vvv, MO_8, do_vbitrev)
4226 TRANS(vbitrev_h, LSX, gvec_vvv, MO_16, do_vbitrev)
4227 TRANS(vbitrev_w, LSX, gvec_vvv, MO_32, do_vbitrev)
4228 TRANS(vbitrev_d, LSX, gvec_vvv, MO_64, do_vbitrev)
4230 static void do_vbitrevi(unsigned vece, uint32_t vd_ofs, uint32_t vj_ofs,
4231 int64_t imm, uint32_t oprsz, uint32_t maxsz)
4233 static const TCGOpcode vecop_list[] = {
4234 INDEX_op_shli_vec, 0
4236 static const GVecGen2i op[4] = {
4238 .fniv = gen_vbitrevi,
4239 .fnoi = gen_helper_vbitrevi_b,
4240 .opt_opc = vecop_list,
4244 .fniv = gen_vbitrevi,
4245 .fnoi = gen_helper_vbitrevi_h,
4246 .opt_opc = vecop_list,
4250 .fniv = gen_vbitrevi,
4251 .fnoi = gen_helper_vbitrevi_w,
4252 .opt_opc = vecop_list,
4256 .fniv = gen_vbitrevi,
4257 .fnoi = gen_helper_vbitrevi_d,
4258 .opt_opc = vecop_list,
4263 tcg_gen_gvec_2i(vd_ofs, vj_ofs, oprsz, maxsz, imm, &op[vece]);
4266 TRANS(vbitrevi_b, LSX, gvec_vv_i, MO_8, do_vbitrevi)
4267 TRANS(vbitrevi_h, LSX, gvec_vv_i, MO_16, do_vbitrevi)
4268 TRANS(vbitrevi_w, LSX, gvec_vv_i, MO_32, do_vbitrevi)
4269 TRANS(vbitrevi_d, LSX, gvec_vv_i, MO_64, do_vbitrevi)
4271 TRANS(vfrstp_b, LSX, gen_vvv, gen_helper_vfrstp_b)
4272 TRANS(vfrstp_h, LSX, gen_vvv, gen_helper_vfrstp_h)
4273 TRANS(vfrstpi_b, LSX, gen_vv_i, gen_helper_vfrstpi_b)
4274 TRANS(vfrstpi_h, LSX, gen_vv_i, gen_helper_vfrstpi_h)
4276 TRANS(vfadd_s, LSX, gen_vvv_ptr, gen_helper_vfadd_s)
4277 TRANS(vfadd_d, LSX, gen_vvv_ptr, gen_helper_vfadd_d)
4278 TRANS(vfsub_s, LSX, gen_vvv_ptr, gen_helper_vfsub_s)
4279 TRANS(vfsub_d, LSX, gen_vvv_ptr, gen_helper_vfsub_d)
4280 TRANS(vfmul_s, LSX, gen_vvv_ptr, gen_helper_vfmul_s)
4281 TRANS(vfmul_d, LSX, gen_vvv_ptr, gen_helper_vfmul_d)
4282 TRANS(vfdiv_s, LSX, gen_vvv_ptr, gen_helper_vfdiv_s)
4283 TRANS(vfdiv_d, LSX, gen_vvv_ptr, gen_helper_vfdiv_d)
4285 TRANS(vfmadd_s, LSX, gen_vvvv_ptr, gen_helper_vfmadd_s)
4286 TRANS(vfmadd_d, LSX, gen_vvvv_ptr, gen_helper_vfmadd_d)
4287 TRANS(vfmsub_s, LSX, gen_vvvv_ptr, gen_helper_vfmsub_s)
4288 TRANS(vfmsub_d, LSX, gen_vvvv_ptr, gen_helper_vfmsub_d)
4289 TRANS(vfnmadd_s, LSX, gen_vvvv_ptr, gen_helper_vfnmadd_s)
4290 TRANS(vfnmadd_d, LSX, gen_vvvv_ptr, gen_helper_vfnmadd_d)
4291 TRANS(vfnmsub_s, LSX, gen_vvvv_ptr, gen_helper_vfnmsub_s)
4292 TRANS(vfnmsub_d, LSX, gen_vvvv_ptr, gen_helper_vfnmsub_d)
4294 TRANS(vfmax_s, LSX, gen_vvv_ptr, gen_helper_vfmax_s)
4295 TRANS(vfmax_d, LSX, gen_vvv_ptr, gen_helper_vfmax_d)
4296 TRANS(vfmin_s, LSX, gen_vvv_ptr, gen_helper_vfmin_s)
4297 TRANS(vfmin_d, LSX, gen_vvv_ptr, gen_helper_vfmin_d)
4299 TRANS(vfmaxa_s, LSX, gen_vvv_ptr, gen_helper_vfmaxa_s)
4300 TRANS(vfmaxa_d, LSX, gen_vvv_ptr, gen_helper_vfmaxa_d)
4301 TRANS(vfmina_s, LSX, gen_vvv_ptr, gen_helper_vfmina_s)
4302 TRANS(vfmina_d, LSX, gen_vvv_ptr, gen_helper_vfmina_d)
4304 TRANS(vflogb_s, LSX, gen_vv_ptr, gen_helper_vflogb_s)
4305 TRANS(vflogb_d, LSX, gen_vv_ptr, gen_helper_vflogb_d)
4307 TRANS(vfclass_s, LSX, gen_vv_ptr, gen_helper_vfclass_s)
4308 TRANS(vfclass_d, LSX, gen_vv_ptr, gen_helper_vfclass_d)
4310 TRANS(vfsqrt_s, LSX, gen_vv_ptr, gen_helper_vfsqrt_s)
4311 TRANS(vfsqrt_d, LSX, gen_vv_ptr, gen_helper_vfsqrt_d)
4312 TRANS(vfrecip_s, LSX, gen_vv_ptr, gen_helper_vfrecip_s)
4313 TRANS(vfrecip_d, LSX, gen_vv_ptr, gen_helper_vfrecip_d)
4314 TRANS(vfrsqrt_s, LSX, gen_vv_ptr, gen_helper_vfrsqrt_s)
4315 TRANS(vfrsqrt_d, LSX, gen_vv_ptr, gen_helper_vfrsqrt_d)
4317 TRANS(vfcvtl_s_h, LSX, gen_vv_ptr, gen_helper_vfcvtl_s_h)
4318 TRANS(vfcvth_s_h, LSX, gen_vv_ptr, gen_helper_vfcvth_s_h)
4319 TRANS(vfcvtl_d_s, LSX, gen_vv_ptr, gen_helper_vfcvtl_d_s)
4320 TRANS(vfcvth_d_s, LSX, gen_vv_ptr, gen_helper_vfcvth_d_s)
4321 TRANS(vfcvt_h_s, LSX, gen_vvv_ptr, gen_helper_vfcvt_h_s)
4322 TRANS(vfcvt_s_d, LSX, gen_vvv_ptr, gen_helper_vfcvt_s_d)
4324 TRANS(vfrintrne_s, LSX, gen_vv_ptr, gen_helper_vfrintrne_s)
4325 TRANS(vfrintrne_d, LSX, gen_vv_ptr, gen_helper_vfrintrne_d)
4326 TRANS(vfrintrz_s, LSX, gen_vv_ptr, gen_helper_vfrintrz_s)
4327 TRANS(vfrintrz_d, LSX, gen_vv_ptr, gen_helper_vfrintrz_d)
4328 TRANS(vfrintrp_s, LSX, gen_vv_ptr, gen_helper_vfrintrp_s)
4329 TRANS(vfrintrp_d, LSX, gen_vv_ptr, gen_helper_vfrintrp_d)
4330 TRANS(vfrintrm_s, LSX, gen_vv_ptr, gen_helper_vfrintrm_s)
4331 TRANS(vfrintrm_d, LSX, gen_vv_ptr, gen_helper_vfrintrm_d)
4332 TRANS(vfrint_s, LSX, gen_vv_ptr, gen_helper_vfrint_s)
4333 TRANS(vfrint_d, LSX, gen_vv_ptr, gen_helper_vfrint_d)
4335 TRANS(vftintrne_w_s, LSX, gen_vv_ptr, gen_helper_vftintrne_w_s)
4336 TRANS(vftintrne_l_d, LSX, gen_vv_ptr, gen_helper_vftintrne_l_d)
4337 TRANS(vftintrz_w_s, LSX, gen_vv_ptr, gen_helper_vftintrz_w_s)
4338 TRANS(vftintrz_l_d, LSX, gen_vv_ptr, gen_helper_vftintrz_l_d)
4339 TRANS(vftintrp_w_s, LSX, gen_vv_ptr, gen_helper_vftintrp_w_s)
4340 TRANS(vftintrp_l_d, LSX, gen_vv_ptr, gen_helper_vftintrp_l_d)
4341 TRANS(vftintrm_w_s, LSX, gen_vv_ptr, gen_helper_vftintrm_w_s)
4342 TRANS(vftintrm_l_d, LSX, gen_vv_ptr, gen_helper_vftintrm_l_d)
4343 TRANS(vftint_w_s, LSX, gen_vv_ptr, gen_helper_vftint_w_s)
4344 TRANS(vftint_l_d, LSX, gen_vv_ptr, gen_helper_vftint_l_d)
4345 TRANS(vftintrz_wu_s, LSX, gen_vv_ptr, gen_helper_vftintrz_wu_s)
4346 TRANS(vftintrz_lu_d, LSX, gen_vv_ptr, gen_helper_vftintrz_lu_d)
4347 TRANS(vftint_wu_s, LSX, gen_vv_ptr, gen_helper_vftint_wu_s)
4348 TRANS(vftint_lu_d, LSX, gen_vv_ptr, gen_helper_vftint_lu_d)
4349 TRANS(vftintrne_w_d, LSX, gen_vvv_ptr, gen_helper_vftintrne_w_d)
4350 TRANS(vftintrz_w_d, LSX, gen_vvv_ptr, gen_helper_vftintrz_w_d)
4351 TRANS(vftintrp_w_d, LSX, gen_vvv_ptr, gen_helper_vftintrp_w_d)
4352 TRANS(vftintrm_w_d, LSX, gen_vvv_ptr, gen_helper_vftintrm_w_d)
4353 TRANS(vftint_w_d, LSX, gen_vvv_ptr, gen_helper_vftint_w_d)
4354 TRANS(vftintrnel_l_s, LSX, gen_vv_ptr, gen_helper_vftintrnel_l_s)
4355 TRANS(vftintrneh_l_s, LSX, gen_vv_ptr, gen_helper_vftintrneh_l_s)
4356 TRANS(vftintrzl_l_s, LSX, gen_vv_ptr, gen_helper_vftintrzl_l_s)
4357 TRANS(vftintrzh_l_s, LSX, gen_vv_ptr, gen_helper_vftintrzh_l_s)
4358 TRANS(vftintrpl_l_s, LSX, gen_vv_ptr, gen_helper_vftintrpl_l_s)
4359 TRANS(vftintrph_l_s, LSX, gen_vv_ptr, gen_helper_vftintrph_l_s)
4360 TRANS(vftintrml_l_s, LSX, gen_vv_ptr, gen_helper_vftintrml_l_s)
4361 TRANS(vftintrmh_l_s, LSX, gen_vv_ptr, gen_helper_vftintrmh_l_s)
4362 TRANS(vftintl_l_s, LSX, gen_vv_ptr, gen_helper_vftintl_l_s)
4363 TRANS(vftinth_l_s, LSX, gen_vv_ptr, gen_helper_vftinth_l_s)
4365 TRANS(vffint_s_w, LSX, gen_vv_ptr, gen_helper_vffint_s_w)
4366 TRANS(vffint_d_l, LSX, gen_vv_ptr, gen_helper_vffint_d_l)
4367 TRANS(vffint_s_wu, LSX, gen_vv_ptr, gen_helper_vffint_s_wu)
4368 TRANS(vffint_d_lu, LSX, gen_vv_ptr, gen_helper_vffint_d_lu)
4369 TRANS(vffintl_d_w, LSX, gen_vv_ptr, gen_helper_vffintl_d_w)
4370 TRANS(vffinth_d_w, LSX, gen_vv_ptr, gen_helper_vffinth_d_w)
4371 TRANS(vffint_s_l, LSX, gen_vvv_ptr, gen_helper_vffint_s_l)
4373 static bool do_cmp(DisasContext *ctx, arg_vvv *a, MemOp mop, TCGCond cond)
4375 uint32_t vd_ofs, vj_ofs, vk_ofs;
4377 if (!check_vec(ctx, 16)) {
4381 vd_ofs = vec_full_offset(a->vd);
4382 vj_ofs = vec_full_offset(a->vj);
4383 vk_ofs = vec_full_offset(a->vk);
4385 tcg_gen_gvec_cmp(cond, mop, vd_ofs, vj_ofs, vk_ofs, 16, ctx->vl/8);
4389 static void do_cmpi_vec(TCGCond cond,
4390 unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4392 tcg_gen_cmp_vec(cond, vece, t, a, tcg_constant_vec_matching(t, vece, imm));
4395 static void gen_vseqi_s_vec(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4397 do_cmpi_vec(TCG_COND_EQ, vece, t, a, imm);
4400 static void gen_vslei_s_vec(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4402 do_cmpi_vec(TCG_COND_LE, vece, t, a, imm);
4405 static void gen_vslti_s_vec(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4407 do_cmpi_vec(TCG_COND_LT, vece, t, a, imm);
4410 static void gen_vslei_u_vec(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4412 do_cmpi_vec(TCG_COND_LEU, vece, t, a, imm);
4415 static void gen_vslti_u_vec(unsigned vece, TCGv_vec t, TCGv_vec a, int64_t imm)
4417 do_cmpi_vec(TCG_COND_LTU, vece, t, a, imm);
4420 #define DO_CMPI_S(NAME) \
4421 static bool do_## NAME ##_s(DisasContext *ctx, arg_vv_i *a, MemOp mop) \
4423 uint32_t vd_ofs, vj_ofs; \
4425 if (!check_vec(ctx, 16)) { \
4429 static const TCGOpcode vecop_list[] = { \
4430 INDEX_op_cmp_vec, 0 \
4432 static const GVecGen2i op[4] = { \
4434 .fniv = gen_## NAME ##_s_vec, \
4435 .fnoi = gen_helper_## NAME ##_b, \
4436 .opt_opc = vecop_list, \
4440 .fniv = gen_## NAME ##_s_vec, \
4441 .fnoi = gen_helper_## NAME ##_h, \
4442 .opt_opc = vecop_list, \
4446 .fniv = gen_## NAME ##_s_vec, \
4447 .fnoi = gen_helper_## NAME ##_w, \
4448 .opt_opc = vecop_list, \
4452 .fniv = gen_## NAME ##_s_vec, \
4453 .fnoi = gen_helper_## NAME ##_d, \
4454 .opt_opc = vecop_list, \
4459 vd_ofs = vec_full_offset(a->vd); \
4460 vj_ofs = vec_full_offset(a->vj); \
4462 tcg_gen_gvec_2i(vd_ofs, vj_ofs, 16, ctx->vl/8, a->imm, &op[mop]); \
4471 #define DO_CMPI_U(NAME) \
4472 static bool do_## NAME ##_u(DisasContext *ctx, arg_vv_i *a, MemOp mop) \
4474 uint32_t vd_ofs, vj_ofs; \
4476 if (!check_vec(ctx, 16)) { \
4480 static const TCGOpcode vecop_list[] = { \
4481 INDEX_op_cmp_vec, 0 \
4483 static const GVecGen2i op[4] = { \
4485 .fniv = gen_## NAME ##_u_vec, \
4486 .fnoi = gen_helper_## NAME ##_bu, \
4487 .opt_opc = vecop_list, \
4491 .fniv = gen_## NAME ##_u_vec, \
4492 .fnoi = gen_helper_## NAME ##_hu, \
4493 .opt_opc = vecop_list, \
4497 .fniv = gen_## NAME ##_u_vec, \
4498 .fnoi = gen_helper_## NAME ##_wu, \
4499 .opt_opc = vecop_list, \
4503 .fniv = gen_## NAME ##_u_vec, \
4504 .fnoi = gen_helper_## NAME ##_du, \
4505 .opt_opc = vecop_list, \
4510 vd_ofs = vec_full_offset(a->vd); \
4511 vj_ofs = vec_full_offset(a->vj); \
4513 tcg_gen_gvec_2i(vd_ofs, vj_ofs, 16, ctx->vl/8, a->imm, &op[mop]); \
4521 TRANS(vseq_b, LSX, do_cmp, MO_8, TCG_COND_EQ)
4522 TRANS(vseq_h, LSX, do_cmp, MO_16, TCG_COND_EQ)
4523 TRANS(vseq_w, LSX, do_cmp, MO_32, TCG_COND_EQ)
4524 TRANS(vseq_d, LSX, do_cmp, MO_64, TCG_COND_EQ)
4525 TRANS(vseqi_b, LSX, do_vseqi_s, MO_8)
4526 TRANS(vseqi_h, LSX, do_vseqi_s, MO_16)
4527 TRANS(vseqi_w, LSX, do_vseqi_s, MO_32)
4528 TRANS(vseqi_d, LSX, do_vseqi_s, MO_64)
4530 TRANS(vsle_b, LSX, do_cmp, MO_8, TCG_COND_LE)
4531 TRANS(vsle_h, LSX, do_cmp, MO_16, TCG_COND_LE)
4532 TRANS(vsle_w, LSX, do_cmp, MO_32, TCG_COND_LE)
4533 TRANS(vsle_d, LSX, do_cmp, MO_64, TCG_COND_LE)
4534 TRANS(vslei_b, LSX, do_vslei_s, MO_8)
4535 TRANS(vslei_h, LSX, do_vslei_s, MO_16)
4536 TRANS(vslei_w, LSX, do_vslei_s, MO_32)
4537 TRANS(vslei_d, LSX, do_vslei_s, MO_64)
4538 TRANS(vsle_bu, LSX, do_cmp, MO_8, TCG_COND_LEU)
4539 TRANS(vsle_hu, LSX, do_cmp, MO_16, TCG_COND_LEU)
4540 TRANS(vsle_wu, LSX, do_cmp, MO_32, TCG_COND_LEU)
4541 TRANS(vsle_du, LSX, do_cmp, MO_64, TCG_COND_LEU)
4542 TRANS(vslei_bu, LSX, do_vslei_u, MO_8)
4543 TRANS(vslei_hu, LSX, do_vslei_u, MO_16)
4544 TRANS(vslei_wu, LSX, do_vslei_u, MO_32)
4545 TRANS(vslei_du, LSX, do_vslei_u, MO_64)
4547 TRANS(vslt_b, LSX, do_cmp, MO_8, TCG_COND_LT)
4548 TRANS(vslt_h, LSX, do_cmp, MO_16, TCG_COND_LT)
4549 TRANS(vslt_w, LSX, do_cmp, MO_32, TCG_COND_LT)
4550 TRANS(vslt_d, LSX, do_cmp, MO_64, TCG_COND_LT)
4551 TRANS(vslti_b, LSX, do_vslti_s, MO_8)
4552 TRANS(vslti_h, LSX, do_vslti_s, MO_16)
4553 TRANS(vslti_w, LSX, do_vslti_s, MO_32)
4554 TRANS(vslti_d, LSX, do_vslti_s, MO_64)
4555 TRANS(vslt_bu, LSX, do_cmp, MO_8, TCG_COND_LTU)
4556 TRANS(vslt_hu, LSX, do_cmp, MO_16, TCG_COND_LTU)
4557 TRANS(vslt_wu, LSX, do_cmp, MO_32, TCG_COND_LTU)
4558 TRANS(vslt_du, LSX, do_cmp, MO_64, TCG_COND_LTU)
4559 TRANS(vslti_bu, LSX, do_vslti_u, MO_8)
4560 TRANS(vslti_hu, LSX, do_vslti_u, MO_16)
4561 TRANS(vslti_wu, LSX, do_vslti_u, MO_32)
4562 TRANS(vslti_du, LSX, do_vslti_u, MO_64)
4564 static bool trans_vfcmp_cond_s(DisasContext *ctx, arg_vvv_fcond *a)
4567 void (*fn)(TCGv_env, TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32);
4568 TCGv_i32 vd = tcg_constant_i32(a->vd);
4569 TCGv_i32 vj = tcg_constant_i32(a->vj);
4570 TCGv_i32 vk = tcg_constant_i32(a->vk);
4572 if (!avail_LSX(ctx)) {
4576 if (!check_vec(ctx, 16)) {
4580 fn = (a->fcond & 1 ? gen_helper_vfcmp_s_s : gen_helper_vfcmp_c_s);
4581 flags = get_fcmp_flags(a->fcond >> 1);
4582 fn(cpu_env, vd, vj, vk, tcg_constant_i32(flags));
4587 static bool trans_vfcmp_cond_d(DisasContext *ctx, arg_vvv_fcond *a)
4590 void (*fn)(TCGv_env, TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32);
4591 TCGv_i32 vd = tcg_constant_i32(a->vd);
4592 TCGv_i32 vj = tcg_constant_i32(a->vj);
4593 TCGv_i32 vk = tcg_constant_i32(a->vk);
4595 if (!avail_LSX(ctx)) {
4599 if (!check_vec(ctx, 16)) {
4603 fn = (a->fcond & 1 ? gen_helper_vfcmp_s_d : gen_helper_vfcmp_c_d);
4604 flags = get_fcmp_flags(a->fcond >> 1);
4605 fn(cpu_env, vd, vj, vk, tcg_constant_i32(flags));
4610 static bool trans_vbitsel_v(DisasContext *ctx, arg_vvvv *a)
4612 if (!avail_LSX(ctx)) {
4616 if (!check_vec(ctx, 16)) {
4620 tcg_gen_gvec_bitsel(MO_64, vec_full_offset(a->vd), vec_full_offset(a->va),
4621 vec_full_offset(a->vk), vec_full_offset(a->vj),
4626 static void gen_vbitseli(unsigned vece, TCGv_vec a, TCGv_vec b, int64_t imm)
4628 tcg_gen_bitsel_vec(vece, a, a, tcg_constant_vec_matching(a, vece, imm), b);
4631 static bool trans_vbitseli_b(DisasContext *ctx, arg_vv_i *a)
4633 static const GVecGen2i op = {
4634 .fniv = gen_vbitseli,
4635 .fnoi = gen_helper_vbitseli_b,
4640 if (!avail_LSX(ctx)) {
4644 if (!check_vec(ctx, 16)) {
4648 tcg_gen_gvec_2i(vec_full_offset(a->vd), vec_full_offset(a->vj),
4649 16, ctx->vl/8, a->imm, &op);
4653 #define VSET(NAME, COND) \
4654 static bool trans_## NAME (DisasContext *ctx, arg_cv *a) \
4656 TCGv_i64 t1, al, ah; \
4658 al = tcg_temp_new_i64(); \
4659 ah = tcg_temp_new_i64(); \
4660 t1 = tcg_temp_new_i64(); \
4662 get_vreg64(ah, a->vj, 1); \
4663 get_vreg64(al, a->vj, 0); \
4665 if (!avail_LSX(ctx)) { \
4669 if (!check_vec(ctx, 16)) { \
4673 tcg_gen_or_i64(t1, al, ah); \
4674 tcg_gen_setcondi_i64(COND, t1, t1, 0); \
4675 tcg_gen_st8_tl(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); \
4680 VSET(vseteqz_v, TCG_COND_EQ)
4681 VSET(vsetnez_v, TCG_COND_NE)
4683 TRANS(vsetanyeqz_b, LSX, gen_cv, gen_helper_vsetanyeqz_b)
4684 TRANS(vsetanyeqz_h, LSX, gen_cv, gen_helper_vsetanyeqz_h)
4685 TRANS(vsetanyeqz_w, LSX, gen_cv, gen_helper_vsetanyeqz_w)
4686 TRANS(vsetanyeqz_d, LSX, gen_cv, gen_helper_vsetanyeqz_d)
4687 TRANS(vsetallnez_b, LSX, gen_cv, gen_helper_vsetallnez_b)
4688 TRANS(vsetallnez_h, LSX, gen_cv, gen_helper_vsetallnez_h)
4689 TRANS(vsetallnez_w, LSX, gen_cv, gen_helper_vsetallnez_w)
4690 TRANS(vsetallnez_d, LSX, gen_cv, gen_helper_vsetallnez_d)
4692 static bool trans_vinsgr2vr_b(DisasContext *ctx, arg_vr_i *a)
4694 TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
4696 if (!avail_LSX(ctx)) {
4700 if (!check_vec(ctx, 16)) {
4704 tcg_gen_st8_i64(src, cpu_env,
4705 offsetof(CPULoongArchState, fpr[a->vd].vreg.B(a->imm)));
4709 static bool trans_vinsgr2vr_h(DisasContext *ctx, arg_vr_i *a)
4711 TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
4713 if (!avail_LSX(ctx)) {
4717 if (!check_vec(ctx, 16)) {
4721 tcg_gen_st16_i64(src, cpu_env,
4722 offsetof(CPULoongArchState, fpr[a->vd].vreg.H(a->imm)));
4726 static bool trans_vinsgr2vr_w(DisasContext *ctx, arg_vr_i *a)
4728 TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
4730 if (!avail_LSX(ctx)) {
4734 if (!check_vec(ctx, 16)) {
4738 tcg_gen_st32_i64(src, cpu_env,
4739 offsetof(CPULoongArchState, fpr[a->vd].vreg.W(a->imm)));
4743 static bool trans_vinsgr2vr_d(DisasContext *ctx, arg_vr_i *a)
4745 TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
4747 if (!avail_LSX(ctx)) {
4751 if (!check_vec(ctx, 16)) {
4755 tcg_gen_st_i64(src, cpu_env,
4756 offsetof(CPULoongArchState, fpr[a->vd].vreg.D(a->imm)));
4760 static bool trans_vpickve2gr_b(DisasContext *ctx, arg_rv_i *a)
4762 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4764 if (!avail_LSX(ctx)) {
4768 if (!check_vec(ctx, 16)) {
4772 tcg_gen_ld8s_i64(dst, cpu_env,
4773 offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
4777 static bool trans_vpickve2gr_h(DisasContext *ctx, arg_rv_i *a)
4779 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4781 if (!avail_LSX(ctx)) {
4785 if (!check_vec(ctx, 16)) {
4789 tcg_gen_ld16s_i64(dst, cpu_env,
4790 offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
4794 static bool trans_vpickve2gr_w(DisasContext *ctx, arg_rv_i *a)
4796 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4798 if (!avail_LSX(ctx)) {
4802 if (!check_vec(ctx, 16)) {
4806 tcg_gen_ld32s_i64(dst, cpu_env,
4807 offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
4811 static bool trans_vpickve2gr_d(DisasContext *ctx, arg_rv_i *a)
4813 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4815 if (!avail_LSX(ctx)) {
4819 if (!check_vec(ctx, 16)) {
4823 tcg_gen_ld_i64(dst, cpu_env,
4824 offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
4828 static bool trans_vpickve2gr_bu(DisasContext *ctx, arg_rv_i *a)
4830 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4832 if (!avail_LSX(ctx)) {
4836 if (!check_vec(ctx, 16)) {
4840 tcg_gen_ld8u_i64(dst, cpu_env,
4841 offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
4845 static bool trans_vpickve2gr_hu(DisasContext *ctx, arg_rv_i *a)
4847 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4849 if (!avail_LSX(ctx)) {
4853 if (!check_vec(ctx, 16)) {
4857 tcg_gen_ld16u_i64(dst, cpu_env,
4858 offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
4862 static bool trans_vpickve2gr_wu(DisasContext *ctx, arg_rv_i *a)
4864 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4866 if (!avail_LSX(ctx)) {
4870 if (!check_vec(ctx, 16)) {
4874 tcg_gen_ld32u_i64(dst, cpu_env,
4875 offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
4879 static bool trans_vpickve2gr_du(DisasContext *ctx, arg_rv_i *a)
4881 TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
4883 if (!avail_LSX(ctx)) {
4887 if (!check_vec(ctx, 16)) {
4891 tcg_gen_ld_i64(dst, cpu_env,
4892 offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
4896 static bool gvec_dup_vl(DisasContext *ctx, arg_vr *a,
4897 uint32_t oprsz, MemOp mop)
4899 TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
4901 if (!check_vec(ctx, oprsz)) {
4905 tcg_gen_gvec_dup_i64(mop, vec_full_offset(a->vd),
4906 oprsz, ctx->vl/8, src);
4910 static bool gvec_dup(DisasContext *ctx, arg_vr *a, MemOp mop)
4912 return gvec_dup_vl(ctx, a, 16, mop);
4915 static bool gvec_dupx(DisasContext *ctx, arg_vr *a, MemOp mop)
4917 return gvec_dup_vl(ctx, a, 32, mop);
4920 TRANS(vreplgr2vr_b, LSX, gvec_dup, MO_8)
4921 TRANS(vreplgr2vr_h, LSX, gvec_dup, MO_16)
4922 TRANS(vreplgr2vr_w, LSX, gvec_dup, MO_32)
4923 TRANS(vreplgr2vr_d, LSX, gvec_dup, MO_64)
4924 TRANS(xvreplgr2vr_b, LASX, gvec_dupx, MO_8)
4925 TRANS(xvreplgr2vr_h, LASX, gvec_dupx, MO_16)
4926 TRANS(xvreplgr2vr_w, LASX, gvec_dupx, MO_32)
4927 TRANS(xvreplgr2vr_d, LASX, gvec_dupx, MO_64)
4929 static bool trans_vreplvei_b(DisasContext *ctx, arg_vv_i *a)
4931 if (!avail_LSX(ctx)) {
4935 if (!check_vec(ctx, 16)) {
4939 tcg_gen_gvec_dup_mem(MO_8,vec_full_offset(a->vd),
4940 offsetof(CPULoongArchState,
4941 fpr[a->vj].vreg.B((a->imm))),
4946 static bool trans_vreplvei_h(DisasContext *ctx, arg_vv_i *a)
4948 if (!avail_LSX(ctx)) {
4952 if (!check_vec(ctx, 16)) {
4956 tcg_gen_gvec_dup_mem(MO_16, vec_full_offset(a->vd),
4957 offsetof(CPULoongArchState,
4958 fpr[a->vj].vreg.H((a->imm))),
4962 static bool trans_vreplvei_w(DisasContext *ctx, arg_vv_i *a)
4964 if (!avail_LSX(ctx)) {
4968 if (!check_vec(ctx, 16)) {
4972 tcg_gen_gvec_dup_mem(MO_32, vec_full_offset(a->vd),
4973 offsetof(CPULoongArchState,
4974 fpr[a->vj].vreg.W((a->imm))),
4978 static bool trans_vreplvei_d(DisasContext *ctx, arg_vv_i *a)
4980 if (!avail_LSX(ctx)) {
4984 if (!check_vec(ctx, 16)) {
4988 tcg_gen_gvec_dup_mem(MO_64, vec_full_offset(a->vd),
4989 offsetof(CPULoongArchState,
4990 fpr[a->vj].vreg.D((a->imm))),
4995 static bool gen_vreplve(DisasContext *ctx, arg_vvr *a, int vece, int bit,
4996 void (*func)(TCGv_i64, TCGv_ptr, tcg_target_long))
4998 TCGv_i64 t0 = tcg_temp_new_i64();
4999 TCGv_ptr t1 = tcg_temp_new_ptr();
5000 TCGv_i64 t2 = tcg_temp_new_i64();
5002 if (!avail_LSX(ctx)) {
5006 if (!check_vec(ctx, 16)) {
5010 tcg_gen_andi_i64(t0, gpr_src(ctx, a->rk, EXT_NONE), (LSX_LEN/bit) -1);
5011 tcg_gen_shli_i64(t0, t0, vece);
5012 if (HOST_BIG_ENDIAN) {
5013 tcg_gen_xori_i64(t0, t0, vece << ((LSX_LEN/bit) -1));
5016 tcg_gen_trunc_i64_ptr(t1, t0);
5017 tcg_gen_add_ptr(t1, t1, cpu_env);
5018 func(t2, t1, vec_full_offset(a->vj));
5019 tcg_gen_gvec_dup_i64(vece, vec_full_offset(a->vd), 16, ctx->vl/8, t2);
5024 TRANS(vreplve_b, LSX, gen_vreplve, MO_8, 8, tcg_gen_ld8u_i64)
5025 TRANS(vreplve_h, LSX, gen_vreplve, MO_16, 16, tcg_gen_ld16u_i64)
5026 TRANS(vreplve_w, LSX, gen_vreplve, MO_32, 32, tcg_gen_ld32u_i64)
5027 TRANS(vreplve_d, LSX, gen_vreplve, MO_64, 64, tcg_gen_ld_i64)
5029 static bool trans_vbsll_v(DisasContext *ctx, arg_vv_i *a)
5032 TCGv_i64 desthigh, destlow, high, low;
5034 if (!avail_LSX(ctx)) {
5038 if (!check_vec(ctx, 16)) {
5042 desthigh = tcg_temp_new_i64();
5043 destlow = tcg_temp_new_i64();
5044 high = tcg_temp_new_i64();
5045 low = tcg_temp_new_i64();
5047 get_vreg64(low, a->vj, 0);
5049 ofs = ((a->imm) & 0xf) * 8;
5051 get_vreg64(high, a->vj, 1);
5052 tcg_gen_extract2_i64(desthigh, low, high, 64 - ofs);
5053 tcg_gen_shli_i64(destlow, low, ofs);
5055 tcg_gen_shli_i64(desthigh, low, ofs - 64);
5056 destlow = tcg_constant_i64(0);
5059 set_vreg64(desthigh, a->vd, 1);
5060 set_vreg64(destlow, a->vd, 0);
5065 static bool trans_vbsrl_v(DisasContext *ctx, arg_vv_i *a)
5067 TCGv_i64 desthigh, destlow, high, low;
5070 if (!avail_LSX(ctx)) {
5074 if (!check_vec(ctx, 16)) {
5078 desthigh = tcg_temp_new_i64();
5079 destlow = tcg_temp_new_i64();
5080 high = tcg_temp_new_i64();
5081 low = tcg_temp_new_i64();
5083 get_vreg64(high, a->vj, 1);
5085 ofs = ((a->imm) & 0xf) * 8;
5087 get_vreg64(low, a->vj, 0);
5088 tcg_gen_extract2_i64(destlow, low, high, ofs);
5089 tcg_gen_shri_i64(desthigh, high, ofs);
5091 tcg_gen_shri_i64(destlow, high, ofs - 64);
5092 desthigh = tcg_constant_i64(0);
5095 set_vreg64(desthigh, a->vd, 1);
5096 set_vreg64(destlow, a->vd, 0);
5101 TRANS(vpackev_b, LSX, gen_vvv, gen_helper_vpackev_b)
5102 TRANS(vpackev_h, LSX, gen_vvv, gen_helper_vpackev_h)
5103 TRANS(vpackev_w, LSX, gen_vvv, gen_helper_vpackev_w)
5104 TRANS(vpackev_d, LSX, gen_vvv, gen_helper_vpackev_d)
5105 TRANS(vpackod_b, LSX, gen_vvv, gen_helper_vpackod_b)
5106 TRANS(vpackod_h, LSX, gen_vvv, gen_helper_vpackod_h)
5107 TRANS(vpackod_w, LSX, gen_vvv, gen_helper_vpackod_w)
5108 TRANS(vpackod_d, LSX, gen_vvv, gen_helper_vpackod_d)
5110 TRANS(vpickev_b, LSX, gen_vvv, gen_helper_vpickev_b)
5111 TRANS(vpickev_h, LSX, gen_vvv, gen_helper_vpickev_h)
5112 TRANS(vpickev_w, LSX, gen_vvv, gen_helper_vpickev_w)
5113 TRANS(vpickev_d, LSX, gen_vvv, gen_helper_vpickev_d)
5114 TRANS(vpickod_b, LSX, gen_vvv, gen_helper_vpickod_b)
5115 TRANS(vpickod_h, LSX, gen_vvv, gen_helper_vpickod_h)
5116 TRANS(vpickod_w, LSX, gen_vvv, gen_helper_vpickod_w)
5117 TRANS(vpickod_d, LSX, gen_vvv, gen_helper_vpickod_d)
5119 TRANS(vilvl_b, LSX, gen_vvv, gen_helper_vilvl_b)
5120 TRANS(vilvl_h, LSX, gen_vvv, gen_helper_vilvl_h)
5121 TRANS(vilvl_w, LSX, gen_vvv, gen_helper_vilvl_w)
5122 TRANS(vilvl_d, LSX, gen_vvv, gen_helper_vilvl_d)
5123 TRANS(vilvh_b, LSX, gen_vvv, gen_helper_vilvh_b)
5124 TRANS(vilvh_h, LSX, gen_vvv, gen_helper_vilvh_h)
5125 TRANS(vilvh_w, LSX, gen_vvv, gen_helper_vilvh_w)
5126 TRANS(vilvh_d, LSX, gen_vvv, gen_helper_vilvh_d)
5128 TRANS(vshuf_b, LSX, gen_vvvv, gen_helper_vshuf_b)
5129 TRANS(vshuf_h, LSX, gen_vvv, gen_helper_vshuf_h)
5130 TRANS(vshuf_w, LSX, gen_vvv, gen_helper_vshuf_w)
5131 TRANS(vshuf_d, LSX, gen_vvv, gen_helper_vshuf_d)
5132 TRANS(vshuf4i_b, LSX, gen_vv_i, gen_helper_vshuf4i_b)
5133 TRANS(vshuf4i_h, LSX, gen_vv_i, gen_helper_vshuf4i_h)
5134 TRANS(vshuf4i_w, LSX, gen_vv_i, gen_helper_vshuf4i_w)
5135 TRANS(vshuf4i_d, LSX, gen_vv_i, gen_helper_vshuf4i_d)
5137 TRANS(vpermi_w, LSX, gen_vv_i, gen_helper_vpermi_w)
5139 TRANS(vextrins_b, LSX, gen_vv_i, gen_helper_vextrins_b)
5140 TRANS(vextrins_h, LSX, gen_vv_i, gen_helper_vextrins_h)
5141 TRANS(vextrins_w, LSX, gen_vv_i, gen_helper_vextrins_w)
5142 TRANS(vextrins_d, LSX, gen_vv_i, gen_helper_vextrins_d)
5144 static bool trans_vld(DisasContext *ctx, arg_vr_i *a)
5150 if (!avail_LSX(ctx)) {
5154 if (!check_vec(ctx, 16)) {
5158 addr = gpr_src(ctx, a->rj, EXT_NONE);
5159 val = tcg_temp_new_i128();
5160 rl = tcg_temp_new_i64();
5161 rh = tcg_temp_new_i64();
5163 addr = make_address_i(ctx, addr, a->imm);
5165 tcg_gen_qemu_ld_i128(val, addr, ctx->mem_idx, MO_128 | MO_TE);
5166 tcg_gen_extr_i128_i64(rl, rh, val);
5167 set_vreg64(rh, a->vd, 1);
5168 set_vreg64(rl, a->vd, 0);
5173 static bool trans_vst(DisasContext *ctx, arg_vr_i *a)
5179 if (!avail_LSX(ctx)) {
5183 if (!check_vec(ctx, 16)) {
5187 addr = gpr_src(ctx, a->rj, EXT_NONE);
5188 val = tcg_temp_new_i128();
5189 ah = tcg_temp_new_i64();
5190 al = tcg_temp_new_i64();
5192 addr = make_address_i(ctx, addr, a->imm);
5194 get_vreg64(ah, a->vd, 1);
5195 get_vreg64(al, a->vd, 0);
5196 tcg_gen_concat_i64_i128(val, al, ah);
5197 tcg_gen_qemu_st_i128(val, addr, ctx->mem_idx, MO_128 | MO_TE);
5202 static bool trans_vldx(DisasContext *ctx, arg_vrr *a)
5204 TCGv addr, src1, src2;
5208 if (!avail_LSX(ctx)) {
5212 if (!check_vec(ctx, 16)) {
5216 src1 = gpr_src(ctx, a->rj, EXT_NONE);
5217 src2 = gpr_src(ctx, a->rk, EXT_NONE);
5218 val = tcg_temp_new_i128();
5219 rl = tcg_temp_new_i64();
5220 rh = tcg_temp_new_i64();
5222 addr = make_address_x(ctx, src1, src2);
5223 tcg_gen_qemu_ld_i128(val, addr, ctx->mem_idx, MO_128 | MO_TE);
5224 tcg_gen_extr_i128_i64(rl, rh, val);
5225 set_vreg64(rh, a->vd, 1);
5226 set_vreg64(rl, a->vd, 0);
5231 static bool trans_vstx(DisasContext *ctx, arg_vrr *a)
5233 TCGv addr, src1, src2;
5237 if (!avail_LSX(ctx)) {
5241 if (!check_vec(ctx, 16)) {
5245 src1 = gpr_src(ctx, a->rj, EXT_NONE);
5246 src2 = gpr_src(ctx, a->rk, EXT_NONE);
5247 val = tcg_temp_new_i128();
5248 ah = tcg_temp_new_i64();
5249 al = tcg_temp_new_i64();
5251 addr = make_address_x(ctx, src1, src2);
5252 get_vreg64(ah, a->vd, 1);
5253 get_vreg64(al, a->vd, 0);
5254 tcg_gen_concat_i64_i128(val, al, ah);
5255 tcg_gen_qemu_st_i128(val, addr, ctx->mem_idx, MO_128 | MO_TE);
5260 #define VLDREPL(NAME, MO) \
5261 static bool trans_## NAME (DisasContext *ctx, arg_vr_i *a) \
5266 if (!avail_LSX(ctx)) { \
5270 if (!check_vec(ctx, 16)) { \
5274 addr = gpr_src(ctx, a->rj, EXT_NONE); \
5275 val = tcg_temp_new_i64(); \
5277 addr = make_address_i(ctx, addr, a->imm); \
5279 tcg_gen_qemu_ld_i64(val, addr, ctx->mem_idx, MO); \
5280 tcg_gen_gvec_dup_i64(MO, vec_full_offset(a->vd), 16, ctx->vl/8, val); \
5285 VLDREPL(vldrepl_b, MO_8)
5286 VLDREPL(vldrepl_h, MO_16)
5287 VLDREPL(vldrepl_w, MO_32)
5288 VLDREPL(vldrepl_d, MO_64)
5290 #define VSTELM(NAME, MO, E) \
5291 static bool trans_## NAME (DisasContext *ctx, arg_vr_ii *a) \
5296 if (!avail_LSX(ctx)) { \
5300 if (!check_vec(ctx, 16)) { \
5304 addr = gpr_src(ctx, a->rj, EXT_NONE); \
5305 val = tcg_temp_new_i64(); \
5307 addr = make_address_i(ctx, addr, a->imm); \
5309 tcg_gen_ld_i64(val, cpu_env, \
5310 offsetof(CPULoongArchState, fpr[a->vd].vreg.E(a->imm2))); \
5311 tcg_gen_qemu_st_i64(val, addr, ctx->mem_idx, MO); \
5316 VSTELM(vstelm_b, MO_8, B)
5317 VSTELM(vstelm_h, MO_16, H)
5318 VSTELM(vstelm_w, MO_32, W)
5319 VSTELM(vstelm_d, MO_64, D)