1 /* Executable testcase for 'output flags.'  */
2 /* { dg-do run } */
3 /* { dg-skip-if "" { arm_thumb1 } } */
4 
test_bits(long nzcv)5 int test_bits (long nzcv)
6 {
7   long n, z, c, v;
8 
9   __asm__ ("msr APSR_nzcvq, %[in]"
10 	   : "=@ccmi"(n), "=@cceq"(z), "=@cccs"(c), "=@ccvs"(v)
11 	   : [in] "r"(nzcv << 28));
12 
13   return n * 8 + z * 4 + c * 2 + v == nzcv;
14 }
15 
test_cmps(long x,long y)16 int test_cmps (long x, long y)
17 {
18   long gt, lt, ge, le;
19 
20   __asm__ ("cmp %[x], %[y]"
21 	   : "=@ccgt"(gt), "=@cclt"(lt), "=@ccge"(ge), "=@ccle"(le)
22 	   : [x] "r"(x), [y] "r"(y));
23 
24   return (gt == (x > y)
25 	  && lt == (x < y)
26 	  && ge == (x >= y)
27 	  && le == (x <= y));
28 }
29 
test_cmpu(unsigned long x,unsigned long y)30 int test_cmpu (unsigned long x, unsigned long y)
31 {
32   long gt, lt, ge, le;
33 
34   __asm__ ("cmp %[x], %[y]"
35 	   : "=@cchi"(gt), "=@cclo"(lt), "=@cchs"(ge), "=@ccls"(le)
36 	   : [x] "r"(x), [y] "r"(y));
37 
38   return (gt == (x > y)
39 	  && lt == (x < y)
40 	  && ge == (x >= y)
41 	  && le == (x <= y));
42 }
43 
main()44 int main ()
45 {
46   long i, j;
47 
48   for (i = 0; i < 16; ++i)
49     if (!test_bits (i))
50       __builtin_abort ();
51 
52   for (i = -1; i <= 1; ++i)
53     for (j = -1; j <= 1; ++j)
54       if (!test_cmps (i, j))
55         __builtin_abort ();
56 
57   for (i = 0; i <= 2; ++i)
58     for (j = 0; j <= 2; ++j)
59       if (!test_cmpu (i, j))
60         __builtin_abort ();
61 
62   return 0;
63 }
64