1 2#include <stdio.h> 3#include <signal.h> 4#include <setjmp.h> 5#include <string.h> 6#include <assert.h> 7 8static jmp_buf env_sigtrap; 9static void handler_sigtrap ( int x ) { longjmp(env_sigtrap,1); } 10 11void 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 33static void tw_0 ( long n, long m ) { 34 __asm__ __volatile__("tw 0, %0,%1" 35 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 36} 37static void tw_1 ( long n, long m ) { 38 __asm__ __volatile__("tw 1, %0,%1" 39 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 40} 41static void tw_2 ( long n, long m ) { 42 __asm__ __volatile__("tw 2, %0,%1" 43 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 44} 45static void tw_3 ( long n, long m ) { 46 __asm__ __volatile__("tw 3, %0,%1" 47 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 48} 49static void tw_4 ( long n, long m ) { 50 __asm__ __volatile__("tw 4, %0,%1" 51 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 52} 53static void tw_5 ( long n, long m ) { 54 __asm__ __volatile__("tw 5, %0,%1" 55 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 56} 57static void tw_6 ( long n, long m ) { 58 __asm__ __volatile__("tw 6, %0,%1" 59 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 60} 61static void tw_7 ( long n, long m ) { 62 __asm__ __volatile__("tw 7, %0,%1" 63 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 64} 65static void tw_8 ( long n, long m ) { 66 __asm__ __volatile__("tw 8, %0,%1" 67 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 68} 69static void tw_9 ( long n, long m ) { 70 __asm__ __volatile__("tw 9, %0,%1" 71 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 72} 73static void tw_10 ( long n, long m ) { 74 __asm__ __volatile__("tw 10, %0,%1" 75 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 76} 77static void tw_11 ( long n, long m ) { 78 __asm__ __volatile__("tw 11, %0,%1" 79 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 80} 81static void tw_12 ( long n, long m ) { 82 __asm__ __volatile__("tw 12, %0,%1" 83 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 84} 85static void tw_13 ( long n, long m ) { 86 __asm__ __volatile__("tw 13, %0,%1" 87 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 88} 89static void tw_14 ( long n, long m ) { 90 __asm__ __volatile__("tw 14, %0,%1" 91 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 92} 93static void tw_15 ( long n, long m ) { 94 __asm__ __volatile__("tw 15, %0,%1" 95 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 96} 97static void tw_16 ( long n, long m ) { 98 __asm__ __volatile__("tw 16, %0,%1" 99 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 100} 101static void tw_17 ( long n, long m ) { 102 __asm__ __volatile__("tw 17, %0,%1" 103 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 104} 105static void tw_18 ( long n, long m ) { 106 __asm__ __volatile__("tw 18, %0,%1" 107 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 108} 109static void tw_19 ( long n, long m ) { 110 __asm__ __volatile__("tw 19, %0,%1" 111 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 112} 113static void tw_20 ( long n, long m ) { 114 __asm__ __volatile__("tw 20, %0,%1" 115 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 116} 117static void tw_21 ( long n, long m ) { 118 __asm__ __volatile__("tw 21, %0,%1" 119 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 120} 121static void tw_22 ( long n, long m ) { 122 __asm__ __volatile__("tw 22, %0,%1" 123 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 124} 125static void tw_23 ( long n, long m ) { 126 __asm__ __volatile__("tw 23, %0,%1" 127 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 128} 129static void tw_24 ( long n, long m ) { 130 __asm__ __volatile__("tw 24, %0,%1" 131 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 132} 133static void tw_25 ( long n, long m ) { 134 __asm__ __volatile__("tw 25, %0,%1" 135 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 136} 137static void tw_26 ( long n, long m ) { 138 __asm__ __volatile__("tw 26, %0,%1" 139 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 140} 141static void tw_27 ( long n, long m ) { 142 __asm__ __volatile__("tw 27, %0,%1" 143 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 144} 145static void tw_28 ( long n, long m ) { 146 __asm__ __volatile__("tw 28, %0,%1" 147 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 148} 149static void tw_29 ( long n, long m ) { 150 __asm__ __volatile__("tw 29, %0,%1" 151 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 152} 153static void tw_30 ( long n, long m ) { 154 __asm__ __volatile__("tw 30, %0,%1" 155 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 156} 157static 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 164static void td_0 ( long n, long m ) { 165 __asm__ __volatile__("td 0, %0,%1" 166 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 167} 168static void td_1 ( long n, long m ) { 169 __asm__ __volatile__("td 1, %0,%1" 170 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 171} 172static void td_2 ( long n, long m ) { 173 __asm__ __volatile__("td 2, %0,%1" 174 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 175} 176static void td_3 ( long n, long m ) { 177 __asm__ __volatile__("td 3, %0,%1" 178 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 179} 180static void td_4 ( long n, long m ) { 181 __asm__ __volatile__("td 4, %0,%1" 182 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 183} 184static void td_5 ( long n, long m ) { 185 __asm__ __volatile__("td 5, %0,%1" 186 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 187} 188static void td_6 ( long n, long m ) { 189 __asm__ __volatile__("td 6, %0,%1" 190 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 191} 192static void td_7 ( long n, long m ) { 193 __asm__ __volatile__("td 7, %0,%1" 194 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 195} 196static void td_8 ( long n, long m ) { 197 __asm__ __volatile__("td 8, %0,%1" 198 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 199} 200static void td_9 ( long n, long m ) { 201 __asm__ __volatile__("td 9, %0,%1" 202 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 203} 204static void td_10 ( long n, long m ) { 205 __asm__ __volatile__("td 10, %0,%1" 206 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 207} 208static void td_11 ( long n, long m ) { 209 __asm__ __volatile__("td 11, %0,%1" 210 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 211} 212static void td_12 ( long n, long m ) { 213 __asm__ __volatile__("td 12, %0,%1" 214 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 215} 216static void td_13 ( long n, long m ) { 217 __asm__ __volatile__("td 13, %0,%1" 218 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 219} 220static void td_14 ( long n, long m ) { 221 __asm__ __volatile__("td 14, %0,%1" 222 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 223} 224static void td_15 ( long n, long m ) { 225 __asm__ __volatile__("td 15, %0,%1" 226 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 227} 228static void td_16 ( long n, long m ) { 229 __asm__ __volatile__("td 16, %0,%1" 230 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 231} 232static void td_17 ( long n, long m ) { 233 __asm__ __volatile__("td 17, %0,%1" 234 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 235} 236static void td_18 ( long n, long m ) { 237 __asm__ __volatile__("td 18, %0,%1" 238 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 239} 240static void td_19 ( long n, long m ) { 241 __asm__ __volatile__("td 19, %0,%1" 242 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 243} 244static void td_20 ( long n, long m ) { 245 __asm__ __volatile__("td 20, %0,%1" 246 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 247} 248static void td_21 ( long n, long m ) { 249 __asm__ __volatile__("td 21, %0,%1" 250 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 251} 252static void td_22 ( long n, long m ) { 253 __asm__ __volatile__("td 22, %0,%1" 254 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 255} 256static void td_23 ( long n, long m ) { 257 __asm__ __volatile__("td 23, %0,%1" 258 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 259} 260static void td_24 ( long n, long m ) { 261 __asm__ __volatile__("td 24, %0,%1" 262 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 263} 264static void td_25 ( long n, long m ) { 265 __asm__ __volatile__("td 25, %0,%1" 266 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 267} 268static void td_26 ( long n, long m ) { 269 __asm__ __volatile__("td 26, %0,%1" 270 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 271} 272static void td_27 ( long n, long m ) { 273 __asm__ __volatile__("td 27, %0,%1" 274 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 275} 276static void td_28 ( long n, long m ) { 277 __asm__ __volatile__("td 28, %0,%1" 278 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 279} 280static void td_29 ( long n, long m ) { 281 __asm__ __volatile__("td 29, %0,%1" 282 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 283} 284static void td_30 ( long n, long m ) { 285 __asm__ __volatile__("td 30, %0,%1" 286 : /*out*/ : /*in*/ "r" (n), "r" (m) ); 287} 288static 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 296int 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