1typedef enum {
2   TO_NEAREST=0,
3   TO_ZERO,
4   TO_PLUS_INFINITY,
5   TO_MINUS_INFINITY
6} round_mode_t;
7
8char *round_mode_name[] = { "near", "zero", "+inf", "-inf" };
9
10void set_rounding_mode(round_mode_t mode)
11{
12   switch(mode) {
13      case TO_NEAREST:
14         __asm__ __volatile__(
15            "cfc1 $t0, $31"  "\n\t"
16            "srl  $t0, 2"    "\n\t"
17            "sll  $t0, 2"    "\n\t"
18            "ctc1 $t0, $31"  "\n\t"
19            :
20            :
21            : "t0"
22         );
23         break;
24      case TO_ZERO:
25         __asm__ __volatile__(
26            "cfc1  $t0, $31"  "\n\t"
27            "srl   $t0, 2"    "\n\t"
28            "sll   $t0, 2"    "\n\t"
29            "addiu $t0, 1"    "\n\t"
30            "ctc1  $t0, $31"  "\n\t"
31            :
32            :
33            : "t0"
34         );
35         break;
36      case TO_PLUS_INFINITY:
37         __asm__ __volatile__(
38            "cfc1  $t0, $31"  "\n\t"
39            "srl   $t0, 2"    "\n\t"
40            "sll   $t0, 2"    "\n\t"
41            "addiu $t0, 2"    "\n\t"
42            "ctc1  $t0, $31"  "\n\t"
43            :
44            :
45            : "t0"
46         );
47         break;
48      case TO_MINUS_INFINITY:
49         __asm__ __volatile__(
50            "cfc1  $t0, $31"  "\n\t"
51            "srl   $t0, 2"    "\n\t"
52            "sll   $t0, 2"    "\n\t"
53            "addiu $t0, 3"    "\n\t"
54            "ctc1  $t0, $31"  "\n\t"
55            :
56            :
57            : "t0"
58         );
59         break;
60      }
61}
62