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), 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