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