diff mbox series

[v2,6/9] target/alpha: Simplify gen_bcond_internal()

Message ID 20240503072014.24751-7-philmd@linaro.org
State New
Headers show
Series target/alpha: Implement CF_PCREL | expand

Commit Message

Philippe Mathieu-Daudé May 3, 2024, 7:20 a.m. UTC
Richard Henderson explained on IRC:

  bcond_internal() used to insist that both branch
  destination and branch fallthrough are use_goto_tb;
  if not, we'd use movcond to compute an indirect jump.
  But it's perfectly fine for e.g. the branch fallthrough
  to use_goto_tb, and the branch destination to use
  an indirect branch.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20240424234436.995410-4-richard.henderson@linaro.org>
[PMD: Split bigger patch, part 4/5]
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/alpha/translate.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

Comments

Richard Henderson May 4, 2024, 2:40 p.m. UTC | #1
On 5/3/24 00:20, Philippe Mathieu-Daudé wrote:
> Richard Henderson explained on IRC:
> 
>    bcond_internal() used to insist that both branch
>    destination and branch fallthrough are use_goto_tb;
>    if not, we'd use movcond to compute an indirect jump.
>    But it's perfectly fine for e.g. the branch fallthrough
>    to use_goto_tb, and the branch destination to use
>    an indirect branch.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> Message-Id: <20240424234436.995410-4-richard.henderson@linaro.org>
> [PMD: Split bigger patch, part 4/5]
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/alpha/translate.c | 17 +++++++----------
>   1 file changed, 7 insertions(+), 10 deletions(-)
> 
> diff --git a/target/alpha/translate.c b/target/alpha/translate.c
> index 41151f002e..079bd5d3fd 100644
> --- a/target/alpha/translate.c
> +++ b/target/alpha/translate.c
> @@ -461,23 +461,20 @@ static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond,
>       uint64_t dest = ctx->base.pc_next + disp;
>       TCGLabel *lab_true = gen_new_label();
>   
> -    if (use_goto_tb(ctx, dest)) {
> -        tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
> -
> +    tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
> +    if (use_goto_tb(ctx, ctx->base.pc_next)) {
>           tcg_gen_goto_tb(0);
>           tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
>           tcg_gen_exit_tb(ctx->base.tb, 0);
> -
> -        gen_set_label(lab_true);
> +    }
> +    /* FALLTHRU */

fall through does not work.


> +    gen_set_label(lab_true);
> +    if (use_goto_tb(ctx, dest)) {
>           tcg_gen_goto_tb(1);
>           tcg_gen_movi_i64(cpu_pc, dest);
>           tcg_gen_exit_tb(ctx->base.tb, 1);
>       } else {
> -        TCGv_i64 i = tcg_constant_i64(imm);
> -        TCGv_i64 d = tcg_constant_i64(dest);
> -        TCGv_i64 p = tcg_constant_i64(ctx->base.pc_next);
> -
> -        tcg_gen_movcond_i64(cond, cpu_pc, cmp, i, d, p);
> +        tcg_gen_movi_i64(cpu_pc, dest);
>           tcg_gen_lookup_and_goto_ptr();
>       }

Need the whole else replicated above.


r~
diff mbox series

Patch

diff --git a/target/alpha/translate.c b/target/alpha/translate.c
index 41151f002e..079bd5d3fd 100644
--- a/target/alpha/translate.c
+++ b/target/alpha/translate.c
@@ -461,23 +461,20 @@  static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond,
     uint64_t dest = ctx->base.pc_next + disp;
     TCGLabel *lab_true = gen_new_label();
 
-    if (use_goto_tb(ctx, dest)) {
-        tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
-
+    tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
+    if (use_goto_tb(ctx, ctx->base.pc_next)) {
         tcg_gen_goto_tb(0);
         tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
         tcg_gen_exit_tb(ctx->base.tb, 0);
-
-        gen_set_label(lab_true);
+    }
+    /* FALLTHRU */
+    gen_set_label(lab_true);
+    if (use_goto_tb(ctx, dest)) {
         tcg_gen_goto_tb(1);
         tcg_gen_movi_i64(cpu_pc, dest);
         tcg_gen_exit_tb(ctx->base.tb, 1);
     } else {
-        TCGv_i64 i = tcg_constant_i64(imm);
-        TCGv_i64 d = tcg_constant_i64(dest);
-        TCGv_i64 p = tcg_constant_i64(ctx->base.pc_next);
-
-        tcg_gen_movcond_i64(cond, cpu_pc, cmp, i, d, p);
+        tcg_gen_movi_i64(cpu_pc, dest);
         tcg_gen_lookup_and_goto_ptr();
     }