From: James Hilliard <[email protected]> ZCB zeros the 128-byte cache block containing the base address. ZCBT has the same user-mode-visible memory effect for QEMU purposes.
Model both forms with a single decodetree wildcard entry, align the address down to a 128-byte line, and store eight zero 128-bit chunks to guest memory. Acked-by: Richard Henderson <[email protected]> Signed-off-by: James Hilliard <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- target/mips/tcg/octeon.decode | 3 +++ target/mips/tcg/octeon_translate.c | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/target/mips/tcg/octeon.decode b/target/mips/tcg/octeon.decode index d77717cd507..01ed3b50beb 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 1110- 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 23748695a14..5392fed08a8 100644 --- a/target/mips/tcg/octeon_translate.c +++ b/target/mips/tcg/octeon_translate.c @@ -184,3 +184,28 @@ static bool trans_saa(DisasContext *ctx, arg_saa *a, MemOp mop) TRANS(SAA, trans_saa, MO_32); TRANS(SAAD, trans_saa, MO_64); + +static bool trans_ZCB(DisasContext *ctx, arg_ZCB *a) +{ + TCGv_i64 addr = tcg_temp_new_i64(); + TCGv_i64 line = tcg_temp_new_i64(); + TCGv_i128 zero128 = tcg_zero_i128(); + const MemOp mop = mo_endian(ctx) | MO_128 | MO_ATOM_NONE; + + 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 < 8; i++) { + TCGv_i64 slot = tcg_temp_new_i64(); + + tcg_gen_addi_i64(slot, line, i * 16); + tcg_gen_qemu_st_i128(zero128, slot, ctx->mem_idx, mop); + } + + return true; +} -- 2.53.0
