Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 
      3 #define TESTINST1(RSval, RD)            \
      4 {                                       \
      5    unsigned int out = 0;                \
      6    __asm__ __volatile__(                \
      7       ".set noreorder"          "\n\t"  \
      8       "move $"#RD", %1"         "\n\t"  \
      9       "b    end"#RSval          "\n\t"  \
     10       "nop"                     "\n\t"  \
     11       "addi $"#RD", $"#RD", 5"  "\n\t"  \
     12       "end"#RSval":"            "\n\t"  \
     13       "addi $"#RD", $"#RD", 1"  "\n\t"  \
     14       "move %0,     $"#RD       "\n\t"  \
     15       ".set reorder"            "\n\t"  \
     16       : "=r" (out)                      \
     17       : "r" (RSval)                     \
     18       : #RD                             \
     19    );                                   \
     20    printf("B :: %d, RSval: %d\n",       \
     21           out, RSval);                  \
     22 }
     23 
     24 #define TESTINST2(RSval, RD)            \
     25 {                                       \
     26    unsigned int out = 0;                \
     27    __asm__ __volatile__(                \
     28       ".set noreorder"          "\n\t"  \
     29       "move $"#RD", %1"         "\n\t"  \
     30       "b    end12"#RSval        "\n\t"  \
     31       "addi $"#RD", $"#RD", 3"  "\n\t"  \
     32       "addi $"#RD", $"#RD", 5"  "\n\t"  \
     33       "end12"#RSval":"          "\n\t"  \
     34       "addi $"#RD", $"#RD", 3"  "\n\t"  \
     35       "move %0,     $"#RD       "\n\t"  \
     36       ".set reorder"            "\n\t"  \
     37       : "=r" (out)                      \
     38       : "r" (RSval)                     \
     39       : #RD                             \
     40    );                                   \
     41    printf("B :: %d, RSval: %d\n",       \
     42           out, RSval);                  \
     43 }
     44 
     45 #define TESTINST3(RSval, RD)              \
     46 {                                         \
     47    unsigned int out = 0;                  \
     48    __asm__ __volatile__(                  \
     49       ".set noreorder"          "\n\t"    \
     50       "move $"#RD", %1"         "\n\t"    \
     51       "bal  end21"#RSval        "\n\t"    \
     52       "nop"                     "\n\t"    \
     53       "addi $"#RD", $"#RD", 5"  "\n\t"    \
     54       "b    r_end"#RSval        "\n\t"    \
     55       "nop"                     "\n\t"    \
     56       "addi $"#RD", $"#RD", 1"  "\n\t"    \
     57       "end21"#RSval":"          "\n\t"    \
     58       "addi $"#RD", $"#RD", 1"  "\n\t"    \
     59       "jr   $ra"                "\n\t"    \
     60       "nop"                     "\n\t"    \
     61       "r_end"#RSval":"          "\n\t"    \
     62       "move %0,     $"#RD       "\n\t"    \
     63       ".set reorder"            "\n\t"    \
     64       : "=r" (out)                        \
     65       : "r" (RSval)                       \
     66       : #RD, "ra"                         \
     67    );                                     \
     68    printf("B BAL JR :: %d, RSval: %d\n",  \
     69           out, RSval);                    \
     70 }
     71 
     72 #define TESTINST3j(RSval, RD)               \
     73 {                                           \
     74    unsigned int out = 0;                    \
     75    __asm__ __volatile__(                    \
     76       ".set noreorder"              "\n\t"  \
     77       "move $"#RD", %1"             "\n\t"  \
     78       "dla  $t9,    end31"#RSval    "\n\t"  \
     79       "jal  $t9"                    "\n\t"  \
     80       "nop"                         "\n\t"  \
     81       "addi $"#RD", $"#RD", 5"      "\n\t"  \
     82       "dla  $t9,    r_end11"#RSval  "\n\t"  \
     83       "j    $t9"                    "\n\t"  \
     84       "nop"                         "\n\t"  \
     85       "end31"#RSval":"              "\n\t"  \
     86       "addi $"#RD", $"#RD", 1"      "\n\t"  \
     87       "jr   $ra"                    "\n\t"  \
     88       "nop"                         "\n\t"  \
     89       "r_end11"#RSval":"            "\n\t"  \
     90       "move %0, $"#RD               "\n\t"  \
     91       ".set reorder"                "\n\t"  \
     92       : "=r" (out)                          \
     93       : "r" (RSval)                         \
     94       : #RD, "t9"                           \
     95    );                                       \
     96    printf("J JAL JR :: %d, RSval: %d\n",    \
     97           out, RSval);                      \
     98 }
     99 
    100 #define TESTINST3ja(RSval, RD)             \
    101 {                                          \
    102    unsigned int out = 0;                   \
    103    __asm__ __volatile__(                   \
    104       ".set noreorder"            "\n\t"   \
    105       "move $"#RD", %1"           "\n\t"   \
    106       "dla  $t9,    end41"#RSval  "\n\t"   \
    107       "jalr $t0,    $t9"          "\n\t"   \
    108       "nop"                       "\n\t"   \
    109       "addi $"#RD", $"#RD", 5"    "\n\t"   \
    110       "dla  $t9, r_end21"#RSval   "\n\t"   \
    111       "j    $t9"                  "\n\t"   \
    112       "nop"                       "\n\t"   \
    113       "addi $"#RD", $"#RD", 1"    "\n\t"   \
    114       "end41"#RSval":"            "\n\t"   \
    115       "addi $"#RD", $"#RD", 1"    "\n\t"   \
    116       "move $t9,    $t0"          "\n\t"   \
    117       "jr   $t9"                  "\n\t"   \
    118       "nop"                       "\n\t"   \
    119       "r_end21"#RSval":"          "\n\t"   \
    120       "move %0,     $"#RD         "\n\t"   \
    121       ".set reorder"              "\n\t"   \
    122       : "=r" (out)                         \
    123       : "r" (RSval)                        \
    124       : #RD, "t0", "t9"                    \
    125    );                                      \
    126    printf("J JALR JR :: %d, RSval: %d\n",  \
    127           out, RSval);                     \
    128 }
    129 
    130 #define TESTINST4(instruction, RDval, RSval, RTval, RD, RS, RT)         \
    131 {                                                                       \
    132    unsigned int out = 0;                                                \
    133    __asm__ __volatile__(                                                \
    134       ".set noreorder"                                    "\n\t"        \
    135       "move        $"#RS", %1"                            "\n\t"        \
    136       "move        $"#RT", %2"                            "\n\t"        \
    137       "move        $"#RD", %3"                            "\n\t"        \
    138       instruction" $"#RS", $"#RT", end"instruction#RDval  "\n\t"        \
    139       "nop"                                               "\n\t"        \
    140       "addi        $"#RD", $"#RD", 5"                     "\n\t"        \
    141       "end"instruction#RDval":"                           "\n\t"        \
    142       "addi        $"#RD", $"#RD", 1"                     "\n\t"        \
    143       "move        %0,     $" #RD                         "\n\t"        \
    144       ".set reorder"                                      "\n\t"        \
    145       : "=r" (out)                                                      \
    146       : "r" (RSval), "r" (RTval), "r" (RDval)                           \
    147       : #RD, #RS, #RT                                                   \
    148    );                                                                   \
    149    printf(instruction" :: out: %d, RDval: %d, RSval: %d, RTval: %d\n",  \
    150           out, RDval, RSval, RTval);                                    \
    151 }
    152 
    153 #define TESTINST5(instruction, RDval, RSval, RD, RS)          \
    154 {                                                             \
    155    unsigned int out = 0;                                      \
    156    __asm__ __volatile__(                                      \
    157       ".set        noreorder"                     "\n\t"      \
    158       "move        $"#RS", %1"                    "\n\t"      \
    159       "move        $"#RD", %2"                    "\n\t"      \
    160       instruction" $"#RS", end"instruction#RDval  "\n\t"      \
    161       "nop"                                       "\n\t"      \
    162       "addi        $"#RD", $"#RD", 5"             "\n\t"      \
    163       "end"instruction#RDval":"                   "\n\t"      \
    164       "addi        $"#RD", $"#RD", 1"             "\n\t"      \
    165       "move        %0,     $"#RD                  "\n\t"      \
    166       ".set        reorder"                       "\n\t"      \
    167       : "=r" (out)                                            \
    168       : "r" (RSval), "r" (RDval)                              \
    169       : #RD, #RS                                              \
    170     );                                                        \
    171     printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
    172            out, RDval, RSval);                                \
    173 }
    174 
    175 #define TESTINST6(instruction, RDval, RSval, RD, RS)         \
    176 {                                                            \
    177    unsigned int out = 0;                                     \
    178    __asm__ __volatile__(                                     \
    179       ".set        noreorder"                       "\n\t"   \
    180       "move        $"#RD", %2"                      "\n\t"   \
    181       "move        $"#RS", %1"                      "\n\t"   \
    182       instruction" $"#RS", end21"instruction#RDval  "\n\t"   \
    183       "nop"                                         "\n\t"   \
    184       "addi        $"#RD", $"#RD", 5"               "\n\t"   \
    185       "b           r_end"instruction#RDval          "\n\t"   \
    186       "nop"                                         "\n\t"   \
    187       "end21"instruction#RDval":"                   "\n\t"   \
    188       "addi        $"#RD", $"#RD", 1"               "\n\t"   \
    189       "jr          $ra"                             "\n\t"   \
    190       "r_end"instruction#RDval":"                   "\n\t"   \
    191       "move        %0, $"#RD                        "\n\t"   \
    192       ".set        reorder"                         "\n\t"   \
    193       : "=r" (out)                                           \
    194       : "r" (RSval), "r" (RDval)                             \
    195       : #RD, #RS, "ra"                                       \
    196    );                                                        \
    197    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
    198           out, RDval, RSval);                                \
    199 }
    200 
    201 #define TESTINST4l(instruction, RDval, RSval, RTval, RD, RS, RT)        \
    202 {                                                                       \
    203    unsigned int out = 0;                                                \
    204    __asm__ __volatile__(                                                \
    205       ".set        noreorder"                             "\n\t"        \
    206       "move        $"#RS", %1"                            "\n\t"        \
    207       "move        $"#RT", %2"                            "\n\t"        \
    208       "move        $"#RD", %3"                            "\n\t"        \
    209       instruction" $"#RS", $"#RT", end"instruction#RDval  "\n\t"        \
    210       "addi        $"#RD", $"#RD", 3"                     "\n\t"        \
    211       "addi        $"#RD", $"#RD", 5"                     "\n\t"        \
    212       "end"instruction#RDval":"                           "\n\t"        \
    213       "addi        $"#RD", $"#RD", 1"                     "\n\t"        \
    214       "move        %0, $"#RD                              "\n\t"        \
    215       ".set        reorder"                               "\n\t"        \
    216       : "=r" (out)                                                      \
    217       : "r" (RSval), "r" (RTval), "r" (RDval)                           \
    218       : #RD, #RS, #RT                                                   \
    219    );                                                                   \
    220    printf(instruction" :: out: %d, RDval: %d, RSval: %d, RTval: %d\n",  \
    221           out, RDval, RSval, RTval);                                    \
    222 }
    223 
    224 #define TESTINST5l(instruction, RDval, RSval, RD, RS)        \
    225 {                                                            \
    226    unsigned int out = 0;                                     \
    227    __asm__ __volatile__(                                     \
    228       ".set        noreorder"                     "\n\t"     \
    229       "move        $"#RS", %1"                    "\n\t"     \
    230       "move        $"#RD", %2"                    "\n\t"     \
    231       instruction" $"#RS", end"instruction#RDval  "\n\t"     \
    232       "addi        $"#RD", $"#RD", 3"             "\n\t"     \
    233       "addi        $"#RD", $"#RD", 5"             "\n\t"     \
    234       "end"instruction#RDval":"                   "\n\t"     \
    235       "addi        $"#RD", $"#RD", 1"             "\n\t"     \
    236       "move        %0,     $"#RD                  "\n\t"     \
    237       ".set        reorder"                       "\n\t"     \
    238       : "=r" (out)                                           \
    239       : "r" (RSval), "r" (RDval)                             \
    240       : #RD, #RS                                             \
    241    );                                                        \
    242    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
    243           out, RDval, RSval);                                \
    244 }
    245 
    246 #define TESTINST6l(instruction, RDval, RSval, RD, RS)        \
    247 {                                                            \
    248    unsigned int out = 0;                                     \
    249    __asm__ __volatile__(                                     \
    250       ".set        noreorder"                       "\n\t"   \
    251       "move        $"#RD", %2"                      "\n\t"   \
    252       "move        $"#RS", %1"                      "\n\t"   \
    253       instruction" $"#RS", end21"instruction#RDval  "\n\t"   \
    254       "addi        $"#RD", $"#RD", 3"               "\n\t"   \
    255       "addi        $"#RD", $"#RD", 5"               "\n\t"   \
    256       "b           r_end"instruction#RDval          "\n\t"   \
    257       "nop"                                         "\n\t"   \
    258       "end21"instruction#RDval":"                   "\n\t"   \
    259       "addi        $"#RD", $"#RD", 1"               "\n\t"   \
    260       "jr          $ra"                             "\n\t"   \
    261       "nop"                                         "\n\t"   \
    262       "r_end"instruction#RDval":"                   "\n\t"   \
    263       "move        %0, $"#RD                        "\n\t"   \
    264       ".set        reorder"                         "\n\t"   \
    265       : "=r" (out)                                           \
    266       : "r" (RSval), "r" (RDval)                             \
    267       : #RD, #RS, "ra"                                       \
    268    );                                                        \
    269    printf(instruction" :: out: %d, RDval: %d, RSval: %d\n",  \
    270           out, RDval, RSval);                                \
    271 }
    272 
    273 
    274 int main()
    275 {
    276    printf("b\n");
    277    TESTINST1(0,  2);
    278    TESTINST1(1,  3);
    279    TESTINST1(2,  4);
    280    TESTINST1(3,  5);
    281    TESTINST1(4,  6);
    282    TESTINST1(5,  7);
    283    TESTINST1(6,  8);
    284    TESTINST1(7,  9);
    285    TESTINST1(8,  10);
    286    TESTINST1(9,  11);
    287    TESTINST1(10, 12);
    288    TESTINST1(11, 13);
    289    TESTINST1(12, 14);
    290    TESTINST1(13, 15);
    291    TESTINST1(14, 16);
    292    TESTINST1(15, 17);
    293    TESTINST1(16, 18);
    294    TESTINST1(17, 19);
    295    TESTINST1(18, 20);
    296    TESTINST1(19, 21);
    297    TESTINST1(20, 22);
    298    TESTINST1(21, 23);
    299    TESTINST1(22, 24);
    300    TESTINST1(23, 25);
    301 
    302    printf("b\n");
    303    TESTINST2(0,  2);
    304    TESTINST2(1,  3);
    305    TESTINST2(2,  4);
    306    TESTINST2(3,  5);
    307    TESTINST2(4,  6);
    308    TESTINST2(5,  7);
    309    TESTINST2(6,  8);
    310    TESTINST2(7,  9);
    311    TESTINST2(8,  10);
    312    TESTINST2(9,  11);
    313    TESTINST2(10, 12);
    314    TESTINST2(11, 13);
    315    TESTINST2(12, 14);
    316    TESTINST2(13, 15);
    317    TESTINST2(14, 16);
    318    TESTINST2(15, 17);
    319    TESTINST2(16, 18);
    320    TESTINST2(17, 19);
    321    TESTINST2(18, 20);
    322    TESTINST2(19, 21);
    323    TESTINST2(20, 22);
    324    TESTINST2(21, 23);
    325    TESTINST2(22, 24);
    326    TESTINST2(23, 25);
    327 
    328    printf("b, bal, jr\n");
    329    TESTINST3(0,  2);
    330    TESTINST3(1,  3);
    331    TESTINST3(2,  4);
    332    TESTINST3(3,  5);
    333    TESTINST3(4,  6);
    334    TESTINST3(5,  7);
    335    TESTINST3(6,  8);
    336    TESTINST3(7,  9);
    337    TESTINST3(8,  10);
    338    TESTINST3(9,  11);
    339    TESTINST3(10, 12);
    340    TESTINST3(11, 13);
    341    TESTINST3(12, 14);
    342    TESTINST3(13, 15);
    343    TESTINST3(14, 16);
    344    TESTINST3(15, 17);
    345    TESTINST3(16, 18);
    346    TESTINST3(17, 19);
    347    TESTINST3(18, 20);
    348    TESTINST3(19, 21);
    349    TESTINST3(20, 22);
    350    TESTINST3(21, 23);
    351    TESTINST3(22, 24);
    352    TESTINST3(23, 25);
    353 
    354    printf("--- BEQ ---  if RSval == RTval then " \
    355           "out = RDval + 1 else out = RDval + 6\n");
    356    TESTINST4("beq", 0,  0,          1,          2,  3 , 4);
    357    TESTINST4("beq", 1,  1,          1,          3,  4,  5);
    358    TESTINST4("beq", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
    359    TESTINST4("beq", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
    360    TESTINST4("beq", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
    361    TESTINST4("beq", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
    362    TESTINST4("beq", 6,  0x5,        0x5,        8,  9,  10);
    363    TESTINST4("beq", 7,  -3,         -4,         9,  10, 11);
    364    TESTINST4("beq", 8,  125,        125,        10, 11, 12);
    365    TESTINST4("beq", 9,  0x80000000, 0x80000000, 11, 12, 13);
    366    TESTINST4("beq", 10, 0xffffffff, 0x80000000, 12, 13, 14);
    367    TESTINST4("beq", 11, 0x256,      0x256,      13, 14, 15);
    368    TESTINST4("beq", 12, 0x55,       0x55,       14, 15, 16);
    369    TESTINST4("beq", 13, 0xfff,      0xdd,       16, 17, 18);
    370    TESTINST4("beq", 14, -1,         0x5,        2,  25, 24);
    371    TESTINST4("beq", 15, -1,         -1,         25, 24, 7);
    372 
    373    printf("--- BNE ---  if RSval != RTval then " \
    374           "out = RDval + 1 else out = RDval + 6\n");
    375    TESTINST4("bne", 0,  0,          1,          2,  3,  4);
    376    TESTINST4("bne", 1,  1,          1,          3,  4,  5);
    377    TESTINST4("bne", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
    378    TESTINST4("bne", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
    379    TESTINST4("bne", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
    380    TESTINST4("bne", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
    381    TESTINST4("bne", 6,  0x5,        0x5,        8,  9,  10);
    382    TESTINST4("bne", 7,  -3,         -4,         9,  10, 11);
    383    TESTINST4("bne", 8,  125,        125,        10, 11, 12);
    384    TESTINST4("bne", 9,  0x80000000, 0x80000000, 11, 12, 13);
    385    TESTINST4("bne", 10, 0xffffffff, 0x80000000, 12, 13, 14);
    386    TESTINST4("bne", 11, 0x256,      0x256,      13, 14, 15);
    387    TESTINST4("bne", 12, 0x55,       0x55,       14, 15, 16);
    388    TESTINST4("bne", 13, 0xfff,      0xdd,       16, 17, 18);
    389    TESTINST4("bne", 14, -1,         0x5,        2,  25, 24);
    390    TESTINST4("bne", 15, -1,         -1,         25, 24, 7);
    391 
    392    printf("--- BEQZ ---  if RSval == 0 then " \
    393           "out = RDval + 1 else out = RDval + 6\n");
    394    TESTINST5("beqz", 0,  0,          2,  3);
    395    TESTINST5("beqz", 1,  1,          3,  4);
    396    TESTINST5("beqz", 2,  0xffffffff, 4,  5);
    397    TESTINST5("beqz", 3,  0xffffffff, 5,  6);
    398    TESTINST5("beqz", 4,  0xfffffffe, 6,  8);
    399    TESTINST5("beqz", 5,  0xffffffff, 7,  8);
    400    TESTINST5("beqz", 6,  0x5,        8,  9);
    401    TESTINST5("beqz", 7,  -3,         9,  10);
    402    TESTINST5("beqz", 8,  125,        10, 11);
    403    TESTINST5("beqz", 9,  0x80000000, 11, 12);
    404    TESTINST5("beqz", 10, 0xffffffff, 12, 13);
    405    TESTINST5("beqz", 11, 0x256,      13, 14);
    406    TESTINST5("beqz", 12, 0x55,       14, 15);
    407    TESTINST5("beqz", 13, 0xfff,      16, 17);
    408    TESTINST5("beqz", 14, -1,         2,  25);
    409    TESTINST5("beqz", 15, -1,         25, 24);
    410 
    411    printf("--- BGEZ ---  if RSval >= 0 then " \
    412           "out = RDval + 1 else out = RDval + 6\n");
    413    TESTINST5("bgez", 0,  0,          2,  3);
    414    TESTINST5("bgez", 1,  1,          3,  4);
    415    TESTINST5("bgez", 2,  0xffffffff, 4,  5);
    416    TESTINST5("bgez", 3,  0xffffffff, 5,  6);
    417    TESTINST5("bgez", 4,  0xfffffffe, 6,  8);
    418    TESTINST5("bgez", 5,  0xffffffff, 7,  8);
    419    TESTINST5("bgez", 6,  0x5,        8,  9);
    420    TESTINST5("bgez", 7,  -3,         9,  10);
    421    TESTINST5("bgez", 8,  125,        10, 11);
    422    TESTINST5("bgez", 9,  0x80000000, 11, 12);
    423    TESTINST5("bgez", 10, 0xffffffff, 12, 13);
    424    TESTINST5("bgez", 11, 0x256,      13, 14);
    425    TESTINST5("bgez", 12, 0x55,       14, 15);
    426    TESTINST5("bgez", 13, 0xfff,      16, 17);
    427    TESTINST5("bgez", 14, -1,         2,  25);
    428    TESTINST5("bgez", 15, -1,         25, 24);
    429 
    430    printf("--- BGTZ ---  if RSval > 0 then " \
    431           "out = RDval + 1 else out = RDval + 6\n");
    432    TESTINST5("bgtz", 0,  0,          2,  3);
    433    TESTINST5("bgtz", 1,  1,          3,  4);
    434    TESTINST5("bgtz", 2,  0xffffffff, 4,  5);
    435    TESTINST5("bgtz", 3,  0xffffffff, 5,  6);
    436    TESTINST5("bgtz", 4,  0xfffffffe, 6,  8);
    437    TESTINST5("bgtz", 5,  0xffffffff, 7,  8);
    438    TESTINST5("bgtz", 6,  0x5,        8,  9);
    439    TESTINST5("bgtz", 7,  -3,         9,  10);
    440    TESTINST5("bgtz", 8,  125,        10, 11);
    441    TESTINST5("bgtz", 9,  0x80000000, 11, 12);
    442    TESTINST5("bgtz", 10, 0xffffffff, 12, 13);
    443    TESTINST5("bgtz", 11, 0x256,      13, 14);
    444    TESTINST5("bgtz", 12, 0x55,       14, 15);
    445    TESTINST5("bgtz", 13, 0xfff,      16, 17);
    446    TESTINST5("bgtz", 14, -1,         2,  25);
    447    TESTINST5("bgtz", 15, -1,         25, 24);
    448 
    449    printf("--- BLEZ ---  if RSval <= 0 then " \
    450           "out = RDval + 1 else out = RDval + 6\n");
    451    TESTINST5("blez", 0,  0,          2,  3);
    452    TESTINST5("blez", 1,  1,          3,  4);
    453    TESTINST5("blez", 2,  0xffffffff, 4,  5);
    454    TESTINST5("blez", 3,  0xffffffff, 5,  6);
    455    TESTINST5("blez", 4,  0xfffffffe, 6,  8);
    456    TESTINST5("blez", 5,  0xffffffff, 7,  8);
    457    TESTINST5("blez", 6,  0x5,        8,  9);
    458    TESTINST5("blez", 7,  -3,         9,  10);
    459    TESTINST5("blez", 8,  125,        10, 11);
    460    TESTINST5("blez", 9,  0x80000000, 11, 12);
    461    TESTINST5("blez", 10, 0xffffffff, 12, 13);
    462    TESTINST5("blez", 11, 0x256,      13, 14);
    463    TESTINST5("blez", 12, 0x55,       14, 15);
    464    TESTINST5("blez", 13, 0xfff,      16, 17);
    465    TESTINST5("blez", 14, -1,         2,  25);
    466    TESTINST5("blez", 15, -1,         25, 24);
    467 
    468    printf("--- BLTZ ---  if RSval < 0 then " \
    469           "out = RDval + 1 else out = RDval + 6\n");
    470    TESTINST5("bltz", 0,  0,          2,  3);
    471    TESTINST5("bltz", 1,  1,          3,  4);
    472    TESTINST5("bltz", 2,  0xffffffff, 4,  5);
    473    TESTINST5("bltz", 3,  0xffffffff, 5,  6);
    474    TESTINST5("bltz", 4,  0xfffffffe, 6,  8);
    475    TESTINST5("bltz", 5,  0xffffffff, 7,  8);
    476    TESTINST5("bltz", 6,  0x5,        8,  9);
    477    TESTINST5("bltz", 7,  -3,         9,  10);
    478    TESTINST5("bltz", 8,  125,        10, 11);
    479    TESTINST5("bltz", 9,  0x80000000, 11, 12);
    480    TESTINST5("bltz", 10, 0xffffffff, 12, 13);
    481    TESTINST5("bltz", 11, 0x256,      13, 14);
    482    TESTINST5("bltz", 12, 0x55,       14, 15);
    483    TESTINST5("bltz", 13, 0xfff,      16, 17);
    484    TESTINST5("bltz", 14, -1,         2,  25);
    485    TESTINST5("bltz", 15, -1,         25, 24);
    486 
    487    printf("--- BGEZAL ---  if RSval >= 0 then " \
    488           "out = RDval + 6 else out = RDval + 5\n");
    489    TESTINST6("bgezal", 0,  0,          2,  3);
    490    TESTINST6("bgezal", 1,  1,          3,  4);
    491    TESTINST6("bgezal", 2,  0xffffffff, 4,  5);
    492    TESTINST6("bgezal", 3,  0xffffffff, 5,  6);
    493    TESTINST6("bgezal", 4,  0xfffffffe, 6,  8);
    494    TESTINST6("bgezal", 5,  0xffffffff, 7,  8);
    495    TESTINST6("bgezal", 6,  0x5,        8,  9);
    496    TESTINST6("bgezal", 7,  -3,         9,  10);
    497    TESTINST6("bgezal", 8,  125,        10, 11);
    498    TESTINST6("bgezal", 9,  0x80000000, 11, 12);
    499    TESTINST6("bgezal", 10, 0xffffffff, 12, 13);
    500    TESTINST6("bgezal", 11, 0x256,      13, 14);
    501    TESTINST6("bgezal", 12, 0x55,       14, 15);
    502    TESTINST6("bgezal", 13, 0xfff,      16, 17);
    503    TESTINST6("bgezal", 14, -1,         2,  25);
    504    TESTINST6("bgezal", 15, -1,         25, 24);
    505 
    506    printf("--- BLTZAL ---  if RSval < 0 then " \
    507           "out = RDval + 6 else out = RDval + 5\n");
    508    TESTINST6("bltzal", 0,  0,          2,  3);
    509    TESTINST6("bltzal", 1,  1,          3,  4);
    510    TESTINST6("bltzal", 2,  0xffffffff, 4,  5);
    511    TESTINST6("bltzal", 3,  0xffffffff, 5,  6);
    512    TESTINST6("bltzal", 4,  0xfffffffe, 6,  8);
    513    TESTINST6("bltzal", 5,  0xffffffff, 7,  8);
    514    TESTINST6("bltzal", 6,  0x5,        8,  9);
    515    TESTINST6("bltzal", 7,  -3,         9,  10);
    516    TESTINST6("bltzal", 8,  125,        10, 11);
    517    TESTINST6("bltzal", 9,  0x80000000, 11, 12);
    518    TESTINST6("bltzal", 10, 0xffffffff, 12, 13);
    519    TESTINST6("bltzal", 11, 0x256,      13, 14);
    520    TESTINST6("bltzal", 12, 0x55,       14, 15);
    521    TESTINST6("bltzal", 13, 0xfff,      16, 17);
    522    TESTINST6("bltzal", 14, -1,         2,  25);
    523    TESTINST6("bltzal", 15, -1,         25, 24);
    524 
    525    printf("--- BNEZ ---  if RSval != 0 then " \
    526           "out = RDval + 1 else out = RDval + 6\n");
    527    TESTINST5("bnez", 0,  0,          2,  3);
    528    TESTINST5("bnez", 1,  1,          3,  4);
    529    TESTINST5("bnez", 2,  0xffffffff, 4,  5);
    530    TESTINST5("bnez", 3,  0xffffffff, 5,  6);
    531    TESTINST5("bnez", 4,  0xfffffffe, 6,  8);
    532    TESTINST5("bnez", 5,  0xffffffff, 7,  8);
    533    TESTINST5("bnez", 6,  0x5,        8,  9);
    534    TESTINST5("bnez", 7,  -3,         9,  10);
    535    TESTINST5("bnez", 8,  125,        10, 11);
    536    TESTINST5("bnez", 9,  0x80000000, 11, 12);
    537    TESTINST5("bnez", 10, 0xffffffff, 12, 13);
    538    TESTINST5("bnez", 11, 0x256,      13, 14);
    539    TESTINST5("bnez", 12, 0x55,       14, 15);
    540    TESTINST5("bnez", 13, 0xfff,      16, 17);
    541    TESTINST5("bnez", 14, -1,         2,  25);
    542    TESTINST5("bnez", 15, -1,         25, 24);
    543 
    544    printf("--- BEQL ---  if RSval == RTval then " \
    545           "out = RDval + 4 else out = RDval + 6\n");
    546    TESTINST4l("beql", 0,  0,          1,          2,  3,  4);
    547    TESTINST4l("beql", 1,  1,          1,          3,  4,  5);
    548    TESTINST4l("beql", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
    549    TESTINST4l("beql", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
    550    TESTINST4l("beql", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
    551    TESTINST4l("beql", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
    552    TESTINST4l("beql", 6,  0x5,        0x5,        8,  9,  10);
    553    TESTINST4l("beql", 7,  -3,         -4,         9,  10, 11);
    554    TESTINST4l("beql", 8,  125,        125,        10, 11, 12);
    555    TESTINST4l("beql", 9,  0x80000000, 0x80000000, 11, 12, 13);
    556    TESTINST4l("beql", 10, 0xffffffff, 0x80000000, 12, 13, 14);
    557    TESTINST4l("beql", 11, 0x256,      0x256,      13, 14, 15);
    558    TESTINST4l("beql", 12, 0x55,       0x55,       14, 15, 16);
    559    TESTINST4l("beql", 13, 0xfff,      0xdd,       16, 17, 18);
    560    TESTINST4l("beql", 14, -1,         0x5,        2,  25, 24);
    561    TESTINST4l("beql", 15, -1,         -1,         25, 24, 7);
    562 
    563    printf("--- BGEZALL ---  if RSval >= 0 then " \
    564           "out = RDval + 4 else out = RDval + 6\n");
    565    TESTINST5l("bgezall", 0,  0,          2,  3);
    566    TESTINST5l("bgezall", 1,  1,          3,  4);
    567    TESTINST5l("bgezall", 2,  0xffffffff, 4,  5);
    568    TESTINST5l("bgezall", 3,  0xffffffff, 5,  6);
    569    TESTINST5l("bgezall", 4,  0xfffffffe, 6,  8);
    570    TESTINST5l("bgezall", 5,  0xffffffff, 7,  8);
    571    TESTINST5l("bgezall", 6,  0x5,        8,  9);
    572    TESTINST5l("bgezall", 7,  -3,         9,  10);
    573    TESTINST5l("bgezall", 8,  125,        10, 11);
    574    TESTINST5l("bgezall", 9,  0x80000000, 11, 12);
    575    TESTINST5l("bgezall", 10, 0xffffffff, 12, 13);
    576    TESTINST5l("bgezall", 11, 0x256,      13, 14);
    577    TESTINST5l("bgezall", 12, 0x55,       14, 15);
    578    TESTINST5l("bgezall", 13, 0xfff,      16, 17);
    579    TESTINST5l("bgezall", 14, -1,         2,  25);
    580    TESTINST5l("bgezall", 15, -1,         25, 24);
    581 
    582    printf("--- BLTZALL ---  if RSval < 0 then " \
    583           "out = RDval + 4 else out = RDval + 6\n");
    584    TESTINST5l("bltzall", 0,  0,          2,  3);
    585    TESTINST5l("bltzall", 1,  1,          3,  4);
    586    TESTINST5l("bltzall", 2,  0xffffffff, 4,  5);
    587    TESTINST5l("bltzall", 3,  0xffffffff, 5,  6);
    588    TESTINST5l("bltzall", 4,  0xfffffffe, 6,  8);
    589    TESTINST5l("bltzall", 5,  0xffffffff, 7,  8);
    590    TESTINST5l("bltzall", 6,  0x5,        8,  9);
    591    TESTINST5l("bltzall", 7,  -3,         9,  10);
    592    TESTINST5l("bltzall", 8,  125,        10, 11);
    593    TESTINST5l("bltzall", 9,  0x80000000, 11, 12);
    594    TESTINST5l("bltzall", 10, 0xffffffff, 12, 13);
    595    TESTINST5l("bltzall", 11, 0x256,      13, 14);
    596    TESTINST5l("bltzall", 12, 0x55,       14, 15);
    597    TESTINST5l("bltzall", 13, 0xfff,      16, 17);
    598    TESTINST5l("bltzall", 14, -1,         2,  25);
    599    TESTINST5l("bltzall", 15, -1,         25, 24);
    600 
    601    printf("--- BGEZL ---  if RSval >= 0 then " \
    602           "out = RDval + 4 else out = RDval + 6\n");
    603    TESTINST5l("bgezl", 0,  0,          2,  3);
    604    TESTINST5l("bgezl", 1,  1,          3,  4);
    605    TESTINST5l("bgezl", 2,  0xffffffff, 4,  5);
    606    TESTINST5l("bgezl", 3,  0xffffffff, 5,  6);
    607    TESTINST5l("bgezl", 4,  0xfffffffe, 6,  8);
    608    TESTINST5l("bgezl", 5,  0xffffffff, 7,  8);
    609    TESTINST5l("bgezl", 6,  0x5,        8,  9);
    610    TESTINST5l("bgezl", 7,  -3,         9,  10);
    611    TESTINST5l("bgezl", 8,  125,        10, 11);
    612    TESTINST5l("bgezl", 9,  0x80000000, 11, 12);
    613    TESTINST5l("bgezl", 10, 0xffffffff, 12, 13);
    614    TESTINST5l("bgezl", 11, 0x256,      13, 14);
    615    TESTINST5l("bgezl", 12, 0x55,       14, 15);
    616    TESTINST5l("bgezl", 13, 0xfff,      16, 17);
    617    TESTINST5l("bgezl", 14, -1,         2,  25);
    618    TESTINST5l("bgezl", 15, -1,         25, 24);
    619 
    620    printf("--- BGTZL ---  if RSval > 0 then " \
    621           "out = RDval + 4 else out = RDval + 6\n");
    622    TESTINST5l("bgtzl", 0,  0,          2,  3);
    623    TESTINST5l("bgtzl", 1,  1,          3,  4);
    624    TESTINST5l("bgtzl", 2,  0xffffffff, 4,  5);
    625    TESTINST5l("bgtzl", 3,  0xffffffff, 5,  6);
    626    TESTINST5l("bgtzl", 4,  0xfffffffe, 6,  8);
    627    TESTINST5l("bgtzl", 5,  0xffffffff, 7,  8);
    628    TESTINST5l("bgtzl", 6,  0x5,        8,  9);
    629    TESTINST5l("bgtzl", 7,  -3,         9,  10);
    630    TESTINST5l("bgtzl", 8,  125,        10, 11);
    631    TESTINST5l("bgtzl", 9,  0x80000000, 11, 12);
    632    TESTINST5l("bgtzl", 10, 0xffffffff, 12, 13);
    633    TESTINST5l("bgtzl", 11, 0x256,      13, 14);
    634    TESTINST5l("bgtzl", 12, 0x55,       14, 15);
    635    TESTINST5l("bgtzl", 13, 0xfff,      16, 17);
    636    TESTINST5l("bgtzl", 14, -1,         2,  25);
    637    TESTINST5l("bgtzl", 15, -1,         25, 24);
    638 
    639    printf("--- BLEZL ---  if RSval <= 0 then " \
    640           "out = RDval + 4 else out = RDval + 6\n");
    641    TESTINST5l("blezl", 0,  0,          2,  3);
    642    TESTINST5l("blezl", 1,  1,          3,  4);
    643    TESTINST5l("blezl", 2,  0xffffffff, 4,  5);
    644    TESTINST5l("blezl", 3,  0xffffffff, 5,  6);
    645    TESTINST5l("blezl", 4,  0xfffffffe, 6,  8);
    646    TESTINST5l("blezl", 5,  0xffffffff, 7,  8);
    647    TESTINST5l("blezl", 6,  0x5,        8,  9);
    648    TESTINST5l("blezl", 7,  -3,         9,  10);
    649    TESTINST5l("blezl", 8,  125,        10, 11);
    650    TESTINST5l("blezl", 9,  0x80000000, 11, 12);
    651    TESTINST5l("blezl", 10, 0xffffffff, 12, 13);
    652    TESTINST5l("blezl", 11, 0x256,      13, 14);
    653    TESTINST5l("blezl", 12, 0x55,       14, 15);
    654    TESTINST5l("blezl", 13, 0xfff,      16, 17);
    655    TESTINST5l("blezl", 14, -1,         2,  25);
    656    TESTINST5l("blezl", 15, -1,         25, 24);
    657 
    658    printf("--- BGEZALL ---  if RSval >= 0 then " \
    659           "out = RDval + 9 else out = RDval + 5\n");
    660    TESTINST6l("bgezall", 0,  0,          2,  3);
    661    TESTINST6l("bgezall", 1,  1,          3,  4);
    662    TESTINST6l("bgezall", 2,  0xffffffff, 4,  5);
    663    TESTINST6l("bgezall", 3,  0xffffffff, 5,  6);
    664    TESTINST6l("bgezall", 4,  0xfffffffe, 6,  8);
    665    TESTINST6l("bgezall", 5,  0xffffffff, 7,  8);
    666    TESTINST6l("bgezall", 6,  0x5,        8,  9);
    667    TESTINST6l("bgezall", 7,  -3,         9,  10);
    668    TESTINST6l("bgezall", 8,  125,        10, 11);
    669    TESTINST6l("bgezall", 9,  0x80000000, 11, 12);
    670    TESTINST6l("bgezall", 10, 0xffffffff, 12, 13);
    671    TESTINST6l("bgezall", 11, 0x256,      13, 14);
    672    TESTINST6l("bgezall", 12, 0x55,       14, 15);
    673    TESTINST6l("bgezall", 13, 0xfff,      16, 17);
    674    TESTINST6l("bgezall", 14, -1,         2,  25);
    675    TESTINST6l("bgezall", 15, -1,         25, 24);
    676 
    677    printf("--- BLTZL ---  if RSval < 0 then " \
    678           "out = RDval + 4 else out = RDval + 6\n");
    679    TESTINST5l("bltzl", 0,  0,          2,  3);
    680    TESTINST5l("bltzl", 1,  1,          3,  4);
    681    TESTINST5l("bltzl", 2,  0xffffffff, 4,  5);
    682    TESTINST5l("bltzl", 3,  0xffffffff, 5,  6);
    683    TESTINST5l("bltzl", 4,  0xfffffffe, 6,  8);
    684    TESTINST5l("bltzl", 5,  0xffffffff, 7,  8);
    685    TESTINST5l("bltzl", 6,  0x5,        8,  9);
    686    TESTINST5l("bltzl", 7,  -3,         9,  10);
    687    TESTINST5l("bltzl", 8,  125,        10, 11);
    688    TESTINST5l("bltzl", 9,  0x80000000, 11, 12);
    689    TESTINST5l("bltzl", 10, 0xffffffff, 12, 13);
    690    TESTINST5l("bltzl", 11, 0x256,      13, 14);
    691    TESTINST5l("bltzl", 12, 0x55,       14, 15);
    692    TESTINST5l("bltzl", 13, 0xfff,      16, 17);
    693    TESTINST5l("bltzl", 14, -1,         2,  25);
    694    TESTINST5l("bltzl", 15, -1,         25, 24);
    695 
    696    printf("--- BNEL ---  if RSval != RTval then " \
    697           "out = RDval + 4 else out = RDval + 5\n");
    698    TESTINST4l("bnel", 0,  0,          1,          2,  3,  4);
    699    TESTINST4l("bnel", 1,  1,          1,          3,  4,  5);
    700    TESTINST4l("bnel", 2,  0xffffffff, 0xffffffff, 4,  5,  6);
    701    TESTINST4l("bnel", 3,  0xffffffff, 0xfffffffe, 5,  6,  7);
    702    TESTINST4l("bnel", 4,  0xfffffffe, 0xffffffff, 6,  8,  9);
    703    TESTINST4l("bnel", 5,  0xffffffff, 0xffffffff, 7,  8,  9);
    704    TESTINST4l("bnel", 6,  0x5,        0x5,        8,  9,  10);
    705    TESTINST4l("bnel", 7,  -3,         -4,         9,  10, 11);
    706    TESTINST4l("bnel", 8,  125,        125,        10, 11, 12);
    707    TESTINST4l("bnel", 9,  0x80000000, 0x80000000, 11, 12, 13);
    708    TESTINST4l("bnel", 10, 0xffffffff, 0x80000000, 12, 13, 14);
    709    TESTINST4l("bnel", 11, 0x256,      0x256,      13, 14, 15);
    710    TESTINST4l("bnel", 12, 0x55,       0x55,       14, 15, 16);
    711    TESTINST4l("bnel", 13, 0xfff,      0xdd,       16, 17, 18);
    712    TESTINST4l("bnel", 14, -1,         0x5,        2,  25, 24);
    713    TESTINST4l("bnel", 15, -1,         -1,         25, 24, 7);
    714 
    715    printf("j, jal, jr\n");
    716    TESTINST3j(0,  2);
    717    TESTINST3j(1,  3);
    718    TESTINST3j(2,  4);
    719    TESTINST3j(3,  5);
    720    TESTINST3j(4,  6);
    721    TESTINST3j(5,  7);
    722    TESTINST3j(6,  4);
    723    TESTINST3j(7,  9);
    724    TESTINST3j(8,  10);
    725    TESTINST3j(9,  11);
    726    TESTINST3j(10, 12);
    727    TESTINST3j(11, 13);
    728    TESTINST3j(12, 14);
    729    TESTINST3j(13, 15);
    730    TESTINST3j(14, 16);
    731    TESTINST3j(15, 17);
    732    TESTINST3j(16, 18);
    733    TESTINST3j(17, 19);
    734    TESTINST3j(18, 20);
    735    TESTINST3j(19, 21);
    736    TESTINST3j(20, 22);
    737    TESTINST3j(21, 23);
    738    TESTINST3j(22, 24);
    739    TESTINST3j(23, 24);
    740 
    741    printf("j, jalr, jr\n");
    742    TESTINST3ja(0,  2);
    743    TESTINST3ja(1,  3);
    744    TESTINST3ja(2,  4);
    745    TESTINST3ja(3,  5);
    746    TESTINST3ja(4,  6);
    747    TESTINST3ja(5,  7);
    748    TESTINST3ja(6,  4);
    749    TESTINST3ja(7,  7);
    750    TESTINST3ja(8,  10);
    751    TESTINST3ja(9,  11);
    752    TESTINST3ja(11, 13);
    753    TESTINST3ja(12, 14);
    754    TESTINST3ja(13, 15);
    755    TESTINST3ja(14, 16);
    756    TESTINST3ja(15, 17);
    757    TESTINST3ja(16, 18);
    758    TESTINST3ja(17, 19);
    759    TESTINST3ja(18, 20);
    760    TESTINST3ja(19, 21);
    761    TESTINST3ja(20, 22);
    762    TESTINST3ja(21, 23);
    763    TESTINST3ja(22, 24);
    764    TESTINST3ja(23, 24);
    765 
    766    return 0;
    767 }
    768