/* { dg-do compile } */ /* { dg-csky-options "-mcpu=ck801 -O1 -fno-reorder-blocks" } */ /* Test branch generation on CK801, which cannot rely on assembler branch relaxation because long branches clobber lr. */ #define nop8 asm ("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop") #define nop64 nop8; nop8; nop8; nop8; nop8; nop8; nop8; nop8 #define nop512 nop64; nop64; nop64; nop64; nop64; nop64; nop64; nop64 #define nop4k nop512; nop512; nop512; nop512; nop512; nop512; nop512; nop512 #define nop32k nop4k; nop4k; nop4k; nop4k; nop4k; nop4k; nop4k; nop4k extern void g (int); int f (int x, int y, int z) { if (x == 0) // cmpnei; jbt { nop64; x = y; } if (y == 0) // cmpnei; jbf; jbr { nop512; y = z; } if (z == 0) // cmpnei; jbf; bsr { nop32k; z = x; } return x + y + z; } /* { dg-final { scan-assembler "push.*lr" } } */ /* { dg-final { scan-assembler "pop.*lr" } } */ /* { dg-final { scan-assembler-times "cmpnei" 3 } } */ /* { dg-final { scan-assembler-times "jbt" 1 } } */ /* { dg-final { scan-assembler-times "jbf" 2 } } */ /* { dg-final { scan-assembler-times "jbr" 1 } } */ /* { dg-final { scan-assembler-times "bsr" 1 } } */