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
8void if_eq(void)        { printf("equal\n");   }
9void if_ne(void)        { printf("not equal\n");   }
10void if_gt(void)        { printf("greater than\n");   }
11void if_le(void)        { printf("less or equal\n");   }
12void if_lt(void)        { printf("less than\n");   }
13void if_ge(void)        { printf("greater or equal\n");   }
14void if_taken(void)     { printf("taken\n");   }
15void 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
28void 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
42void 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
56void 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
70void 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
84void 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
98void 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
112void 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
126void 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
140int 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