about summary refs log tree commit diff
path: root/sysdeps/x86_64/fpu/s_copysign.S
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2002-08-31 10:33:26 +0000
committerAndreas Jaeger <aj@suse.de>2002-08-31 10:33:26 +0000
commit7c9466bc7688e084cfbf9311eb91bdbaed1ea888 (patch)
treeb3f17e8757bae3da71ef07fa4eee967236983fd5 /sysdeps/x86_64/fpu/s_copysign.S
parent22ca6116c0c24ddcbc8be0de69a0bb497c64220a (diff)
downloadglibc-7c9466bc7688e084cfbf9311eb91bdbaed1ea888.tar.gz
glibc-7c9466bc7688e084cfbf9311eb91bdbaed1ea888.tar.xz
glibc-7c9466bc7688e084cfbf9311eb91bdbaed1ea888.zip
Update.
2002-08-31  Andreas Jaeger  <aj@suse.de>

	* sysdeps/x86_64/fpu/s_copysign.S: Fix algorithm.

	* sysdeps/x86_64/fpu/libm-test-ulps: Add ulps for double tests.
Diffstat (limited to 'sysdeps/x86_64/fpu/s_copysign.S')
-rw-r--r--sysdeps/x86_64/fpu/s_copysign.S19
1 files changed, 11 insertions, 8 deletions
diff --git a/sysdeps/x86_64/fpu/s_copysign.S b/sysdeps/x86_64/fpu/s_copysign.S
index acb4c3a16e..f1ebcf8bf1 100644
--- a/sysdeps/x86_64/fpu/s_copysign.S
+++ b/sysdeps/x86_64/fpu/s_copysign.S
@@ -27,10 +27,14 @@
 #endif
 
 	.align ALIGNARG(4)
-	ASM_TYPE_DIRECTIVE(mask,@object)
-mask:
+	ASM_TYPE_DIRECTIVE(signmask,@object)
+signmask:
 	.byte 0, 0, 0, 0, 0, 0, 0, 0x80
-	ASM_SIZE_DIRECTIVE(mask)
+	.byte 0, 0, 0, 0, 0, 0, 0, 0
+othermask:
+	.byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
+	.byte 0, 0, 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(othermask)
 
 #ifdef PIC
 #define MO(op) op##(%rip)
@@ -39,11 +43,10 @@ mask:
 #endif
 
 ENTRY(__copysign)
-	movlpd MO(mask),%xmm3
-	andps %xmm3,%xmm0
-	andnpd %xmm1,%xmm3
-	orpd %xmm3,%xmm0
-	retq
+	andpd MO(othermask),%xmm0
+	andpd MO(signmask),%xmm1
+	orpd %xmm1,%xmm0
+	ret
 END (__copysign)
 
 weak_alias (__copysign, copysign)