The '*tb<optab><mode>1' can safely be extended to match operands of
any size, as long as the immediate operand (i.e. the bits tested)
match the size of the register operand.

This removes unnecessary zero-extension operations from the
generated instruction stream.
---
 gcc/config/aarch64/aarch64.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index b972a1b..90f1ee9 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -382,14 +382,14 @@
 
 (define_insn "*tb<optab><mode>1"
   [(set (pc) (if_then_else
-             (EQL (zero_extract:DI (match_operand:GPI 0 "register_operand" "r")
+             (EQL (zero_extract:DI (match_operand:ALLI 0 "register_operand" 
"r")
                                    (const_int 1)
                                    (match_operand 1 "const_int_operand" "n"))
                   (const_int 0))
             (label_ref (match_operand 2 "" ""))
             (pc)))
    (clobber (match_scratch:DI 3 "=r"))]
-  ""
+  "(UINTVAL(operands[1]) < GET_MODE_BITSIZE(<MODE>mode))"
   "*
   if (get_attr_length (insn) == 8)
     return \"ubfx\\t%<w>3, %<w>0, %1, #1\;<cbz>\\t%<w>3, %l2\";
-- 
1.9.0

Reply via email to