aboutsummaryrefslogtreecommitdiff
path: root/target/loongarch
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2023-01-17 14:54:50 -1000
committerRichard Henderson <richard.henderson@linaro.org>2023-01-23 15:36:36 -1000
commit69c9a5cfbedcaebfb0deddb5278a289629b78af5 (patch)
tree685a660baa4bfb098eb426b6afe868a6f65fe769 /target/loongarch
parentc2b618a8c1acb899b56eb8b2f1354da1f69474ea (diff)
downloadqemu-69c9a5cfbedcaebfb0deddb5278a289629b78af5.zip
qemu-69c9a5cfbedcaebfb0deddb5278a289629b78af5.tar.gz
qemu-69c9a5cfbedcaebfb0deddb5278a289629b78af5.tar.bz2
target/loongarch: Disassemble pcadd* addresses
Print both the raw field and the resolved pc-relative address, as we do for branches. Reviewed-by: WANG Xuerui <git@xen0n.name> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'target/loongarch')
-rw-r--r--target/loongarch/disas.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/target/loongarch/disas.c b/target/loongarch/disas.c
index 7cffd85..2e93e77 100644
--- a/target/loongarch/disas.c
+++ b/target/loongarch/disas.c
@@ -519,10 +519,6 @@ INSN(fsel, fffc)
INSN(addu16i_d, rr_i)
INSN(lu12i_w, r_i)
INSN(lu32i_d, r_i)
-INSN(pcaddi, r_i)
-INSN(pcalau12i, r_i)
-INSN(pcaddu12i, r_i)
-INSN(pcaddu18i, r_i)
INSN(ll_w, rr_i)
INSN(sc_w, rr_i)
INSN(ll_d, rr_i)
@@ -755,3 +751,36 @@ static bool trans_fcmp_cond_##suffix(DisasContext *ctx, \
FCMP_INSN(s)
FCMP_INSN(d)
+
+#define PCADD_INSN(name) \
+static bool trans_##name(DisasContext *ctx, arg_##name *a) \
+{ \
+ output(ctx, #name, "r%d, %d # 0x%" PRIx64, \
+ a->rd, a->imm, gen_##name(ctx->pc, a->imm)); \
+ return true; \
+}
+
+static uint64_t gen_pcaddi(uint64_t pc, int imm)
+{
+ return pc + (imm << 2);
+}
+
+static uint64_t gen_pcalau12i(uint64_t pc, int imm)
+{
+ return (pc + (imm << 12)) & ~0xfff;
+}
+
+static uint64_t gen_pcaddu12i(uint64_t pc, int imm)
+{
+ return pc + (imm << 12);
+}
+
+static uint64_t gen_pcaddu18i(uint64_t pc, int imm)
+{
+ return pc + ((uint64_t)(imm) << 18);
+}
+
+PCADD_INSN(pcaddi)
+PCADD_INSN(pcalau12i)
+PCADD_INSN(pcaddu12i)
+PCADD_INSN(pcaddu18i)