target/arm: Improve gen_top_byte_ignore

Use simple arithmetic instead of a conditional
move when tbi0 != tbi1.

Backports 2169b5c6f7a791ef9c43c72412efaafae3245114
This commit is contained in:
Richard Henderson 2021-03-04 18:39:21 -05:00 committed by Lioncash
parent ab07f048d8
commit de982a8346

View file

@ -318,17 +318,20 @@ static void gen_top_byte_ignore(DisasContext *s, TCGv_i64 dst,
/* Sign-extend from bit 55. */ /* Sign-extend from bit 55. */
tcg_gen_sextract_i64(tcg_ctx, dst, src, 0, 56); tcg_gen_sextract_i64(tcg_ctx, dst, src, 0, 56);
if (tbi != 3) { switch (tbi) {
TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); case 1:
/* tbi0 but !tbi1: only use the extension if positive */
/* tcg_gen_and_i64(tcg_ctx, dst, dst, src);
* The two TBI bits differ. break;
* If tbi0, then !tbi1: only use the extension if positive. case 2:
* if !tbi0, then tbi1: only use the extension if negative. /* !tbi0 but tbi1: only use the extension if negative */
*/ tcg_gen_or_i64(tcg_ctx, dst, dst, src);
tcg_gen_movcond_i64(tcg_ctx, tbi == 1 ? TCG_COND_GE : TCG_COND_LT, break;
dst, dst, tcg_zero, dst, src); case 3:
tcg_temp_free_i64(tcg_ctx, tcg_zero); /* tbi0 and tbi1: always use the extension */
break;
default:
g_assert_not_reached();
} }
} }
} }