1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define branch(mask,_v1,_v2)                           \
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ({                                                   \
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned char taken;                           \
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned b1 = _v1;                             \
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned b2 = _v2;                             \
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        asm volatile(   "       alr %[b1],%[b2]\n\t"   \
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 	"	brc " #mask " ,1f\n\t" \
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        "       mvi %[taken],0\n\t"    \
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			"	j   0f\n\t"            \
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			"1:	mvi %[taken],1\n\t"    \
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov			"0:	bcr 0,0 /* nop */\n\t" \
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             : [taken] "=Q" (taken), [b1] "+d"(b1)     \
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             : [b2] "d"(b2)                            \
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             : "cc");                                  \
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        taken;                                         \
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   })
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovalr_cc_0(void)
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  unsigned v1, v2;
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int wrong, ok;
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  printf("Test #1  cc == 0\n");
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v1 = v2 = 0;
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  wrong = ok = 0;
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(0,  v1, v2)) ++wrong; else ++ok;
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(1,  v1, v2)) ++wrong; else ++ok;
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(2,  v1, v2)) ++wrong; else ++ok;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(3,  v1, v2)) ++wrong; else ++ok;
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(4,  v1, v2)) ++wrong; else ++ok;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(5,  v1, v2)) ++wrong; else ++ok;
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(6,  v1, v2)) ++wrong; else ++ok;
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(7,  v1, v2)) ++wrong; else ++ok;
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(8,  v1, v2)) ++ok; else ++wrong;
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(9,  v1, v2)) ++ok; else ++wrong;
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(10, v1, v2)) ++ok; else ++wrong;
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(11, v1, v2)) ++ok; else ++wrong;
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(12, v1, v2)) ++ok; else ++wrong;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(13, v1, v2)) ++ok; else ++wrong;
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(14, v1, v2)) ++ok; else ++wrong;
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(15, v1, v2)) ++ok; else ++wrong;
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (wrong != 0 || ok != 16)
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("FAILED\n");
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  else
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("OK\n");
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovalr_cc_1(void)
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  unsigned v1, v2;
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int wrong, ok;
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  printf("Test #2  cc == 1\n");
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v1 = v2 = 42;
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  wrong = ok = 0;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(0,  v1, v2)) ++wrong; else ++ok;
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(1,  v1, v2)) ++wrong; else ++ok;
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(2,  v1, v2)) ++wrong; else ++ok;
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(3,  v1, v2)) ++wrong; else ++ok;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(4,  v1, v2)) ++ok; else ++wrong;
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(5,  v1, v2)) ++ok; else ++wrong;
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(6,  v1, v2)) ++ok; else ++wrong;
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(7,  v1, v2)) ++ok; else ++wrong;
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(8,  v1, v2)) ++wrong; else ++ok;
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(9,  v1, v2)) ++wrong; else ++ok;
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(10, v1, v2)) ++wrong; else ++ok;
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(11, v1, v2)) ++wrong; else ++ok;
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(12, v1, v2)) ++ok; else ++wrong;
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(13, v1, v2)) ++ok; else ++wrong;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(14, v1, v2)) ++ok; else ++wrong;
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(15, v1, v2)) ++ok; else ++wrong;
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (wrong != 0 || ok != 16)
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("FAILED\n");
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  else
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("OK\n");
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovalr_cc_2(void)
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  unsigned v1, v2;
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int wrong, ok;
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  printf("Test #3  cc == 2\n");
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v1 = 0xFFFFFFFF;
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v2 = 1;
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  wrong = ok = 0;
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(0,  v1, v2)) ++wrong; else ++ok;
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(1,  v1, v2)) ++wrong; else ++ok;
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(2,  v1, v2)) ++ok; else ++wrong;
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(3,  v1, v2)) ++ok; else ++wrong;
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(4,  v1, v2)) ++wrong; else ++ok;
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(5,  v1, v2)) ++wrong; else ++ok;
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(6,  v1, v2)) ++ok; else ++wrong;
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(7,  v1, v2)) ++ok; else ++wrong;
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(8,  v1, v2)) ++wrong; else ++ok;
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(9,  v1, v2)) ++wrong; else ++ok;
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(10, v1, v2)) ++ok; else ++wrong;
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(11, v1, v2)) ++ok; else ++wrong;
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(12, v1, v2)) ++wrong; else ++ok;
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(13, v1, v2)) ++wrong; else ++ok;
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(14, v1, v2)) ++ok; else ++wrong;
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(15, v1, v2)) ++ok; else ++wrong;
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (wrong != 0 /* || ok != 16 */)
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("FAILED\n");
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  else
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("OK\n");
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovalr_cc_3(void)
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  unsigned v1, v2;
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int wrong, ok;
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  printf("Test #4  cc == 3\n");
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v1 = 0xFFFFFFFF;
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  v2 = 100;
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  wrong = ok = 0;
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(0,  v1, v2)) ++wrong; else ++ok;
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(1,  v1, v2)) ++ok; else ++wrong;
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(2,  v1, v2)) ++wrong; else ++ok;
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(3,  v1, v2)) ++ok; else ++wrong;
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(4,  v1, v2)) ++wrong; else ++ok;
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(5,  v1, v2)) ++ok; else ++wrong;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(6,  v1, v2)) ++wrong; else ++ok;
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(7,  v1, v2)) ++ok; else ++wrong;
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(8,  v1, v2)) ++wrong; else ++ok;
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(9,  v1, v2)) ++ok; else ++wrong;
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(10, v1, v2)) ++wrong; else ++ok;
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(11, v1, v2)) ++ok; else ++wrong;
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(12, v1, v2)) ++wrong; else ++ok;
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(13, v1, v2)) ++ok; else ++wrong;
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(14, v1, v2)) ++wrong; else ++ok;
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (branch(15, v1, v2)) ++ok; else ++wrong;
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (wrong != 0 || ok != 16)
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("FAILED\n");
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  else
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    printf("OK\n");
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main()
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  alr_cc_0();
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  alr_cc_1();
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  alr_cc_2();
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  alr_cc_3();
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  return 0;
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
169