summaryrefslogtreecommitdiffstats
path: root/lib/libc/i386
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1994-12-27 13:37:38 +0000
committerbde <bde@FreeBSD.org>1994-12-27 13:37:38 +0000
commit672359307cefb1bf566b37e39d1d221293b5a9a9 (patch)
tree874548090bdafa532f534de5b5f0231ca4446b37 /lib/libc/i386
parente96890ff0bcbb9165aa29c205d8688fa8e82771f (diff)
downloadFreeBSD-src-672359307cefb1bf566b37e39d1d221293b5a9a9.zip
FreeBSD-src-672359307cefb1bf566b37e39d1d221293b5a9a9.tar.gz
fixunsdfsi.S:
Embalm. Rewrite to do things much the same as gcc-2: use fistpq for speed and elegance, and mishandle overflow consistently. __fixunsdfsi() is no longer called by gcc.
Diffstat (limited to 'lib/libc/i386')
-rw-r--r--lib/libc/i386/gen/fixunsdfsi.S59
1 files changed, 22 insertions, 37 deletions
diff --git a/lib/libc/i386/gen/fixunsdfsi.S b/lib/libc/i386/gen/fixunsdfsi.S
index f61daee..cf58b28 100644
--- a/lib/libc/i386/gen/fixunsdfsi.S
+++ b/lib/libc/i386/gen/fixunsdfsi.S
@@ -34,49 +34,34 @@
* SUCH DAMAGE.
*
* from: @(#)fixunsdfsi.s 5.1 12/17/90
- * $Id: fixunsdfsi.S,v 1.1 1993/12/05 13:01:03 ats Exp $
+ * $Id: fixunsdfsi.S,v 1.1 1994/08/05 01:18:05 wollman Exp $
*/
-#if defined(LIBC_SCCS)
- .text
- .asciz "$Id: fixunsdfsi.S,v 1.1 1993/12/05 13:01:03 ats Exp $"
-#endif
+#if defined(LIBC_SCCS) && !defined(lint)
+ .asciz "$Id: fixunsdfsi.S,v 1.1 1994/08/05 01:18:05 wollman Exp $"
+#endif /* LIBC_SCCS and not lint */
#include "DEFS.h"
-#include "SYS.h"
ENTRY(__fixunsdfsi)
- fldl 4(%esp) /* argument double to accum stack */
- frndint /* create integer */
-#ifdef PIC
- PIC_PROLOGUE
- leal PIC_GOTOFF(fbiggestsigned),%eax
- PIC_EPILOGUE
- fcoml (%eax)
-#else
- fcoml PIC_GOTOFF(fbiggestsigned) /* bigger than biggest signed? */
-#endif
- fstsw %ax
- sahf
- jnb 1f
-
- fistpl 4(%esp)
+ fldl 4(%esp)
+ fnstcw 4(%esp)
movl 4(%esp),%eax
+ orb $(3 << 2),%ah # change rounding mode bitfield to 3 (chop)
+ movl %eax,8(%esp)
+ fldcw 8(%esp)
+ subl $8,%esp
+ fistpq (%esp) # convert to 64 bit integer
+ popl %eax
+ popl %edx # discard top 32 bits
+ fldcw 4(%esp)
ret
-1:
-#ifdef PIC
- PIC_PROLOGUE
- leal PIC_GOTOFF(fbiggestsigned),%eax
- PIC_EPILOGUE
- fsubl (%eax)
-#else
- fsubl PIC_GOTOFF(fbiggestsigned) /* reduce for proper conversion */
-#endif
- fistpl 4(%esp) /* convert */
- movl 4(%esp),%eax
- orl $0x80000000,%eax /* restore bias */
- PIC_EPILOGUE
- ret
-
-fbiggestsigned: .double 0r2147483648.0
+/*
+ * XXX - we are sloppy about overflow, the same as gcc-2. Values too big
+ * for a 64-bit (signed) integer cause an overflow trap or are silently
+ * converted to 0 if the overflow trap is masked. The remaining values
+ * too big for a 32-bit (unsigned) integer are silently truncated to 32
+ * bits. Negative values are converted like negative ints (no overflow)
+ * if they fit in 32 bits.
+ */
OpenPOWER on IntegriCloud