about summary refs log tree commit diff
path: root/src/fenv
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-06-13 13:37:43 -0400
committerRich Felker <dalias@aerifal.cx>2011-06-13 13:37:43 -0400
commit773b0fe4473be18fdcc1b822630e2ebdb1719536 (patch)
tree039e57ede4d1d767c8cf64272755b6d6b2d4e559 /src/fenv
parent52cf24a0f45f208b1627a64e4af9a5ed8cb28ae7 (diff)
downloadmusl-773b0fe4473be18fdcc1b822630e2ebdb1719536.tar.gz
musl-773b0fe4473be18fdcc1b822630e2ebdb1719536.tar.xz
musl-773b0fe4473be18fdcc1b822630e2ebdb1719536.zip
x86_64 fenv support (untested; at least known to build successfully)
Diffstat (limited to 'src/fenv')
-rw-r--r--src/fenv/x86_64/fenv.s88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s
new file mode 100644
index 00000000..3ed22755
--- /dev/null
+++ b/src/fenv/x86_64/fenv.s
@@ -0,0 +1,88 @@
+2:	not %edi
+	sub $32,%rsp
+	fnstenv (%rsp)
+	and %edi,4(%rsp)
+	or %esi,4(%rsp)
+	fldenv (%rsp)
+	stmxcsr (%rsp)
+	and %edi,(%rsp)
+	ldmxcsr (%rsp)
+	add $32,%rsp
+	ret
+
+.global feclearexcept
+feclearexcept:	
+	xor %eax,%eax
+	xor %esi,%esi
+	test %edi,%edi
+	jnz 2b
+	ret
+
+.global feraiseexcept
+feraiseexcept:	
+	xor %eax,%eax
+	mov %edi,%esi
+	xor %edi,%edi
+	test %esi,%esi
+	jnz 2b
+	ret
+
+.global fesetround
+fesetround:
+	xor %eax,%eax
+	sub $32,%rsp
+	fnstenv (%rsp)
+	andb $0xf3,1(%rsp)
+	or %edi,(%rsp)
+	fldenv (%rsp)
+	stmxcsr (%rsp)
+	shl $3,%edi
+	andb $0x9f,1(%rsp)
+	or %edi,(%rsp)
+	ldmxcsr (%rsp)
+	add $32,%rsp
+	ret
+
+.global fegetround
+fegetround:
+	push %rax
+	stmxcsr (%rsp)
+	pop %rax
+	shr $3,%eax
+	and $0xc,%ah
+	ret
+
+.global fegetenv
+fegetenv:
+	xor %eax,%eax
+	fnstenv (%rdi)
+	stmxcsr 28(%rdi)
+	ret
+
+.global fesetenv
+fesetenv:
+	xor %eax,%eax
+	inc %rdi
+	jz 1f
+	fldenv -1(%rdi)
+	ldmxcsr 27(%rdi)
+	ret
+1:	push %rax
+	push %rax
+	push %rax
+	pushq $0x37f
+	fldenv (%rsp)
+	pushq $0x1f80
+	ldmxcsr (%rsp)
+	add $40,%rsp
+	ret
+
+.global fetestexcept
+fetestexcept:
+	push %rax
+	stmxcsr (%rsp)
+	pop %rsi
+	fnstsw %ax
+	or %esi,%eax
+	and %edi,%eax
+	ret