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), long arg1, long arg2 ) 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(arg1, arg2); 25 } 26 signal(SIGTRAP, SIG_DFL); 27 28 printf("%s(%4lld,%4lld) -> %s\n", who, (long long int)arg1, 29 (long long int)arg2, 30 trapped ? "TRAP" : "no trap" ); 31 } 32 33 static void tw_0 ( long n, long m ) { 34 __asm__ __volatile__("tw 0, %0,%1" 35 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 36 } 37 static void tw_1 ( long n, long m ) { 38 __asm__ __volatile__("tw 1, %0,%1" 39 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 40 } 41 static void tw_2 ( long n, long m ) { 42 __asm__ __volatile__("tw 2, %0,%1" 43 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 44 } 45 static void tw_3 ( long n, long m ) { 46 __asm__ __volatile__("tw 3, %0,%1" 47 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 48 } 49 static void tw_4 ( long n, long m ) { 50 __asm__ __volatile__("tw 4, %0,%1" 51 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 52 } 53 static void tw_5 ( long n, long m ) { 54 __asm__ __volatile__("tw 5, %0,%1" 55 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 56 } 57 static void tw_6 ( long n, long m ) { 58 __asm__ __volatile__("tw 6, %0,%1" 59 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 60 } 61 static void tw_7 ( long n, long m ) { 62 __asm__ __volatile__("tw 7, %0,%1" 63 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 64 } 65 static void tw_8 ( long n, long m ) { 66 __asm__ __volatile__("tw 8, %0,%1" 67 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 68 } 69 static void tw_9 ( long n, long m ) { 70 __asm__ __volatile__("tw 9, %0,%1" 71 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 72 } 73 static void tw_10 ( long n, long m ) { 74 __asm__ __volatile__("tw 10, %0,%1" 75 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 76 } 77 static void tw_11 ( long n, long m ) { 78 __asm__ __volatile__("tw 11, %0,%1" 79 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 80 } 81 static void tw_12 ( long n, long m ) { 82 __asm__ __volatile__("tw 12, %0,%1" 83 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 84 } 85 static void tw_13 ( long n, long m ) { 86 __asm__ __volatile__("tw 13, %0,%1" 87 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 88 } 89 static void tw_14 ( long n, long m ) { 90 __asm__ __volatile__("tw 14, %0,%1" 91 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 92 } 93 static void tw_15 ( long n, long m ) { 94 __asm__ __volatile__("tw 15, %0,%1" 95 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 96 } 97 static void tw_16 ( long n, long m ) { 98 __asm__ __volatile__("tw 16, %0,%1" 99 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 100 } 101 static void tw_17 ( long n, long m ) { 102 __asm__ __volatile__("tw 17, %0,%1" 103 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 104 } 105 static void tw_18 ( long n, long m ) { 106 __asm__ __volatile__("tw 18, %0,%1" 107 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 108 } 109 static void tw_19 ( long n, long m ) { 110 __asm__ __volatile__("tw 19, %0,%1" 111 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 112 } 113 static void tw_20 ( long n, long m ) { 114 __asm__ __volatile__("tw 20, %0,%1" 115 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 116 } 117 static void tw_21 ( long n, long m ) { 118 __asm__ __volatile__("tw 21, %0,%1" 119 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 120 } 121 static void tw_22 ( long n, long m ) { 122 __asm__ __volatile__("tw 22, %0,%1" 123 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 124 } 125 static void tw_23 ( long n, long m ) { 126 __asm__ __volatile__("tw 23, %0,%1" 127 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 128 } 129 static void tw_24 ( long n, long m ) { 130 __asm__ __volatile__("tw 24, %0,%1" 131 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 132 } 133 static void tw_25 ( long n, long m ) { 134 __asm__ __volatile__("tw 25, %0,%1" 135 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 136 } 137 static void tw_26 ( long n, long m ) { 138 __asm__ __volatile__("tw 26, %0,%1" 139 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 140 } 141 static void tw_27 ( long n, long m ) { 142 __asm__ __volatile__("tw 27, %0,%1" 143 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 144 } 145 static void tw_28 ( long n, long m ) { 146 __asm__ __volatile__("tw 28, %0,%1" 147 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 148 } 149 static void tw_29 ( long n, long m ) { 150 __asm__ __volatile__("tw 29, %0,%1" 151 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 152 } 153 static void tw_30 ( long n, long m ) { 154 __asm__ __volatile__("tw 30, %0,%1" 155 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 156 } 157 static void tw_31 ( long n, long m ) { 158 __asm__ __volatile__("tw 31, %0,%1" 159 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 160 } 161 162 #if defined(__powerpc64__) 163 164 static void td_0 ( long n, long m ) { 165 __asm__ __volatile__("td 0, %0,%1" 166 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 167 } 168 static void td_1 ( long n, long m ) { 169 __asm__ __volatile__("td 1, %0,%1" 170 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 171 } 172 static void td_2 ( long n, long m ) { 173 __asm__ __volatile__("td 2, %0,%1" 174 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 175 } 176 static void td_3 ( long n, long m ) { 177 __asm__ __volatile__("td 3, %0,%1" 178 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 179 } 180 static void td_4 ( long n, long m ) { 181 __asm__ __volatile__("td 4, %0,%1" 182 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 183 } 184 static void td_5 ( long n, long m ) { 185 __asm__ __volatile__("td 5, %0,%1" 186 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 187 } 188 static void td_6 ( long n, long m ) { 189 __asm__ __volatile__("td 6, %0,%1" 190 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 191 } 192 static void td_7 ( long n, long m ) { 193 __asm__ __volatile__("td 7, %0,%1" 194 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 195 } 196 static void td_8 ( long n, long m ) { 197 __asm__ __volatile__("td 8, %0,%1" 198 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 199 } 200 static void td_9 ( long n, long m ) { 201 __asm__ __volatile__("td 9, %0,%1" 202 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 203 } 204 static void td_10 ( long n, long m ) { 205 __asm__ __volatile__("td 10, %0,%1" 206 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 207 } 208 static void td_11 ( long n, long m ) { 209 __asm__ __volatile__("td 11, %0,%1" 210 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 211 } 212 static void td_12 ( long n, long m ) { 213 __asm__ __volatile__("td 12, %0,%1" 214 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 215 } 216 static void td_13 ( long n, long m ) { 217 __asm__ __volatile__("td 13, %0,%1" 218 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 219 } 220 static void td_14 ( long n, long m ) { 221 __asm__ __volatile__("td 14, %0,%1" 222 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 223 } 224 static void td_15 ( long n, long m ) { 225 __asm__ __volatile__("td 15, %0,%1" 226 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 227 } 228 static void td_16 ( long n, long m ) { 229 __asm__ __volatile__("td 16, %0,%1" 230 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 231 } 232 static void td_17 ( long n, long m ) { 233 __asm__ __volatile__("td 17, %0,%1" 234 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 235 } 236 static void td_18 ( long n, long m ) { 237 __asm__ __volatile__("td 18, %0,%1" 238 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 239 } 240 static void td_19 ( long n, long m ) { 241 __asm__ __volatile__("td 19, %0,%1" 242 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 243 } 244 static void td_20 ( long n, long m ) { 245 __asm__ __volatile__("td 20, %0,%1" 246 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 247 } 248 static void td_21 ( long n, long m ) { 249 __asm__ __volatile__("td 21, %0,%1" 250 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 251 } 252 static void td_22 ( long n, long m ) { 253 __asm__ __volatile__("td 22, %0,%1" 254 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 255 } 256 static void td_23 ( long n, long m ) { 257 __asm__ __volatile__("td 23, %0,%1" 258 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 259 } 260 static void td_24 ( long n, long m ) { 261 __asm__ __volatile__("td 24, %0,%1" 262 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 263 } 264 static void td_25 ( long n, long m ) { 265 __asm__ __volatile__("td 25, %0,%1" 266 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 267 } 268 static void td_26 ( long n, long m ) { 269 __asm__ __volatile__("td 26, %0,%1" 270 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 271 } 272 static void td_27 ( long n, long m ) { 273 __asm__ __volatile__("td 27, %0,%1" 274 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 275 } 276 static void td_28 ( long n, long m ) { 277 __asm__ __volatile__("td 28, %0,%1" 278 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 279 } 280 static void td_29 ( long n, long m ) { 281 __asm__ __volatile__("td 29, %0,%1" 282 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 283 } 284 static void td_30 ( long n, long m ) { 285 __asm__ __volatile__("td 30, %0,%1" 286 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 287 } 288 static void td_31 ( long n, long m ) { 289 __asm__ __volatile__("td 31, %0,%1" 290 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 291 } 292 293 #endif 294 295 296 int main ( void ) 297 { 298 #define TW_GROUP(cmp) \ 299 try("tw_" #cmp "", tw_##cmp, -150, -100); \ 300 try("tw_" #cmp "", tw_##cmp, -100, -100); \ 301 try("tw_" #cmp "", tw_##cmp, -50, -100); 302 303 TW_GROUP(0); 304 TW_GROUP(1); 305 TW_GROUP(2); 306 TW_GROUP(3); 307 TW_GROUP(4); 308 TW_GROUP(5); 309 TW_GROUP(6); 310 TW_GROUP(7); 311 TW_GROUP(8); 312 TW_GROUP(9); 313 TW_GROUP(10); 314 TW_GROUP(11); 315 TW_GROUP(12); 316 TW_GROUP(13); 317 TW_GROUP(14); 318 TW_GROUP(15); 319 TW_GROUP(16); 320 TW_GROUP(17); 321 TW_GROUP(18); 322 TW_GROUP(19); 323 TW_GROUP(20); 324 TW_GROUP(21); 325 TW_GROUP(22); 326 TW_GROUP(23); 327 TW_GROUP(24); 328 TW_GROUP(25); 329 TW_GROUP(26); 330 TW_GROUP(27); 331 TW_GROUP(28); 332 TW_GROUP(29); 333 TW_GROUP(30); 334 TW_GROUP(31); 335 #if defined(__powerpc64__) 336 #define TD_GROUP(cmp) \ 337 try("td_" #cmp "", td_##cmp, -150, -100); \ 338 try("td_" #cmp "", td_##cmp, -100, -100); \ 339 try("td_" #cmp "", td_##cmp, -50, -100); 340 341 TD_GROUP(0); 342 TD_GROUP(1); 343 TD_GROUP(2); 344 TD_GROUP(3); 345 TD_GROUP(4); 346 TD_GROUP(5); 347 TD_GROUP(6); 348 TD_GROUP(7); 349 TD_GROUP(8); 350 TD_GROUP(9); 351 TD_GROUP(10); 352 TD_GROUP(11); 353 TD_GROUP(12); 354 TD_GROUP(13); 355 TD_GROUP(14); 356 TD_GROUP(15); 357 TD_GROUP(16); 358 TD_GROUP(17); 359 TD_GROUP(18); 360 TD_GROUP(19); 361 TD_GROUP(20); 362 TD_GROUP(21); 363 TD_GROUP(22); 364 TD_GROUP(23); 365 TD_GROUP(24); 366 TD_GROUP(25); 367 TD_GROUP(26); 368 TD_GROUP(27); 369 TD_GROUP(28); 370 TD_GROUP(29); 371 TD_GROUP(30); 372 TD_GROUP(31); 373 #endif 374 return 0; 375 } 376