about summary refs log tree commit diff
path: root/sysdeps/i386/fpu/s_sinl.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/fpu/s_sinl.S')
-rw-r--r--sysdeps/i386/fpu/s_sinl.S29
1 files changed, 26 insertions, 3 deletions
diff --git a/sysdeps/i386/fpu/s_sinl.S b/sysdeps/i386/fpu/s_sinl.S
index 3e215de5e1..68c4f99668 100644
--- a/sysdeps/i386/fpu/s_sinl.S
+++ b/sysdeps/i386/fpu/s_sinl.S
@@ -3,15 +3,22 @@
  * Public domain.
  *
  * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
+ * Fixed errno handling by Ulrich Drepper <drepper@redhat.com>.
  */
 
+#define __need_Emath
+#include <bits/errno.h>
 #include <machine/asm.h>
 
-RCSID("$NetBSD: $")
-
 ENTRY(__sinl)
 	fldt	4(%esp)
-	fsin
+	fxam
+	fstsw	%ax
+	movb	$0x45, %dh
+	andb	%ah, %dh
+	cmpb	$0x05, %dh
+	je	3f
+4:	fsin
 	fnstsw	%ax
 	testl	$0x400,%eax
 	jnz	1f
@@ -27,5 +34,21 @@ ENTRY(__sinl)
 	fstp	%st(1)
 	fsin
 	ret
+3:
+#ifdef PIC
+	pushl	%ebx
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (ebx, 0)
+	LOAD_PIC_REG (bx)
+	call	__errno_location@PLT
+	movl	$EDOM, (%eax)
+	popl	%ebx
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (ebx)
+#else
+	call	__errno_location@PLT
+	movl	$EDOM, (%eax)
+#endif
+	jmp	4b
 END (__sinl)
 weak_alias (__sinl, sinl)