#ifndef __loongarch_soft_float
#ifdef BROKEN_LOONGARCH_FCSR_ASM
#define FCSR $r0
#else
#define FCSR $fcsr0
#endif
.global feclearexcept
.type feclearexcept,@function
feclearexcept:
li.w $t0, 0x1f0000
and $a0, $a0, $t0
movfcsr2gr $t1, FCSR
andn $t1, $t1, $a0
movgr2fcsr FCSR, $t1
li.w $a0, 0
jr $ra
.global feraiseexcept
.type feraiseexcept,@function
feraiseexcept:
li.w $t0, 0x1f0000
and $a0, $a0, $t0
movfcsr2gr $t1, FCSR
or $t1, $t1, $a0
movgr2fcsr FCSR, $t1
li.w $a0, 0
jr $ra
.global fetestexcept
.type fetestexcept,@function
fetestexcept:
li.w $t0, 0x1f0000
and $a0, $a0, $t0
movfcsr2gr $t1, FCSR
and $a0, $t1, $a0
jr $ra
.global fegetround
.type fegetround,@function
fegetround:
movfcsr2gr $t0, FCSR
andi $a0, $t0, 0x300
jr $ra
.global __fesetround
.hidden __fesetround
.type __fesetround,@function
__fesetround:
li.w $t0, 0x300
and $a0, $a0, $t0
movfcsr2gr $t1, FCSR
andn $t1, $t1, $t0
or $t1, $t1, $a0
movgr2fcsr FCSR, $t1
li.w $a0, 0
jr $ra
.global fegetenv
.type fegetenv,@function
fegetenv:
movfcsr2gr $t0, FCSR
st.w $t0, $a0, 0
li.w $a0, 0
jr $ra
.global fesetenv
.type fesetenv,@function
fesetenv:
addi.d $t0, $a0, 1
beq $t0, $r0, 1f
ld.w $t0, $a0, 0
1: movgr2fcsr FCSR, $t0
li.w $a0, 0
jr $ra
#endif