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