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