1#include <stdio.h>
2
3#define branch(mask,i2,_v1)                            \
4  ({                                                   \
5        unsigned char taken;                           \
6        unsigned char v1 = _v1;                        \
7        asm volatile(   "       tm %[v]," #i2 "\n\t" \
8                 	"	brc " #mask " ,1f\n\t" \
9                        "       mvi %[taken],0\n\t"    \
10			"	j   0f\n\t"            \
11			"1:	mvi %[taken],1\n\t"    \
12			"0:	bcr 0,0 /* nop */\n\t" \
13             : [taken] "=Q" (taken)                    \
14             : [v] "Q"(v1)                             \
15             : "cc");                                  \
16        taken;                                         \
17   })
18
19void
20tm_mask_0(void)
21{
22  int wrong, ok;
23  unsigned char v;
24
25  printf("Test #1  mask == 0, value == ~0  --> cc == 0\n");
26
27  v = ~0;
28  wrong = ok = 0;
29
30  if (branch(0,  0, v)) ++wrong; else ++ok;
31  if (branch(1,  0, v)) ++wrong; else ++ok;
32  if (branch(2,  0, v)) ++wrong; else ++ok;
33  if (branch(3,  0, v)) ++wrong; else ++ok;
34  if (branch(4,  0, v)) ++wrong; else ++ok;
35  if (branch(5,  0, v)) ++wrong; else ++ok;
36  if (branch(6,  0, v)) ++wrong; else ++ok;
37  if (branch(7,  0, v)) ++wrong; else ++ok;
38  if (branch(8,  0, v)) ++ok; else ++wrong;
39  if (branch(9,  0, v)) ++ok; else ++wrong;
40  if (branch(10, 0, v)) ++ok; else ++wrong;
41  if (branch(11, 0, v)) ++ok; else ++wrong;
42  if (branch(12, 0, v)) ++ok; else ++wrong;
43  if (branch(13, 0, v)) ++ok; else ++wrong;
44  if (branch(14, 0, v)) ++ok; else ++wrong;
45  if (branch(15, 0, v)) ++ok; else ++wrong;
46
47  if (wrong != 0 || ok != 16)
48    printf("FAILED\n");
49  else
50    printf("OK\n");
51}
52
53void
54tm_value_0(void)
55{
56  int wrong, ok;
57  unsigned char v;
58
59  printf("Test #2  mask == 0xFF, value == 0  --> cc == 0\n");
60
61  v = 0;
62  wrong = ok = 0;
63
64  if (branch(0,  0xFF, v)) ++wrong; else ++ok;
65  if (branch(1,  0xFF, v)) ++wrong; else ++ok;
66  if (branch(2,  0xFF, v)) ++wrong; else ++ok;
67  if (branch(3,  0xFF, v)) ++wrong; else ++ok;
68  if (branch(4,  0xFF, v)) ++wrong; else ++ok;
69  if (branch(5,  0xFF, v)) ++wrong; else ++ok;
70  if (branch(6,  0xFF, v)) ++wrong; else ++ok;
71  if (branch(7,  0xFF, v)) ++wrong; else ++ok;
72  if (branch(8,  0xFF, v)) ++ok; else ++wrong;
73  if (branch(9,  0xFF, v)) ++ok; else ++wrong;
74  if (branch(10, 0xFF, v)) ++ok; else ++wrong;
75  if (branch(11, 0xFF, v)) ++ok; else ++wrong;
76  if (branch(12, 0xFF, v)) ++ok; else ++wrong;
77  if (branch(13, 0xFF, v)) ++ok; else ++wrong;
78  if (branch(14, 0xFF, v)) ++ok; else ++wrong;
79  if (branch(15, 0xFF, v)) ++ok; else ++wrong;
80
81  if (wrong != 0 || ok != 16)
82    printf("FAILED\n");
83  else
84    printf("OK\n");
85}
86
87void
88tm_all_selected_bits_set_1(void)
89{
90  int wrong, ok;
91  unsigned char v;
92
93  printf("Test #3  mask == 0xFF, value == 0xFF  --> cc == 3\n");
94
95  v = 0xFF;
96  wrong = ok = 0;
97
98  if (branch(0,  0xFF, v)) ++wrong; else ++ok;
99  if (branch(1,  0xFF, v)) ++ok; else ++wrong;
100  if (branch(2,  0xFF, v)) ++wrong; else ++ok;
101  if (branch(3,  0xFF, v)) ++ok; else ++wrong;
102  if (branch(4,  0xFF, v)) ++wrong; else ++ok;
103  if (branch(5,  0xFF, v)) ++ok; else ++wrong;
104  if (branch(6,  0xFF, v)) ++wrong; else ++ok;
105  if (branch(7,  0xFF, v)) ++ok; else ++wrong;
106  if (branch(8,  0xFF, v)) ++wrong; else ++ok;
107  if (branch(9,  0xFF, v)) ++ok; else ++wrong;
108  if (branch(10, 0xFF, v)) ++wrong; else ++ok;
109  if (branch(11, 0xFF, v)) ++ok; else ++wrong;
110  if (branch(12, 0xFF, v)) ++wrong; else ++ok;
111  if (branch(13, 0xFF, v)) ++ok; else ++wrong;
112  if (branch(14, 0xFF, v)) ++wrong; else ++ok;
113  if (branch(15, 0xFF, v)) ++ok; else ++wrong;
114
115  if (wrong != 0 || ok != 16)
116    printf("FAILED\n");
117  else
118    printf("OK\n");
119}
120
121void
122tm_all_selected_bits_set_2(void)
123{
124  int wrong, ok;
125  unsigned char v;
126
127  printf("Test #4  mask == 0x80, value == 0x80  --> cc == 3\n");
128
129  v = 0x80;
130  wrong = ok = 0;
131
132  if (branch(0,  0x80, v)) ++wrong; else ++ok;
133  if (branch(1,  0x80, v)) ++ok; else ++wrong;
134  if (branch(2,  0x80, v)) ++wrong; else ++ok;
135  if (branch(3,  0x80, v)) ++ok; else ++wrong;
136  if (branch(4,  0x80, v)) ++wrong; else ++ok;
137  if (branch(5,  0x80, v)) ++ok; else ++wrong;
138  if (branch(6,  0x80, v)) ++wrong; else ++ok;
139  if (branch(7,  0x80, v)) ++ok; else ++wrong;
140  if (branch(8,  0x80, v)) ++wrong; else ++ok;
141  if (branch(9,  0x80, v)) ++ok; else ++wrong;
142  if (branch(10, 0x80, v)) ++wrong; else ++ok;
143  if (branch(11, 0x80, v)) ++ok; else ++wrong;
144  if (branch(12, 0x80, v)) ++wrong; else ++ok;
145  if (branch(13, 0x80, v)) ++ok; else ++wrong;
146  if (branch(14, 0x80, v)) ++wrong; else ++ok;
147  if (branch(15, 0x80, v)) ++ok; else ++wrong;
148
149  if (wrong != 0 || ok != 16)
150    printf("FAILED\n");
151  else
152    printf("OK\n");
153}
154
155void
156tm_some_selected_bits_set_msb_set(void)
157{
158  int wrong, ok;
159  unsigned char v;
160
161  printf("Test #5  mask == 0xF0, value == 0x90  --> cc == 1\n");
162
163  v = 0x90;
164  wrong = ok = 0;
165
166  if (branch(0,  0xF0, v)) ++wrong; else ++ok;
167  if (branch(1,  0xF0, v)) ++wrong; else ++ok;
168  if (branch(2,  0xF0, v)) ++wrong; else ++ok;
169  if (branch(3,  0xF0, v)) ++wrong; else ++ok;
170  if (branch(4,  0xF0, v)) ++ok; else ++wrong;
171  if (branch(5,  0xF0, v)) ++ok; else ++wrong;
172  if (branch(6,  0xF0, v)) ++ok; else ++wrong;
173  if (branch(7,  0xF0, v)) ++ok; else ++wrong;
174  if (branch(8,  0xF0, v)) ++wrong; else ++ok;
175  if (branch(9,  0xF0, v)) ++wrong; else ++ok;
176  if (branch(10, 0xF0, v)) ++wrong; else ++ok;
177  if (branch(11, 0xF0, v)) ++wrong; else ++ok;
178  if (branch(12, 0xF0, v)) ++ok; else ++wrong;
179  if (branch(13, 0xF0, v)) ++ok; else ++wrong;
180  if (branch(14, 0xF0, v)) ++ok; else ++wrong;
181  if (branch(15, 0xF0, v)) ++ok; else ++wrong;
182
183  if (wrong != 0 || ok != 16)
184    printf("FAILED\n");
185  else
186    printf("OK\n");
187}
188
189void
190tm_some_selected_bits_set_msb_not_set(void)
191{
192  int wrong, ok;
193  unsigned char v;
194
195  printf("Test #6  mask == 0xF0, value == 0x30  --> cc == 1\n");
196
197  v = 0x30;
198  wrong = ok = 0;
199
200  if (branch(0,  0xF0, v)) ++wrong; else ++ok;
201  if (branch(1,  0xF0, v)) ++wrong; else ++ok;
202  if (branch(2,  0xF0, v)) ++wrong; else ++ok;
203  if (branch(3,  0xF0, v)) ++wrong; else ++ok;
204  if (branch(4,  0xF0, v)) ++ok; else ++wrong;
205  if (branch(5,  0xF0, v)) ++ok; else ++wrong;
206  if (branch(6,  0xF0, v)) ++ok; else ++wrong;
207  if (branch(7,  0xF0, v)) ++ok; else ++wrong;
208  if (branch(8,  0xF0, v)) ++wrong; else ++ok;
209  if (branch(9,  0xF0, v)) ++wrong; else ++ok;
210  if (branch(10, 0xF0, v)) ++wrong; else ++ok;
211  if (branch(11, 0xF0, v)) ++wrong; else ++ok;
212  if (branch(12, 0xF0, v)) ++ok; else ++wrong;
213  if (branch(13, 0xF0, v)) ++ok; else ++wrong;
214  if (branch(14, 0xF0, v)) ++ok; else ++wrong;
215  if (branch(15, 0xF0, v)) ++ok; else ++wrong;
216
217  if (wrong != 0 || ok != 16)
218    printf("FAILED\n");
219  else
220    printf("OK\n");
221}
222
223int main()
224{
225  tm_mask_0();
226  tm_value_0();
227  tm_all_selected_bits_set_1();
228  tm_all_selected_bits_set_2();
229  tm_some_selected_bits_set_msb_set();
230  tm_some_selected_bits_set_msb_not_set();
231
232  return 0;
233}
234