1#include <stdio.h>
2
3#define branch(mask,_v1,_v2)                           \
4  ({                                                   \
5        unsigned char taken;                           \
6        unsigned int  b1 = _v1;                        \
7        unsigned int  b2 = _v2;                        \
8        asm volatile(   "       slr %[b1],%[b2]\n\t"   \
9                 	"	brc " #mask " ,1f\n\t" \
10                        "       mvi %[taken],0\n\t"    \
11			"	j   0f\n\t"            \
12			"1:	mvi %[taken],1\n\t"    \
13			"0:	bcr 0,0 /* nop */\n\t" \
14             : [taken] "=Q" (taken), [b1] "+d"(b1)     \
15             : [b2] "d"(b2)                            \
16             : "cc");                                  \
17        taken;                                         \
18   })
19
20/* cc = (op1 == op2) ? 2
21                     : (op1 > op2) ? 3 : 1; */
22
23void
24slr_equal(void)
25{
26  unsigned int v1, v2;
27  int wrong, ok;
28
29  printf("Test #1  op1 == op2\n");
30
31  v1 = v2 = 0xffffffff;
32  wrong = ok = 0;
33
34  if (branch(0,  v1, v2)) ++wrong; else ++ok;
35  if (branch(1,  v1, v2)) ++wrong; else ++ok;
36  if (branch(2,  v1, v2)) ++ok; else ++wrong;
37  if (branch(3,  v1, v2)) ++ok; else ++wrong;
38  if (branch(4,  v1, v2)) ++wrong; else ++ok;
39  if (branch(5,  v1, v2)) ++wrong; else ++ok;
40  if (branch(6,  v1, v2)) ++ok; else ++wrong;
41  if (branch(7,  v1, v2)) ++ok; else ++wrong;
42  if (branch(8,  v1, v2)) ++wrong; else ++ok;
43  if (branch(9,  v1, v2)) ++wrong; else ++ok;
44  if (branch(10, v1, v2)) ++ok; else ++wrong;
45  if (branch(11, v1, v2)) ++ok; else ++wrong;
46  if (branch(12, v1, v2)) ++wrong; else ++ok;
47  if (branch(13, v1, v2)) ++wrong; else ++ok;
48  if (branch(14, v1, v2)) ++ok; else ++wrong;
49  if (branch(15, v1, v2)) ++ok; else ++wrong;
50
51  if (wrong != 0 || ok != 16)
52    printf("FAILED\n");
53  else
54    printf("OK\n");
55}
56
57void
58slr_less(void)
59{
60  unsigned int v1, v2;
61  int wrong, ok;
62
63  printf("Test #2  op1 < op2\n");
64
65  v1 = 100;
66  v2 = 0xffffffff;
67
68  wrong = ok = 0;
69
70  if (branch(0,  v1, v2)) ++wrong; else ++ok;
71  if (branch(1,  v1, v2)) ++wrong; else ++ok;
72  if (branch(2,  v1, v2)) ++wrong; else ++ok;
73  if (branch(3,  v1, v2)) ++wrong; else ++ok;
74  if (branch(4,  v1, v2)) ++ok; else ++wrong;
75  if (branch(5,  v1, v2)) ++ok; else ++wrong;
76  if (branch(6,  v1, v2)) ++ok; else ++wrong;
77  if (branch(7,  v1, v2)) ++ok; else ++wrong;
78  if (branch(8,  v1, v2)) ++wrong; else ++ok;
79  if (branch(9,  v1, v2)) ++wrong; else ++ok;
80  if (branch(10, v1, v2)) ++wrong; else ++ok;
81  if (branch(11, v1, v2)) ++wrong; else ++ok;
82  if (branch(12, v1, v2)) ++ok; else ++wrong;
83  if (branch(13, v1, v2)) ++ok; else ++wrong;
84  if (branch(14, v1, v2)) ++ok; else ++wrong;
85  if (branch(15, v1, v2)) ++ok; else ++wrong;
86
87  if (wrong != 0 /* || ok != 16 */)
88    printf("FAILED\n");
89  else
90    printf("OK\n");
91}
92
93void
94slr_greater(void)
95{
96  unsigned int v1, v2;
97  int wrong, ok;
98
99  printf("Test #3  op1 > op2\n");
100
101  v1 = 0xffffffff;
102  v2 = 1000;
103
104  wrong = ok = 0;
105
106  if (branch(0,  v1, v2)) ++wrong; else ++ok;
107  if (branch(1,  v1, v2)) ++ok; else ++wrong;
108  if (branch(2,  v1, v2)) ++wrong; else ++ok;
109  if (branch(3,  v1, v2)) ++ok; else ++wrong;
110  if (branch(4,  v1, v2)) ++wrong; else ++ok;
111  if (branch(5,  v1, v2)) ++ok; else ++wrong;
112  if (branch(6,  v1, v2)) ++wrong; else ++ok;
113  if (branch(7,  v1, v2)) ++ok; else ++wrong;
114  if (branch(8,  v1, v2)) ++wrong; else ++ok;
115  if (branch(9,  v1, v2)) ++ok; else ++wrong;
116  if (branch(10, v1, v2)) ++wrong; else ++ok;
117  if (branch(11, v1, v2)) ++ok; else ++wrong;
118  if (branch(12, v1, v2)) ++wrong; else ++ok;
119  if (branch(13, v1, v2)) ++ok; else ++wrong;
120  if (branch(14, v1, v2)) ++wrong; else ++ok;
121  if (branch(15, v1, v2)) ++ok; else ++wrong;
122
123  if (wrong != 0 || ok != 16)
124    printf("FAILED\n");
125  else
126    printf("OK\n");
127}
128
129int main()
130{
131  slr_equal();
132  slr_less();
133  slr_greater();
134
135  return 0;
136}
137