1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   CEILWS=0, CEILWD,
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   FLOORWS, FLOORWD,
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ROUNDWS, ROUNDWD,
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   TRUNCWS, TRUNCWD
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} flt_dir_op_t;
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   CVTDS, CVTDW,
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   CVTSD, CVTSW,
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   CVTWS, CVTWD
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} flt_round_op_t;
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum {
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   TO_NEAREST=0, TO_ZERO, TO_PLUS_INFINITY, TO_MINUS_INFINITY } round_mode_t;
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengchar *round_mode_name[] = { "near", "zero", "+inf", "-inf" };
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst char *flt_dir_op_names[] = {
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "ceil.w.s", "ceil.w.d",
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "floor.w.s", "floor.w.d",
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "round.w.s", "round.w.d",
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "trunc.w.s", "trunc.w.d"
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst char *flt_round_op_names[] = {
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "cvt.d.s", "cvt.d.w",
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "cvt.s.d", "cvt.s.w",
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   "cvt.w.s", "cvt.w.d"
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst double fs_d[] = {
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   0, 456.25, 3, -1,
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1384.5, -7.25, 1000000000, -5786.25,
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1752, 0.015625, 0.03125, -248562.75,
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -45786.5, 456, 34.03125, 45786.75,
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1752065, 107, -45667.25, -7,
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -347856.5, 356047, -1.25, 23.0625
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst float fs_f[] = {
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   0, 456.25, 3, -1,
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1384.5, -7.25, 1000000000, -5786.25,
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1752, 0.015625, 0.03125, -248562.75,
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -45786.5, 456, 34.03125, 45786.75,
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   1752065, 107, -45667.25, -7,
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -347856.5, 356047, -1.25, 23.0625
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst int fs_w[] = {
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0, 456, 3, -1,
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   0xffffffff, 356, 1000000000, -5786,
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   1752, 24575, 10, -248562,
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   -45786, 456, 34, 45786,
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   1752065, 107, -45667, -7,
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   -347856, 0x80000000, 0xFFFFFFF, 23
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng};
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BINOP(op)                                   \
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op"   %1, %2, %3"  "\n\t"  \
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"     "\n\t"  \
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd)    \
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(f) , "f"(fB));
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdd(op)                                  \
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_d = 0;                                   \
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op"   %1, %2"      "\n\t"  \
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"     "\n\t"  \
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_d)  \
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_d[i]));
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPff(op)                                  \
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_f = 0;                                   \
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op" %1, %2"        "\n\t"  \
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"     "\n\t"  \
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_f)  \
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_f[i]));
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPfd(op)                                  \
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_d = 0;                                   \
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op"   %1, %2"   "\n\t"     \
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"  "\n\t"     \
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_d)  \
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_f[i]));
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdf(op)                                  \
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_f = 0;                                   \
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op"   %1, %2"   "\n\t"     \
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"  "\n\t"     \
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_f)  \
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_d[i]));
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPfw(op)                                  \
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_w = 0;                                   \
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op"   $f0, %2"   "\n\t"    \
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "mfc1 %1,  $f0"  "\n\t"    \
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"   "\n\t"    \
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=r"(fd_w)  \
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_f[i])             \
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "$f0");
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdw(op)                                  \
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_w = 0;                                   \
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile(op" $f0, %2"    "\n\t"     \
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "mfc1 %1, $f0"  "\n\t"     \
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"  "\n\t"     \
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=r"(fd_w)  \
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "f"(fs_d[i])             \
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "$f0");
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPwd(op)                                  \
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_d = 0;                                   \
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile("mtc1 %2, $f0"  "\n\t"     \
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         op"   %1, $f0"  "\n\t"     \
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"  "\n\t"     \
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_d)  \
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "r"(fs_w[i])             \
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "$f0", "$f1");
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPwf(op)                                  \
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        fd_f = 0;                                   \
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        __asm__ volatile("mtc1 %2, $f0"  "\n\t"     \
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         op"   %1, $f0"  "\n\t"     \
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         "cfc1 %0, $31"  "\n\t"     \
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "=r" (fcsr), "=f"(fd_f)  \
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "r"(fs_w[i])             \
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         : "$f0");
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid set_rounding_mode(round_mode_t mode)
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch(mode) {
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_NEAREST:
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ volatile("ctc1 $zero, $31"  "\n\t");
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_ZERO:
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ volatile("li    $t0, 0x1"  "\n\t"
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          "ctc1  $t0, $31"  "\n\t");
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_PLUS_INFINITY:
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          __asm__ volatile("li    $t0, 0x2"  "\n\t"
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           "ctc1  $t0, $31"  "\n\t");
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_MINUS_INFINITY:
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          __asm__ volatile("li    $t0, 0x3"  "\n\t"
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           "ctc1  $t0, $31"  "\n\t");
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint directedRoundingMode(flt_dir_op_t op) {
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int fd_w = 0;
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i;
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int fcsr = 0;
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   round_mode_t rm = TO_NEAREST;
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (i = 0; i < 24; i++) {
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      set_rounding_mode(rm);
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch(op) {
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case CEILWS:
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPfw("ceil.w.s");
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case CEILWD:
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPdw("ceil.w.d");
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case FLOORWS:
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPfw("floor.w.s");
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case FLOORWD:
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPdw("floor.w.d");
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case ROUNDWS:
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPfw("round.w.s");
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case ROUNDWD:
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPdw("round.w.d");
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case TRUNCWS:
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPfw("trunc.w.s");
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]);
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         case TRUNCWD:
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              UNOPdw("trunc.w.d");
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]);
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              printf("fcsr: 0x%x\n", fcsr);
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              break;
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        default:
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            printf("error\n");
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        }
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    }
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint FCSRRoundingMode(flt_round_op_t op1)
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   double fd_d = 0;
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   float fd_f = 0;
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int fd_w = 0;
213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int i;
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int fcsr = 0;
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   round_mode_t rm;
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      set_rounding_mode(rm);
218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("roundig mode: %s\n", round_mode_name[rm]);
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      for (i = 0; i < 24; i++) {
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         set_rounding_mode(rm);
221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         switch(op1) {
222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTDS:
223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPfd("cvt.d.s");
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %lf %lf\n", flt_round_op_names[op1], fd_d, fs_f[i]);
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTDW:
228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPwd("cvt.d.w");
229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %lf %d\n", flt_round_op_names[op1], fd_d, fs_w[i]);
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTSD:
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPdf("cvt.s.d");
234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %f %lf\n", flt_round_op_names[op1], fd_f, fs_d[i]);
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTSW:
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPwf("cvt.s.w");
239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %f %d\n", flt_round_op_names[op1], fd_f, fs_w[i]);
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTWS:
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPfw("cvt.w.s");
244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %d %f\n", flt_round_op_names[op1], fd_w, fs_f[i]);
245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case CVTWD:
248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 UNOPdw("cvt.w.d");
249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("%s %d %lf\n", flt_round_op_names[op1], fd_w, fs_d[i]);
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 printf("fcsr: 0x%x\n", fcsr);
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            default:
253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 printf("error\n");
254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                 break;
255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main()
262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   flt_dir_op_t op;
264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   flt_round_op_t op1;
265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("-------------------------- %s --------------------------\n",
267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        "test FPU Conversion Operations Using a Directed Rounding Mode");
268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (op = CEILWS; op <= TRUNCWD; op++) {
269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      directedRoundingMode(op);
270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("-------------------------- %s --------------------------\n",
273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        "test FPU Conversion Operations Using the FCSR Rounding Mode");
274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for (op1 = CVTDS; op1 <= CVTWD; op1++) {
275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      FCSRRoundingMode(op1);
276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
280