(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
csky/
ck801-branch.c
       1  /* { dg-do compile } */
       2  /* { dg-skip-if  "test is specific to ck801"  { csky-*-* }  { "*" }  { "-mcpu=ck801" }  }  */
       3  /* { dg-csky-options "-O1 -fno-reorder-blocks" } */
       4  
       5  /* Test branch generation on CK801, which cannot rely on assembler
       6     branch relaxation because long branches clobber lr.  */
       7  
       8  #define nop8 asm ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop")
       9  #define nop64 nop8; nop8; nop8; nop8; nop8; nop8; nop8; nop8
      10  #define nop512 nop64; nop64; nop64; nop64; nop64; nop64; nop64; nop64
      11  #define nop4k nop512; nop512; nop512; nop512; nop512; nop512; nop512; nop512
      12  #define nop32k nop4k; nop4k; nop4k; nop4k; nop4k; nop4k; nop4k; nop4k
      13  
      14  extern void g (int);
      15  int f (int x, int y, int z)
      16  {
      17    if (x == 0)		// cmpnei; jbt
      18      {
      19        nop64;
      20        x = y;
      21      }
      22    if (y == 0)		// cmpnei; jbf; jbr
      23      {
      24        nop512;
      25        y = z;
      26      }
      27    if (z == 0)		// cmpnei; jbf; bsr
      28      {
      29        nop32k;
      30        z = x;
      31      }
      32    return x + y + z;
      33  }
      34  
      35  /* { dg-final { scan-assembler "push.*lr" } } */
      36  /* { dg-final { scan-assembler "pop.*lr" } } */
      37  /* { dg-final { scan-assembler-times "cmpnei" 3 } } */
      38  /* { dg-final { scan-assembler-times "jbt" 1 } } */
      39  /* { dg-final { scan-assembler-times "jbf" 2 } } */
      40  /* { dg-final { scan-assembler-times "jbr" 1 } } */
      41  /* { dg-final { scan-assembler-times "bsr" 1 } } */