target-arm: Eliminate unnecessary zero-extend in disas_bitfield
authorRichard Henderson <rth@twiddle.net>
Mon, 14 Sep 2015 13:39:48 +0000 (14:39 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Mon, 14 Sep 2015 13:39:48 +0000 (14:39 +0100)
For !SF, this initial ext32u can't be optimized away by the
current TCG code generator.  (It would require backward bit
liveness propagation.)

But since the range of bits for !SF are already constrained by
unallocated_encoding, we'll never reference the high bits anyway.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
Message-id: 1441909103-24666-10-git-send-email-rth@twiddle.net
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
target-arm/translate-a64.c

index f2f8443483828a663fc45d6ca4fbc0d7029202ba..3ab0b42258e0b244058b7c528805a499be2d155e 100644 (file)
@@ -3015,7 +3015,11 @@ static void disas_bitfield(DisasContext *s, uint32_t insn)
     }
 
     tcg_rd = cpu_reg(s, rd);
-    tcg_tmp = read_cpu_reg(s, rn, sf);
+
+    /* Suppress the zero-extend for !sf.  Since RI and SI are constrained
+       to be smaller than bitsize, we'll never reference data outside the
+       low 32-bits anyway.  */
+    tcg_tmp = read_cpu_reg(s, rn, 1);
 
     /* Recognize the common aliases.  */
     if (opc == 0) { /* SBFM */