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