1 #ifndef __loongarch_soft_float
2 
3 #ifdef BROKEN_LOONGARCH_FCSR_ASM
4 #define FCSR $r0
5 #else
6 #define FCSR $fcsr0
7 #endif
8 
9 .global feclearexcept
10 .type   feclearexcept,@function
11 feclearexcept:
12 	li.w    $t0, 0x1f0000
13 	and     $a0, $a0, $t0
14 	movfcsr2gr $t1, FCSR
15 	andn    $t1, $t1, $a0
16 	movgr2fcsr FCSR, $t1
17 	li.w    $a0, 0
18 	jr      $ra
19 
20 .global feraiseexcept
21 .type   feraiseexcept,@function
22 feraiseexcept:
23 	li.w    $t0, 0x1f0000
24 	and     $a0, $a0, $t0
25 	movfcsr2gr $t1, FCSR
26 	or      $t1, $t1, $a0
27 	movgr2fcsr FCSR, $t1
28 	li.w    $a0, 0
29 	jr      $ra
30 
31 .global fetestexcept
32 .type   fetestexcept,@function
33 fetestexcept:
34 	li.w    $t0, 0x1f0000
35 	and     $a0, $a0, $t0
36 	movfcsr2gr $t1, FCSR
37 	and     $a0, $t1, $a0
38 	jr      $ra
39 
40 .global fegetround
41 .type   fegetround,@function
42 fegetround:
43 	movfcsr2gr $t0, FCSR
44 	andi    $a0, $t0, 0x300
45 	jr      $ra
46 
47 .global __fesetround
48 .hidden __fesetround
49 .type   __fesetround,@function
50 __fesetround:
51 	li.w    $t0, 0x300
52 	and     $a0, $a0, $t0
53 	movfcsr2gr $t1, FCSR
54 	andn    $t1, $t1, $t0
55 	or      $t1, $t1, $a0
56 	movgr2fcsr FCSR, $t1
57 	li.w    $a0, 0
58 	jr      $ra
59 
60 .global fegetenv
61 .type   fegetenv,@function
62 fegetenv:
63 	movfcsr2gr $t0, FCSR
64 	st.w    $t0, $a0, 0
65 	li.w    $a0, 0
66 	jr      $ra
67 
68 .global fesetenv
69 .type   fesetenv,@function
70 fesetenv:
71 	addi.d  $t0, $a0, 1
72 	beq     $t0, $r0, 1f
73 	ld.w    $t0, $a0, 0
74 1:	movgr2fcsr FCSR, $t0
75 	li.w    $a0, 0
76 	jr      $ra
77 
78 #endif
79