Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 #include <math.h>
      3 #include "rounding_mode.h"
      4 #include "macro_fpu.h"
      5 
      6 #if defined(__mips_hard_float)
      7 int arithmeticOperations(flt_art_op_t op)
      8 {
      9    double fd_d = 0;
     10    float fd_f = 0;
     11    int i = 0;
     12    int fcsr = 0;
     13    round_mode_t rm;
     14    for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
     15       set_rounding_mode(rm);
     16       printf("roundig mode: %s\n", round_mode_name[rm]);
     17       for (i = 0; i < MAX_ARR; i++) {
     18          switch(op) {
     19             case ABSS:
     20                UNOPff("abs.s");
     21                printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
     22                break;
     23             case ABSD:
     24                UNOPdd("abs.d");
     25                printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
     26                break;
     27             case ADDS:
     28                BINOPf("add.s");
     29                printf("%s %f %f %f\n",
     30                       flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
     31                break;
     32             case ADDD:
     33                BINOPd("add.d");
     34                printf("%s %lf %lf %lf\n",
     35                       flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
     36                break;
     37             case DIVS:
     38                BINOPf("div.s");
     39                printf("%s %f %f %f\n",
     40                       flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
     41                break;
     42             case DIVD:
     43                BINOPd("div.d");
     44                printf("%s %lf %lf %lf\n",
     45                       flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
     46                break;
     47             case MULS:
     48                BINOPf("mul.s");
     49                printf("%s %f %f %f\n",
     50                       flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
     51                break;
     52             case MULD:
     53                BINOPd("mul.d");
     54                printf("%s %lf %lf %lf\n",
     55                       flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
     56                break;
     57             case NEGS:
     58                UNOPff("neg.s");
     59                printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
     60                break;
     61             case NEGD:
     62                UNOPdd("neg.d");
     63                printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
     64                break;
     65             case SQRTS:
     66                UNOPff("sqrt.s");
     67                printf("%s %f %f\n",
     68                       flt_art_op_names[op], roundf(fd_f), fs_f[i]);
     69                break;
     70             case SQRTD:
     71                UNOPdd("sqrt.d");
     72                printf("%s %lf %lf\n",
     73                       flt_art_op_names[op], round(fd_d), fs_d[i]);
     74                break;
     75             case SUBS:
     76                BINOPf("sub.s");
     77                printf("%s %f %f %f\n",
     78                       flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
     79                break;
     80             case SUBD:
     81                BINOPd("sub.d");
     82                printf("%s %lf %lf %lf\n",
     83                       flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
     84                break;
     85             case RECIPS:
     86                UNOPff("recip.s");
     87                printf("%s %f %f\n",
     88                       flt_art_op_names[op], roundf(fd_f), fs_f[i]);
     89                break;
     90             case RECIPD:
     91                UNOPdd("recip.d");
     92                printf("%s %lf %lf\n",
     93                       flt_art_op_names[op], round(fd_d), fs_d[i]);
     94                break;
     95             case RSQRTS:
     96                if (fs_f[i] >= 0) {
     97                   UNOPff("rsqrt.s");
     98                   printf("%s %f %f\n",
     99                          flt_art_op_names[op], roundf(fd_f), fs_f[i]);
    100                }
    101                break;
    102             case RSQRTD:
    103                if (fs_d[i] >= 0) {
    104                   UNOPdd("rsqrt.d");
    105                   printf("%s %lf %lf\n",
    106                          flt_art_op_names[op], round(fd_d), fs_d[i]);
    107                }
    108                break;
    109             case MSUBS:
    110                TRIOPf("msub.s");
    111                printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f),
    112                                          fr_f[i], fs_f[i], ft_f[i]);
    113                break;
    114             case MSUBD:
    115                TRIOPd("msub.d");
    116                printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
    117                                               fr_d[i], fs_d[i], ft_d[i]);
    118                break;
    119             case MADDS:
    120                TRIOPf("madd.s");
    121                printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
    122                                           fr_f[i], fs_f[i], ft_f[i]);
    123                break;
    124             case MADDD:
    125                TRIOPd("madd.d");
    126                printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
    127                                               fr_d[i], fs_d[i], ft_d[i]);
    128                break;
    129             case NMADDS:
    130                TRIOPf("nmadd.s");
    131                printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
    132                                           fr_f[i], fs_f[i], ft_f[i]);
    133                break;
    134             case NMADDD:
    135                TRIOPd("nmadd.d");
    136                printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
    137                                               fr_d[i], fs_d[i], ft_d[i]);
    138                break;
    139             case NMSUBS:
    140                TRIOPf("nmsub.s");
    141                printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
    142                                           fr_f[i], fs_f[i], ft_f[i]);
    143                break;
    144             case NMSUBD:
    145                TRIOPd("nmsub.d");
    146                printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op],
    147                                                 round(fd_d), fr_d[i], fs_d[i],
    148                                                 ft_d[i]);
    149                break;
    150             default:
    151                printf("error\n");
    152                break;
    153          }
    154       }
    155    }
    156    return 0;
    157 }
    158 #endif
    159 
    160 int main()
    161 {
    162 #if defined(__mips_hard_float)
    163    flt_art_op_t op;
    164 
    165    printf("-------------------------- %s --------------------------\n",
    166         "test FPU Arithmetic Operations");
    167    for (op = ABSS; op <= NMSUBD; op++) {
    168       arithmeticOperations(op);
    169    }
    170 #endif
    171    return 0;
    172 }
    173