Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 #include "const.h"
      3 #include "macro_int.h"
      4 
      5 typedef enum {
      6    ADD=0,  ADDI,   ADDIU,  ADDU,
      7    CLO,    CLZ,    DADD,   DADDI,
      8    DADDIU, DADDU,  DCLO,   DCLZ,
      9    DDIV,   DDIVU,  DIV,    DIVU,
     10    DMULT,  DMULTU, DSUB,   DSUBU,
     11    MADD,   MADDU,  MSUB,   MSUBU,
     12    MUL,    MULT,   MULTU,  MOVN,
     13    MOVZ,   SEB,    SEH,    SLT,
     14    SLTI,   SLTIU,  SLTU,   SUB,
     15    SUBU
     16 } arithmetic_op;
     17 
     18 int main()
     19 {
     20    arithmetic_op op;
     21    int i;
     22    init_reg_val2();
     23 
     24    for (op = ADD; op <= SUBU; op++) {
     25       for (i = 0; i < N; i++) {
     26          switch(op) {
     27             case ADD:
     28                /* If either GPR rt or GPR rs does not contain sign-extended
     29                   32-bit values (bits 63..31 equal), then the result of the
     30                   operation is UNPREDICTABLE. */
     31                TEST1("add $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
     32                                           t0, t1, t2);
     33                break;
     34 
     35             case ADDI:
     36                /* If GPR rs does not contain a sign-extended 32-bit
     37                   value (bits 63..31 equal), then the result of the operation
     38                   is UNPREDICTABLE. */
     39                TEST2("addi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
     40                TEST2("addi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
     41                TEST2("addi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
     42                TEST2("addi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
     43                break;
     44 
     45             case ADDIU:
     46                /* If GPR rs does not contain a sign-extended 32-bit
     47                   value (bits 63..31 equal), then the result of the operation
     48                   is UNPREDICTABLE. */
     49                TEST2("addiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
     50                TEST2("addiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
     51                TEST2("addiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
     52                TEST2("addiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
     53                break;
     54 
     55             case ADDU:
     56                /* If either GPR rt or GPR rs does not contain sign-extended
     57                   32-bit values (bits 63..31 equal), then the result of the
     58                   operation is UNPREDICTABLE. */
     59                TEST1("addu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
     60                                            t0, t1, t2);
     61                break;
     62 
     63             case CLO:
     64                /* If GPR rs does not contain a sign-extended 32-bit
     65                   value (bits 63..31 equal), then the results of the operation
     66                   are UNPREDICTABLE. */
     67                TEST3("clo $t0, $t1", reg_val1[i], t0, t1);
     68                break;
     69 
     70             case CLZ:
     71                /* If GPR rs does not contain a sign-extended 32-bit
     72                   value (bits 63..31 equal), then the results of the operation
     73                   are UNPREDICTABLE. */
     74                TEST3("clz $t0, $t1", reg_val1[i], t0, t1);
     75                break;
     76 
     77             case DADD:
     78                /* If the addition results in 64-bit 2s complement arithmetic
     79                   overflow, then the destination register is not modified and
     80                   an IntegerOverflow exception occurs. */
     81                TEST1("dadd $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
     82                                            t0, t1, t2);
     83                break;
     84 
     85             case DADDI:
     86                /* If the addition results in 64-bit 2s complement arithmetic
     87                   overflow, then the destination register is not modified and
     88                   an Integer Overflow exception occurs. */
     89                TEST2("daddi $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
     90                TEST2("daddi $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
     91                TEST2("daddi $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
     92                TEST2("daddi $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
     93                TEST2("daddi $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
     94                TEST2("daddi $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
     95                TEST2("daddi $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
     96                TEST2("daddi $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
     97                break;
     98 
     99             case DADDIU:
    100                /* No Integer Overflow exception occurs under any
    101                   circumstances. */
    102                TEST2("daddiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
    103                TEST2("daddiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
    104                TEST2("daddiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
    105                TEST2("daddiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
    106                TEST2("daddiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
    107                TEST2("daddiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
    108                TEST2("daddiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
    109                TEST2("daddiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
    110                break;
    111 
    112             case DADDU:
    113                /* No Integer Overflow exception occurs under any
    114                   circumstances. */
    115                TEST1("daddu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    116                                             t0, t1, t2);
    117                TEST1("daddu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
    118                                             s0, s1, s2);
    119                break;
    120 
    121             case DCLO:
    122                /* No arithmetic exception occurs under any circumstances. */
    123                TEST3("dclo $t0, $t1", reg_val1[i], t0, t1);
    124                TEST3("dclo $v0, $v1", reg_val2[i], v0, v1);
    125                break;
    126 
    127             case DCLZ:
    128                /* No arithmetic exception occurs under any circumstances. */
    129                TEST3("dclz $t0, $t1", reg_val1[i], t0, t1);
    130                TEST3("dclz $v0, $v1", reg_val2[i], v0, v1);
    131                break;
    132 
    133             case DDIV:
    134                /* If the divisor in GPR rt is zero, the arithmetic result value
    135                   is UNPREDICTABLE. */
    136                if (reg_val1[N-i-1] != 0)
    137                   TEST4("ddiv $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    138 
    139                if (reg_val2[N-i-1] != 0)
    140                   TEST4("ddiv $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
    141 
    142                break;
    143 
    144             case DDIVU:
    145                /* If the divisor in GPR rt is zero, the arithmetic result value
    146                   is UNPREDICTABLE. */
    147                if (reg_val1[N-i-1] != 0)
    148                   TEST4("ddivu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    149 
    150                if (reg_val2[N-i-1] != 0)
    151                   TEST4("ddivu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
    152 
    153                break;
    154 
    155             case DIV:
    156                /* If either GPR rt or GPR rs does not contain sign-extended
    157                   32-bit values (bits 63..31 equal), then the result of the
    158                   operation is UNPREDICTABLE.
    159                   If the divisor in GPR rt is zero, the arithmetic result
    160                   value is UNPREDICTABLE. */
    161                if (reg_val1[N-i-1] != 0)
    162                   TEST4("div $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    163 
    164                break;
    165 
    166             case DIVU:
    167                /* If either GPR rt or GPR rs does not contain sign-extended
    168                   32-bit values (bits 63..31 equal), then the result of the
    169                   operation is UNPREDICTABLE.
    170                   If the divisor in GPR rt is zero, the arithmetic result
    171                   value is UNPREDICTABLE. */
    172                if (reg_val1[N-i-1] != 0)
    173                   TEST4("divu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    174 
    175                break;
    176 
    177             case DMULT:
    178                /* No arithmetic exception occurs under any circumstances. */
    179                TEST4("dmult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    180                TEST4("dmult $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
    181                break;
    182 
    183             case DMULTU:
    184                /* No arithmetic exception occurs under any circumstances. */
    185                TEST4("dmultu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    186                TEST4("dmultu $v0, $v1", reg_val2[i], reg_val2[N-i-1], v0, v1);
    187                break;
    188 
    189             case DSUB:
    190                /* If the subtraction results in 64-bit 2s complement
    191                   arithmetic overflow, then the destination register is not
    192                   modified and an Integer Overflow exception occurs. */
    193                TEST1("dsub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    194                                            t0, t1, t2);
    195                break;
    196 
    197             case DSUBU:
    198                /* No Integer Overflow exception occurs under any
    199                   circumstances. */
    200                TEST1("dsubu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    201                                             t0, t1, t2);
    202                TEST1("dsubu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
    203                                             s0, s1, s2);
    204                break;
    205 
    206             case MADD:
    207                /* If GPRs rs or rt do not contain sign-extended 32-bit
    208                   values (bits 63..31 equal), then the results of the operation
    209                   are UNPREDICTABLE. */
    210                TEST5("madd $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    211                break;
    212 
    213             case MADDU:
    214                /* If GPRs rs or rt do not contain sign-extended 32-bit
    215                   values (bits 63..31 equal), then the results of the operation
    216                   are UNPREDICTABLE. */
    217                TEST5("maddu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    218                break;
    219 
    220             case MSUB:
    221                /* If GPR rs or rt do not contain a sign-extended 32-bit
    222                   value (bits 63..31 equal), then the results of the operation
    223                   are UNPREDICTABLE. */
    224                TEST5("msub $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    225                break;
    226 
    227             case MSUBU:
    228                /* If GPRs rs or rt do not contain sign-extended 32-bit
    229                   values (bits 63..31 equal), then the results of the operation
    230                   are UNPREDICTABLE.
    231                   This instruction does not provide the capability of writing
    232                   directly to a target GPR. */
    233                TEST5("msubu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    234                break;
    235 
    236             case MUL:
    237                /* On 64-bit processors, if either GPR rt or GPR rs does not
    238                   contain sign-extended 32-bit values (bits 63..31 equal), then
    239                   the result of the operation is UNPREDICTABLE. */
    240                TEST1("mul $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    241                                           t0, t1, t2);
    242                break;
    243 
    244             case MULT:
    245                /* On 64-bit processors, if either GPR rt or GPR rs does not
    246                   contain sign-extended 32-bit values (bits 63..31 equal), then
    247                   the result of the operation is UNPREDICTABLE. */
    248                TEST4("mult $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    249                break;
    250 
    251             case MULTU:
    252                /* On 64-bit processors, if either GPR rt or GPR rs does not
    253                   contain sign-extended 32-bit values (bits 63..31 equal), then
    254                   the result of the operation is UNPREDICTABLE. */
    255                TEST4("multu $t0, $t1", reg_val1[i], reg_val1[N-i-1], t0, t1);
    256                break;
    257 
    258             case MOVN:
    259                /* The arithmetic comparison does not cause an Integer Overflow
    260                   exception. */
    261                TEST1("movn $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    262                                            t0, t1, t2);
    263                TEST1("movn $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
    264                                            s0, s1, s2);
    265                break;
    266 
    267             case MOVZ:
    268                /* The arithmetic comparison does not cause an Integer Overflow
    269                   exception. */
    270                TEST1("movz $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    271                                            t0, t1, t2);
    272                TEST1("movz $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
    273                                            s0, s1, s2);
    274                break;
    275 
    276             case SEB:
    277 #if (__mips==64) && (__mips_isa_rev>=2)
    278                /* If GPR rt does not contain a sign-extended 32-bit
    279                   value (bits 63..31 equal), then the result of the operation
    280                   is UNPREDICTABLE. */
    281                TEST3("seb $t0, $t1", reg_val1[i], t0, t1);
    282 #endif
    283                break;
    284 
    285             case SEH:
    286 #if (__mips==64) && (__mips_isa_rev>=2)
    287                /* If GPR rt does not contain a sign-extended 32-bit
    288                   value (bits 63..31 equal), then the result of the operation
    289                   is UNPREDICTABLE. */
    290                TEST3("seh $t0, $t1", reg_val1[i], t0, t1);
    291 #endif
    292                break;
    293 
    294             case SLT:
    295                /* The arithmetic comparison does not cause an Integer Overflow
    296                   exception. */
    297                TEST1("slt $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    298                                           t0, t1, t2);
    299                break;
    300 
    301             case SLTI:
    302                /* The arithmetic comparison does not cause an Integer Overflow
    303                   exception. */
    304                TEST2("slti $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
    305                TEST2("slti $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
    306                TEST2("slti $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
    307                TEST2("slti $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
    308                TEST2("slti $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
    309                TEST2("slti $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
    310                TEST2("slti $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
    311                TEST2("slti $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
    312                break;
    313 
    314             case SLTIU:
    315                /* The arithmetic comparison does not cause an Integer Overflow
    316                   exception. */
    317                TEST2("sltiu $t0, $t1, 0xff",   reg_val1[i], 0xff,   t0, t1);
    318                TEST2("sltiu $t2, $t3, 0xffff", reg_val1[i], 0xffff, t2, t3);
    319                TEST2("sltiu $a0, $a1, 0x0",    reg_val1[i], 0x0,    a0, a1);
    320                TEST2("sltiu $s0, $s1, 0x23",   reg_val1[i], 0x23,   s0, s1);
    321                TEST2("sltiu $t0, $t1, 0xff",   reg_val2[i], 0xff,   t0, t1);
    322                TEST2("sltiu $t2, $t3, 0xffff", reg_val2[i], 0xffff, t2, t3);
    323                TEST2("sltiu $a0, $a1, 0x0",    reg_val2[i], 0x0,    a0, a1);
    324                TEST2("sltiu $s0, $s1, 0x23",   reg_val2[i], 0x23,   s0, s1);
    325                break;
    326 
    327             case SLTU:
    328                /* The arithmetic comparison does not cause an Integer Overflow
    329                   exception. */
    330                TEST1("sltu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    331                                            t0, t1, t2);
    332                TEST1("sltu $s0, $s1, $s2", reg_val2[i], reg_val2[N-i-1],
    333                                            s0, s1, s2);
    334                break;
    335 
    336             case SUB:
    337                /* On 64-bit processors, if either GPR rt or GPR rs does not
    338                   contain sign-extended 32-bit values (bits 63..31 equal), then
    339                   the result of the operation is UNPREDICTABLE. */
    340                if (i < 8 || (i > 15 && i < 22))
    341                   TEST1("sub $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    342                                              t0, t1, t2);
    343                break;
    344 
    345             case SUBU:
    346                /* On 64-bit processors, if either GPR rt or GPR rs does not
    347                   contain sign-extended 32-bit values (bits 63..31 equal), then
    348                   the result of the operation is UNPREDICTABLE. */
    349                TEST1("subu $t0, $t1, $t2", reg_val1[i], reg_val1[N-i-1],
    350                                            t0, t1, t2);
    351                break;
    352 
    353             default:
    354                printf("Error!\n");
    355                break;
    356          }
    357       }
    358    }
    359    return 0;
    360 }
    361