Home | History | Annotate | Download | only in ppc64
      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