twi_tdi.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
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 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 32static void twi_0_neg100 ( long n ) { 33 __asm__ __volatile__("twi 0, %0,-100" 34 : /*out*/ : /*in*/ "r" (n) ); 35} 36static void twi_1_neg100 ( long n ) { 37 __asm__ __volatile__("twi 1, %0,-100" 38 : /*out*/ : /*in*/ "r" (n) ); 39} 40static void twi_2_neg100 ( long n ) { 41 __asm__ __volatile__("twi 2, %0,-100" 42 : /*out*/ : /*in*/ "r" (n) ); 43} 44static void twi_3_neg100 ( long n ) { 45 __asm__ __volatile__("twi 3, %0,-100" 46 : /*out*/ : /*in*/ "r" (n) ); 47} 48static void twi_4_neg100 ( long n ) { 49 __asm__ __volatile__("twi 4, %0,-100" 50 : /*out*/ : /*in*/ "r" (n) ); 51} 52static void twi_5_neg100 ( long n ) { 53 __asm__ __volatile__("twi 5, %0,-100" 54 : /*out*/ : /*in*/ "r" (n) ); 55} 56static void twi_6_neg100 ( long n ) { 57 __asm__ __volatile__("twi 6, %0,-100" 58 : /*out*/ : /*in*/ "r" (n) ); 59} 60static void twi_7_neg100 ( long n ) { 61 __asm__ __volatile__("twi 7, %0,-100" 62 : /*out*/ : /*in*/ "r" (n) ); 63} 64static void twi_8_neg100 ( long n ) { 65 __asm__ __volatile__("twi 8, %0,-100" 66 : /*out*/ : /*in*/ "r" (n) ); 67} 68static void twi_9_neg100 ( long n ) { 69 __asm__ __volatile__("twi 9, %0,-100" 70 : /*out*/ : /*in*/ "r" (n) ); 71} 72static void twi_10_neg100 ( long n ) { 73 __asm__ __volatile__("twi 10, %0,-100" 74 : /*out*/ : /*in*/ "r" (n) ); 75} 76static void twi_11_neg100 ( long n ) { 77 __asm__ __volatile__("twi 11, %0,-100" 78 : /*out*/ : /*in*/ "r" (n) ); 79} 80static void twi_12_neg100 ( long n ) { 81 __asm__ __volatile__("twi 12, %0,-100" 82 : /*out*/ : /*in*/ "r" (n) ); 83} 84static void twi_13_neg100 ( long n ) { 85 __asm__ __volatile__("twi 13, %0,-100" 86 : /*out*/ : /*in*/ "r" (n) ); 87} 88static void twi_14_neg100 ( long n ) { 89 __asm__ __volatile__("twi 14, %0,-100" 90 : /*out*/ : /*in*/ "r" (n) ); 91} 92static void twi_15_neg100 ( long n ) { 93 __asm__ __volatile__("twi 15, %0,-100" 94 : /*out*/ : /*in*/ "r" (n) ); 95} 96static void twi_16_neg100 ( long n ) { 97 __asm__ __volatile__("twi 16, %0,-100" 98 : /*out*/ : /*in*/ "r" (n) ); 99} 100static void twi_17_neg100 ( long n ) { 101 __asm__ __volatile__("twi 17, %0,-100" 102 : /*out*/ : /*in*/ "r" (n) ); 103} 104static void twi_18_neg100 ( long n ) { 105 __asm__ __volatile__("twi 18, %0,-100" 106 : /*out*/ : /*in*/ "r" (n) ); 107} 108static void twi_19_neg100 ( long n ) { 109 __asm__ __volatile__("twi 19, %0,-100" 110 : /*out*/ : /*in*/ "r" (n) ); 111} 112static void twi_20_neg100 ( long n ) { 113 __asm__ __volatile__("twi 20, %0,-100" 114 : /*out*/ : /*in*/ "r" (n) ); 115} 116static void twi_21_neg100 ( long n ) { 117 __asm__ __volatile__("twi 21, %0,-100" 118 : /*out*/ : /*in*/ "r" (n) ); 119} 120static void twi_22_neg100 ( long n ) { 121 __asm__ __volatile__("twi 22, %0,-100" 122 : /*out*/ : /*in*/ "r" (n) ); 123} 124static void twi_23_neg100 ( long n ) { 125 __asm__ __volatile__("twi 23, %0,-100" 126 : /*out*/ : /*in*/ "r" (n) ); 127} 128static void twi_24_neg100 ( long n ) { 129 __asm__ __volatile__("twi 24, %0,-100" 130 : /*out*/ : /*in*/ "r" (n) ); 131} 132static void twi_25_neg100 ( long n ) { 133 __asm__ __volatile__("twi 25, %0,-100" 134 : /*out*/ : /*in*/ "r" (n) ); 135} 136static void twi_26_neg100 ( long n ) { 137 __asm__ __volatile__("twi 26, %0,-100" 138 : /*out*/ : /*in*/ "r" (n) ); 139} 140static void twi_27_neg100 ( long n ) { 141 __asm__ __volatile__("twi 27, %0,-100" 142 : /*out*/ : /*in*/ "r" (n) ); 143} 144static void twi_28_neg100 ( long n ) { 145 __asm__ __volatile__("twi 28, %0,-100" 146 : /*out*/ : /*in*/ "r" (n) ); 147} 148static void twi_29_neg100 ( long n ) { 149 __asm__ __volatile__("twi 29, %0,-100" 150 : /*out*/ : /*in*/ "r" (n) ); 151} 152static void twi_30_neg100 ( long n ) { 153 __asm__ __volatile__("twi 30, %0,-100" 154 : /*out*/ : /*in*/ "r" (n) ); 155} 156static 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 163static void tdi_0_neg100 ( long n ) { 164 __asm__ __volatile__("tdi 0, %0,-100" 165 : /*out*/ : /*in*/ "r" (n) ); 166} 167static void tdi_1_neg100 ( long n ) { 168 __asm__ __volatile__("tdi 1, %0,-100" 169 : /*out*/ : /*in*/ "r" (n) ); 170} 171static void tdi_2_neg100 ( long n ) { 172 __asm__ __volatile__("tdi 2, %0,-100" 173 : /*out*/ : /*in*/ "r" (n) ); 174} 175static void tdi_3_neg100 ( long n ) { 176 __asm__ __volatile__("tdi 3, %0,-100" 177 : /*out*/ : /*in*/ "r" (n) ); 178} 179static void tdi_4_neg100 ( long n ) { 180 __asm__ __volatile__("tdi 4, %0,-100" 181 : /*out*/ : /*in*/ "r" (n) ); 182} 183static void tdi_5_neg100 ( long n ) { 184 __asm__ __volatile__("tdi 5, %0,-100" 185 : /*out*/ : /*in*/ "r" (n) ); 186} 187static void tdi_6_neg100 ( long n ) { 188 __asm__ __volatile__("tdi 6, %0,-100" 189 : /*out*/ : /*in*/ "r" (n) ); 190} 191static void tdi_7_neg100 ( long n ) { 192 __asm__ __volatile__("tdi 7, %0,-100" 193 : /*out*/ : /*in*/ "r" (n) ); 194} 195static void tdi_8_neg100 ( long n ) { 196 __asm__ __volatile__("tdi 8, %0,-100" 197 : /*out*/ : /*in*/ "r" (n) ); 198} 199static void tdi_9_neg100 ( long n ) { 200 __asm__ __volatile__("tdi 9, %0,-100" 201 : /*out*/ : /*in*/ "r" (n) ); 202} 203static void tdi_10_neg100 ( long n ) { 204 __asm__ __volatile__("tdi 10, %0,-100" 205 : /*out*/ : /*in*/ "r" (n) ); 206} 207static void tdi_11_neg100 ( long n ) { 208 __asm__ __volatile__("tdi 11, %0,-100" 209 : /*out*/ : /*in*/ "r" (n) ); 210} 211static void tdi_12_neg100 ( long n ) { 212 __asm__ __volatile__("tdi 12, %0,-100" 213 : /*out*/ : /*in*/ "r" (n) ); 214} 215static void tdi_13_neg100 ( long n ) { 216 __asm__ __volatile__("tdi 13, %0,-100" 217 : /*out*/ : /*in*/ "r" (n) ); 218} 219static void tdi_14_neg100 ( long n ) { 220 __asm__ __volatile__("tdi 14, %0,-100" 221 : /*out*/ : /*in*/ "r" (n) ); 222} 223static void tdi_15_neg100 ( long n ) { 224 __asm__ __volatile__("tdi 15, %0,-100" 225 : /*out*/ : /*in*/ "r" (n) ); 226} 227static void tdi_16_neg100 ( long n ) { 228 __asm__ __volatile__("tdi 16, %0,-100" 229 : /*out*/ : /*in*/ "r" (n) ); 230} 231static void tdi_17_neg100 ( long n ) { 232 __asm__ __volatile__("tdi 17, %0,-100" 233 : /*out*/ : /*in*/ "r" (n) ); 234} 235static void tdi_18_neg100 ( long n ) { 236 __asm__ __volatile__("tdi 18, %0,-100" 237 : /*out*/ : /*in*/ "r" (n) ); 238} 239static void tdi_19_neg100 ( long n ) { 240 __asm__ __volatile__("tdi 19, %0,-100" 241 : /*out*/ : /*in*/ "r" (n) ); 242} 243static void tdi_20_neg100 ( long n ) { 244 __asm__ __volatile__("tdi 20, %0,-100" 245 : /*out*/ : /*in*/ "r" (n) ); 246} 247static void tdi_21_neg100 ( long n ) { 248 __asm__ __volatile__("tdi 21, %0,-100" 249 : /*out*/ : /*in*/ "r" (n) ); 250} 251static void tdi_22_neg100 ( long n ) { 252 __asm__ __volatile__("tdi 22, %0,-100" 253 : /*out*/ : /*in*/ "r" (n) ); 254} 255static void tdi_23_neg100 ( long n ) { 256 __asm__ __volatile__("tdi 23, %0,-100" 257 : /*out*/ : /*in*/ "r" (n) ); 258} 259static void tdi_24_neg100 ( long n ) { 260 __asm__ __volatile__("tdi 24, %0,-100" 261 : /*out*/ : /*in*/ "r" (n) ); 262} 263static void tdi_25_neg100 ( long n ) { 264 __asm__ __volatile__("tdi 25, %0,-100" 265 : /*out*/ : /*in*/ "r" (n) ); 266} 267static void tdi_26_neg100 ( long n ) { 268 __asm__ __volatile__("tdi 26, %0,-100" 269 : /*out*/ : /*in*/ "r" (n) ); 270} 271static void tdi_27_neg100 ( long n ) { 272 __asm__ __volatile__("tdi 27, %0,-100" 273 : /*out*/ : /*in*/ "r" (n) ); 274} 275static void tdi_28_neg100 ( long n ) { 276 __asm__ __volatile__("tdi 28, %0,-100" 277 : /*out*/ : /*in*/ "r" (n) ); 278} 279static void tdi_29_neg100 ( long n ) { 280 __asm__ __volatile__("tdi 29, %0,-100" 281 : /*out*/ : /*in*/ "r" (n) ); 282} 283static void tdi_30_neg100 ( long n ) { 284 __asm__ __volatile__("tdi 30, %0,-100" 285 : /*out*/ : /*in*/ "r" (n) ); 286} 287static void tdi_31_neg100 ( long n ) { 288 __asm__ __volatile__("tdi 31, %0,-100" 289 : /*out*/ : /*in*/ "r" (n) ); 290} 291 292#endif 293 294 295int 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