• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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