]> git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/fenv/x86_64/fenv.s
WASI libc prototype implementation.
[wasi-libc.git] / libc-top-half / musl / src / fenv / x86_64 / fenv.s
1 .global feclearexcept
2 .type feclearexcept,@function
3 feclearexcept:
4 # maintain exceptions in the sse mxcsr, clear x87 exceptions
5 mov %edi,%ecx
6 and $0x3f,%ecx
7 fnstsw %ax
8 test %eax,%ecx
9 jz 1f
10 fnclex
11 1: stmxcsr -8(%rsp)
12 and $0x3f,%eax
13 or %eax,-8(%rsp)
14 test %ecx,-8(%rsp)
15 jz 1f
16 not %ecx
17 and %ecx,-8(%rsp)
18 ldmxcsr -8(%rsp)
19 1: xor %eax,%eax
20 ret
21
22 .global feraiseexcept
23 .type feraiseexcept,@function
24 feraiseexcept:
25 and $0x3f,%edi
26 stmxcsr -8(%rsp)
27 or %edi,-8(%rsp)
28 ldmxcsr -8(%rsp)
29 xor %eax,%eax
30 ret
31
32 .global __fesetround
33 .hidden __fesetround
34 .type __fesetround,@function
35 __fesetround:
36 push %rax
37 xor %eax,%eax
38 mov %edi,%ecx
39 fnstcw (%rsp)
40 andb $0xf3,1(%rsp)
41 or %ch,1(%rsp)
42 fldcw (%rsp)
43 stmxcsr (%rsp)
44 shl $3,%ch
45 andb $0x9f,1(%rsp)
46 or %ch,1(%rsp)
47 ldmxcsr (%rsp)
48 pop %rcx
49 ret
50
51 .global fegetround
52 .type fegetround,@function
53 fegetround:
54 push %rax
55 stmxcsr (%rsp)
56 pop %rax
57 shr $3,%eax
58 and $0xc00,%eax
59 ret
60
61 .global fegetenv
62 .type fegetenv,@function
63 fegetenv:
64 xor %eax,%eax
65 fnstenv (%rdi)
66 stmxcsr 28(%rdi)
67 ret
68
69 .global fesetenv
70 .type fesetenv,@function
71 fesetenv:
72 xor %eax,%eax
73 inc %rdi
74 jz 1f
75 fldenv -1(%rdi)
76 ldmxcsr 27(%rdi)
77 ret
78 1: push %rax
79 push %rax
80 pushq $0xffff
81 pushq $0x37f
82 fldenv (%rsp)
83 pushq $0x1f80
84 ldmxcsr (%rsp)
85 add $40,%rsp
86 ret
87
88 .global fetestexcept
89 .type fetestexcept,@function
90 fetestexcept:
91 and $0x3f,%edi
92 push %rax
93 stmxcsr (%rsp)
94 pop %rsi
95 fnstsw %ax
96 or %esi,%eax
97 and %edi,%eax
98 ret