1#include <stdio.h>
2#include <math.h>
3#include "rounding_mode.h"
4#include "macro_fpu.h"
5
6int 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
158int 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