1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef enum {
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   TO_NEAREST=0,
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   TO_ZERO,
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   TO_PLUS_INFINITY,
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   TO_MINUS_INFINITY
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} round_mode_t;
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovchar *round_mode_name[] = { "near", "zero", "+inf", "-inf" };
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid set_rounding_mode(round_mode_t mode)
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch(mode) {
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_NEAREST:
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ __volatile__(
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "cfc1 $t0, $31"  "\n\t"
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "srl  $t0, 2"    "\n\t"
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "sll  $t0, 2"    "\n\t"
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "ctc1 $t0, $31"  "\n\t"
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            : "t0"
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         );
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_ZERO:
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ __volatile__(
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "cfc1  $t0, $31"  "\n\t"
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "srl   $t0, 2"    "\n\t"
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "sll   $t0, 2"    "\n\t"
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "addiu $t0, 1"    "\n\t"
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "ctc1  $t0, $31"  "\n\t"
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            : "t0"
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         );
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_PLUS_INFINITY:
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ __volatile__(
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "cfc1  $t0, $31"  "\n\t"
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "srl   $t0, 2"    "\n\t"
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "sll   $t0, 2"    "\n\t"
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "addiu $t0, 2"    "\n\t"
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "ctc1  $t0, $31"  "\n\t"
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            : "t0"
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         );
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case TO_MINUS_INFINITY:
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         __asm__ __volatile__(
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "cfc1  $t0, $31"  "\n\t"
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "srl   $t0, 2"    "\n\t"
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "sll   $t0, 2"    "\n\t"
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "addiu $t0, 3"    "\n\t"
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            "ctc1  $t0, $31"  "\n\t"
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            :
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            : "t0"
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         );
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
62