xref: /qemu/tests/tcg/alpha/test-cond.c (revision 15bede554162dda822cd762c689edb6fa32b6e3b)
1*4f2cbcfbSAlex Bennée #include <unistd.h>
2df0fc998Saurel32 
3df0fc998Saurel32 #ifdef TEST_CMOV
4df0fc998Saurel32 
5df0fc998Saurel32 #define TEST_COND(N) 				\
6df0fc998Saurel32 int test_##N (long a)				\
7df0fc998Saurel32 {						\
8df0fc998Saurel32   int res = 1;					\
9df0fc998Saurel32                                                 \
10df0fc998Saurel32   asm ("cmov"#N" %1,$31,%0"			\
11df0fc998Saurel32        : "+r" (res) : "r" (a));			\
12df0fc998Saurel32   return !res;					\
13df0fc998Saurel32 }
14df0fc998Saurel32 
15df0fc998Saurel32 #else
16df0fc998Saurel32 
17df0fc998Saurel32 #define TEST_COND(N) 				\
18df0fc998Saurel32 int test_##N (long a)				\
19df0fc998Saurel32 {						\
20df0fc998Saurel32   int res = 1;					\
21df0fc998Saurel32                                                 \
22df0fc998Saurel32   asm ("b"#N" %1,1f\n\t"			\
23df0fc998Saurel32        "addq $31,$31,%0\n\t"			\
24df0fc998Saurel32        "1: unop\n"				\
25df0fc998Saurel32        : "+r" (res) : "r" (a));			\
26df0fc998Saurel32   return res;					\
27df0fc998Saurel32 }
28df0fc998Saurel32 
29df0fc998Saurel32 #endif
30df0fc998Saurel32 
31df0fc998Saurel32 TEST_COND(eq)
32df0fc998Saurel32 TEST_COND(ne)
33df0fc998Saurel32 TEST_COND(ge)
34df0fc998Saurel32 TEST_COND(gt)
35df0fc998Saurel32 TEST_COND(lbc)
36df0fc998Saurel32 TEST_COND(lbs)
37df0fc998Saurel32 TEST_COND(le)
38df0fc998Saurel32 TEST_COND(lt)
39df0fc998Saurel32 
40df0fc998Saurel32 static struct {
41df0fc998Saurel32   int (*func)(long);
42df0fc998Saurel32   long v;
43df0fc998Saurel32   int r;
44df0fc998Saurel32 } vectors[] =
45df0fc998Saurel32   {
46df0fc998Saurel32     {test_eq, 0, 1},
47df0fc998Saurel32     {test_eq, 1, 0},
48df0fc998Saurel32 
49df0fc998Saurel32     {test_ne, 0, 0},
50df0fc998Saurel32     {test_ne, 1, 1},
51df0fc998Saurel32 
52df0fc998Saurel32     {test_ge, 0, 1},
53df0fc998Saurel32     {test_ge, 1, 1},
54df0fc998Saurel32     {test_ge, -1, 0},
55df0fc998Saurel32 
56df0fc998Saurel32     {test_gt, 0, 0},
57df0fc998Saurel32     {test_gt, 1, 1},
58df0fc998Saurel32     {test_gt, -1, 0},
59df0fc998Saurel32 
60df0fc998Saurel32     {test_lbc, 0, 1},
61df0fc998Saurel32     {test_lbc, 1, 0},
62df0fc998Saurel32     {test_lbc, -1, 0},
63df0fc998Saurel32 
64df0fc998Saurel32     {test_lbs, 0, 0},
65df0fc998Saurel32     {test_lbs, 1, 1},
66df0fc998Saurel32     {test_lbs, -1, 1},
67df0fc998Saurel32 
68df0fc998Saurel32     {test_le, 0, 1},
69df0fc998Saurel32     {test_le, 1, 0},
70df0fc998Saurel32     {test_le, -1, 1},
71df0fc998Saurel32 
72df0fc998Saurel32     {test_lt, 0, 0},
73df0fc998Saurel32     {test_lt, 1, 0},
74df0fc998Saurel32     {test_lt, -1, 1},
75df0fc998Saurel32   };
76df0fc998Saurel32 
main(void)77df0fc998Saurel32 int main (void)
78df0fc998Saurel32 {
79df0fc998Saurel32   int i;
80df0fc998Saurel32 
81df0fc998Saurel32   for (i = 0; i < sizeof (vectors)/sizeof(vectors[0]); i++)
82df0fc998Saurel32     if ((*vectors[i].func)(vectors[i].v) != vectors[i].r) {
83df0fc998Saurel32       write(1, "Failed\n", 7);
84df0fc998Saurel32       return 1;
85df0fc998Saurel32     }
86df0fc998Saurel32   write(1, "OK\n", 3);
87df0fc998Saurel32   return 0;
88df0fc998Saurel32 }
89