summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2003-04-30 16:21:03 +0000
committerobrien <obrien@FreeBSD.org>2003-04-30 16:21:03 +0000
commit76d866f25cb2080c3045f9cbd497eea0d0b9fb6e (patch)
tree0fd5a9a7b3cb3abfafab66bbd08ac87a6c0a8725 /lib
parent006fb9f2ad8c466c4a862504411bd1c565020cd4 (diff)
downloadFreeBSD-src-76d866f25cb2080c3045f9cbd497eea0d0b9fb6e.zip
FreeBSD-src-76d866f25cb2080c3045f9cbd497eea0d0b9fb6e.tar.gz
Floating point libc functions traditionally written in ASM.
AMD64 does away with the x87 in 64-bit long mode, so we have to play the SSE/SSE2 game now. Obtained from: NetBSD/x86-64
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/amd64/gen/fabs.S18
-rw-r--r--lib/libc/amd64/gen/modf.S95
2 files changed, 113 insertions, 0 deletions
diff --git a/lib/libc/amd64/gen/fabs.S b/lib/libc/amd64/gen/fabs.S
new file mode 100644
index 0000000..695c20c
--- /dev/null
+++ b/lib/libc/amd64/gen/fabs.S
@@ -0,0 +1,18 @@
+#include <machine/asm.h>
+#if defined(LIBC_SCCS)
+ RCSID("$NetBSD: fabs.S,v 1.4 1997/07/16 14:37:16 christos Exp $")
+#endif
+__FBSDID("$FreeBSD$");
+
+/*
+ * Ok, this sucks. Is there really no way to push an xmm register onto
+ * the FP stack directly?
+ */
+
+ENTRY(fabs)
+ movsd %xmm0, -8(%rsp)
+ fldl -8(%rsp)
+ fabs
+ fstp -8(%rsp)
+ movsd -8(%rsp),%xmm0
+ ret
diff --git a/lib/libc/amd64/gen/modf.S b/lib/libc/amd64/gen/modf.S
new file mode 100644
index 0000000..2c25b77
--- /dev/null
+++ b/lib/libc/amd64/gen/modf.S
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Sean Eric Fagan.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)modf.s 5.5 (Berkeley) 3/18/91
+ */
+
+#include <machine/asm.h>
+#if defined(LIBC_SCCS)
+ RCSID("$NetBSD: modf.S,v 1.5 1997/07/16 14:37:18 christos Exp $")
+#endif
+__FBSDID("$FreeBSD$");
+
+/*
+ * modf(value, iptr): return fractional part of value, and stores the
+ * integral part into iptr (a pointer to double).
+ *
+ * Written by Sean Eric Fagan (sef@kithrup.COM)
+ * Sun Mar 11 20:27:30 PST 1990
+ */
+
+/* With CHOP mode on, frndint behaves as TRUNC does. Useful. */
+ENTRY(modf)
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $24,%rsp
+
+ /*
+ * Set chop mode.
+ */
+ fnstcw -12(%rbp)
+ movw -12(%rbp),%dx
+ orw $3072,%dx
+ movw %dx,-16(%rbp)
+ fldcw -16(%rbp)
+
+ /*
+ * Get integral part.
+ */
+ movsd %xmm0,-24(%rbp)
+ fldl -24(%rbp)
+ frndint
+ fstpl -8(%rbp)
+
+ /*
+ * Restore control word.
+ */
+ fldcw -12(%rbp)
+
+ /*
+ * Store integral part.
+ */
+ movsd -8(%rbp),%xmm0
+ movsd %xmm0,(%rdi)
+
+ /*
+ * Get fractional part and return it.
+ */
+ fldl -24(%rbp)
+ fsubl -8(%rbp)
+ movsd -8(%rbp),%xmm0
+
+ leave
+ ret
OpenPOWER on IntegriCloud