@samitouri / QOSamiQemu / commits / c56ebd64b8

tcg/loongarch64: Fix cmp_vec with TCG_COND_NE

For NE we need to invert EQ, not swap operands. Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3589 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260623140609.645445-1-richard.henderson@linaro.org>

Richard Henderson committed Jun 23, 2026 at 07:06 UTC c56ebd64b82aa4d4a4e2144abbf9568ef593b836
1 file changed +28 -11
tcg/loongarch64/tcg-target.c.inc
+28 -11
@@ -2371,19 +2371,36 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
2371 default:
2372 g_assert_not_reached();
2373 }
2374 - break;
2375 - }
2376 -
2377 - insn = cmp_vec_insn[cond][lasx][vece];
2378 - if (insn == 0) {
2379 - TCGArg t;
2380 - t = a1, a1 = a2, a2 = t;
2381 - cond = tcg_swap_cond(cond);
2382 - insn = cmp_vec_insn[cond][lasx][vece];
2383 - tcg_debug_assert(insn != 0);
2374 + } else {
2375 + switch (cond) {
2376 + case TCG_COND_EQ:
2377 + case TCG_COND_LE:
2378 + case TCG_COND_LEU:
2379 + case TCG_COND_LT:
2380 + case TCG_COND_LTU:
2381 + insn = cmp_vec_insn[cond][lasx][vece];
2382 + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a1, a2));
2383 + break;
2384 + case TCG_COND_GE:
2385 + case TCG_COND_GEU:
2386 + case TCG_COND_GT:
2387 + case TCG_COND_GTU:
2388 + insn = cmp_vec_insn[tcg_swap_cond(cond)][lasx][vece];
2389 + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a2, a1));
2390 + break;
2391 + case TCG_COND_NE:
2392 + /* ne -> not(eq) */
2393 + insn = cmp_vec_insn[TCG_COND_EQ][lasx][vece];
2394 + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a1, a2));
2395 + insn = lasx ? OPC_XVNOR_V : OPC_VNOR_V;
2396 + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a0, a0));
2397 + break;
2398 + default:
2399 + g_assert_not_reached();
2400 + }
2401 }
2402 }
2386 - goto vdvjvk;
2403 + break;
2404 case INDEX_op_add_vec:
2405 tcg_out_addsub_vec(s, lasx, vece, a0, a1, a2, const_args[2], true);
2406 break;