diff options
author | Philippe Mathieu-Daudé | 2021-02-13 14:58:18 +0100 |
---|---|---|
committer | Philippe Mathieu-Daudé | 2021-07-11 22:29:54 +0200 |
commit | aaaa82a9f9975c59b72debb22bc92b8e1ab4ab10 (patch) | |
tree | 032a2b9083438c00e507d16eedff43028f67fee1 /target/mips/tcg/tx79_translate.c | |
parent | target/mips/tx79: Introduce PROT3W opcode (Parallel Rotate 3 Words) (diff) | |
download | qemu-aaaa82a9f9975c59b72debb22bc92b8e1ab4ab10.tar.gz qemu-aaaa82a9f9975c59b72debb22bc92b8e1ab4ab10.tar.xz qemu-aaaa82a9f9975c59b72debb22bc92b8e1ab4ab10.zip |
target/mips/tx79: Introduce LQ opcode (Load Quadword)
Introduce the LQ opcode (Load Quadword) and remove unreachable code.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210214175912.732946-26-f4bug@amsat.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Diffstat (limited to 'target/mips/tcg/tx79_translate.c')
-rw-r--r-- | target/mips/tcg/tx79_translate.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/target/mips/tcg/tx79_translate.c b/target/mips/tcg/tx79_translate.c index 402790249f..d9193b4d86 100644 --- a/target/mips/tcg/tx79_translate.c +++ b/target/mips/tcg/tx79_translate.c @@ -334,6 +334,41 @@ static bool trans_PCEQW(DisasContext *ctx, arg_rtype *a) * SQ rt, offset(base) Store Quadword */ +static bool trans_LQ(DisasContext *ctx, arg_itype *a) +{ + TCGv_i64 t0; + TCGv addr; + + if (a->rt == 0) { + /* nop */ + return true; + } + + t0 = tcg_temp_new_i64(); + addr = tcg_temp_new(); + + gen_base_offset_addr(ctx, addr, a->base, a->offset); + /* + * Clear least-significant four bits of the effective + * address, effectively creating an aligned address. + */ + tcg_gen_andi_tl(addr, addr, ~0xf); + + /* Lower half */ + tcg_gen_qemu_ld_i64(t0, addr, ctx->mem_idx, MO_TEQ); + gen_store_gpr(t0, a->rt); + + /* Upper half */ + tcg_gen_addi_i64(addr, addr, 8); + tcg_gen_qemu_ld_i64(t0, addr, ctx->mem_idx, MO_TEQ); + gen_store_gpr_hi(t0, a->rt); + + tcg_temp_free(t0); + tcg_temp_free(addr); + + return true; +} + /* * Multiply and Divide (19 instructions) * ------------------------------------- |