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(int64_t value)
29abbc9afe94e1712fadb403d3f426fbd69744b658florian{
30abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
31abbc9afe94e1712fadb403d3f426fbd69744b658florian
32abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
33ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
34abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,NEVER,8,2a) "\n\t"    /* 0x2a == 42 */
35abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_not_taken\n\t"
36abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
37abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_taken\n\t"
38ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
39abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
40abbc9afe94e1712fadb403d3f426fbd69744b658florian}
41abbc9afe94e1712fadb403d3f426fbd69744b658florian
42abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_always(int64_t value)
43abbc9afe94e1712fadb403d3f426fbd69744b658florian{
44abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
45abbc9afe94e1712fadb403d3f426fbd69744b658florian
46abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
47ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
48abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,ALWAYS,8,2a) "\n\t"    /* 0x2a == 42 */
49abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_not_taken\n\t"
50abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
51abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_taken\n\t"
52ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
53abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
54abbc9afe94e1712fadb403d3f426fbd69744b658florian}
55abbc9afe94e1712fadb403d3f426fbd69744b658florian
56abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_le42(int64_t value)
57abbc9afe94e1712fadb403d3f426fbd69744b658florian{
58abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
59abbc9afe94e1712fadb403d3f426fbd69744b658florian
60abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
61ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
62abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,LE,8,2a) "\n\t"    /* 0x2a == 42 */
63abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_gt\n\t"
64abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
65abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_le\n\t"
66ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
67abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
68abbc9afe94e1712fadb403d3f426fbd69744b658florian}
69abbc9afe94e1712fadb403d3f426fbd69744b658florian
70abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ge42(int64_t value)
71abbc9afe94e1712fadb403d3f426fbd69744b658florian{
72abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
73abbc9afe94e1712fadb403d3f426fbd69744b658florian
74abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
75ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
76abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,GE,8,2a) "\n\t"    /* 0x2a == 42 */
77abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_lt\n\t"
78abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
79abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ge\n\t"
80ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
81abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
82abbc9afe94e1712fadb403d3f426fbd69744b658florian}
83abbc9afe94e1712fadb403d3f426fbd69744b658florian
84abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_gt42(int64_t value)
85abbc9afe94e1712fadb403d3f426fbd69744b658florian{
86abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
87abbc9afe94e1712fadb403d3f426fbd69744b658florian
88abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
89ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
90abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,GT,8,2a) "\n\t"    /* 0x2a == 42 */
91abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_le\n\t"
92abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
93abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_gt\n\t"
94ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
95abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
96abbc9afe94e1712fadb403d3f426fbd69744b658florian}
97abbc9afe94e1712fadb403d3f426fbd69744b658florian
98abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_lt42(int64_t value)
99abbc9afe94e1712fadb403d3f426fbd69744b658florian{
100abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
101abbc9afe94e1712fadb403d3f426fbd69744b658florian
102abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
103ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
104abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,LT,8,2a) "\n\t"    /* 0x2a == 42 */
105abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ge\n\t"
106abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
107abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_lt\n\t"
108ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
109abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
110abbc9afe94e1712fadb403d3f426fbd69744b658florian}
111abbc9afe94e1712fadb403d3f426fbd69744b658florian
112abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_eq42(int64_t value)
113abbc9afe94e1712fadb403d3f426fbd69744b658florian{
114abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
115abbc9afe94e1712fadb403d3f426fbd69744b658florian
116abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
117ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
118abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,EQ,8,2a) "\n\t"    /* 0x2a == 42 */
119abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ne\n\t"
120abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
121abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_eq\n\t"
122ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
123abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
124abbc9afe94e1712fadb403d3f426fbd69744b658florian}
125abbc9afe94e1712fadb403d3f426fbd69744b658florian
126abbc9afe94e1712fadb403d3f426fbd69744b658florianvoid compare_ne42(int64_t value)
127abbc9afe94e1712fadb403d3f426fbd69744b658florian{
128abbc9afe94e1712fadb403d3f426fbd69744b658florian   register int64_t val asm("r7") = value;
129abbc9afe94e1712fadb403d3f426fbd69744b658florian
130abbc9afe94e1712fadb403d3f426fbd69744b658florian   asm volatile(
131ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "aghi   15,-160\n\t"
132abbc9afe94e1712fadb403d3f426fbd69744b658florian                CGIJ(7,NE,8,2a) "\n\t"    /* 0x2a == 42 */
133abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_eq\n\t"
134abbc9afe94e1712fadb403d3f426fbd69744b658florian                "j     0f\n\t"
135abbc9afe94e1712fadb403d3f426fbd69744b658florian                "brasl 14,if_ne\n\t"
136ce004ebec861b6a0154e20aa928ce6c5cada4628florian                "0: aghi 15,160\n\t" : : "d"(val) : "15", BRASLCLOBBER);
137abbc9afe94e1712fadb403d3f426fbd69744b658florian   return;
138abbc9afe94e1712fadb403d3f426fbd69744b658florian}
139abbc9afe94e1712fadb403d3f426fbd69744b658florian
140abbc9afe94e1712fadb403d3f426fbd69744b658florianint main()
141abbc9afe94e1712fadb403d3f426fbd69744b658florian{
142abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq42(-12);
143abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq42(42);
144abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_eq42(100);
145abbc9afe94e1712fadb403d3f426fbd69744b658florian
146abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne42(-12);
147abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne42(42);
148abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ne42(100);
149abbc9afe94e1712fadb403d3f426fbd69744b658florian
150abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt42(-12);
151abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt42(42);
152abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_gt42(100);
153abbc9afe94e1712fadb403d3f426fbd69744b658florian
154abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt42(-12);
155abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt42(42);
156abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_lt42(100);
157abbc9afe94e1712fadb403d3f426fbd69744b658florian
158abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le42(-12);
159abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le42(42);
160abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_le42(100);
161abbc9afe94e1712fadb403d3f426fbd69744b658florian
162abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge42(-12);
163abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge42(42);
164abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_ge42(100);
165abbc9afe94e1712fadb403d3f426fbd69744b658florian
166abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(-12);
167abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(42);
168abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_never(100);
169abbc9afe94e1712fadb403d3f426fbd69744b658florian
170abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(-12);
171abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(42);
172abbc9afe94e1712fadb403d3f426fbd69744b658florian   compare_always(100);
173abbc9afe94e1712fadb403d3f426fbd69744b658florian
174abbc9afe94e1712fadb403d3f426fbd69744b658florian   return 0;
175abbc9afe94e1712fadb403d3f426fbd69744b658florian}
176