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