1 #include <stdio.h>
2 #include <math.h>
3 #include "rounding_mode.h"
4 #include "macro_fpu.h"
5
6 #if defined(__mips_hard_float)
arithmeticOperations(flt_art_op_t op)7 int arithmeticOperations(flt_art_op_t op)
8 {
9 double fd_d = 0;
10 float fd_f = 0;
11 int i = 0;
12 int fcsr = 0;
13 round_mode_t rm;
14 for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
15 set_rounding_mode(rm);
16 printf("roundig mode: %s\n", round_mode_name[rm]);
17 for (i = 0; i < MAX_ARR; i++) {
18 switch(op) {
19 case ABSS:
20 UNOPff("abs.s");
21 printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
22 break;
23 case ABSD:
24 UNOPdd("abs.d");
25 printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
26 break;
27 case ADDS:
28 BINOPf("add.s");
29 printf("%s %f %f %f\n",
30 flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
31 break;
32 case ADDD:
33 BINOPd("add.d");
34 printf("%s %lf %lf %lf\n",
35 flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
36 break;
37 case DIVS:
38 BINOPf("div.s");
39 printf("%s %f %f %f\n",
40 flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
41 break;
42 case DIVD:
43 BINOPd("div.d");
44 printf("%s %lf %lf %lf\n",
45 flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
46 break;
47 case MULS:
48 BINOPf("mul.s");
49 printf("%s %f %f %f\n",
50 flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
51 break;
52 case MULD:
53 BINOPd("mul.d");
54 printf("%s %lf %lf %lf\n",
55 flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
56 break;
57 case NEGS:
58 UNOPff("neg.s");
59 printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
60 break;
61 case NEGD:
62 UNOPdd("neg.d");
63 printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
64 break;
65 case SQRTS:
66 UNOPff("sqrt.s");
67 printf("%s %f %f\n",
68 flt_art_op_names[op], roundf(fd_f), fs_f[i]);
69 break;
70 case SQRTD:
71 UNOPdd("sqrt.d");
72 printf("%s %lf %lf\n",
73 flt_art_op_names[op], round(fd_d), fs_d[i]);
74 break;
75 case SUBS:
76 BINOPf("sub.s");
77 printf("%s %f %f %f\n",
78 flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
79 break;
80 case SUBD:
81 BINOPd("sub.d");
82 printf("%s %lf %lf %lf\n",
83 flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
84 break;
85 case RECIPS:
86 UNOPff("recip.s");
87 printf("%s %f %f\n",
88 flt_art_op_names[op], roundf(fd_f), fs_f[i]);
89 break;
90 case RECIPD:
91 UNOPdd("recip.d");
92 printf("%s %lf %lf\n",
93 flt_art_op_names[op], round(fd_d), fs_d[i]);
94 break;
95 case RSQRTS:
96 if (fs_f[i] >= 0) {
97 UNOPff("rsqrt.s");
98 printf("%s %f %f\n",
99 flt_art_op_names[op], roundf(fd_f), fs_f[i]);
100 }
101 break;
102 case RSQRTD:
103 if (fs_d[i] >= 0) {
104 UNOPdd("rsqrt.d");
105 printf("%s %lf %lf\n",
106 flt_art_op_names[op], round(fd_d), fs_d[i]);
107 }
108 break;
109 case MSUBS:
110 TRIOPf("msub.s");
111 printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f),
112 fr_f[i], fs_f[i], ft_f[i]);
113 break;
114 case MSUBD:
115 TRIOPd("msub.d");
116 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
117 fr_d[i], fs_d[i], ft_d[i]);
118 break;
119 case MADDS:
120 TRIOPf("madd.s");
121 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
122 fr_f[i], fs_f[i], ft_f[i]);
123 break;
124 case MADDD:
125 TRIOPd("madd.d");
126 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
127 fr_d[i], fs_d[i], ft_d[i]);
128 break;
129 case NMADDS:
130 TRIOPf("nmadd.s");
131 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
132 fr_f[i], fs_f[i], ft_f[i]);
133 break;
134 case NMADDD:
135 TRIOPd("nmadd.d");
136 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
137 fr_d[i], fs_d[i], ft_d[i]);
138 break;
139 case NMSUBS:
140 TRIOPf("nmsub.s");
141 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
142 fr_f[i], fs_f[i], ft_f[i]);
143 break;
144 case NMSUBD:
145 TRIOPd("nmsub.d");
146 printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op],
147 round(fd_d), fr_d[i], fs_d[i],
148 ft_d[i]);
149 break;
150 default:
151 printf("error\n");
152 break;
153 }
154 }
155 }
156 return 0;
157 }
158 #endif
159
main()160 int main()
161 {
162 #if defined(__mips_hard_float)
163 flt_art_op_t op;
164
165 printf("-------------------------- %s --------------------------\n",
166 "test FPU Arithmetic Operations");
167 for (op = ABSS; op <= NMSUBD; op++) {
168 arithmeticOperations(op);
169 }
170 #endif
171 return 0;
172 }
173