Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 
      3 unsigned int mem[] = {
      4    0x121f1e1f, 0, 3, -1,
      5    0x232f2e2f, 0x242c2b2b, 0x252a2e2b, 0x262d2d2a,
      6    0x3f343f3e, 0x3e353d3c, 0x363a3c3b, 0x3b373b3a,
      7    0x454f4e45, 0x4e464d46, 0x474d474c, 0x4a484a4c
      8 };
      9 
     10 unsigned int mem1[] = {
     11    0, 0, 0, 0,
     12    0, 0, 0, 0,
     13    0xffffffff, 0, 0, 0,
     14    0, 0, 0, 0
     15 };
     16 
     17 unsigned int mem2[] = {
     18    0x0000e680, 0x00010700, 0x0000e7dc, 0x0000b0d0,
     19    0x2ab05fd0, 0x0000b6a0, 0x0000be80, 0x0000de10,
     20    0x0000df20, 0x2ab05fe0, 0x0000dfd0, 0x00010300
     21 };
     22 
     23 #define TESTINST1(instruction, RTval, offset, RT, RS)  \
     24 {                                                      \
     25    unsigned int out;                                   \
     26    __asm__ __volatile__(                               \
     27       "move $"#RS", %1"                 "\n\t"         \
     28       "li   $"#RT", "#RTval             "\n\t"         \
     29       instruction                       "\n\t"         \
     30       "lw   %0,     "#offset"($"#RS")"  "\n\t"         \
     31       : "=&r" (out)                                    \
     32       : "r" (mem1), "r" (RTval)                        \
     33       : #RT, #RS                                       \
     34    );                                                  \
     35    printf("%s :: RTval: 0x%x, out: 0x%x\n",            \
     36           instruction, RTval, out);                    \
     37    out = 0;                                            \
     38    __asm__ __volatile__(                               \
     39       "move $"#RS", %1"                 "\n\t"         \
     40       "li   $"#RT", " #RTval            "\n\t"         \
     41       instruction                       "\n\t"         \
     42       "lw   %0,     "#offset"($"#RS")"  "\n\t"         \
     43       : "=&r" (out)                                    \
     44       : "r" (mem), "r" (RTval)                         \
     45       : #RT, #RS                                       \
     46    );                                                  \
     47    printf("%s :: RTval: 0x%x, out: 0x%x\n",            \
     48           instruction, RTval, out);                    \
     49 }
     50 
     51 /* swl $t0, 3($t1)
     52    swr $t0, 0($t1) */
     53 #define TESTINSTsw(RTval, offset, RT, RS)                                    \
     54 {                                                                            \
     55    unsigned int out;                                                         \
     56    __asm__ __volatile__(                                                     \
     57       "move   $"#RS", %1"               "\n\t"                               \
     58       "daddiu $"#RS", $"#RS", "#offset  "\n\t"                               \
     59       "li     $"#RT", "#RTval           "\n\t"                               \
     60       "swl    $t0,    3($t1)"           "\n\t"                               \
     61       "swr    $t0,    0($t1)"           "\n\t"                               \
     62       "lw     %0,     0($"#RS")"        "\n\t"                               \
     63       : "=&r" (out)                                                          \
     64       : "r" (mem2), "r" (RTval)                                              \
     65       : #RT, #RS                                                             \
     66    );                                                                        \
     67    printf("swl $t0, 3($t1)\nswr $t0, 0($t1)\n :: RTval: 0x%x, out: 0x%x\n",  \
     68           RTval, out);                                                       \
     69 }
     70 
     71 void ppMem(unsigned int* m, int len)
     72 {
     73    int i;
     74    printf("MEM1:\n");
     75    for (i = 0; i < len; i += 4) {
     76       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
     77       m[i] = 0;
     78       m[i+1] = 0;
     79       m[i+2] = 0;
     80       m[i+3] = 0;
     81       if (i == 2) {
     82          m[i] = 0xffffffff;
     83          m[i+1] = 0;
     84          m[i+2] = 0;
     85          m[i+3] = 0;
     86       }
     87    }
     88 }
     89 
     90 void ppMem1(unsigned int* m, int len)
     91 {
     92    int i;
     93    printf("MEM:\n");
     94    for (i = 0; i < len; i += 4) {
     95       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
     96    }
     97    m[0] = 0x121f1e1f;
     98    m[1] = 0;
     99    m[2] = 3;
    100    m[3] = -1;
    101    m[4] = 0x232f2e2f;
    102    m[5] = 0x242c2b2b;
    103    m[6] = 0x252a2e2b;
    104    m[7] = 0x262d2d2a;
    105    m[8] = 0x3f343f3e;
    106    m[9] = 0x3e353d3c;
    107    m[10] = 0x363a3c3b;
    108    m[11] = 0x3b373b3a;
    109    m[12] = 0x454f4e45;
    110    m[13] = 0x4e464d46;
    111    m[14] = 0x474d474c;
    112    m[15] = 0x4a484a4c;
    113 }
    114 
    115 void ppMem2(unsigned int* m, int len)
    116 {
    117    int i;
    118    printf("MEM:\n");
    119    for (i = 0; i < len; i=i+4) {
    120       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
    121    }
    122 
    123    m[0] = 0x0000e680;
    124    m[1] = 0x00010700;
    125    m[2] = 0x0000e7dc;
    126    m[3] = 0x0000b0d0;
    127    m[4] = 0x2ab05fd0;
    128    m[5] = 0x0000b6a0;
    129    m[6] = 0x0000be80;
    130    m[7] = 0x0000de10;
    131    m[8] = 0x0000df20;
    132    m[9] = 0x2ab05fe0;
    133    m[10] = 0x0000dfd0;
    134    m[11] = 0x00010300;
    135 }
    136 
    137 int main()
    138 {
    139    printf("sb\n");
    140    TESTINST1("sb $t0, 3($t1)",  0,          3,  t0, t1);
    141    TESTINST1("sb $t0, 5($t1)",  0x31415927, 5,  t0, t1);
    142    TESTINST1("sb $t0, 7($t1)",  0x7fffffff, 7,  t0, t1);
    143    TESTINST1("sb $t0, 1($t1)",  0x80000000, 1,  t0, t1);
    144    TESTINST1("sb $t0, 2($t1)",  0x80000000, 2,  t0, t1);
    145    TESTINST1("sb $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    146    TESTINST1("sb $t0, 11($t1)", 0x7fffffff, 11, t0, t1);
    147    TESTINST1("sb $t0, 8($t1)",  -1,         8,  t0, t1);
    148    TESTINST1("sb $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    149    TESTINST1("sb $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    150    TESTINST1("sb $t0, 0($t1)",  655,        0,  t0, t1);
    151    TESTINST1("sb $t0, 0($t1)",  -655,       0,  t0, t1);
    152    TESTINST1("sb $t0, 0($t1)",  15,         0,  t0, t1);
    153    TESTINST1("sb $t0, 0($t1)",  1,          0,  t0, t1);
    154    TESTINST1("sb $t0, 0($t1)",  53,         0,  t0, t1);
    155    TESTINST1("sb $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    156    TESTINST1("sb $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    157    TESTINST1("sb $t0, 31($t1)", 0xffffffff, 31, t0, t1);
    158    TESTINST1("sb $t0, 35($t1)", 0xffffffff, 35, t0, t1);
    159    TESTINST1("sb $t0, 41($t1)", 0x31415927, 41, t0, t1);
    160    TESTINST1("sb $t0, 42($t1)", 0x7fffffff, 42, t0, t1);
    161    TESTINST1("sb $t0, 45($t1)", 0x80000000, 45, t0, t1);
    162    TESTINST1("sb $t0, 51($t1)", 655,        51, t0, t1);
    163    ppMem(mem1, 16);
    164    ppMem1(mem, 16);
    165 
    166    printf("sh\n");
    167    TESTINST1("sh $t0, 1($t1)",  0,          1,  t0, t1);
    168    TESTINST1("sh $t0, 3($t1)",  0x31415927, 3,  t0, t1);
    169    TESTINST1("sh $t0, 5($t1)",  0x7fffffff, 5,  t0, t1);
    170    TESTINST1("sh $t0, 7($t1)",  0x80000000, 7,  t0, t1);
    171    TESTINST1("sh $t0, 9($t1)",  0x80000000, 9,  t0, t1);
    172    TESTINST1("sh $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    173    TESTINST1("sh $t0, 11($t1)", 0x7fffffff, 11, t0, t1);
    174    TESTINST1("sh $t0, 8($t1)",  -1,         8,  t0, t1);
    175    TESTINST1("sh $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    176    TESTINST1("sh $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    177    TESTINST1("sh $t0, 0($t1)",  655,        0,  t0, t1);
    178    TESTINST1("sh $t0, 0($t1)",  -655,       0,  t0, t1);
    179    TESTINST1("sh $t0, 0($t1)",  15,         0,  t0, t1);
    180    TESTINST1("sh $t0, 0($t1)",  1,          0,  t0, t1);
    181    TESTINST1("sh $t0, 0($t1)",  53,         0,  t0, t1);
    182    TESTINST1("sh $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    183    TESTINST1("sh $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    184    TESTINST1("sh $t0, 31($t1)", 0xffffffff, 31, t0, t1);
    185    TESTINST1("sh $t0, 35($t1)", 0xffffffff, 35, t0, t1);
    186    TESTINST1("sh $t0, 41($t1)", 0x31415927, 41, t0, t1);
    187    TESTINST1("sh $t0, 47($t1)", 0x7fffffff, 47, t0, t1);
    188    TESTINST1("sh $t0, 49($t1)", 0x80000000, 49, t0, t1);
    189    TESTINST1("sh $t0, 51($t1)", 655,        51, t0, t1);
    190    ppMem(mem1, 16);
    191    ppMem1(mem, 16);
    192 
    193    printf("sw\n");
    194    TESTINST1("sw $t0, 1($t1)",  0,          1,  t0, t1);
    195    TESTINST1("sw $t0, 3($t1)",  0x31415927, 3,  t0, t1);
    196    TESTINST1("sw $t0, 5($t1)",  0x7fffffff, 5,  t0, t1);
    197    TESTINST1("sw $t0, 7($t1)",  0x80000000, 7,  t0, t1);
    198    TESTINST1("sw $t0, 9($t1)",  0x80000000, 9,  t0, t1);
    199    TESTINST1("sw $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    200    TESTINST1("sw $t0, 15($t1)", 0x7fffffff, 11, t0, t1);
    201    TESTINST1("sw $t0, 8($t1)",  -1,         8,  t0, t1);
    202    TESTINST1("sw $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    203    TESTINST1("sw $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    204    TESTINST1("sw $t0, 0($t1)",  655,        0,  t0, t1);
    205    TESTINST1("sw $t0, 0($t1)",  -655,       0,  t0, t1);
    206    TESTINST1("sw $t0, 0($t1)",  15,         0,  t0, t1);
    207    TESTINST1("sw $t0, 0($t1)",  1,          0,  t0, t1);
    208    TESTINST1("sw $t0, 0($t1)",  53,         0,  t0, t1);
    209    TESTINST1("sw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    210    TESTINST1("sw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    211    TESTINST1("sw $t0, 31($t1)", 0xffffffff, 31, t0, t1);
    212    TESTINST1("sw $t0, 37($t1)", 0xffffffff, 37, t0, t1);
    213    TESTINST1("sw $t0, 49($t1)", 0x31415927, 49, t0, t1);
    214    TESTINST1("sw $t0, 41($t1)", 0x7fffffff, 41, t0, t1);
    215    TESTINST1("sw $t0, 43($t1)", 0x80000000, 43, t0, t1);
    216    TESTINST1("sw $t0, 51($t1)", 655,        51, t0, t1);
    217    ppMem(mem1, 16);
    218    ppMem1(mem, 16);
    219 
    220    printf("swl\n");
    221    TESTINST1("swl $t0, 1($t1)",  0,          1,  t0, t1);
    222    TESTINST1("swl $t0, 3($t1)",  0x31415927, 3,  t0, t1);
    223    TESTINST1("swl $t0, 5($t1)",  0x7fffffff, 5,  t0, t1);
    224    TESTINST1("swl $t0, 7($t1)",  0x80000000, 7,  t0, t1);
    225    TESTINST1("swl $t0, 9($t1)",  0x80000000, 9,  t0, t1);
    226    TESTINST1("swl $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    227    TESTINST1("swl $t0, 11($t1)", 0x7fffffff, 11, t0, t1);
    228    TESTINST1("swl $t0, 8($t1)",  -1,         8,  t0, t1);
    229    TESTINST1("swl $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    230    TESTINST1("swl $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    231    TESTINST1("swl $t0, 0($t1)",  655,        0,  t0, t1);
    232    TESTINST1("swl $t0, 0($t1)",  -655,       0,  t0, t1);
    233    TESTINST1("swl $t0, 0($t1)",  15,         0,  t0, t1);
    234    TESTINST1("swl $t0, 0($t1)",  1,          0,  t0, t1);
    235    TESTINST1("swl $t0, 0($t1)",  53,         0,  t0, t1);
    236    TESTINST1("swl $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    237    TESTINST1("swl $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    238    TESTINST1("swl $t0, 33($t1)", 0xffffffff, 33, t0, t1);
    239    TESTINST1("swl $t0, 35($t1)", 0xffffffff, 35, t0, t1);
    240    TESTINST1("swl $t0, 41($t1)", 0x31415927, 41, t0, t1);
    241    TESTINST1("swl $t0, 45($t1)", 0x7fffffff, 45, t0, t1);
    242    TESTINST1("swl $t0, 49($t1)", 0x80000000, 49, t0, t1);
    243    TESTINST1("swl $t0, 51($t1)", 655,        51, t0, t1);
    244    ppMem(mem1, 16);
    245    ppMem1(mem, 16);
    246 
    247    printf("swr\n");
    248    TESTINST1("swr $t0, 1($t1)",  0,          1,  t0, t1);
    249    TESTINST1("swr $t0, 3($t1)",  0x31415927, 3,  t0, t1);
    250    TESTINST1("swr $t0, 5($t1)",  0x7fffffff, 5,  t0, t1);
    251    TESTINST1("swr $t0, 7($t1)",  0x80000000, 7,  t0, t1);
    252    TESTINST1("swr $t0, 9($t1)",  0x80000000, 9,  t0, t1);
    253    TESTINST1("swr $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    254    TESTINST1("swr $t0, 11($t1)", 0x7fffffff, 11, t0, t1);
    255    TESTINST1("swr $t0, 8($t1)",  -1,         8,  t0, t1);
    256    TESTINST1("swr $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    257    TESTINST1("swr $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    258    TESTINST1("swr $t0, 0($t1)",  655,        0,  t0, t1);
    259    TESTINST1("swr $t0, 0($t1)",  -655,       0,  t0, t1);
    260    TESTINST1("swr $t0, 0($t1)",  15,         0,  t0, t1);
    261    TESTINST1("swr $t0, 0($t1)",  1,          0,  t0, t1);
    262    TESTINST1("swr $t0, 0($t1)",  53,         0,  t0, t1);
    263    TESTINST1("swr $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    264    TESTINST1("swr $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    265    TESTINST1("swr $t0, 31($t1)", 0xffffffff, 31, t0, t1);
    266    TESTINST1("swr $t0, 33($t1)", 0xffffffff, 33, t0, t1);
    267    TESTINST1("swr $t0, 45($t1)", 0x31415927, 45, t0, t1);
    268    TESTINST1("swr $t0, 47($t1)", 0x7fffffff, 47, t0, t1);
    269    TESTINST1("swr $t0, 49($t1)", 0x80000000, 49, t0, t1);
    270    TESTINST1("swr $t0, 51($t1)", 655,        51, t0, t1);
    271    ppMem(mem1, 16);
    272    ppMem1(mem, 16);
    273 
    274    printf("ulw\n");
    275    TESTINST1("ulw $t0, 0($t1)",  0,          0,  t0, t1);
    276    TESTINST1("ulw $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    277    TESTINST1("ulw $t0, 0($t1)",  0x7fffffff, 0,  t0, t1);
    278    TESTINST1("ulw $t0, 0($t1)",  0x80000000, 0,  t0, t1);
    279    TESTINST1("ulw $t0, 2($t1)",  0x80000000, 2,  t0, t1);
    280    TESTINST1("ulw $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    281    TESTINST1("ulw $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
    282    TESTINST1("ulw $t0, 8($t1)",  -1,         8,  t0, t1);
    283    TESTINST1("ulw $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    284    TESTINST1("ulw $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    285    TESTINST1("ulw $t0, 0($t1)",  655,        0,  t0, t1);
    286    TESTINST1("ulw $t0, 0($t1)",  -655,       0,  t0, t1);
    287    TESTINST1("ulw $t0, 0($t1)",  15,         0,  t0, t1);
    288    TESTINST1("ulw $t0, 0($t1)",  1,          0,  t0, t1);
    289    TESTINST1("ulw $t0, 0($t1)",  53,         0,  t0, t1);
    290    TESTINST1("ulw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    291    TESTINST1("ulw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    292    TESTINST1("ulw $t0, 32($t1)", 0xffffffff, 32, t0, t1);
    293    TESTINST1("ulw $t0, 36($t1)", 0xffffffff, 36, t0, t1);
    294    TESTINST1("ulw $t0, 40($t1)", 0x31415927, 40, t0, t1);
    295    TESTINST1("ulw $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
    296    TESTINST1("ulw $t0, 48($t1)", 0x80000000, 48, t0, t1);
    297    TESTINST1("ulw $t0, 52($t1)", 655,        52, t0, t1);
    298    ppMem(mem1, 16);
    299    ppMem1(mem, 16);
    300 
    301    printf("usw\n");
    302    TESTINST1("usw $t0, 0($t1)",  0,          0,  t0, t1);
    303    TESTINST1("usw $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    304    TESTINST1("usw $t0, 0($t1)",  0x7fffffff, 0,  t0, t1);
    305    TESTINST1("usw $t0, 0($t1)",  0x80000000, 0,  t0, t1);
    306    TESTINST1("usw $t0, 2($t1)",  0x80000000, 2,  t0, t1);
    307    TESTINST1("usw $t0, 6($t1)",  0x7fffffff, 6,  t0, t1);
    308    TESTINST1("usw $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
    309    TESTINST1("usw $t0, 8($t1)",  -1,         8,  t0, t1);
    310    TESTINST1("usw $t0, 0($t1)",  0x31415927, 0,  t0, t1);
    311    TESTINST1("usw $t0, 0($t1)",  0x0dd00000, 0,  t0, t1);
    312    TESTINST1("usw $t0, 0($t1)",  655,        0,  t0, t1);
    313    TESTINST1("usw $t0, 0($t1)",  -655,       0,  t0, t1);
    314    TESTINST1("usw $t0, 0($t1)",  15,         0,  t0, t1);
    315    TESTINST1("usw $t0, 0($t1)",  1,          0,  t0, t1);
    316    TESTINST1("usw $t0, 0($t1)",  53,         0,  t0, t1);
    317    TESTINST1("usw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    318    TESTINST1("usw $t0, 2($t1)",  0xffffffff, 2,  t0, t1);
    319    TESTINST1("usw $t0, 32($t1)", 0xffffffff, 32, t0, t1);
    320    TESTINST1("usw $t0, 36($t1)", 0xffffffff, 36, t0, t1);
    321    TESTINST1("usw $t0, 40($t1)", 0x31415927, 40, t0, t1);
    322    TESTINST1("usw $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
    323    TESTINST1("usw $t0, 48($t1)", 0x80000000, 48, t0, t1);
    324    TESTINST1("usw $t0, 52($t1)", 655,        52, t0, t1);
    325    ppMem(mem1, 16);
    326    ppMem1(mem, 16);
    327 
    328    printf("swl $t0, 3($t0)\nswr $t0, 0($t0)\n");
    329    TESTINSTsw(0x4853000,  0,  t0, t1);
    330    ppMem2(mem2, 12);
    331    TESTINSTsw(0x4853000,  4,  t0, t1);
    332    ppMem2(mem2, 12);
    333    TESTINSTsw(0x4863700,  8,  t0, t1);
    334    ppMem2(mem2, 12);
    335    TESTINSTsw(0x48aedd0,  12, t0, t1);
    336    ppMem2(mem2, 12);
    337    TESTINSTsw(0x2aaee700, 16, t0, t1);
    338    ppMem2(mem2, 12);
    339    TESTINSTsw(0x2aaee7ff, 20, t0, t1);
    340    ppMem2(mem2, 12);
    341    TESTINSTsw(0x2aaeffff, 24, t0, t1);
    342    ppMem2(mem2, 12);
    343    TESTINSTsw(0x4863700,  28, t0, t1);
    344    ppMem2(mem2, 12);
    345    TESTINSTsw(0x2aaee700, 32, t0, t1);
    346    ppMem2(mem2, 12);
    347 
    348    return 0;
    349 }
    350 
    351