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 } 375