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