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(int64_t value)
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,NEVER,8,2a) "\n\t"    /* 0x2a == 42 */
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_not_taken\n\t"
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_taken\n\t"
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_always(int64_t value)
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,ALWAYS,8,2a) "\n\t"    /* 0x2a == 42 */
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_not_taken\n\t"
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_taken\n\t"
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_le42(int64_t value)
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,LE,8,2a) "\n\t"    /* 0x2a == 42 */
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_gt\n\t"
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_le\n\t"
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ge42(int64_t value)
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,GE,8,2a) "\n\t"    /* 0x2a == 42 */
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_lt\n\t"
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ge\n\t"
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_gt42(int64_t value)
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,GT,8,2a) "\n\t"    /* 0x2a == 42 */
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_le\n\t"
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_gt\n\t"
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_lt42(int64_t value)
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,LT,8,2a) "\n\t"    /* 0x2a == 42 */
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ge\n\t"
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_lt\n\t"
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_eq42(int64_t value)
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,EQ,8,2a) "\n\t"    /* 0x2a == 42 */
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ne\n\t"
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_eq\n\t"
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid compare_ne42(int64_t value)
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register int64_t val asm("r7") = value;
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   asm volatile(
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "aghi   15,-160\n\t"
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                CGIJ(7,NE,8,2a) "\n\t"    /* 0x2a == 42 */
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_eq\n\t"
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "j     0f\n\t"
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "brasl 14,if_ne\n\t"
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return;
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main()
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq42(-12);
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq42(42);
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_eq42(100);
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne42(-12);
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne42(42);
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ne42(100);
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt42(-12);
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt42(42);
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_gt42(100);
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt42(-12);
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt42(42);
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_lt42(100);
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le42(-12);
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le42(42);
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_le42(100);
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge42(-12);
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge42(42);
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_ge42(100);
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(-12);
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(42);
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_never(100);
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(-12);
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(42);
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   compare_always(100);
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
176