about summary refs log tree commit diff
path: root/src/fenv/i386
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-06-12 15:58:15 -0400
committerRich Felker <dalias@aerifal.cx>2011-06-12 15:58:15 -0400
commitb09b78905b09016becda8df81a43e11bebd88208 (patch)
tree1242583c88f60a96f92f321b43d17c4bb358afb5 /src/fenv/i386
parent2afebbbcd16e8bfc5e008a40b2faf3bd8cf14e88 (diff)
downloadmusl-b09b78905b09016becda8df81a43e11bebd88208.tar.gz
musl-b09b78905b09016becda8df81a43e11bebd88208.tar.xz
musl-b09b78905b09016becda8df81a43e11bebd88208.zip
floating point environment, untested
at present the i386 code does not support sse floating point, which is
not part of the standard i386 abi. while it may be desirable to
support it later, doing so will reduce performance and require some
tricks to probe if sse support is present.

this first commit is i386-only, but it should be trivial to port the
asm to x86_64.
Diffstat (limited to 'src/fenv/i386')
-rw-r--r--src/fenv/i386/fenv.s75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/fenv/i386/fenv.s b/src/fenv/i386/fenv.s
new file mode 100644
index 00000000..72d2ed7d
--- /dev/null
+++ b/src/fenv/i386/fenv.s
@@ -0,0 +1,75 @@
+2:	not %ecx
+	sub $32,%esp
+	fnstenv (%esp)
+	and %ecx,4(%esp)
+	or %edx,4(%esp)
+	fldenv (%esp)
+	add $32,%esp
+	ret
+
+.global feclearexcept
+feclearexcept:	
+	xor %eax,%eax
+	mov 4(%esp),%ecx
+	xor %edx,%edx
+	test %ecx,%ecx
+	jnz 2b
+	ret
+
+.global feraiseexcept
+feraiseexcept:	
+	xor %eax,%eax
+	mov 4(%esp),%edx
+	xor %ecx,%ecx
+	test %edx,%edx
+	jnz 2b
+	ret
+
+.global fesetround
+fesetround:
+	xor %eax,%eax
+	mov $0xc00,%ecx
+	mov 4(%esp),%edx
+	jmp 2b
+
+.global fegetround
+fegetround:
+	sub $28,%esp
+	fnstenv (%esp)
+	mov 4(%esp),%eax
+	add $28,%esp
+	and $0xc,%ah
+	ret
+
+.global fegetenv
+fegetenv:
+	mov 4(%esp),%ecx
+	xor %eax,%eax
+	fnstenv (%ecx)
+	ret
+
+.global fesetenv
+fesetenv:
+	mov 4(%esp),%ecx
+	xor %eax,%eax
+	test %ecx,%ecx
+	jz 1f
+	fldenv (%ecx)
+	ret
+1:	push %eax
+	push %eax
+	push %eax
+	push %eax
+	push %eax
+	push %eax
+	pushl $0x37f
+	fldenv (%esp)
+	add $28,%esp
+	ret
+
+.global fetestexcept
+fetestexcept:
+	mov 4(%esp),%ecx
+	fnstsw %ax
+	and %ecx,%eax
+	ret