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(   "       cr  %[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
19void
20cr_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
52void
53cr_2(void)
54{
55  int wrong, ok, v1, v2;
56
57  printf("Test #2  op1 > op2\n");
58  v1 = 100;
59  v2 = -10;
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
85void
86cr_3(void)
87{
88  int wrong, ok, v1, v2;
89
90  printf("Test #3  op1 < op2\n");
91  v1 = -100;
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
118int main()
119{
120  cr_1();
121  cr_2();
122  cr_3();
123  return 0;
124}
125