1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "opcodes.h"
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BRASLCLOBBER "0","1","2","3","4","5","14", \
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng		     "f0","f1","f2","f3","f4","f5","f6","f7"
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_eq(void)        { printf("equal\n");   }
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_ne(void)        { printf("not equal\n");   }
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_gt(void)        { printf("greater than\n");   }
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_le(void)        { printf("less or equal\n");   }
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_lt(void)        { printf("less than\n");   }
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_ge(void)        { printf("greater or equal\n");   }
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_taken(void)     { printf("taken\n");   }
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid if_not_taken(void) { printf("not taken\n");   }
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#undef LT
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define NEVER 0
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GT 2
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LT 4
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define NE 6
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define EQ 8
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LE C
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GE A
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALWAYS E
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_never(uint64_t value1, uint64_t value2)
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,NEVER) "\n\t"
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_not_taken\n\t"
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_taken\n\t"
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_always(uint64_t value1, uint64_t value2)
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,ALWAYS) "\n\t"
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_not_taken\n\t"
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_taken\n\t"
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_le(uint64_t value1, uint64_t value2)
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,LE) "\n\t"
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_gt\n\t"
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_le\n\t"
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ge(uint64_t value1, uint64_t value2)
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,GE) "\n\t"
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_lt\n\t"
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ge\n\t"
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_gt(uint64_t value1, uint64_t value2)
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,GT) "\n\t"
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_le\n\t"
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_gt\n\t"
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_lt(uint64_t value1, uint64_t value2)
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,LT) "\n\t"
116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ge\n\t"
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_lt\n\t"
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_eq(uint64_t value1, uint64_t value2)
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,EQ) "\n\t"
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ne\n\t"
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_eq\n\t"
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ne(uint64_t value1, uint64_t value2)
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val1 asm("r7") = value1;
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register uint64_t val2 asm("r8") = value2;
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi  15,-160\n\t"
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CLGRJ(7,8,8,NE) "\n\t"
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_eq\n\t"
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ne\n\t"
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t"
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main()
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq(12, 42);
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq(42, 42);
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq(100, 42);
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne(12, 42);
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne(42, 42);
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne(100, 42);
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt(12, 42);
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt(42, 42);
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt(100, 42);
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt(12, 42);
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt(42, 42);
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt(100, 42);
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le(12, 42);
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le(42, 42);
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le(100, 42);
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge(12, 42);
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge(42, 42);
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge(100, 42);
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(12, 42);
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(42, 42);
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(100, 42);
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(12, 42);
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(42, 42);
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(100, 42);
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
192