icmp_branch_eqne.c (822B)
1 /* == and != used as branch conditions. On aarch64 an equality test against a 2 * value often lowers to cbz/cbnz or cmp + b.eq/b.ne. volatile defeats folding; 3 * noinline forces real branches. Exit code 42. */ 4 __attribute__((noinline)) static int pick_eq(int a, int b) { 5 return a == b ? 10 : 1; 6 } 7 __attribute__((noinline)) static int pick_ne(int a, int b) { 8 return a != b ? 11 : 1; 9 } 10 __attribute__((noinline)) static int pick_eqz(int a) { return a == 0 ? 10 : 1; } 11 __attribute__((noinline)) static int pick_nez(int a) { return a != 0 ? 11 : 1; } 12 int test_main(void) { 13 volatile int a = 5, b = 5, z = 0, nz = 9; 14 int r = 0; 15 r += pick_eq(a, b); /* 5==5 -> 10 */ 16 r += pick_ne(a, nz); /* 5!=9 -> 11 */ 17 r += pick_eqz(z); /* 0==0 -> 10 */ 18 r += pick_nez(nz); /* 9!=0 -> 11 */ 19 return r; /* 42 */ 20 }