xref: /aosp_15_r20/external/musl/src/fenv/loongarch64/fenv.S (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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
11feclearexcept:
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
22feraiseexcept:
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
33fetestexcept:
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
42fegetround:
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
62fegetenv:
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
70fesetenv:
71	addi.d  $t0, $a0, 1
72	beq     $t0, $r0, 1f
73	ld.w    $t0, $a0, 0
741:	movgr2fcsr FCSR, $t0
75	li.w    $a0, 0
76	jr      $ra
77
78#endif
79