Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 #include "rounding_mode.h"
      3 #include "macro_fpu.h"
      4 
      5 #if defined(__mips_hard_float)
      6 int directedRoundingMode(flt_dir_op_t op) {
      7    int fd_w = 0;
      8    long long int fd_l = 0;
      9    int i;
     10    int fcsr = 0;
     11    for (i = 0; i < MAX_ARR; i++) {
     12       clear_fcc();
     13       switch(op) {
     14          case CEILWS:
     15               UNOPfw("ceil.w.s");
     16               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
     17               printf("fcsr: 0x%x\n", fcsr);
     18               break;
     19          case CEILWD:
     20               UNOPdw("ceil.w.d");
     21               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
     22               printf("fcsr: 0x%x\n", fcsr);
     23               break;
     24          case FLOORWS:
     25               UNOPfw("floor.w.s");
     26               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
     27               printf("fcsr: 0x%x\n", fcsr);
     28               break;
     29          case FLOORWD:
     30               UNOPdw("floor.w.d");
     31               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
     32               printf("fcsr: 0x%x\n", fcsr);
     33               break;
     34          case ROUNDWS:
     35               UNOPfw("round.w.s");
     36               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
     37               printf("fcsr: 0x%x\n", fcsr);
     38               break;
     39          case ROUNDWD:
     40               UNOPdw("round.w.d");
     41               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
     42               printf("fcsr: 0x%x\n", fcsr);
     43               break;
     44          case TRUNCWS:
     45               UNOPfw("trunc.w.s");
     46               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
     47               printf("fcsr: 0x%x\n", fcsr);
     48               break;
     49          case TRUNCWD:
     50               UNOPdw("trunc.w.d");
     51               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
     52               printf("fcsr: 0x%x\n", fcsr);
     53               break;
     54          case CEILLS:
     55               UNOPsl("ceil.l.s");
     56               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
     57               printf("fcsr: 0x%x\n", fcsr);
     58               break;
     59          case CEILLD:
     60               UNOPdl("ceil.l.d");
     61               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
     62               printf("fcsr: 0x%x\n", fcsr);
     63               break;
     64          case FLOORLS:
     65               UNOPsl("floor.l.s");
     66               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
     67               printf("fcsr: 0x%x\n", fcsr);
     68               break;
     69          case FLOORLD:
     70               UNOPdl("floor.l.d");
     71               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
     72               printf("fcsr: 0x%x\n", fcsr);
     73               break;
     74          case ROUNDLS:
     75               UNOPsl("round.l.s");
     76               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
     77               printf("fcsr: 0x%x\n", fcsr);
     78               break;
     79          case ROUNDLD:
     80               UNOPdl("round.l.d");
     81               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
     82               printf("fcsr: 0x%x\n", fcsr);
     83               break;
     84          case TRUNCLS:
     85               UNOPsl("trunc.l.s");
     86               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
     87               printf("fcsr: 0x%x\n", fcsr);
     88               break;
     89          case TRUNCLD:
     90               UNOPdl("trunc.l.d");
     91               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
     92               printf("fcsr: 0x%x\n", fcsr);
     93               break;
     94         default:
     95             printf("error\n");
     96             break;
     97         }
     98     }
     99    return 0;
    100 }
    101 
    102 int FCSRRoundingMode(flt_round_op_t op1)
    103 {
    104    double fd_d = 0;
    105    float fd_f = 0;
    106    int fd_w = 0;
    107    long long int fd_l = 0;
    108    int i;
    109    int fcsr = 0;
    110    round_mode_t rm;
    111    for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
    112       set_rounding_mode(rm);
    113       printf("roundig mode: %s\n", round_mode_name[rm]);
    114       for (i = 0; i < MAX_ARR; i++) {
    115          clear_fcc();
    116          set_rounding_mode(rm);
    117          switch(op1) {
    118             case CVTDS:
    119                  UNOPfd("cvt.d.s");
    120                  printf("%s %lf %lf\n", flt_round_op_names[op1], fd_d, fs_f[i]);
    121                  printf("fcsr: 0x%x\n", fcsr);
    122                  break;
    123             case CVTDW:
    124                  UNOPwd("cvt.d.w");
    125                  printf("%s %lf %d\n", flt_round_op_names[op1], fd_d, fs_w[i]);
    126                  printf("fcsr: 0x%x\n", fcsr);
    127                  break;
    128             case CVTSD:
    129                  UNOPdf("cvt.s.d");
    130                  printf("%s %f %lf\n", flt_round_op_names[op1], fd_f, fs_d[i]);
    131                  printf("fcsr: 0x%x\n", fcsr);
    132                  break;
    133             case CVTSW:
    134                  UNOPwf("cvt.s.w");
    135                  printf("%s %f %d\n", flt_round_op_names[op1], fd_f, fs_w[i]);
    136                  printf("fcsr: 0x%x\n", fcsr);
    137                  break;
    138             case CVTWS:
    139                  UNOPfw("cvt.w.s");
    140                  printf("%s %d %f\n", flt_round_op_names[op1], fd_w, fs_f[i]);
    141                  printf("fcsr: 0x%x\n", fcsr);
    142                  break;
    143             case CVTWD:
    144                  UNOPdw("cvt.w.d");
    145                  printf("%s %d %lf\n", flt_round_op_names[op1], fd_w, fs_d[i]);
    146                  printf("fcsr: 0x%x\n", fcsr);
    147                  break;
    148             case CVTDL:
    149                  UNOPld("cvt.d.l");
    150                  printf("%s %lf %ld\n", flt_round_op_names[op1], fd_d, fs_l[i]);
    151                  printf("fcsr: 0x%x\n", fcsr);
    152                  break;
    153             case CVTLS:
    154                  UNOPsl("cvt.l.s");
    155                  printf("%s %lld %f\n", flt_round_op_names[op1], fd_l, fs_f[i]);
    156                  printf("fcsr: 0x%x\n", fcsr);
    157                  break;
    158             case CVTLD:
    159                  UNOPdl("cvt.l.d");
    160                  printf("%s %lld %lf\n", flt_round_op_names[op1], fd_l, fs_d[i]);
    161                  printf("fcsr: 0x%x\n", fcsr);
    162                  break;
    163             case CVTSL:
    164                  UNOPls("cvt.s.l");
    165                  printf("%s %f %ld\n", flt_round_op_names[op1], fd_f, fs_l[i]);
    166                  printf("fcsr: 0x%x\n", fcsr);
    167                  break;
    168             default:
    169                  printf("error\n");
    170                  break;
    171          }
    172       }
    173    }
    174    return 0;
    175 }
    176 #endif
    177 
    178 int main()
    179 {
    180 #if defined(__mips_hard_float)
    181    flt_dir_op_t op;
    182    flt_round_op_t op1;
    183 
    184    printf("-------------------------- %s --------------------------\n",
    185         "test FPU Conversion Operations Using a Directed Rounding Mode");
    186    for (op = CEILWS; op <= TRUNCLS; op++) {
    187       directedRoundingMode(op);
    188    }
    189 
    190    printf("-------------------------- %s --------------------------\n",
    191         "test FPU Conversion Operations Using the FCSR Rounding Mode");
    192    for (op1 = CVTDS; op1 <= CVTSL; op1++) {
    193       FCSRRoundingMode(op1);
    194    }
    195 #endif
    196    return 0;
    197 }
    198