• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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