1 #include <stdio.h>
2
3 #define branch(mask,_v1,_v2) \
4 ({ \
5 unsigned char taken; \
6 unsigned b1 = _v1; \
7 unsigned b2 = _v2; \
8 asm volatile( " alr %[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
21 void
alr_cc_0(void)22 alr_cc_0(void)
23 {
24 unsigned v1, v2;
25 int wrong, ok;
26
27 printf("Test #1 cc == 0\n");
28
29 v1 = v2 = 0;
30 wrong = ok = 0;
31 if (branch(0, v1, v2)) ++wrong; else ++ok;
32 if (branch(1, v1, v2)) ++wrong; else ++ok;
33 if (branch(2, v1, v2)) ++wrong; else ++ok;
34 if (branch(3, v1, v2)) ++wrong; else ++ok;
35 if (branch(4, v1, v2)) ++wrong; else ++ok;
36 if (branch(5, v1, v2)) ++wrong; else ++ok;
37 if (branch(6, v1, v2)) ++wrong; else ++ok;
38 if (branch(7, v1, v2)) ++wrong; else ++ok;
39 if (branch(8, v1, v2)) ++ok; else ++wrong;
40 if (branch(9, v1, v2)) ++ok; else ++wrong;
41 if (branch(10, v1, v2)) ++ok; else ++wrong;
42 if (branch(11, v1, v2)) ++ok; else ++wrong;
43 if (branch(12, v1, v2)) ++ok; else ++wrong;
44 if (branch(13, v1, v2)) ++ok; else ++wrong;
45 if (branch(14, v1, v2)) ++ok; else ++wrong;
46 if (branch(15, v1, v2)) ++ok; else ++wrong;
47
48 if (wrong != 0 || ok != 16)
49 printf("FAILED\n");
50 else
51 printf("OK\n");
52 }
53
54 void
alr_cc_1(void)55 alr_cc_1(void)
56 {
57 unsigned v1, v2;
58 int wrong, ok;
59
60 printf("Test #2 cc == 1\n");
61
62 v1 = v2 = 42;
63 wrong = ok = 0;
64
65 if (branch(0, v1, v2)) ++wrong; else ++ok;
66 if (branch(1, v1, v2)) ++wrong; else ++ok;
67 if (branch(2, v1, v2)) ++wrong; else ++ok;
68 if (branch(3, v1, v2)) ++wrong; else ++ok;
69 if (branch(4, v1, v2)) ++ok; else ++wrong;
70 if (branch(5, v1, v2)) ++ok; else ++wrong;
71 if (branch(6, v1, v2)) ++ok; else ++wrong;
72 if (branch(7, v1, v2)) ++ok; else ++wrong;
73 if (branch(8, v1, v2)) ++wrong; else ++ok;
74 if (branch(9, v1, v2)) ++wrong; else ++ok;
75 if (branch(10, v1, v2)) ++wrong; else ++ok;
76 if (branch(11, v1, v2)) ++wrong; else ++ok;
77 if (branch(12, v1, v2)) ++ok; else ++wrong;
78 if (branch(13, v1, v2)) ++ok; else ++wrong;
79 if (branch(14, v1, v2)) ++ok; else ++wrong;
80 if (branch(15, v1, v2)) ++ok; else ++wrong;
81
82 if (wrong != 0 || ok != 16)
83 printf("FAILED\n");
84 else
85 printf("OK\n");
86 }
87
88 void
alr_cc_2(void)89 alr_cc_2(void)
90 {
91 unsigned v1, v2;
92 int wrong, ok;
93
94 printf("Test #3 cc == 2\n");
95
96 v1 = 0xFFFFFFFF;
97 v2 = 1;
98
99 wrong = ok = 0;
100
101 if (branch(0, v1, v2)) ++wrong; else ++ok;
102 if (branch(1, v1, v2)) ++wrong; else ++ok;
103 if (branch(2, v1, v2)) ++ok; else ++wrong;
104 if (branch(3, v1, v2)) ++ok; else ++wrong;
105 if (branch(4, v1, v2)) ++wrong; else ++ok;
106 if (branch(5, v1, v2)) ++wrong; else ++ok;
107 if (branch(6, v1, v2)) ++ok; else ++wrong;
108 if (branch(7, v1, v2)) ++ok; else ++wrong;
109 if (branch(8, v1, v2)) ++wrong; else ++ok;
110 if (branch(9, v1, v2)) ++wrong; else ++ok;
111 if (branch(10, v1, v2)) ++ok; else ++wrong;
112 if (branch(11, v1, v2)) ++ok; else ++wrong;
113 if (branch(12, v1, v2)) ++wrong; else ++ok;
114 if (branch(13, v1, v2)) ++wrong; else ++ok;
115 if (branch(14, v1, v2)) ++ok; else ++wrong;
116 if (branch(15, v1, v2)) ++ok; else ++wrong;
117
118 if (wrong != 0 /* || ok != 16 */)
119 printf("FAILED\n");
120 else
121 printf("OK\n");
122 }
123
124 void
alr_cc_3(void)125 alr_cc_3(void)
126 {
127 unsigned v1, v2;
128 int wrong, ok;
129
130 printf("Test #4 cc == 3\n");
131
132 v1 = 0xFFFFFFFF;
133 v2 = 100;
134
135 wrong = ok = 0;
136
137 if (branch(0, v1, v2)) ++wrong; else ++ok;
138 if (branch(1, v1, v2)) ++ok; else ++wrong;
139 if (branch(2, v1, v2)) ++wrong; else ++ok;
140 if (branch(3, v1, v2)) ++ok; else ++wrong;
141 if (branch(4, v1, v2)) ++wrong; else ++ok;
142 if (branch(5, v1, v2)) ++ok; else ++wrong;
143 if (branch(6, v1, v2)) ++wrong; else ++ok;
144 if (branch(7, v1, v2)) ++ok; else ++wrong;
145 if (branch(8, v1, v2)) ++wrong; else ++ok;
146 if (branch(9, v1, v2)) ++ok; else ++wrong;
147 if (branch(10, v1, v2)) ++wrong; else ++ok;
148 if (branch(11, v1, v2)) ++ok; else ++wrong;
149 if (branch(12, v1, v2)) ++wrong; else ++ok;
150 if (branch(13, v1, v2)) ++ok; else ++wrong;
151 if (branch(14, v1, v2)) ++wrong; else ++ok;
152 if (branch(15, v1, v2)) ++ok; else ++wrong;
153
154 if (wrong != 0 || ok != 16)
155 printf("FAILED\n");
156 else
157 printf("OK\n");
158 }
159
main()160 int main()
161 {
162 alr_cc_0();
163 alr_cc_1();
164 alr_cc_2();
165 alr_cc_3();
166
167 return 0;
168 }
169