about summary refs log tree commit diff
path: root/sysdeps/x86_64/fpu/s_cosl.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/fpu/s_cosl.S')
-rw-r--r--sysdeps/x86_64/fpu/s_cosl.S16
1 files changed, 13 insertions, 3 deletions
diff --git a/sysdeps/x86_64/fpu/s_cosl.S b/sysdeps/x86_64/fpu/s_cosl.S
index 6636fb5ec6..6921cda567 100644
--- a/sysdeps/x86_64/fpu/s_cosl.S
+++ b/sysdeps/x86_64/fpu/s_cosl.S
@@ -4,15 +4,22 @@
  *
  * 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(__cosl)
 	fldt	8(%rsp)
-	fcos
+	fxam
+	fstsw	%ax
+	movb	$0x45, %dh
+	andb	%ah, %dh
+	cmpb	$0x05, %dh
+	je	3f
+4:	fcos
 	fnstsw	%ax
 	testl	$0x400,%eax
 	jnz	1f
@@ -28,5 +35,8 @@ ENTRY(__cosl)
 	fstp	%st(1)
 	fcos
 	ret
+3:	call	__errno_location@PLT
+	movl	$EDOM, (%rax)
+	jmp	4b
 END (__cosl)
 weak_alias (__cosl, cosl)