On 10/1/24 23:43, Richard Henderson wrote:
> ... and the inverse, CBZ for TSTEQ.
>
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> tcg/aarch64/tcg-target.c.inc | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
> index 55225313ad..0c98c48f68 100644
> --- a/tcg/aarch64/tcg-target.c.inc
> +++ b/tcg/aarch64/tcg-target.c.inc
> @@ -1453,6 +1453,7 @@ static void tcg_out_brcond(TCGContext *s, TCGType ext, TCGCond c, TCGArg a,
> break;
> case TCG_COND_LT:
> case TCG_COND_GE:
> + /* cmp xN,0; b.mi L -> tbnz xN,63,L */
> if (b_const && b == 0) {
> c = (c == TCG_COND_LT ? TCG_COND_TSTNE : TCG_COND_TSTEQ);
This comment ...
> tbit = ext ? 63 : 31;
> @@ -1461,6 +1462,13 @@ static void tcg_out_brcond(TCGContext *s, TCGType ext, TCGCond c, TCGArg a,
> break;
> case TCG_COND_TSTEQ:
> case TCG_COND_TSTNE:
> + /* tst xN,0xffffffff; b.ne L -> cbnz wN,L */
> + if (b_const && b == UINT32_MAX) {
> + ext = TCG_TYPE_I32;
> + need_cmp = false;
> + break;
> + }
> + /* tst xN,1<<B; b.ne L -> tbnz xN,B,L */
... and this one belong to the previous patch. Otherwise:
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> if (b_const && is_power_of_2(b)) {
> tbit = ctz64(b);
> need_cmp = false;