1 #include <stdio.h>
2 #include "rounding_mode.h"
3 #include "macro_fpu.h"
4 
5 #if defined(__mips_hard_float)
directedRoundingMode(flt_dir_op_t op)6 int directedRoundingMode(flt_dir_op_t op) {
7    int fd_w = 0;
8    long long int fd_l = 0;
9    int i;
10    int fcsr = 0;
11    for (i = 0; i < MAX_ARR; i++) {
12       switch(op) {
13          case CEILWS:
14               UNOPfw("ceil.w.s");
15               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
16               printf("fcsr: 0x%x\n", fcsr);
17               break;
18          case CEILWD:
19               UNOPdw("ceil.w.d");
20               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
21               printf("fcsr: 0x%x\n", fcsr);
22               break;
23          case FLOORWS:
24               UNOPfw("floor.w.s");
25               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
26               printf("fcsr: 0x%x\n", fcsr);
27               break;
28          case FLOORWD:
29               UNOPdw("floor.w.d");
30               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
31               printf("fcsr: 0x%x\n", fcsr);
32               break;
33          case ROUNDWS:
34               UNOPfw("round.w.s");
35               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
36               printf("fcsr: 0x%x\n", fcsr);
37               break;
38          case ROUNDWD:
39               UNOPdw("round.w.d");
40               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
41               printf("fcsr: 0x%x\n", fcsr);
42               break;
43          case TRUNCWS:
44               UNOPfw("trunc.w.s");
45               printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
46               printf("fcsr: 0x%x\n", fcsr);
47               break;
48          case TRUNCWD:
49               UNOPdw("trunc.w.d");
50               printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
51               printf("fcsr: 0x%x\n", fcsr);
52               break;
53          case CEILLS:
54               UNOPsl("ceil.l.s");
55               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
56               printf("fcsr: 0x%x\n", fcsr);
57               break;
58          case CEILLD:
59               UNOPdl("ceil.l.d");
60               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
61               printf("fcsr: 0x%x\n", fcsr);
62               break;
63          case FLOORLS:
64               UNOPsl("floor.l.s");
65               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
66               printf("fcsr: 0x%x\n", fcsr);
67               break;
68          case FLOORLD:
69               UNOPdl("floor.l.d");
70               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
71               printf("fcsr: 0x%x\n", fcsr);
72               break;
73          case ROUNDLS:
74               UNOPsl("round.l.s");
75               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
76               printf("fcsr: 0x%x\n", fcsr);
77               break;
78          case ROUNDLD:
79               UNOPdl("round.l.d");
80               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
81               printf("fcsr: 0x%x\n", fcsr);
82               break;
83          case TRUNCLS:
84               UNOPsl("trunc.l.s");
85               printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]);
86               printf("fcsr: 0x%x\n", fcsr);
87               break;
88          case TRUNCLD:
89               UNOPdl("trunc.l.d");
90               printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]);
91               printf("fcsr: 0x%x\n", fcsr);
92               break;
93         default:
94             printf("error\n");
95             break;
96         }
97     }
98    return 0;
99 }
100 
FCSRRoundingMode(flt_round_op_t op1)101 int FCSRRoundingMode(flt_round_op_t op1)
102 {
103    double fd_d = 0;
104    float fd_f = 0;
105    int fd_w = 0;
106    long long int fd_l = 0;
107    int i;
108    int fcsr = 0;
109    round_mode_t rm;
110    for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
111       set_rounding_mode(rm);
112       printf("roundig mode: %s\n", round_mode_name[rm]);
113       for (i = 0; i < MAX_ARR; i++) {
114          set_rounding_mode(rm);
115          switch(op1) {
116             case CVTDS:
117                  UNOPfd("cvt.d.s");
118                  printf("%s %lf %lf\n", flt_round_op_names[op1], fd_d, fs_f[i]);
119                  printf("fcsr: 0x%x\n", fcsr);
120                  break;
121             case CVTDW:
122                  UNOPwd("cvt.d.w");
123                  printf("%s %lf %d\n", flt_round_op_names[op1], fd_d, fs_w[i]);
124                  printf("fcsr: 0x%x\n", fcsr);
125                  break;
126             case CVTSD:
127                  UNOPdf("cvt.s.d");
128                  printf("%s %f %lf\n", flt_round_op_names[op1], fd_f, fs_d[i]);
129                  printf("fcsr: 0x%x\n", fcsr);
130                  break;
131             case CVTSW:
132                  UNOPwf("cvt.s.w");
133                  printf("%s %f %d\n", flt_round_op_names[op1], fd_f, fs_w[i]);
134                  printf("fcsr: 0x%x\n", fcsr);
135                  break;
136             case CVTWS:
137                  UNOPfw("cvt.w.s");
138                  printf("%s %d %f\n", flt_round_op_names[op1], fd_w, fs_f[i]);
139                  printf("fcsr: 0x%x\n", fcsr);
140                  break;
141             case CVTWD:
142                  UNOPdw("cvt.w.d");
143                  printf("%s %d %lf\n", flt_round_op_names[op1], fd_w, fs_d[i]);
144                  printf("fcsr: 0x%x\n", fcsr);
145                  break;
146             case CVTDL:
147                  UNOPld("cvt.d.l");
148                  printf("%s %lf %ld\n", flt_round_op_names[op1], fd_d, fs_l[i]);
149                  printf("fcsr: 0x%x\n", fcsr);
150                  break;
151             case CVTLS:
152                  UNOPsl("cvt.l.s");
153                  printf("%s %lld %f\n", flt_round_op_names[op1], fd_l, fs_f[i]);
154                  printf("fcsr: 0x%x\n", fcsr);
155                  break;
156             case CVTLD:
157                  UNOPdl("cvt.l.d");
158                  printf("%s %lld %lf\n", flt_round_op_names[op1], fd_l, fs_d[i]);
159                  printf("fcsr: 0x%x\n", fcsr);
160                  break;
161             case CVTSL:
162                  UNOPls("cvt.s.l");
163                  printf("%s %f %ld\n", flt_round_op_names[op1], fd_f, fs_l[i]);
164                  printf("fcsr: 0x%x\n", fcsr);
165                  break;
166             default:
167                  printf("error\n");
168                  break;
169          }
170       }
171    }
172    return 0;
173 }
174 #endif
175 
main()176 int main()
177 {
178 #if defined(__mips_hard_float)
179    flt_dir_op_t op;
180    flt_round_op_t op1;
181 
182    printf("-------------------------- %s --------------------------\n",
183         "test FPU Conversion Operations Using a Directed Rounding Mode");
184    for (op = CEILWS; op <= TRUNCLS; op++) {
185       directedRoundingMode(op);
186    }
187 
188    printf("-------------------------- %s --------------------------\n",
189         "test FPU Conversion Operations Using the FCSR Rounding Mode");
190    for (op1 = CVTDS; op1 <= CVTSL; op1++) {
191       FCSRRoundingMode(op1);
192    }
193 #endif
194    return 0;
195 }
196