1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define branch(mask,_v1,_v2)                           \
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ({                                                   \
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned char taken;                           \
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned long b1 = _v1;                        \
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        unsigned long b2 = _v2;                        \
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        asm volatile("     slgr %[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 Ivanov/* cc = (op1 == op2) ? 2
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     : (op1 > op2) ? 3 : 1; */
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_equal(void)
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned long v1, v2;
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int wrong, ok;
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("Test #1  op1 == op2\n");
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v1 = v2 = 42;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   wrong = ok = 0;
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(0,  v1, v2)) ++wrong; else ++ok;
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(1,  v1, v2)) ++wrong; else ++ok;
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(2,  v1, v2)) ++ok; else ++wrong;
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(3,  v1, v2)) ++ok; else ++wrong;
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(4,  v1, v2)) ++wrong; else ++ok;
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(5,  v1, v2)) ++wrong; else ++ok;
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(6,  v1, v2)) ++ok; else ++wrong;
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(7,  v1, v2)) ++ok; else ++wrong;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(8,  v1, v2)) ++wrong; else ++ok;
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(9,  v1, v2)) ++wrong; else ++ok;
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(10, v1, v2)) ++ok; else ++wrong;
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(11, v1, v2)) ++ok; else ++wrong;
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(12, v1, v2)) ++wrong; else ++ok;
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(13, v1, v2)) ++wrong; else ++ok;
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(14, v1, v2)) ++ok; else ++wrong;
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(15, v1, v2)) ++ok; else ++wrong;
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (wrong != 0 || ok != 16)
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("FAILED\n");
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("OK\n");
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_less(void)
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned long v1, v2;
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int wrong, ok;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("Test #2  op1 < op2\n");
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v1 = 100;
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v2 = 1000;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   wrong = ok = 0;
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(0,  v1, v2)) ++wrong; else ++ok;
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(1,  v1, v2)) ++wrong; else ++ok;
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(2,  v1, v2)) ++wrong; else ++ok;
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(3,  v1, v2)) ++wrong; else ++ok;
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(4,  v1, v2)) ++ok; else ++wrong;
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(5,  v1, v2)) ++ok; else ++wrong;
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(6,  v1, v2)) ++ok; else ++wrong;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(7,  v1, v2)) ++ok; else ++wrong;
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(8,  v1, v2)) ++wrong; else ++ok;
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(9,  v1, v2)) ++wrong; else ++ok;
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(10, v1, v2)) ++wrong; else ++ok;
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(11, v1, v2)) ++wrong; else ++ok;
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(12, v1, v2)) ++ok; else ++wrong;
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(13, v1, v2)) ++ok; else ++wrong;
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(14, v1, v2)) ++ok; else ++wrong;
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(15, v1, v2)) ++ok; else ++wrong;
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (wrong != 0 /* || ok != 16 */)
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("FAILED\n");
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("OK\n");
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_greater(void)
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned long v1, v2;
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int wrong, ok;
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("Test #3  op1 > op2\n");
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v1 = 10000;
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v2 = 1000;
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   wrong = ok = 0;
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(0,  v1, v2)) ++wrong; else ++ok;
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(1,  v1, v2)) ++ok; else ++wrong;
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(2,  v1, v2)) ++wrong; else ++ok;
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(3,  v1, v2)) ++ok; else ++wrong;
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(4,  v1, v2)) ++wrong; else ++ok;
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(5,  v1, v2)) ++ok; else ++wrong;
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(6,  v1, v2)) ++wrong; else ++ok;
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(7,  v1, v2)) ++ok; else ++wrong;
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(8,  v1, v2)) ++wrong; else ++ok;
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(9,  v1, v2)) ++ok; else ++wrong;
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(10, v1, v2)) ++wrong; else ++ok;
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(11, v1, v2)) ++ok; else ++wrong;
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(12, v1, v2)) ++wrong; else ++ok;
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(13, v1, v2)) ++ok; else ++wrong;
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(14, v1, v2)) ++wrong; else ++ok;
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (branch(15, v1, v2)) ++ok; else ++wrong;
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (wrong != 0 || ok != 16)
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("FAILED\n");
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("OK\n");
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main()
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   slgr_equal();
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   slgr_less();
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   slgr_greater();
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
139