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