@samitouri / QOSamiQemu / commits / d558d05f60

target/ppc: convert slw, srw instruction via decode spec

Move slw and srw to decodetree specification using the @X_rc format. The existing shift-masking logic from gen_slw/gen_srw is preserved verbatim in the new trans_SLW/trans_SRW handlers. Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com> Reviewed-by: Glenn Miles <milesg@linux.ibm.com> Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com> Signed-off-by: Chinmay Rath <rathc@linux.ibm.com> Tested-by: Aniket Sahu <asahu1x@linux.ibm.com> Link: https://lore.kernel.org/qemu-devel/20260827133010.278889-8-rathc@linux.ibm.com Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

Mukesh Kumar Chaurasiya (IBM) committed Aug 27, 2026 at 18:59 UTC d558d05f600ee8f2c1e28e6b6699e36e9bccb8c0
3 files changed +53 -49
target/ppc/insn32.decode
+5
@@ -505,6 +505,11 @@ HASHCHK 011111 ..... ..... ..... 1011110010 . @X_DW
505 HASHSTP 011111 ..... ..... ..... 1010010010 . @X_DW
506 HASHCHKP 011111 ..... ..... ..... 1010110010 . @X_DW
507
508 +# Fixed-Point Shift Instructions
509 +
510 +SLW 011111 ..... ..... ..... 0000011000 . @X_rc
511 +SRW 011111 ..... ..... ..... 1000011000 . @X_rc
512 +
513 ## BCD Assist
514
515 ADDG6S 011111 ..... ..... ..... - 001001010 - @X
target/ppc/translate.c
-49
@@ -2315,29 +2315,6 @@ GEN_PPC64_R4(rldimi, 0x1E, 0x06);
2315
2316 /*** Integer shift ***/
2317
2318 -/* slw & slw. */
2319 -static void gen_slw(DisasContext *ctx)
2320 -{
2321 - TCGv t0, t1;
2322 -
2323 - t0 = tcg_temp_new();
2324 - /* AND rS with a mask that is 0 when rB >= 0x20 */
2325 -#if defined(TARGET_PPC64)
2326 - tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3a);
2327 - tcg_gen_sari_tl(t0, t0, 0x3f);
2328 -#else
2329 - tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1a);
2330 - tcg_gen_sari_tl(t0, t0, 0x1f);
2331 -#endif
2332 - tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
2333 - t1 = tcg_temp_new();
2334 - tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f);
2335 - tcg_gen_shl_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
2336 - tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
2337 - if (unlikely(Rc(ctx->opcode) != 0)) {
2338 - gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2339 - }
2340 -}
2318
2319 /* sraw & sraw. */
2320 static void gen_sraw(DisasContext *ctx)
@@ -2379,30 +2356,6 @@ static void gen_srawi(DisasContext *ctx)
2356 }
2357 }
2358
2382 -/* srw & srw. */
2383 -static void gen_srw(DisasContext *ctx)
2384 -{
2385 - TCGv t0, t1;
2386 -
2387 - t0 = tcg_temp_new();
2388 - /* AND rS with a mask that is 0 when rB >= 0x20 */
2389 -#if defined(TARGET_PPC64)
2390 - tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3a);
2391 - tcg_gen_sari_tl(t0, t0, 0x3f);
2392 -#else
2393 - tcg_gen_shli_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1a);
2394 - tcg_gen_sari_tl(t0, t0, 0x1f);
2395 -#endif
2396 - tcg_gen_andc_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
2397 - tcg_gen_ext32u_tl(t0, t0);
2398 - t1 = tcg_temp_new();
2399 - tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f);
2400 - tcg_gen_shr_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
2401 - if (unlikely(Rc(ctx->opcode) != 0)) {
2402 - gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
2403 - }
2404 -}
2405 -
2359 #if defined(TARGET_PPC64)
2360 /* sld & sld. */
2361 static void gen_sld(DisasContext *ctx)
@@ -5764,10 +5717,8 @@ GEN_HANDLER_E(paste, 0x1F, 0x06, 0x1C, 0x03C00000, PPC_NONE, PPC2_ISA300),
5717 GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
5718 GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
5719 GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
5767 -GEN_HANDLER(slw, 0x1F, 0x18, 0x00, 0x00000000, PPC_INTEGER),
5720 GEN_HANDLER(sraw, 0x1F, 0x18, 0x18, 0x00000000, PPC_INTEGER),
5721 GEN_HANDLER(srawi, 0x1F, 0x18, 0x19, 0x00000000, PPC_INTEGER),
5770 -GEN_HANDLER(srw, 0x1F, 0x18, 0x10, 0x00000000, PPC_INTEGER),
5722 #if defined(TARGET_PPC64)
5723 GEN_HANDLER(sld, 0x1F, 0x1B, 0x00, 0x00000000, PPC_64B),
5724 GEN_HANDLER(srad, 0x1F, 0x1A, 0x18, 0x00000000, PPC_64B),
target/ppc/translate/fixedpoint-impl.c.inc
+48
@@ -1406,3 +1406,51 @@ TRANS(HASHST, do_hash, false, gen_helper_HASHST)
1406 TRANS(HASHCHK, do_hash, false, gen_helper_HASHCHK)
1407 TRANS(HASHSTP, do_hash, true, gen_helper_HASHSTP)
1408 TRANS(HASHCHKP, do_hash, true, gen_helper_HASHCHKP)
1409 +
1410 +static bool trans_SLW(DisasContext *ctx, arg_SLW *a)
1411 +{
1412 + TCGv t0, t1;
1413 +
1414 + t0 = tcg_temp_new();
1415 + /* AND rt with a mask that is 0 when rB >= 0x20 */
1416 +#if defined(TARGET_PPC64)
1417 + tcg_gen_shli_tl(t0, cpu_gpr[a->rb], 0x3a);
1418 + tcg_gen_sari_tl(t0, t0, 0x3f);
1419 +#else
1420 + tcg_gen_shli_tl(t0, cpu_gpr[a->rb], 0x1a);
1421 + tcg_gen_sari_tl(t0, t0, 0x1f);
1422 +#endif
1423 + tcg_gen_andc_tl(t0, cpu_gpr[a->rt], t0);
1424 + t1 = tcg_temp_new();
1425 + tcg_gen_andi_tl(t1, cpu_gpr[a->rb], 0x1f);
1426 + tcg_gen_shl_tl(cpu_gpr[a->ra], t0, t1);
1427 + tcg_gen_ext32u_tl(cpu_gpr[a->ra], cpu_gpr[a->ra]);
1428 + if (unlikely(a->rc)) {
1429 + gen_set_Rc0(ctx, cpu_gpr[a->ra]);
1430 + }
1431 + return true;
1432 +}
1433 +
1434 +static bool trans_SRW(DisasContext *ctx, arg_SRW *a)
1435 +{
1436 + TCGv t0, t1;
1437 +
1438 + t0 = tcg_temp_new();
1439 + /* AND rt with a mask that is 0 when rB >= 0x20 */
1440 +#if defined(TARGET_PPC64)
1441 + tcg_gen_shli_tl(t0, cpu_gpr[a->rb], 0x3a);
1442 + tcg_gen_sari_tl(t0, t0, 0x3f);
1443 +#else
1444 + tcg_gen_shli_tl(t0, cpu_gpr[a->rb], 0x1a);
1445 + tcg_gen_sari_tl(t0, t0, 0x1f);
1446 +#endif
1447 + tcg_gen_andc_tl(t0, cpu_gpr[a->rt], t0);
1448 + tcg_gen_ext32u_tl(t0, t0);
1449 + t1 = tcg_temp_new();
1450 + tcg_gen_andi_tl(t1, cpu_gpr[a->rb], 0x1f);
1451 + tcg_gen_shr_tl(cpu_gpr[a->ra], t0, t1);
1452 + if (unlikely(a->rc)) {
1453 + gen_set_Rc0(ctx, cpu_gpr[a->ra]);
1454 + }
1455 + return true;
1456 +}