fenv support for ppc, untested
[musl] / src / fenv / powerpc / fenv.s
1 .global feclearexcept
2 .type feclearexcept,@function
3 feclearexcept:
4         # if (r3 & FE_INVALID) r3 |= all_invalid_flags
5         andis. 0,3,0x2000
6         stwu 1,-16(1)
7         beq- 0,1f
8         oris 3,3,0x01f8
9         ori  3,3,0x0700
10 1:
11         # note: fpscr contains various fpu status and control
12         # flags and we dont check if r3 may alter other flags
13         # than the exception related ones
14         # fpscr &= ~r3
15         mffs 0
16         stfd 0,8(1)
17         lwz 9,12(1)
18         andc 9,9,3
19         stw 9,12(1)
20         lfd 0,8(1)
21         mtfsf 255,0
22
23         # return 0
24         li 3,0
25         addi 1,1,16
26         blr
27
28 .global feraiseexcept
29 .type feraiseexcept,@function
30 feraiseexcept:
31         # if (r3 & FE_INVALID) r3 |= software_invalid_flag
32         andis. 0,3,0x2000
33         stwu 1,-16(1)
34         beq- 0,1f
35         ori 3,3,0x0400
36 1:
37         # fpscr |= r3
38         mffs 0
39         stfd 0,8(1)
40         lwz 9,12(1)
41         or 9,9,3
42         stw 9,12(1)
43         lfd 0,8(1)
44         mtfsf 255,0
45
46         # return 0
47         li 3,0
48         addi 1,1,16
49         blr
50
51 .global fetestexcept
52 .type fetestexcept,@function
53 fetestexcept:
54         # return r3 & fpscr
55         stwu 1,-16(1)
56         mffs 0
57         stfd 0,8(1)
58         lwz 9,12(1)
59         addi 1,1,16
60         and 3,3,9
61         blr
62
63 .global fegetround
64 .type fegetround,@function
65 fegetround:
66         # return fpscr & 3
67         stwu 1,-16(1)
68         mffs 0
69         stfd 0,8(1)
70         lwz 3,12(1)
71         addi 1,1,16
72         clrlwi 3,3,30
73         blr
74
75 .global fesetround
76 .type fesetround,@function
77 fesetround:
78         # note: invalid input is not checked, r3 < 4 must hold
79         # fpscr = (fpscr & -4U) | r3
80         stwu 1,-16(1)
81         mffs 0
82         stfd 0,8(1)
83         lwz 9,12(1)
84         clrrwi 9,9,2
85         or 9,9,3
86         stw 9,12(1)
87         lfd 0,8(1)
88         mtfsf 255,0
89
90         # return 0
91         li 3,0
92         addi 1,1,16
93         blr
94
95 .global fegetenv
96 .type fegetenv,@function
97 fegetenv:
98         # *r3 = fpscr
99         mffs 0
100         stfd 0,0(3)
101         # return 0
102         li 3,0
103         blr
104
105 .global fesetenv
106 .type fesetenv,@function
107 fesetenv:
108         cmpwi 3, -1
109         bne 1f
110         mflr 4
111         bl 2f
112         .zero 8
113 2:      mflr 3
114         mtlr 4
115 1:      # fpscr = *r3
116         lfd 0,0(3)
117         mtfsf 255,0
118         # return 0
119         li 3,0
120         blr