#include <stdio.h>
#include <math.h>
#include "rounding_mode.h"
#include "macro_fpu.h"

#if defined(__mips_hard_float)
int arithmeticOperations(flt_art_op_t op) 
{
   double fd_d = 0;
   float fd_f = 0;
   int i = 0;
   int fcsr = 0;
   round_mode_t rm;
   for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
      set_rounding_mode(rm);
      printf("roundig mode: %s\n", round_mode_name[rm]);
      for (i = 0; i < MAX_ARR; i++) {
         switch(op) {
            case ABSS:
               UNOPff("abs.s");
               printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
               break;
            case ABSD:
               UNOPdd("abs.d");
               printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
               break;
            case ADDS:
               BINOPf("add.s");
               printf("%s %f %f %f\n",
                      flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
               break;
            case ADDD:
               BINOPd("add.d");
               printf("%s %lf %lf %lf\n",
                      flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
               break;
            case DIVS:
               BINOPf("div.s");
               printf("%s %f %f %f\n",
                      flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
               break;
            case DIVD:
               BINOPd("div.d");
               printf("%s %lf %lf %lf\n",
                      flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
               break;
            case MULS:
               BINOPf("mul.s");
               printf("%s %f %f %f\n",
                      flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
               break;
            case MULD:
               BINOPd("mul.d");
               printf("%s %lf %lf %lf\n",
                      flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
               break;
            case NEGS:
               UNOPff("neg.s");
               printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
               break;
            case NEGD:
               UNOPdd("neg.d");
               printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
               break;
            case SQRTS:
               UNOPff("sqrt.s");
               printf("%s %f %f\n",
                      flt_art_op_names[op], roundf(fd_f), fs_f[i]);
               break;
            case SQRTD:
               UNOPdd("sqrt.d");
               printf("%s %lf %lf\n",
                      flt_art_op_names[op], round(fd_d), fs_d[i]);
               break;
            case SUBS:
               BINOPf("sub.s");
               printf("%s %f %f %f\n",
                      flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
               break;
            case SUBD:
               BINOPd("sub.d");
               printf("%s %lf %lf %lf\n",
                      flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
               break;
            case RECIPS:
               UNOPff("recip.s");
               printf("%s %f %f\n",
                      flt_art_op_names[op], roundf(fd_f), fs_f[i]);
               break;
            case RECIPD:
               UNOPdd("recip.d");
               printf("%s %lf %lf\n",
                      flt_art_op_names[op], round(fd_d), fs_d[i]);
               break;
            case RSQRTS:
               if (fs_f[i] >= 0) {
                  UNOPff("rsqrt.s");
                  printf("%s %f %f\n",
                         flt_art_op_names[op], roundf(fd_f), fs_f[i]);
               }
               break;
            case RSQRTD:
               if (fs_d[i] >= 0) {
                  UNOPdd("rsqrt.d");
                  printf("%s %lf %lf\n",
                         flt_art_op_names[op], round(fd_d), fs_d[i]);
               }
               break;
            case MSUBS:
               TRIOPf("msub.s");
               printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f),
                                         fr_f[i], fs_f[i], ft_f[i]);
               break;
            case MSUBD:
               TRIOPd("msub.d");
               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
                                              fr_d[i], fs_d[i], ft_d[i]);
               break;
            case MADDS:
               TRIOPf("madd.s");
               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
                                          fr_f[i], fs_f[i], ft_f[i]);
               break;
            case MADDD:
               TRIOPd("madd.d");
               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
                                              fr_d[i], fs_d[i], ft_d[i]);
               break;
            case NMADDS:
               TRIOPf("nmadd.s");
               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
                                          fr_f[i], fs_f[i], ft_f[i]);
               break;
            case NMADDD:
               TRIOPd("nmadd.d");
               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
                                              fr_d[i], fs_d[i], ft_d[i]);
               break;
            case NMSUBS:
               TRIOPf("nmsub.s");
               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
                                          fr_f[i], fs_f[i], ft_f[i]);
               break;
            case NMSUBD:
               TRIOPd("nmsub.d");
               printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op],
                                                round(fd_d), fr_d[i], fs_d[i],
                                                ft_d[i]);
               break;
            default:
               printf("error\n");
               break;
         }
      }
   }
   return 0;
}
#endif

int main()
{
#if defined(__mips_hard_float)
   flt_art_op_t op;

   printf("-------------------------- %s --------------------------\n",
        "test FPU Arithmetic Operations");
   for (op = ABSS; op <= NMSUBD; op++) {
      arithmeticOperations(op);
   }
#endif
   return 0;
}
