Elliott Hughes | a0664b9 | 2017-04-18 17:46:52 -0700 | [diff] [blame^] | 1 | |
| 2 | #include <stdio.h> |
| 3 | #include <signal.h> |
| 4 | #include <setjmp.h> |
| 5 | #include <string.h> |
| 6 | #include <assert.h> |
| 7 | |
| 8 | static jmp_buf env_sigtrap; |
| 9 | static void handler_sigtrap ( int x ) { longjmp(env_sigtrap,1); } |
| 10 | |
| 11 | void try ( char* who, void(*maybe_traps)(long), long arg ) |
| 12 | { |
| 13 | struct sigaction tmp_act; |
| 14 | int r, trapped = 0; |
| 15 | memset(&tmp_act, 0, sizeof(tmp_act)); |
| 16 | tmp_act.sa_handler = handler_sigtrap; |
| 17 | sigemptyset(&tmp_act.sa_mask); |
| 18 | tmp_act.sa_flags = SA_NODEFER; |
| 19 | r = sigaction(SIGTRAP, &tmp_act, NULL); |
| 20 | assert(r == 0); |
| 21 | if (setjmp(env_sigtrap)) { |
| 22 | trapped = 1; |
| 23 | } else { |
| 24 | maybe_traps(arg); |
| 25 | } |
| 26 | signal(SIGTRAP, SIG_DFL); |
| 27 | |
| 28 | printf("%s(%4lld) -> %s\n", who, (long long int)arg, |
| 29 | trapped ? "TRAP" : "no trap" ); |
| 30 | } |
| 31 | |
| 32 | static void twi_0_neg100 ( long n ) { |
| 33 | __asm__ __volatile__("twi 0, %0,-100" |
| 34 | : /*out*/ : /*in*/ "r" (n) ); |
| 35 | } |
| 36 | static void twi_1_neg100 ( long n ) { |
| 37 | __asm__ __volatile__("twi 1, %0,-100" |
| 38 | : /*out*/ : /*in*/ "r" (n) ); |
| 39 | } |
| 40 | static void twi_2_neg100 ( long n ) { |
| 41 | __asm__ __volatile__("twi 2, %0,-100" |
| 42 | : /*out*/ : /*in*/ "r" (n) ); |
| 43 | } |
| 44 | static void twi_3_neg100 ( long n ) { |
| 45 | __asm__ __volatile__("twi 3, %0,-100" |
| 46 | : /*out*/ : /*in*/ "r" (n) ); |
| 47 | } |
| 48 | static void twi_4_neg100 ( long n ) { |
| 49 | __asm__ __volatile__("twi 4, %0,-100" |
| 50 | : /*out*/ : /*in*/ "r" (n) ); |
| 51 | } |
| 52 | static void twi_5_neg100 ( long n ) { |
| 53 | __asm__ __volatile__("twi 5, %0,-100" |
| 54 | : /*out*/ : /*in*/ "r" (n) ); |
| 55 | } |
| 56 | static void twi_6_neg100 ( long n ) { |
| 57 | __asm__ __volatile__("twi 6, %0,-100" |
| 58 | : /*out*/ : /*in*/ "r" (n) ); |
| 59 | } |
| 60 | static void twi_7_neg100 ( long n ) { |
| 61 | __asm__ __volatile__("twi 7, %0,-100" |
| 62 | : /*out*/ : /*in*/ "r" (n) ); |
| 63 | } |
| 64 | static void twi_8_neg100 ( long n ) { |
| 65 | __asm__ __volatile__("twi 8, %0,-100" |
| 66 | : /*out*/ : /*in*/ "r" (n) ); |
| 67 | } |
| 68 | static void twi_9_neg100 ( long n ) { |
| 69 | __asm__ __volatile__("twi 9, %0,-100" |
| 70 | : /*out*/ : /*in*/ "r" (n) ); |
| 71 | } |
| 72 | static void twi_10_neg100 ( long n ) { |
| 73 | __asm__ __volatile__("twi 10, %0,-100" |
| 74 | : /*out*/ : /*in*/ "r" (n) ); |
| 75 | } |
| 76 | static void twi_11_neg100 ( long n ) { |
| 77 | __asm__ __volatile__("twi 11, %0,-100" |
| 78 | : /*out*/ : /*in*/ "r" (n) ); |
| 79 | } |
| 80 | static void twi_12_neg100 ( long n ) { |
| 81 | __asm__ __volatile__("twi 12, %0,-100" |
| 82 | : /*out*/ : /*in*/ "r" (n) ); |
| 83 | } |
| 84 | static void twi_13_neg100 ( long n ) { |
| 85 | __asm__ __volatile__("twi 13, %0,-100" |
| 86 | : /*out*/ : /*in*/ "r" (n) ); |
| 87 | } |
| 88 | static void twi_14_neg100 ( long n ) { |
| 89 | __asm__ __volatile__("twi 14, %0,-100" |
| 90 | : /*out*/ : /*in*/ "r" (n) ); |
| 91 | } |
| 92 | static void twi_15_neg100 ( long n ) { |
| 93 | __asm__ __volatile__("twi 15, %0,-100" |
| 94 | : /*out*/ : /*in*/ "r" (n) ); |
| 95 | } |
| 96 | static void twi_16_neg100 ( long n ) { |
| 97 | __asm__ __volatile__("twi 16, %0,-100" |
| 98 | : /*out*/ : /*in*/ "r" (n) ); |
| 99 | } |
| 100 | static void twi_17_neg100 ( long n ) { |
| 101 | __asm__ __volatile__("twi 17, %0,-100" |
| 102 | : /*out*/ : /*in*/ "r" (n) ); |
| 103 | } |
| 104 | static void twi_18_neg100 ( long n ) { |
| 105 | __asm__ __volatile__("twi 18, %0,-100" |
| 106 | : /*out*/ : /*in*/ "r" (n) ); |
| 107 | } |
| 108 | static void twi_19_neg100 ( long n ) { |
| 109 | __asm__ __volatile__("twi 19, %0,-100" |
| 110 | : /*out*/ : /*in*/ "r" (n) ); |
| 111 | } |
| 112 | static void twi_20_neg100 ( long n ) { |
| 113 | __asm__ __volatile__("twi 20, %0,-100" |
| 114 | : /*out*/ : /*in*/ "r" (n) ); |
| 115 | } |
| 116 | static void twi_21_neg100 ( long n ) { |
| 117 | __asm__ __volatile__("twi 21, %0,-100" |
| 118 | : /*out*/ : /*in*/ "r" (n) ); |
| 119 | } |
| 120 | static void twi_22_neg100 ( long n ) { |
| 121 | __asm__ __volatile__("twi 22, %0,-100" |
| 122 | : /*out*/ : /*in*/ "r" (n) ); |
| 123 | } |
| 124 | static void twi_23_neg100 ( long n ) { |
| 125 | __asm__ __volatile__("twi 23, %0,-100" |
| 126 | : /*out*/ : /*in*/ "r" (n) ); |
| 127 | } |
| 128 | static void twi_24_neg100 ( long n ) { |
| 129 | __asm__ __volatile__("twi 24, %0,-100" |
| 130 | : /*out*/ : /*in*/ "r" (n) ); |
| 131 | } |
| 132 | static void twi_25_neg100 ( long n ) { |
| 133 | __asm__ __volatile__("twi 25, %0,-100" |
| 134 | : /*out*/ : /*in*/ "r" (n) ); |
| 135 | } |
| 136 | static void twi_26_neg100 ( long n ) { |
| 137 | __asm__ __volatile__("twi 26, %0,-100" |
| 138 | : /*out*/ : /*in*/ "r" (n) ); |
| 139 | } |
| 140 | static void twi_27_neg100 ( long n ) { |
| 141 | __asm__ __volatile__("twi 27, %0,-100" |
| 142 | : /*out*/ : /*in*/ "r" (n) ); |
| 143 | } |
| 144 | static void twi_28_neg100 ( long n ) { |
| 145 | __asm__ __volatile__("twi 28, %0,-100" |
| 146 | : /*out*/ : /*in*/ "r" (n) ); |
| 147 | } |
| 148 | static void twi_29_neg100 ( long n ) { |
| 149 | __asm__ __volatile__("twi 29, %0,-100" |
| 150 | : /*out*/ : /*in*/ "r" (n) ); |
| 151 | } |
| 152 | static void twi_30_neg100 ( long n ) { |
| 153 | __asm__ __volatile__("twi 30, %0,-100" |
| 154 | : /*out*/ : /*in*/ "r" (n) ); |
| 155 | } |
| 156 | static void twi_31_neg100 ( long n ) { |
| 157 | __asm__ __volatile__("twi 31, %0,-100" |
| 158 | : /*out*/ : /*in*/ "r" (n) ); |
| 159 | } |
| 160 | |
| 161 | #if defined(__powerpc64__) |
| 162 | |
| 163 | static void tdi_0_neg100 ( long n ) { |
| 164 | __asm__ __volatile__("tdi 0, %0,-100" |
| 165 | : /*out*/ : /*in*/ "r" (n) ); |
| 166 | } |
| 167 | static void tdi_1_neg100 ( long n ) { |
| 168 | __asm__ __volatile__("tdi 1, %0,-100" |
| 169 | : /*out*/ : /*in*/ "r" (n) ); |
| 170 | } |
| 171 | static void tdi_2_neg100 ( long n ) { |
| 172 | __asm__ __volatile__("tdi 2, %0,-100" |
| 173 | : /*out*/ : /*in*/ "r" (n) ); |
| 174 | } |
| 175 | static void tdi_3_neg100 ( long n ) { |
| 176 | __asm__ __volatile__("tdi 3, %0,-100" |
| 177 | : /*out*/ : /*in*/ "r" (n) ); |
| 178 | } |
| 179 | static void tdi_4_neg100 ( long n ) { |
| 180 | __asm__ __volatile__("tdi 4, %0,-100" |
| 181 | : /*out*/ : /*in*/ "r" (n) ); |
| 182 | } |
| 183 | static void tdi_5_neg100 ( long n ) { |
| 184 | __asm__ __volatile__("tdi 5, %0,-100" |
| 185 | : /*out*/ : /*in*/ "r" (n) ); |
| 186 | } |
| 187 | static void tdi_6_neg100 ( long n ) { |
| 188 | __asm__ __volatile__("tdi 6, %0,-100" |
| 189 | : /*out*/ : /*in*/ "r" (n) ); |
| 190 | } |
| 191 | static void tdi_7_neg100 ( long n ) { |
| 192 | __asm__ __volatile__("tdi 7, %0,-100" |
| 193 | : /*out*/ : /*in*/ "r" (n) ); |
| 194 | } |
| 195 | static void tdi_8_neg100 ( long n ) { |
| 196 | __asm__ __volatile__("tdi 8, %0,-100" |
| 197 | : /*out*/ : /*in*/ "r" (n) ); |
| 198 | } |
| 199 | static void tdi_9_neg100 ( long n ) { |
| 200 | __asm__ __volatile__("tdi 9, %0,-100" |
| 201 | : /*out*/ : /*in*/ "r" (n) ); |
| 202 | } |
| 203 | static void tdi_10_neg100 ( long n ) { |
| 204 | __asm__ __volatile__("tdi 10, %0,-100" |
| 205 | : /*out*/ : /*in*/ "r" (n) ); |
| 206 | } |
| 207 | static void tdi_11_neg100 ( long n ) { |
| 208 | __asm__ __volatile__("tdi 11, %0,-100" |
| 209 | : /*out*/ : /*in*/ "r" (n) ); |
| 210 | } |
| 211 | static void tdi_12_neg100 ( long n ) { |
| 212 | __asm__ __volatile__("tdi 12, %0,-100" |
| 213 | : /*out*/ : /*in*/ "r" (n) ); |
| 214 | } |
| 215 | static void tdi_13_neg100 ( long n ) { |
| 216 | __asm__ __volatile__("tdi 13, %0,-100" |
| 217 | : /*out*/ : /*in*/ "r" (n) ); |
| 218 | } |
| 219 | static void tdi_14_neg100 ( long n ) { |
| 220 | __asm__ __volatile__("tdi 14, %0,-100" |
| 221 | : /*out*/ : /*in*/ "r" (n) ); |
| 222 | } |
| 223 | static void tdi_15_neg100 ( long n ) { |
| 224 | __asm__ __volatile__("tdi 15, %0,-100" |
| 225 | : /*out*/ : /*in*/ "r" (n) ); |
| 226 | } |
| 227 | static void tdi_16_neg100 ( long n ) { |
| 228 | __asm__ __volatile__("tdi 16, %0,-100" |
| 229 | : /*out*/ : /*in*/ "r" (n) ); |
| 230 | } |
| 231 | static void tdi_17_neg100 ( long n ) { |
| 232 | __asm__ __volatile__("tdi 17, %0,-100" |
| 233 | : /*out*/ : /*in*/ "r" (n) ); |
| 234 | } |
| 235 | static void tdi_18_neg100 ( long n ) { |
| 236 | __asm__ __volatile__("tdi 18, %0,-100" |
| 237 | : /*out*/ : /*in*/ "r" (n) ); |
| 238 | } |
| 239 | static void tdi_19_neg100 ( long n ) { |
| 240 | __asm__ __volatile__("tdi 19, %0,-100" |
| 241 | : /*out*/ : /*in*/ "r" (n) ); |
| 242 | } |
| 243 | static void tdi_20_neg100 ( long n ) { |
| 244 | __asm__ __volatile__("tdi 20, %0,-100" |
| 245 | : /*out*/ : /*in*/ "r" (n) ); |
| 246 | } |
| 247 | static void tdi_21_neg100 ( long n ) { |
| 248 | __asm__ __volatile__("tdi 21, %0,-100" |
| 249 | : /*out*/ : /*in*/ "r" (n) ); |
| 250 | } |
| 251 | static void tdi_22_neg100 ( long n ) { |
| 252 | __asm__ __volatile__("tdi 22, %0,-100" |
| 253 | : /*out*/ : /*in*/ "r" (n) ); |
| 254 | } |
| 255 | static void tdi_23_neg100 ( long n ) { |
| 256 | __asm__ __volatile__("tdi 23, %0,-100" |
| 257 | : /*out*/ : /*in*/ "r" (n) ); |
| 258 | } |
| 259 | static void tdi_24_neg100 ( long n ) { |
| 260 | __asm__ __volatile__("tdi 24, %0,-100" |
| 261 | : /*out*/ : /*in*/ "r" (n) ); |
| 262 | } |
| 263 | static void tdi_25_neg100 ( long n ) { |
| 264 | __asm__ __volatile__("tdi 25, %0,-100" |
| 265 | : /*out*/ : /*in*/ "r" (n) ); |
| 266 | } |
| 267 | static void tdi_26_neg100 ( long n ) { |
| 268 | __asm__ __volatile__("tdi 26, %0,-100" |
| 269 | : /*out*/ : /*in*/ "r" (n) ); |
| 270 | } |
| 271 | static void tdi_27_neg100 ( long n ) { |
| 272 | __asm__ __volatile__("tdi 27, %0,-100" |
| 273 | : /*out*/ : /*in*/ "r" (n) ); |
| 274 | } |
| 275 | static void tdi_28_neg100 ( long n ) { |
| 276 | __asm__ __volatile__("tdi 28, %0,-100" |
| 277 | : /*out*/ : /*in*/ "r" (n) ); |
| 278 | } |
| 279 | static void tdi_29_neg100 ( long n ) { |
| 280 | __asm__ __volatile__("tdi 29, %0,-100" |
| 281 | : /*out*/ : /*in*/ "r" (n) ); |
| 282 | } |
| 283 | static void tdi_30_neg100 ( long n ) { |
| 284 | __asm__ __volatile__("tdi 30, %0,-100" |
| 285 | : /*out*/ : /*in*/ "r" (n) ); |
| 286 | } |
| 287 | static void tdi_31_neg100 ( long n ) { |
| 288 | __asm__ __volatile__("tdi 31, %0,-100" |
| 289 | : /*out*/ : /*in*/ "r" (n) ); |
| 290 | } |
| 291 | |
| 292 | #endif |
| 293 | |
| 294 | |
| 295 | int main ( void ) |
| 296 | { |
| 297 | #define TWI_GROUP(cmp) \ |
| 298 | try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -150); \ |
| 299 | try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -100); \ |
| 300 | try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -50); |
| 301 | |
| 302 | TWI_GROUP(0); |
| 303 | TWI_GROUP(1); |
| 304 | TWI_GROUP(2); |
| 305 | TWI_GROUP(3); |
| 306 | TWI_GROUP(4); |
| 307 | TWI_GROUP(5); |
| 308 | TWI_GROUP(6); |
| 309 | TWI_GROUP(7); |
| 310 | TWI_GROUP(8); |
| 311 | TWI_GROUP(9); |
| 312 | TWI_GROUP(10); |
| 313 | TWI_GROUP(11); |
| 314 | TWI_GROUP(12); |
| 315 | TWI_GROUP(13); |
| 316 | TWI_GROUP(14); |
| 317 | TWI_GROUP(15); |
| 318 | TWI_GROUP(16); |
| 319 | TWI_GROUP(17); |
| 320 | TWI_GROUP(18); |
| 321 | TWI_GROUP(19); |
| 322 | TWI_GROUP(20); |
| 323 | TWI_GROUP(21); |
| 324 | TWI_GROUP(22); |
| 325 | TWI_GROUP(23); |
| 326 | TWI_GROUP(24); |
| 327 | TWI_GROUP(25); |
| 328 | TWI_GROUP(26); |
| 329 | TWI_GROUP(27); |
| 330 | TWI_GROUP(28); |
| 331 | TWI_GROUP(29); |
| 332 | TWI_GROUP(30); |
| 333 | TWI_GROUP(31); |
| 334 | #if defined(__powerpc64__) |
| 335 | #define TDI_GROUP(cmp) \ |
| 336 | try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -150); \ |
| 337 | try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -100); \ |
| 338 | try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -50); |
| 339 | |
| 340 | TDI_GROUP(0); |
| 341 | TDI_GROUP(1); |
| 342 | TDI_GROUP(2); |
| 343 | TDI_GROUP(3); |
| 344 | TDI_GROUP(4); |
| 345 | TDI_GROUP(5); |
| 346 | TDI_GROUP(6); |
| 347 | TDI_GROUP(7); |
| 348 | TDI_GROUP(8); |
| 349 | TDI_GROUP(9); |
| 350 | TDI_GROUP(10); |
| 351 | TDI_GROUP(11); |
| 352 | TDI_GROUP(12); |
| 353 | TDI_GROUP(13); |
| 354 | TDI_GROUP(14); |
| 355 | TDI_GROUP(15); |
| 356 | TDI_GROUP(16); |
| 357 | TDI_GROUP(17); |
| 358 | TDI_GROUP(18); |
| 359 | TDI_GROUP(19); |
| 360 | TDI_GROUP(20); |
| 361 | TDI_GROUP(21); |
| 362 | TDI_GROUP(22); |
| 363 | TDI_GROUP(23); |
| 364 | TDI_GROUP(24); |
| 365 | TDI_GROUP(25); |
| 366 | TDI_GROUP(26); |
| 367 | TDI_GROUP(27); |
| 368 | TDI_GROUP(28); |
| 369 | TDI_GROUP(29); |
| 370 | TDI_GROUP(30); |
| 371 | TDI_GROUP(31); |
| 372 | #endif |
| 373 | return 0; |
| 374 | } |