aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/arm/asm-flag-6.c
blob: d862db4e106301952a5707df0965703d9e76bce6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* 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;
}