#if defined(__mips_hard_float)
typedef enum {
   TO_NEAREST=0,
   TO_ZERO,
   TO_PLUS_INFINITY,
   TO_MINUS_INFINITY
} round_mode_t;

char *round_mode_name[] = { "near", "zero", "+inf", "-inf" };

void set_rounding_mode(round_mode_t mode)
{
   switch(mode) {
      case TO_NEAREST:
         __asm__ __volatile__(
            "cfc1 $t0, $31"  "\n\t"
            "srl  $t0, 2"    "\n\t"
            "sll  $t0, 2"    "\n\t"
            "ctc1 $t0, $31"  "\n\t"
            :
            :
            : "t0"
         );
         break;
      case TO_ZERO:
         __asm__ __volatile__(
            "cfc1  $t0, $31"  "\n\t"
            "srl   $t0, 2"    "\n\t"
            "sll   $t0, 2"    "\n\t"
            "addiu $t0, 1"    "\n\t"
            "ctc1  $t0, $31"  "\n\t"
            :
            :
            : "t0"
         );
         break;
      case TO_PLUS_INFINITY:
         __asm__ __volatile__(
            "cfc1  $t0, $31"  "\n\t"
            "srl   $t0, 2"    "\n\t"
            "sll   $t0, 2"    "\n\t"
            "addiu $t0, 2"    "\n\t"
            "ctc1  $t0, $31"  "\n\t"
            :
            :
            : "t0"
         );
         break;
      case TO_MINUS_INFINITY:
         __asm__ __volatile__(
            "cfc1  $t0, $31"  "\n\t"
            "srl   $t0, 2"    "\n\t"
            "sll   $t0, 2"    "\n\t"
            "addiu $t0, 3"    "\n\t"
            "ctc1  $t0, $31"  "\n\t"
            :
            :
            : "t0"
         );
         break;
      }
}

void clear_fcc(){
   __asm__ __volatile__(
      "cfc1 $t0, $31"            "\n\t"
      "and  $t0, $t0, 0x17FFFFF" "\n\t"
      "ctc1 $t0, $31"            "\n\t"
      :
      :
      : "t0"
   );
}
#endif
