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