kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }