summaryrefslogtreecommitdiffstats
path: root/target/mips/tcg/tx79_translate.c
diff options
context:
space:
mode:
authorPhilippe Mathieu-Daudé2021-02-13 14:58:18 +0100
committerPhilippe Mathieu-Daudé2021-07-11 22:29:54 +0200
commitaaaa82a9f9975c59b72debb22bc92b8e1ab4ab10 (patch)
tree032a2b9083438c00e507d16eedff43028f67fee1 /target/mips/tcg/tx79_translate.c
parenttarget/mips/tx79: Introduce PROT3W opcode (Parallel Rotate 3 Words) (diff)
downloadqemu-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.c35
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)
* -------------------------------------