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 } } */