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 8 void if_eq(void) { printf("equal\n"); } 9 void if_ne(void) { printf("not equal\n"); } 10 void if_gt(void) { printf("greater than\n"); } 11 void if_le(void) { printf("less or equal\n"); } 12 void if_lt(void) { printf("less than\n"); } 13 void if_ge(void) { printf("greater or equal\n"); } 14 void if_taken(void) { printf("taken\n"); } 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 28 void compare_never(uint64_t value1, uint64_t value2) 29 { 30 register uint64_t val1 asm("r7") = value1; 31 register uint64_t val2 asm("r8") = value2; 32 33 asm volatile( 34 "aghi 15,-160\n\t" 35 CLGRJ(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 44 void compare_always(uint64_t value1, uint64_t value2) 45 { 46 register uint64_t val1 asm("r7") = value1; 47 register uint64_t val2 asm("r8") = value2; 48 49 asm volatile( 50 "aghi 15,-160\n\t" 51 CLGRJ(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 60 void compare_le(uint64_t value1, uint64_t value2) 61 { 62 register uint64_t val1 asm("r7") = value1; 63 register uint64_t val2 asm("r8") = value2; 64 65 asm volatile( 66 "aghi 15,-160\n\t" 67 CLGRJ(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 76 void compare_ge(uint64_t value1, uint64_t value2) 77 { 78 register uint64_t val1 asm("r7") = value1; 79 register uint64_t val2 asm("r8") = value2; 80 81 asm volatile( 82 "aghi 15,-160\n\t" 83 CLGRJ(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 92 void compare_gt(uint64_t value1, uint64_t value2) 93 { 94 register uint64_t val1 asm("r7") = value1; 95 register uint64_t val2 asm("r8") = value2; 96 97 asm volatile( 98 "aghi 15,-160\n\t" 99 CLGRJ(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 108 void compare_lt(uint64_t value1, uint64_t value2) 109 { 110 register uint64_t val1 asm("r7") = value1; 111 register uint64_t val2 asm("r8") = value2; 112 113 asm volatile( 114 "aghi 15,-160\n\t" 115 CLGRJ(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 124 void compare_eq(uint64_t value1, uint64_t value2) 125 { 126 register uint64_t val1 asm("r7") = value1; 127 register uint64_t val2 asm("r8") = value2; 128 129 asm volatile( 130 "aghi 15,-160\n\t" 131 CLGRJ(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 140 void compare_ne(uint64_t value1, uint64_t value2) 141 { 142 register uint64_t val1 asm("r7") = value1; 143 register uint64_t val2 asm("r8") = value2; 144 145 asm volatile( 146 "aghi 15,-160\n\t" 147 CLGRJ(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 156 int 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