From 70dd48b85552a6f279b3eee2d0e24f78bbca1bc1 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 10 Feb 2018 23:47:13 -0500 Subject: [PATCH] target-arm: Handle always condition codes within arm_test_cc Handling this with TCG_COND_ALWAYS will allow these unlikely cases to be handled without special cases in the rest of the translator. The TCG optimizer ought to be able to reduce these ALWAYS conditions completely. Backports commit 9305eac09e61d857c9cc11e20db754dfc25a82db from qemu --- qemu/target-arm/translate.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/qemu/target-arm/translate.c b/qemu/target-arm/translate.c index d07305e2..9b944963 100644 --- a/qemu/target-arm/translate.c +++ b/qemu/target-arm/translate.c @@ -802,6 +802,14 @@ void arm_test_cc(TCGContext *tcg_ctx, DisasCompare *cmp, int cc) tcg_gen_andc_i32(tcg_ctx, value, tcg_ctx->cpu_ZF, value); break; + case 14: /* always */ + case 15: /* always */ + /* Use the ALWAYS condition, which will fold early. + * It doesn't matter what we use for the value. */ + cond = TCG_COND_ALWAYS; + value = tcg_ctx->cpu_ZF; + goto no_invert; + default: fprintf(stderr, "Bad condition code 0x%x\n", cc); abort(); @@ -811,6 +819,7 @@ void arm_test_cc(TCGContext *tcg_ctx, DisasCompare *cmp, int cc) cond = tcg_invert_cond(cond); } +no_invert: cmp->cond = cond; cmp->value = value; cmp->value_global = global;