qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v5 3/9] target/arm: Change gen_*set_pc_im to gen_*update_pc


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH v5 3/9] target/arm: Change gen_*set_pc_im to gen_*update_pc
Date: Mon, 3 Oct 2022 16:18:50 +0200
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.13.1

On 1/10/22 00:03, Richard Henderson wrote:
In preparation for TARGET_TB_PCREL, reduce reliance on
absolute values by passing in pc difference.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
  target/arm/translate-a32.h |  2 +-
  target/arm/translate.h     |  6 ++--
  target/arm/translate-a64.c | 32 +++++++++---------
  target/arm/translate-vfp.c |  2 +-
  target/arm/translate.c     | 68 ++++++++++++++++++++------------------
  5 files changed, 56 insertions(+), 54 deletions(-)

-void gen_a64_set_pc_im(uint64_t val)
+void gen_a64_update_pc(DisasContext *s, target_long diff)
  {
-    tcg_gen_movi_i64(cpu_pc, val);
+    tcg_gen_movi_i64(cpu_pc, s->pc_curr + diff);
  }

@@ -384,11 +384,11 @@ static void gen_goto_tb(DisasContext *s, int n, int64_t 
diff)

Adding more context from previous patch to ease review:

>       uint64_t dest = s->pc_curr + diff;

      if (use_goto_tb(s, dest)) {
          tcg_gen_goto_tb(n);
-        gen_a64_set_pc_im(dest);
+        gen_a64_update_pc(s, diff);
          tcg_gen_exit_tb(s->base.tb, n);
          s->base.is_jmp = DISAS_NORETURN;
      } else {
-        gen_a64_set_pc_im(dest);
+        gen_a64_update_pc(s, diff);
          if (s->ss_active) {
              gen_step_complete_exception(s);
          } else {

diff --git a/target/arm/translate.c b/target/arm/translate.c
index 6855128fb1..01b7536c7e 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -772,9 +772,9 @@ void gen_set_condexec(DisasContext *s)
      }
  }
-void gen_set_pc_im(DisasContext *s, target_ulong val)
+void gen_update_pc(DisasContext *s, target_long diff)
  {
-    tcg_gen_movi_i32(cpu_R[15], val);
+    tcg_gen_movi_i32(cpu_R[15], s->pc_curr + diff);
  }

@@ -2600,10 +2600,10 @@ static void gen_goto_tb(DisasContext *s, int n, int 
diff)

Ditto:

>       target_ulong dest = s->pc_curr + diff;

      if (translator_use_goto_tb(&s->base, dest)) {
          tcg_gen_goto_tb(n);
-        gen_set_pc_im(s, dest);
+        gen_update_pc(s, diff);
          tcg_gen_exit_tb(s->base.tb, n);
      } else {
-        gen_set_pc_im(s, dest);
+        gen_update_pc(s, diff);
          gen_goto_ptr();
      }

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]