about summary refs log tree commit diff
path: root/sysdeps/x86_64/fpu/s_tanl.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/fpu/s_tanl.S')
-rw-r--r--sysdeps/x86_64/fpu/s_tanl.S14
1 files changed, 13 insertions, 1 deletions
diff --git a/sysdeps/x86_64/fpu/s_tanl.S b/sysdeps/x86_64/fpu/s_tanl.S
index 674e908acc..6427e3f6f0 100644
--- a/sysdeps/x86_64/fpu/s_tanl.S
+++ b/sysdeps/x86_64/fpu/s_tanl.S
@@ -4,15 +4,24 @@
  *
  * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
  * Adapted for x86-64 by Andreas Jaeger <aj@suse.de>.
+ * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>.
  */
 
+#define __need_Emath
+#include <bits/errno.h>
 #include <machine/asm.h>
 
 RCSID("$NetBSD: $")
 
 ENTRY(__tanl)
 	fldt	8(%rsp)
-	fptan
+	fxam
+	fstsw	%ax
+	movb	$0x45, %dh
+	andb	%ah, %dh
+	cmpb	$0x05, %dh
+	je	3f
+4:	fptan
 	fnstsw	%ax
 	testl	$0x400,%eax
 	jnz	1f
@@ -29,5 +38,8 @@ ENTRY(__tanl)
 	fptan
 	fstp	%st(0)
 	ret
+3:	call	__errno_location@PLT
+	movl	$EDOM, (%rax)
+	jmp	4b
 END (__tanl)
 weak_alias (__tanl, tanl)