blob: 95e6962447574c7efc28f0bd896ec4948cae893f [file] [log] [blame]
/* { 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 } } */