about summary refs log tree commit diff
path: root/src/fenv/i386/fenv.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/fenv/i386/fenv.s')
-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