summaryrefslogtreecommitdiff
path: root/src/fenv/loongarch64/fenv.S
blob: 9c38599e10d5624b3ee554e1d42eec2448ac7878 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#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