1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <math.h>
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "rounding_mode.h"
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "macro_fpu.h"
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint arithmeticOperations(flt_art_op_t op)
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   double fd_d = 0;
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   float fd_f = 0;
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int i = 0;
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int fcsr = 0;
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   round_mode_t rm;
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      set_rounding_mode(rm);
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("roundig mode: %s\n", round_mode_name[rm]);
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      for (i = 0; i < MAX_ARR; i++) {
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(op) {
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ABSS:
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPff("abs.s");
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ABSD:
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPdd("abs.d");
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADDS:
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPf("add.s");
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f\n",
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case ADDD:
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPd("add.d");
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf\n",
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DIVS:
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPf("div.s");
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f\n",
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case DIVD:
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPd("div.d");
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf\n",
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MULS:
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPf("mul.s");
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f\n",
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MULD:
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPd("mul.d");
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf\n",
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NEGS:
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPff("neg.s");
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NEGD:
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPdd("neg.d");
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SQRTS:
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPff("sqrt.s");
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f\n",
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], roundf(fd_f), fs_f[i]);
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SQRTD:
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPdd("sqrt.d");
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf\n",
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], round(fd_d), fs_d[i]);
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SUBS:
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPf("sub.s");
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f\n",
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case SUBD:
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               BINOPd("sub.d");
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf\n",
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case RECIPS:
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPff("recip.s");
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f\n",
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], roundf(fd_f), fs_f[i]);
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case RECIPD:
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UNOPdd("recip.d");
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf\n",
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      flt_art_op_names[op], round(fd_d), fs_d[i]);
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case RSQRTS:
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (fs_f[i] >= 0) {
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UNOPff("rsqrt.s");
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  printf("%s %f %f\n",
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         flt_art_op_names[op], roundf(fd_f), fs_f[i]);
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case RSQRTD:
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (fs_d[i] >= 0) {
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UNOPdd("rsqrt.d");
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  printf("%s %lf %lf\n",
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         flt_art_op_names[op], round(fd_d), fs_d[i]);
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MSUBS:
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPf("msub.s");
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f),
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         fr_f[i], fs_f[i], ft_f[i]);
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MSUBD:
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPd("msub.d");
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              fr_d[i], fs_d[i], ft_d[i]);
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MADDS:
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPf("madd.s");
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fr_f[i], fs_f[i], ft_f[i]);
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case MADDD:
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPd("madd.d");
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              fr_d[i], fs_d[i], ft_d[i]);
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NMADDS:
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPf("nmadd.s");
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fr_f[i], fs_f[i], ft_f[i]);
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NMADDD:
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPd("nmadd.d");
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              fr_d[i], fs_d[i], ft_d[i]);
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NMSUBS:
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPf("nmsub.s");
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fr_f[i], fs_f[i], ft_f[i]);
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case NMSUBD:
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               TRIOPd("nmsub.d");
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op],
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                round(fd_d), fr_d[i], fs_d[i],
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ft_d[i]);
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               printf("error\n");
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main()
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   flt_art_op_t op;
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("-------------------------- %s --------------------------\n",
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        "test FPU Arithmetic Operations");
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (op = ABSS; op <= NMSUBD; op++) {
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      arithmeticOperations(op);
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
170