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