1abbc9afe94e1712fadb403d3f426fbd69744b658florian#include <stdio.h>
2abbc9afe94e1712fadb403d3f426fbd69744b658florian#include <stdint.h>
3abbc9afe94e1712fadb403d3f426fbd69744b658florian#include "opcodes.h"
4abbc9afe94e1712fadb403d3f426fbd69744b658florian
5abbc9afe94e1712fadb403d3f426fbd69744b658florian#define BRASLCLOBBER "0","1","2","3","4","5","14", \
6abbc9afe94e1712fadb403d3f426fbd69744b658florian		     "f0","f1","f2","f3","f4","f5","f6","f7"
7abbc9afe94e1712fadb403d3f426fbd69744b658florian
8abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_eq(void)        { printf("equal\n");   }
9abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_ne(void)        { printf("not equal\n");   }
10abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_gt(void)        { printf("greater than\n");   }
11abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_le(void)        { printf("less or equal\n");   }
12abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_lt(void)        { printf("less than\n");   }
13abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_ge(void)        { printf("greater or equal\n");   }
14abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_taken(void)     { printf("taken\n");   }
15abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid if_not_taken(void) { printf("not taken\n");   }
16abbc9afe94e1712fadb403d3f426fbd69744b658florian
17abbc9afe94e1712fadb403d3f426fbd69744b658florian#undef LT
18abbc9afe94e1712fadb403d3f426fbd69744b658florian#define NEVER 0
19abbc9afe94e1712fadb403d3f426fbd69744b658florian#define GT 2
20abbc9afe94e1712fadb403d3f426fbd69744b658florian#define LT 4
21abbc9afe94e1712fadb403d3f426fbd69744b658florian#define NE 6
22abbc9afe94e1712fadb403d3f426fbd69744b658florian#define EQ 8
23abbc9afe94e1712fadb403d3f426fbd69744b658florian#define LE C
24abbc9afe94e1712fadb403d3f426fbd69744b658florian#define GE A
25abbc9afe94e1712fadb403d3f426fbd69744b658florian#define ALWAYS E
26abbc9afe94e1712fadb403d3f426fbd69744b658florian
27abbc9afe94e1712fadb403d3f426fbd69744b658florian
28abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_never(int32_t value1, int32_t value2)
29abbc9afe94e1712fadb403d3f426fbd69744b658florian{
30abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
31abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
32abbc9afe94e1712fadb403d3f426fbd69744b658florian
33abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
34ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
35abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,NEVER) "\n\t"
36abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_not_taken\n\t"
37abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
38abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_taken\n\t"
39ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
40ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
41abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
42abbc9afe94e1712fadb403d3f426fbd69744b658florian}
43abbc9afe94e1712fadb403d3f426fbd69744b658florian
44abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_always(int32_t value1, int32_t value2)
45abbc9afe94e1712fadb403d3f426fbd69744b658florian{
46abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
47abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
48abbc9afe94e1712fadb403d3f426fbd69744b658florian
49abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
50ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
51abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,ALWAYS) "\n\t"
52abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_not_taken\n\t"
53abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
54abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_taken\n\t"
55ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
56ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
57abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
58abbc9afe94e1712fadb403d3f426fbd69744b658florian}
59abbc9afe94e1712fadb403d3f426fbd69744b658florian
60abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_le(int32_t value1, int32_t value2)
61abbc9afe94e1712fadb403d3f426fbd69744b658florian{
62abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
63abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
64abbc9afe94e1712fadb403d3f426fbd69744b658florian
65abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
66ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
67abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,LE) "\n\t"
68abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_gt\n\t"
69abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
70abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_le\n\t"
71ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
72ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
73abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
74abbc9afe94e1712fadb403d3f426fbd69744b658florian}
75abbc9afe94e1712fadb403d3f426fbd69744b658florian
76abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ge(int32_t value1, int32_t value2)
77abbc9afe94e1712fadb403d3f426fbd69744b658florian{
78abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
79abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
80abbc9afe94e1712fadb403d3f426fbd69744b658florian
81abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
82ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
83abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,GE) "\n\t"
84abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_lt\n\t"
85abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
86abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ge\n\t"
87ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
88ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
89abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
90abbc9afe94e1712fadb403d3f426fbd69744b658florian}
91abbc9afe94e1712fadb403d3f426fbd69744b658florian
92abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_gt(int32_t value1, int32_t value2)
93abbc9afe94e1712fadb403d3f426fbd69744b658florian{
94abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
95abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
96abbc9afe94e1712fadb403d3f426fbd69744b658florian
97abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
98ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
99abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,GT) "\n\t"
100abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_le\n\t"
101abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
102abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_gt\n\t"
103ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
104ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
105abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
106abbc9afe94e1712fadb403d3f426fbd69744b658florian}
107abbc9afe94e1712fadb403d3f426fbd69744b658florian
108abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_lt(int32_t value1, int32_t value2)
109abbc9afe94e1712fadb403d3f426fbd69744b658florian{
110abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
111abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
112abbc9afe94e1712fadb403d3f426fbd69744b658florian
113abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
114ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
115abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,LT) "\n\t"
116abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ge\n\t"
117abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
118abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_lt\n\t"
119ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
120ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
121abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
122abbc9afe94e1712fadb403d3f426fbd69744b658florian}
123abbc9afe94e1712fadb403d3f426fbd69744b658florian
124abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_eq(int32_t value1, int32_t value2)
125abbc9afe94e1712fadb403d3f426fbd69744b658florian{
126abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
127abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
128abbc9afe94e1712fadb403d3f426fbd69744b658florian
129abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
130ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
131abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,EQ) "\n\t"
132abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ne\n\t"
133abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
134abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_eq\n\t"
135ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
136ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
137abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
138abbc9afe94e1712fadb403d3f426fbd69744b658florian}
139abbc9afe94e1712fadb403d3f426fbd69744b658florian
140abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ne(int32_t value1, int32_t value2)
141abbc9afe94e1712fadb403d3f426fbd69744b658florian{
142abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val1 asm("r7") = value1;
143abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int32_t val2 asm("r8") = value2;
144abbc9afe94e1712fadb403d3f426fbd69744b658florian
145abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
146ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi  15,-160\n\t"
147abbc9afe94e1712fadb403d3f426fbd69744b658florian                CRJ(7,8,8,NE) "\n\t"
148abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_eq\n\t"
149abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
150abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ne\n\t"
151ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t"
152ce004ebec861b6a0154e20aa928ce6c5cada4628florian                : : "d"(val1), "d"(val2) : "15", BRASLCLOBBER);
153abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
154abbc9afe94e1712fadb403d3f426fbd69744b658florian}
155abbc9afe94e1712fadb403d3f426fbd69744b658florian
156abbc9afe94e1712fadb403d3f426fbd69744b658florianint main()
157abbc9afe94e1712fadb403d3f426fbd69744b658florian{
158abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq(-12, 42);
159abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq(42, 42);
160abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq(100, 42);
161abbc9afe94e1712fadb403d3f426fbd69744b658florian
162abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne(-12, 42);
163abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne(42, 42);
164abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne(100, 42);
165abbc9afe94e1712fadb403d3f426fbd69744b658florian
166abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt(-12, 42);
167abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt(42, 42);
168abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt(100, 42);
169abbc9afe94e1712fadb403d3f426fbd69744b658florian
170abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt(-12, 42);
171abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt(42, 42);
172abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt(100, 42);
173abbc9afe94e1712fadb403d3f426fbd69744b658florian
174abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le(-12, 42);
175abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le(42, 42);
176abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le(100, 42);
177abbc9afe94e1712fadb403d3f426fbd69744b658florian
178abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge(-12, 42);
179abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge(42, 42);
180abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge(100, 42);
181abbc9afe94e1712fadb403d3f426fbd69744b658florian
182abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(-12, 42);
183abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(42, 42);
184abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(100, 42);
185abbc9afe94e1712fadb403d3f426fbd69744b658florian
186abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(-12, 42);
187abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(42, 42);
188abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(100, 42);
189abbc9afe94e1712fadb403d3f426fbd69744b658florian
190abbc9afe94e1712fadb403d3f426fbd69744b658florian   return 0;
191abbc9afe94e1712fadb403d3f426fbd69744b658florian}
192