On 11/5/26 20:22, James Hilliard wrote:
ZCB zeros the 128-byte cache block containing the base address.
Model the user-mode-visible effect by aligning the address down to a
128-byte line and storing sixteen zero doublewords to guest memory.
Acked-by: Richard Henderson <[email protected]>
Signed-off-by: James Hilliard <[email protected]>
---
Changes v2 -> v3:
- Split ZCB out of the combined Octeon arithmetic and memory
instruction patch. (requested by Richard Henderson)
---
target/mips/tcg/octeon.decode | 3 +++
target/mips/tcg/octeon_translate.c | 24 ++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode
index d77717cd50..d8a1bfce77 100644
--- a/target/mips/tcg/octeon.decode
+++ b/target/mips/tcg/octeon.decode
@@ -49,6 +49,9 @@ SNEI 011100 rs:5 rt:5 imm:s10 101111 &cmpi
SAA 011100 ..... ..... 00000 00000 011000 @saa
SAAD 011100 ..... ..... 00000 00000 011001 @saa
+&zcb base
+ZCB 011100 base:5 00000 00000 11100 011111 &zcb
+
&lx base index rd
@lx ...... base:5 index:5 rd:5 ...... ..... &lx
LWX 011111 ..... ..... ..... 00000 001010 @lx
diff --git a/target/mips/tcg/octeon_translate.c
b/target/mips/tcg/octeon_translate.c
index daeaf07072..75b28c4338 100644
--- a/target/mips/tcg/octeon_translate.c
+++ b/target/mips/tcg/octeon_translate.c
@@ -174,6 +174,30 @@ static bool trans_saa(DisasContext *ctx, arg_saa *a, MemOp
mop)
return true;
}
+static bool trans_ZCB(DisasContext *ctx, arg_ZCB *a)
+{
+ TCGv_i64 addr = tcg_temp_new_i64();
+ TCGv_i64 line = tcg_temp_new_i64();
+ TCGv_i64 zero = tcg_constant_i64(0);
Could it be more effective to use TCGv_i128 zero?
+
+ gen_base_offset_addr(ctx, addr, a->base, 0);
+
+ /*
+ * QEMU models ZCB/ZCBT as zeroing the containing 128-byte cache line
+ * in guest memory.
+ */
+ tcg_gen_andi_i64(line, addr, ~0x7fULL);
+
+ for (int i = 0; i < 16; i++) {
+ TCGv_i64 slot = tcg_temp_new_i64();
+
+ tcg_gen_addi_i64(slot, line, i * 8);
+ tcg_gen_qemu_st_i64(zero, slot, ctx->mem_idx, mo_endian(ctx) | MO_UQ);
s/MO_UQ/MO_$bits/
+ }
+
+ return true;
+}
+
TRANS(SAA, trans_saa, MO_UL);
TRANS(SAAD, trans_saa, MO_UQ);
TRANS(LBX, trans_lx, MO_SB);