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