(define_expand "tbranch_<code><mode>3"
[(set (pc) (if_then_else
- (EQL (match_operand:ALLI 0 "register_operand")
- (match_operand 1 "aarch64_simd_shift_imm_<mode>"))
+ (EQL (match_operand:SHORT 0 "register_operand")
+ (match_operand 1 "const0_operand"))
(label_ref (match_operand 2 ""))
(pc)))]
""
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-O2 -std=c99 -fno-unwind-tables -fno-asynchronous-unwind-tables" } */
+/* { dg-final { check-function-bodies "**" "" "" { target { le } } } } */
+
+#include <stdbool.h>
+
+void h(void);
+
+/*
+** g1:
+** cbnz w0, .L[0-9]+
+** ret
+** ...
+*/
+void g1(int x)
+{
+ if (__builtin_expect (x, 0))
+ h ();
+}
+
+/*
+** g2:
+** tbnz x0, 0, .L[0-9]+
+** ret
+** ...
+*/
+void g2(int x)
+{
+ if (__builtin_expect (x & 1, 0))
+ h ();
+}
+
+/*
+** g3:
+** tbnz x0, 3, .L[0-9]+
+** ret
+** ...
+*/
+void g3(int x)
+{
+ if (__builtin_expect (x & 8, 0))
+ h ();
+}
+
+/*
+** g4:
+** tbnz w0, #31, .L[0-9]+
+** ret
+** ...
+*/
+void g4(int x)
+{
+ if (__builtin_expect (x & (1 << 31), 0))
+ h ();
+}
+
+/*
+** g5:
+** tst w0, 255
+** bne .L[0-9]+
+** ret
+** ...
+*/
+void g5(char x)
+{
+ if (__builtin_expect (x, 0))
+ h ();
+}
+
+/*
+** g6:
+** tbnz w0, 0, .L[0-9]+
+** ret
+** ...
+*/
+void g6(char x)
+{
+ if (__builtin_expect (x & 1, 0))
+ h ();
+}
+
+/*
+** g7:
+** tst w0, 3
+** bne .L[0-9]+
+** ret
+** ...
+*/
+void g7(char x)
+{
+ if (__builtin_expect (x & 3, 0))
+ h ();
+}
+
+/*
+** g8:
+** tbnz w0, 7, .L[0-9]+
+** ret
+** ...
+*/
+void g8(char x)
+{
+ if (__builtin_expect (x & (1 << 7), 0))
+ h ();
+}
+
+/*
+** g9:
+** tbnz w0, 0, .L[0-9]+
+** ret
+** ...
+*/
+void g9(bool x)
+{
+ if (__builtin_expect (x, 0))
+ h ();
+}
+
+/*
+** g10:
+** tbnz w0, 0, .L[0-9]+
+** ret
+** ...
+*/
+void g10(bool x)
+{
+ if (__builtin_expect (x & 1, 0))
+ h ();
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void g(int);
+
+void
+f (unsigned int x, _Bool y)
+{
+ for (int i = 0; i < 100; ++i)
+ {
+ if ((x >> 31) | y)
+ g (1);
+ for (int j = 0; j < 100; ++j)
+ g (2);
+ }
+}
+
+/* { dg-final { scan-assembler-times {and\t} 1 } } */