fix undefined behavior in getdelim via null pointer arithmetic and memcpy
[musl] / src / fenv / aarch64 / fenv.s
1 .global fegetround
2 .type fegetround,%function
3 fegetround:
4         mrs x0, fpcr
5         and w0, w0, #0xc00000
6         ret
7
8 .global __fesetround
9 .hidden __fesetround
10 .type __fesetround,%function
11 __fesetround:
12         mrs x1, fpcr
13         bic w1, w1, #0xc00000
14         orr w1, w1, w0
15         msr fpcr, x1
16         mov w0, #0
17         ret
18
19 .global fetestexcept
20 .type fetestexcept,%function
21 fetestexcept:
22         and w0, w0, #0x1f
23         mrs x1, fpsr
24         and w0, w0, w1
25         ret
26
27 .global feclearexcept
28 .type feclearexcept,%function
29 feclearexcept:
30         and w0, w0, #0x1f
31         mrs x1, fpsr
32         bic w1, w1, w0
33         msr fpsr, x1
34         mov w0, #0
35         ret
36
37 .global feraiseexcept
38 .type feraiseexcept,%function
39 feraiseexcept:
40         and w0, w0, #0x1f
41         mrs x1, fpsr
42         orr w1, w1, w0
43         msr fpsr, x1
44         mov w0, #0
45         ret
46
47 .global fegetenv
48 .type fegetenv,%function
49 fegetenv:
50         mrs x1, fpcr
51         mrs x2, fpsr
52         stp w1, w2, [x0]
53         mov w0, #0
54         ret
55
56 // TODO preserve some bits
57 .global fesetenv
58 .type fesetenv,%function
59 fesetenv:
60         mov x1, #0
61         mov x2, #0
62         cmn x0, #1
63         b.eq 1f
64         ldp w1, w2, [x0]
65 1:      msr fpcr, x1
66         msr fpsr, x2
67         mov w0, #0
68         ret