blob: d862db4e106301952a5707df0965703d9e76bce6 [file] [log] [blame]
/* Executable testcase for 'output flags.' */
/* { dg-do run } */
/* { dg-skip-if "" { arm_thumb1 } } */
int test_bits (long nzcv)
{
long n, z, c, v;
__asm__ ("msr APSR_nzcvq, %[in]"
: "=@ccmi"(n), "=@cceq"(z), "=@cccs"(c), "=@ccvs"(v)
: [in] "r"(nzcv << 28));
return n * 8 + z * 4 + c * 2 + v == nzcv;
}
int test_cmps (long x, long y)
{
long gt, lt, ge, le;
__asm__ ("cmp %[x], %[y]"
: "=@ccgt"(gt), "=@cclt"(lt), "=@ccge"(ge), "=@ccle"(le)
: [x] "r"(x), [y] "r"(y));
return (gt == (x > y)
&& lt == (x < y)
&& ge == (x >= y)
&& le == (x <= y));
}
int test_cmpu (unsigned long x, unsigned long y)
{
long gt, lt, ge, le;
__asm__ ("cmp %[x], %[y]"
: "=@cchi"(gt), "=@cclo"(lt), "=@cchs"(ge), "=@ccls"(le)
: [x] "r"(x), [y] "r"(y));
return (gt == (x > y)
&& lt == (x < y)
&& ge == (x >= y)
&& le == (x <= y));
}
int main ()
{
long i, j;
for (i = 0; i < 16; ++i)
if (!test_bits (i))
__builtin_abort ();
for (i = -1; i <= 1; ++i)
for (j = -1; j <= 1; ++j)
if (!test_cmps (i, j))
__builtin_abort ();
for (i = 0; i <= 2; ++i)
for (j = 0; j <= 2; ++j)
if (!test_cmpu (i, j))
__builtin_abort ();
return 0;
}