#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