please test qemu port update
Juergen Lock
nox at jelal.kn-bremen.de
Wed Apr 27 12:11:26 PDT 2005
With the help of Jung-uk Kim i have made an update for the qemu port
that might :) now actually work on amd64 as well. Please test.
(I also haven't tested 4.11 or 6.0 i386.)
remove these files: files/patch-ab, files/patch-target-sparc::op_helper.c
(btw I'm not subscribed on -amd64 so if you remove -emulation please
Cc me if you want me to see followups...)
Index: Makefile
===================================================================
RCS file: /home/ncvs/ports/emulators/qemu/Makefile,v
retrieving revision 1.22
diff -u -r1.22 Makefile
--- Makefile 8 Mar 2005 23:02:58 -0000 1.22
+++ Makefile 27 Apr 2005 18:08:46 -0000
@@ -6,17 +6,19 @@
#
PORTNAME= qemu
-PORTVERSION= 0.6.2s.20050305
+PORTVERSION= 0.6.2s.20050426
CATEGORIES= emulators
MASTER_SITES= http://people.fruitsalad.org/nox/qemu/ \
http://dad-answers.com/qemu/
-DISTNAME= ${PORTNAME}-snapshot-2005-03-05_23
+DISTNAME= ${PORTNAME}-snapshot-2005-04-26_23
MAINTAINER= nox at jelal.kn-bremen.de
COMMENT= QEMU CPU Emulator
BUILD_DEPENDS+= texi2html:${PORTSDIR}/textproc/texi2html
+.if !defined(WITHOUT_SAMBA)
RUN_DEPENDS+= ${LOCALBASE}/sbin/smbd:${PORTSDIR}/net/samba
+.endif
HAS_CONFIGURE= yes
USE_BZIP2= yes
@@ -27,22 +29,32 @@
PATCH_STRIP= -p1
CONFIGURE_ARGS+= --prefix=${PREFIX} --cc=${CC}\ -I${PREFIX}/include
MAN1= qemu.1 qemu-img.1
-ONLY_FOR_ARCHS= i386 amd64 powerpc
+ONLY_FOR_ARCHS= amd64 i386
+MAKE_ENV+= BSD_MAKE=${MAKE}
# gcc34 (system cc on 5.x now) has problems with qemu on amd64
# (doesnt build target-i386/op.c), try the one in ports which is newer
.include <bsd.port.pre.mk>
.if ${ARCH} == "amd64" && ${OSVERSION} >= 502126
-BROKEN= Does not compile
CC= gcc34
-CXX= g++34
BUILD_DEPENDS+= gcc34:${PORTSDIR}/lang/gcc34
GCCVERSION= 030402
.else
USE_GCC= 3.4
.endif
+pre-everything::
+.if !defined(WITHOUT_SAMBA)
+ @${ECHO_MSG} "Notice: if you don't need qemu's -smb option (smb-export local dir to guest)"
+ @${ECHO_MSG} "then you can omit this port's samba dependency by defining WITHOUT_SAMBA."
+.endif
+
+pre-patch:
+ @for A in ${ONLY_FOR_ARCHS}; do \
+ ${MKDIR} ${WRKSRC}/bsd/$$A; \
+ done
+
post-install:
@${CAT} ${PKGMESSAGE}
Index: distinfo
===================================================================
RCS file: /home/ncvs/ports/emulators/qemu/distinfo,v
retrieving revision 1.16
diff -u -r1.16 distinfo
--- distinfo 8 Mar 2005 23:02:58 -0000 1.16
+++ distinfo 27 Apr 2005 18:10:17 -0000
@@ -1,2 +1,2 @@
-MD5 (qemu-snapshot-2005-03-05_23.tar.bz2) = f0ef5e1e3570df94d910d00cc9f62f6e
-SIZE (qemu-snapshot-2005-03-05_23.tar.bz2) = 962774
+MD5 (qemu-snapshot-2005-04-26_23.tar.bz2) = 6068a58820e3716a70d40d0a99fc7718
+SIZE (qemu-snapshot-2005-04-26_23.tar.bz2) = 1008614
Index: files/patch-aa
===================================================================
RCS file: /home/ncvs/ports/emulators/qemu/files/patch-aa,v
retrieving revision 1.3
diff -u -r1.3 patch-aa
--- files/patch-aa 25 Oct 2004 14:57:30 -0000 1.3
+++ files/patch-aa 26 Apr 2005 16:24:36 -0000
@@ -11,206 +11,6 @@
qemu.1: qemu-doc.texi
./texi2pod.pl $< qemu.pod
Only in qemu-0.5.5: qemu.1
-diff -urd --exclude=CVS ../cvs/qemu/target-i386/cpu.h qemu-0.5.5/target-i386/cpu.h
---- ../cvs/qemu/target-i386/cpu.h Thu May 20 15:01:56 2004
-+++ qemu-0.5.5/target-i386/cpu.h Sun May 30 05:16:10 2004
-@@ -259,7 +259,7 @@
- CC_OP_NB,
- };
-
--#if (defined(__i386__) || defined(__x86_64__)) && !defined(_BSD)
-+#if defined(__i386__) || defined(__x86_64__)
- #define USE_X86LDOUBLE
- #endif
-
-diff -urd --exclude=CVS ../cvs/qemu/target-i386/exec.h qemu-0.5.5/target-i386/exec.h
---- ../cvs/qemu/target-i386/exec.h Sat May 29 12:08:52 2004
-+++ qemu-0.5.5/target-i386/exec.h Sun May 30 05:19:43 2004
-@@ -293,6 +293,22 @@
-
- #endif /* !defined(CONFIG_USER_ONLY) */
-
-+#if defined(_BSD) && defined(USE_X86LDOUBLE)
-+#include <math.h>
-+/*int rintl(long double __x);
-+long int lrintl(long double __x);
-+long long int llrintl(long double __x);
-+long double powl(long double __x, long double __y);
-+long double logl(long double __x);
-+long double tanl(long double __x);
-+long double atan2l(long double __y, long double __x);
-+long double ceill(long double __x);
-+long double floorl(long double __x);
-+long double sqrtl(long double __x);
-+long double sinl(long double __x);
-+long double cosl(long double __x);*/
-+#endif
-+
- #ifdef USE_X86LDOUBLE
- /* use long double functions */
- #define lrint lrintl
-@@ -310,7 +326,7 @@
- #define rint rintl
- #endif
-
--#if !defined(_BSD)
-+#if !defined(_BSD) || defined(USE_X86LDOUBLE)
- extern int lrint(CPU86_LDouble x);
- extern int64_t llrint(CPU86_LDouble x);
- #else
-diff -urd --exclude=CVS ../cvs/qemu/target-i386/op.c qemu-0.5.5/target-i386/op.c
---- ../cvs/qemu/target-i386/op.c Sat May 29 12:08:52 2004
-+++ qemu-0.5.5/target-i386/op.c Sun May 30 05:40:54 2004
-@@ -1304,6 +1304,149 @@
- functions comes from the LGPL'ed x86 emulator found in the Willows
- TWIN windows emulator. */
-
-+#if defined(_BSD) && defined(USE_X86LDOUBLE)
-+
-+CPU86_LDouble rintl(CPU86_LDouble __x) {
-+ CPU86_LDouble __rintres;
-+ __asm__ __volatile__
-+ ("fistp %0"
-+ : "=m" (__rintres) : "t" (__x) : "st");
-+ return __rintres;
-+}
-+
-+int lrintl(CPU86_LDouble __x) {
-+ int __lrintres;
-+ __asm__ __volatile__
-+ ("fistpl %0"
-+ : "=m" (__lrintres) : "t" (__x) : "st");
-+ return __lrintres;
-+}
-+
-+
-+int64_t llrintl(CPU86_LDouble __x) {
-+ int64_t __llrintres;
-+ __asm__ __volatile__
-+ ("fistpll %0"
-+ : "=m" (__llrintres) : "t" (__x) : "st");
-+ return __llrintres;
-+}
-+
-+CPU86_LDouble powl(CPU86_LDouble __x, CPU86_LDouble __y) {
-+ register CPU86_LDouble __value;
-+ register long double __exponent;
-+ __extension__ long long int __p = (long long int) __y;
-+ if (__x == 0.0)
-+ {
-+ if (__y > 0.0)
-+ return __y == (double) __p && (__p & 1) != 0 ? __x : 0.0;
-+ else if (__y < 0.0)
-+ return (__y == (double) __p && (-__p & 1) != 0
-+ ? 1.0 / __x : 1.0 / fabs (__x));
-+ }
-+ if (__y == (double) __p)
-+ {
-+ long double __r = 1.0;
-+ if (__p == 0)
-+ return 1.0;
-+ if (__p < 0)
-+ {
-+ __p = -__p;
-+ __x = 1.0 / __x;
-+ }
-+ while (1)
-+ {
-+ if (__p & 1)
-+ __r *= __x;
-+ __p >>= 1;
-+ if (__p == 0)
-+ return __r;
-+ __x *= __x;
-+ }
-+ /* NOTREACHED */
-+ }
-+ __asm __volatile__
-+ ("fyl2x" : "=t" (__value) : "0" (__x), "u" (1.0) : "st(1)");
-+ __asm __volatile__
-+ ("fmul %%st(1) # y * log2(x)\n\t"
-+ "fst %%st(1)\n\t"
-+ "frndint # int(y * log2(x))\n\t"
-+ "fxch\n\t"
-+ "fsub %%st(1) # fract(y * log2(x))\n\t"
-+ "f2xm1 # 2^(fract(y * log2(x))) - 1\n\t"
-+ : "=t" (__value), "=u" (__exponent) : "0" (__y), "1" (__value));
-+ __value += 1.0;
-+ __asm __volatile__
-+ ("fscale"
-+ : "=t" (__value) : "0" (__value), "u" (__exponent));
-+ return __value;
-+}
-+
-+CPU86_LDouble logl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __result;
-+ __asm __volatile__ ("fldln2; fxch; fyl2x" : "=t" (__result) : "0" (__x) : "st(1)");
-+ return __result;
-+}
-+
-+CPU86_LDouble tanl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __value;
-+ register CPU86_LDouble __value2 __attribute__ ((__unused__));
-+ __asm __volatile__
-+ ("fptan"
-+ : "=t" (__value2), "=u" (__value) : "0" (__x));
-+ return __value;
-+}
-+
-+CPU86_LDouble atan2l(CPU86_LDouble __y, CPU86_LDouble __x) {
-+ register CPU86_LDouble __value;
-+ __asm __volatile__
-+ ("fpatan"
-+ : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)");
-+ return __value;
-+}
-+
-+CPU86_LDouble ceill(CPU86_LDouble __x) {
-+ register CPU86_LDouble __value;
-+ __volatile unsigned short int __cw;
-+ __volatile unsigned short int __cwtmp;
-+ __asm __volatile ("fnstcw %0" : "=m" (__cw));
-+ __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */
-+ __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
-+ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
-+ __asm __volatile ("fldcw %0" : : "m" (__cw));
-+ return __value;
-+}
-+
-+CPU86_LDouble floorl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __value;
-+ __volatile unsigned short int __cw;
-+ __volatile unsigned short int __cwtmp;
-+ __asm __volatile ("fnstcw %0" : "=m" (__cw));
-+ __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */
-+ __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
-+ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
-+ __asm __volatile ("fldcw %0" : : "m" (__cw));
-+ return __value;
-+}
-+
-+CPU86_LDouble sqrtl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __result;
-+ __asm __volatile__ ("fsqrt" : "=t" (__result) : "0" (__x));
-+ return __result;
-+}
-+
-+CPU86_LDouble sinl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __result;
-+ __asm __volatile__ ("fsin" : "=t" (__result) : "0" (__x));
-+ return __result;
-+}
-+
-+CPU86_LDouble cosl(CPU86_LDouble __x) {
-+ register CPU86_LDouble __result;
-+ __asm __volatile__ ("fcos" : "=t" (__result) : "0" (__x));
-+ return __result;
-+}
-+#endif
-+
- #if defined(__powerpc__)
- extern CPU86_LDouble copysign(CPU86_LDouble, CPU86_LDouble);
-
diff -urd --exclude=CVS ../cvs/qemu/vl.c qemu-0.5.5/vl.c
--- ../cvs/qemu/vl.c Wed May 26 23:12:06 2004
+++ qemu-0.5.5/vl.c Sun May 30 05:30:56 2004
Index: files/patch-bh
===================================================================
RCS file: /home/ncvs/ports/emulators/qemu/files/patch-bh,v
retrieving revision 1.2
diff -u -r1.2 patch-bh
--- files/patch-bh 11 Jul 2004 11:41:06 -0000 1.2
+++ files/patch-bh 26 Apr 2005 16:24:36 -0000
@@ -24,68 +24,3 @@
#undef NULL
#define NULL 0
#ifdef _BSD
-Index: qemu/target-ppc/op_helper.c
-===================================================================
-RCS file: /cvsroot/qemu/qemu/target-ppc/op_helper.c,v
-retrieving revision 1.6
-diff -w -u -d -r1.6 op_helper.c
---- target-ppc/op_helper.c 21 May 2004 12:59:31 -0000 1.6
-+++ target-ppc/op_helper.c 21 May 2004 15:00:49 -0000
-@@ -210,6 +210,22 @@
- }
- /* TODO: update FEX & VX */
- /* Set rounding mode */
-+#ifdef _BSD
-+ switch(env->fpscr[0] & 0x3) {
-+ case 0:
-+ fpsetround(FP_RN);
-+ break;
-+ case 1:
-+ fpsetround(FP_RZ);
-+ break;
-+ case 2:
-+ fpsetround(FP_RP);
-+ break;
-+ case 3:
-+ fpsetround(FP_RM);
-+ break;
-+ }
-+#else
- switch (env->fpscr[0] & 0x3) {
- case 0:
- /* Best approximation (round to nearest) */
-@@ -228,6 +244,7 @@
- fesetround(FE_DOWNWARD);
- break;
- }
-+#endif
- }
-
- void do_fctiw (void)
-@@ -253,9 +270,13 @@
- double d;
- uint64_t i;
- } *p = (void *)&FT1;
-+#ifdef _BSD
-+ int cround = fpgetround();
-+ fpsetround(FP_RZ);
-+#else
- int cround = fegetround();
--
- fesetround(FE_TOWARDZERO);
-+#endif
- if (FT0 > (double)0x7FFFFFFF)
- p->i = 0x7FFFFFFFULL << 32;
- else if (FT0 < -(double)0x80000000)
-@@ -264,7 +285,11 @@
- p->i = 0;
- p->i |= (uint32_t)FT0;
- FT0 = p->d;
-+#ifdef _BSD
-+ fpsetround(cround);
-+#else
- fesetround(cround);
-+#endif
- }
-
- void do_fnmadds (void)
Index: files/patch-block.c
===================================================================
RCS file: /home/ncvs/ports/emulators/qemu/files/patch-block.c,v
retrieving revision 1.2
diff -u -r1.2 patch-block.c
--- files/patch-block.c 17 Nov 2004 09:47:38 -0000 1.2
+++ files/patch-block.c 27 Apr 2005 17:10:11 -0000
@@ -1,71 +1,34 @@
-Index: qemu/block.c
-@@ -21,6 +21,17 @@
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-+
-+#include "config-host.h"
-+
+Index: block.c
+===================================================================
+RCS file: /cvsroot/qemu/qemu/block.c,v
+retrieving revision 1.19
+diff -u -r1.19 block.c
+--- block.c 26 Apr 2005 21:59:26 -0000 1.19
++++ block.c 27 Apr 2005 17:04:23 -0000
+@@ -548,6 +548,9 @@
+ BDRVRawState *s = bs->opaque;
+ int fd;
+ int64_t size;
+#ifdef _BSD
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <sys/ioctl.h>
-+#include <sys/queue.h>
-+#include <sys/disk.h>
-+#endif
-+
- #include "vl.h"
- #include "block_int.h"
-
-@@ -103,14 +103,25 @@
- {
- int fd, ret, score, score_max;
- BlockDriver *drv1, *drv;
-- uint8_t buf[1024];
-+ uint8_t *buf;
-+ size_t bufsize = 1024;
-+ u_int sectorsize = 512;
-
- fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE);
- if (fd < 0)
- return NULL;
-- ret = read(fd, buf, sizeof(buf));
-+#ifdef DIOCGSECTORSIZE
-+ if (!ioctl(fd, DIOCGSECTORSIZE, §orsize) &&
-+ sectorsize > bufsize)
-+ bufsize = sectorsize;
++ struct stat sb;
+#endif
-+ buf = malloc(bufsize);
-+ if (!buf)
-+ return NULL;
-+ ret = read(fd, buf, bufsize);
- if (ret < 0) {
- close(fd);
-+ free(buf);
- return NULL;
- }
- close(fd);
-@@ -124,6 +135,7 @@
- drv = drv1;
- }
- }
-+ free(buf);
- return drv;
- }
-@@ -522,6 +533,15 @@
- return -1;
+ fd = open(filename, O_RDWR | O_BINARY | O_LARGEFILE);
+ if (fd < 0) {
+@@ -557,13 +560,11 @@
bs->read_only = 1;
}
-+#ifdef _BSD
-+ struct stat sb;
-+ if (!fstat(fd,&sb) && (S_IFCHR & sb.st_mode)) {
-+#ifdef DIOCGMEDIASIZE
-+ if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
-+#endif
-+ size = lseek(fd, 0LL, SEEK_END);
-+ } else
-+#endif
- size = lseek(fd, 0, SEEK_END);
- bs->total_sectors = size / 512;
- s->fd = fd;
+ #ifdef _BSD
+- {
+- struct stat sb;
+- if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
++ if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
+ #ifdef DIOCGMEDIASIZE
+- if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
++ if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
+ #endif
+- size = lseek(fd, 0LL, SEEK_END);
++ size = lseek(fd, 0LL, SEEK_END);
+ } else
+ #endif
+ {
Index: files/patch-amd64
@@ -0,0 +1,141 @@
+Index: qemu/Makefile
+@@ -13,7 +13,7 @@
+ endif
+ DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1
+
+-all: dyngen$(EXESUF) $(TOOLS) $(DOCS)
++all: bsd/libmath.a dyngen$(EXESUF) $(TOOLS) $(DOCS)
+ for d in $(TARGET_DIRS); do \
+ $(MAKE) -C $$d $@ || exit 1 ; \
+ done
+@@ -25,6 +25,9 @@
+ endif
+ endif
+
++bsd/libmath.a:
++ ( cd bsd ; $(BSD_MAKE) CC=$(CC) )
++
+ qemu-img$(EXESUF): qemu-img.c block.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c
+ $(CC) -DQEMU_TOOL $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $@ $^ -lz $(LIBS)
+
+@@ -33,6 +36,7 @@
+
+ clean:
+ # avoid old build problems by removing potentially incorrect old files
++ ( cd bsd ; $(BSD_MAKE) clean )
+ rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
+ rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS *.pod *~ */*~
+ $(MAKE) -C tests clean
+Index: qemu/Makefile.target
+@@ -391,8 +391,8 @@
+ VL_LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/ia64.ld
+ endif
+
+-$(QEMU_SYSTEM): $(VL_OBJS) libqemu.a
+- $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS)
++$(QEMU_SYSTEM): $(VL_OBJS) libqemu.a ../bsd/libmath.a
++ $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS) ../bsd/libmath.a
+
+ cocoa.o: cocoa.m
+ $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
+Index: qemu/fpu/softfloat-native.c
+@@ -2,11 +2,15 @@
+ context is supported */
+ #include "softfloat.h"
+ #include <math.h>
++#if defined(__FreeBSD__) && __FreeBSD_version < 500000
++#include <ieeefp.h>
++#endif
+
+ void set_float_rounding_mode(int val STATUS_PARAM)
+ {
+ STATUS(float_rounding_mode) = val;
+-#if defined(_BSD) && !defined(__APPLE__)
++#if defined(_BSD) && !defined(__APPLE__) && \
++ (defined(__FreeBSD__) && __FreeBSD_version < 500000)
+ fpsetround(val);
+ #elif defined(__arm__)
+ /* nothing to do */
+@@ -22,7 +26,7 @@
+ }
+ #endif
+
+-#if defined(_BSD)
++#if defined(_BSD) && !defined(__FreeBSD__)
+ #define lrint(d) ((int32_t)rint(d))
+ #define llrint(d) ((int64_t)rint(d))
+ #endif
+Index: qemu/fpu/softfloat-native.h
+@@ -1,7 +1,17 @@
+ /* Native implementation of soft float functions */
+ #include <math.h>
+-#if defined(_BSD) && !defined(__APPLE__)
++#if defined(_BSD) && !defined(__APPLE__) && \
++ (!defined(__FreeBSD__) || __FreeBSD_version < 500000)
+ #include <ieeefp.h>
++#if defined(__FreeBSD__)
++#define isgreater(x, y) __builtin_isgreater((x), (y))
++#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
++#define isless(x, y) __builtin_isless((x), (y))
++#define islessequal(x, y) __builtin_islessequal((x), (y))
++#define islessgreater(x, y) __builtin_islessgreater((x), (y))
++#define isunordered(x, y) __builtin_isunordered((x), (y))
++long double fabsl(long double x);
++#endif
+ #else
+ #include <fenv.h>
+ #endif
+@@ -33,12 +43,13 @@
+ /*----------------------------------------------------------------------------
+ | Software IEC/IEEE floating-point rounding mode.
+ *----------------------------------------------------------------------------*/
+-#if defined(_BSD) && !defined(__APPLE__)
++#if defined(_BSD) && !defined(__APPLE__) && \
++ (!defined(__FreeBSD__) || __FreeBSD_version < 500000)
+ enum {
+ float_round_nearest_even = FP_RN,
+- float_round_down = FE_RM,
+- float_round_up = FE_RP,
+- float_round_to_zero = FE_RZ
++ float_round_down = FP_RM,
++ float_round_up = FP_RP,
++ float_round_to_zero = FP_RZ
+ };
+ #elif defined(__arm__)
+ enum {
+Index: qemu/fpu/softfloat.h
+@@ -84,7 +84,8 @@
+ #define FLOAT128
+ #else
+ /* native float support */
+-#if (defined(__i386__) || defined(__x86_64__)) && !defined(_BSD)
++#if (defined(__i386__) || defined(__x86_64__)) && \
++ (!defined(_BSD) || defined(__FreeBSD__))
+ #define FLOATX80
+ #endif
+ #endif /* !CONFIG_SOFTFLOAT */
+Index: qemu/target-ppc/op_helper.c
+@@ -303,6 +303,13 @@
+ FT0 = sqrt(FT0);
+ }
+
++#ifndef isnormal
++#define isnormal(x) \
++ ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
++ : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
++ : __isnormall(x))
++#endif
++
+ void do_fres (void)
+ {
+ union {
+Index: qemu/x86_64.ld
+@@ -2,7 +2,7 @@
+ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
+ OUTPUT_ARCH(i386:x86-64)
+ ENTRY(_start)
+-SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib64");
++SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib");
+ SECTIONS
+ {
+ /* Read-only sections, merged into text segment: */
Index: files/patch-libmath
@@ -0,0 +1,2407 @@
+Index: qemu/bsd/Makefile
+@@ -0,0 +1,32 @@
++SRCS= ${MACHINE_ARCH}/e_atan2l.c \
++ ${MACHINE_ARCH}/e_logl.S \
++ ${MACHINE_ARCH}/e_powl.S \
++ ${MACHINE_ARCH}/e_remainderl.S \
++ ${MACHINE_ARCH}/e_sqrtl.c \
++ ${MACHINE_ARCH}/s_ceill.S \
++ ${MACHINE_ARCH}/s_cosl.S \
++ ${MACHINE_ARCH}/s_floorl.S \
++ ${MACHINE_ARCH}/s_isnormal.c \
++ ${MACHINE_ARCH}/s_llrint.S \
++ ${MACHINE_ARCH}/s_llrintf.S \
++ ${MACHINE_ARCH}/s_llrintl.S \
++ ${MACHINE_ARCH}/s_lrint.S \
++ ${MACHINE_ARCH}/s_lrintf.S \
++ ${MACHINE_ARCH}/s_lrintl.S \
++ ${MACHINE_ARCH}/s_rintl.c \
++ ${MACHINE_ARCH}/s_round.c \
++ ${MACHINE_ARCH}/s_sinl.S \
++ ${MACHINE_ARCH}/s_tanl.S
++
++OBJS= ${SRCS:R:S/$/.o/}
++
++CFLAGS= -O2 -Wall -I.
++
++all: libmath.a
++
++libmath.a: ${OBJS}
++ rm -f $@
++ ${AR} rcs $@ ${OBJS:T}
++
++clean:
++ rm -f ${OBJS:T} libmath.a
+Index: qemu/bsd/amd64/e_atan2l.c
+@@ -0,0 +1,20 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <sysdep.h>
++
++long double
++__ieee754_atan2l (long double y, long double x)
++{
++ long double res;
++
++ asm ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
++
++ return res;
++}
++
++weak_alias(__ieee754_atan2l, atan2l)
+Index: qemu/bsd/amd64/e_logl.S
+@@ -0,0 +1,59 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ * Adapted for x86-64 by Andreas Jaeger <aj at suse.de>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++
++#ifdef __ELF__
++ .section .rodata
++#else
++ .text
++#endif
++ .align ALIGNARG(4)
++ ASM_TYPE_DIRECTIVE(one, at object)
++one: .double 1.0
++ ASM_SIZE_DIRECTIVE(one)
++ /* It is not important that this constant is precise. It is only
++ a value which is known to be on the safe side for using the
++ fyl2xp1 instruction. */
++ ASM_TYPE_DIRECTIVE(limit, at object)
++limit: .double 0.29
++ ASM_SIZE_DIRECTIVE(limit)
++
++
++#ifdef PIC
++#define MO(op) op##(%rip)
++#else
++#define MO(op) op
++#endif
++
++ .text
++ENTRY(__ieee754_logl)
++ fldln2 // log(2)
++ fldt 8(%rsp) // x : log(2)
++ fld %st // x : x : log(2)
++ fsubl MO(one) // x-1 : x : log(2)
++ fld %st // x-1 : x-1 : x : log(2)
++ fabs // |x-1| : x-1 : x : log(2)
++ fcompl MO(limit) // x-1 : x : log(2)
++ fnstsw // x-1 : x : log(2)
++ andb $0x45, %ah
++ jz 2f
++ fstp %st(1) // x-1 : log(2)
++ fyl2xp1 // log(x)
++ ret
++
++2: fstp %st(0) // x : log(2)
++ fyl2x // log(x)
++ ret
++END (__ieee754_logl)
++
++weak_alias(__ieee754_logl,logl)
+Index: qemu/bsd/amd64/e_powl.S
+@@ -0,0 +1,341 @@
++/* ix87 specific implementation of pow function.
++ Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Ulrich Drepper <drepper at cygnus.com>, 1996.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++#ifdef __ELF__
++ .section .rodata
++#else
++ .text
++#endif
++
++ .align ALIGNARG(4)
++ ASM_TYPE_DIRECTIVE(infinity, at object)
++inf_zero:
++infinity:
++ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
++ ASM_SIZE_DIRECTIVE(infinity)
++ ASM_TYPE_DIRECTIVE(zero, at object)
++zero: .double 0.0
++ ASM_SIZE_DIRECTIVE(zero)
++ ASM_TYPE_DIRECTIVE(minf_mzero, at object)
++minf_mzero:
++minfinity:
++ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff
++mzero:
++ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
++ ASM_SIZE_DIRECTIVE(minf_mzero)
++ ASM_TYPE_DIRECTIVE(one, at object)
++one: .double 1.0
++ ASM_SIZE_DIRECTIVE(one)
++ ASM_TYPE_DIRECTIVE(limit, at object)
++limit: .double 0.29
++ ASM_SIZE_DIRECTIVE(limit)
++ ASM_TYPE_DIRECTIVE(p63, at object)
++p63:
++ .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
++ ASM_SIZE_DIRECTIVE(p63)
++
++#ifdef PIC
++#define MO(op) op##(%rip)
++#else
++#define MO(op) op
++#endif
++
++ .text
++ENTRY(__ieee754_powl)
++ fldt 24(%rsp) // y
++ fxam
++
++
++ fnstsw
++ movb %ah, %dl
++ andb $0x45, %ah
++ cmpb $0x40, %ah // is y == 0 ?
++ je 11f
++
++ cmpb $0x05, %ah // is y == ±inf ?
++ je 12f
++
++ cmpb $0x01, %ah // is y == NaN ?
++ je 30f
++
++ fldt 8(%rsp) // x : y
++
++ fxam
++ fnstsw
++ movb %ah, %dh
++ andb $0x45, %ah
++ cmpb $0x40, %ah
++ je 20f // x is ±0
++
++ cmpb $0x05, %ah
++ je 15f // x is ±inf
++
++ fxch // y : x
++
++ /* fistpll raises invalid exception for |y| >= 1L<<63. */
++ fldl MO(p63) // 1L<<63 : y : x
++ fld %st(1) // y : 1L<<63 : y : x
++ fabs // |y| : 1L<<63 : y : x
++ fcomip %st(1), %st // 1L<<63 : y : x
++ fstp %st(0) // y : x
++ jnc 2f
++
++ /* First see whether `y' is a natural number. In this case we
++ can use a more precise algorithm. */
++ fld %st // y : y : x
++ fistpll -8(%rsp) // y : x
++ fildll -8(%rsp) // int(y) : y : x
++ fucomip %st(1),%st // y : x
++ jne 2f
++
++ /* OK, we have an integer value for y. */
++ mov -8(%rsp),%eax
++ mov -4(%rsp),%edx
++ orl $0, %edx
++ fstp %st(0) // x
++ jns 4f // y >= 0, jump
++ fdivrl MO(one) // 1/x (now referred to as x)
++ negl %eax
++ adcl $0, %edx
++ negl %edx
++4: fldl MO(one) // 1 : x
++ fxch
++
++6: shrdl $1, %edx, %eax
++ jnc 5f
++ fxch
++ fmul %st(1) // x : ST*x
++ fxch
++5: fmul %st(0), %st // x*x : ST*x
++ shrl $1, %edx
++ movl %eax, %ecx
++ orl %edx, %ecx
++ jnz 6b
++ fstp %st(0) // ST*x
++ ret
++
++ /* y is ±NAN */
++30: fldt 8(%rsp) // x : y
++ fldl MO(one) // 1.0 : x : y
++ fucomip %st(1),%st // x : y
++ je 31f
++ fxch // y : x
++31: fstp %st(1)
++ ret
++
++ .align ALIGNARG(4)
++2: /* y is a real number. */
++ fxch // x : y
++ fldl MO(one) // 1.0 : x : y
++ fld %st(1) // x : 1.0 : x : y
++ fsub %st(1) // x-1 : 1.0 : x : y
++ fabs // |x-1| : 1.0 : x : y
++ fcompl MO(limit) // 1.0 : x : y
++ fnstsw
++ fxch // x : 1.0 : y
++ test $4500,%eax
++ jz 7f
++ fsub %st(1) // x-1 : 1.0 : y
++ fyl2xp1 // log2(x) : y
++ jmp 8f
++
++7: fyl2x // log2(x) : y
++8: fmul %st(1) // y*log2(x) : y
++ fxam
++ fnstsw
++ andb $0x45, %ah
++ cmpb $0x05, %ah // is y*log2(x) == ±inf ?
++ je 28f
++ fst %st(1) // y*log2(x) : y*log2(x)
++ frndint // int(y*log2(x)) : y*log2(x)
++ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
++ fxch // fract(y*log2(x)) : int(y*log2(x))
++ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
++ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
++ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
++ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
++ ret
++
++28: fstp %st(1) // y*log2(x)
++ fldl MO(one) // 1 : y*log2(x)
++ fscale // 2^(y*log2(x)) : y*log2(x)
++ fstp %st(1) // 2^(y*log2(x))
++ ret
++
++ // pow(x,±0) = 1
++ .align ALIGNARG(4)
++11: fstp %st(0) // pop y
++ fldl MO(one)
++ ret
++
++ // y == ±inf
++ .align ALIGNARG(4)
++12: fstp %st(0) // pop y
++ fldt 8(%rsp) // x
++ fabs
++ fcompl MO(one) // < 1, == 1, or > 1
++ fnstsw
++ andb $0x45, %ah
++ cmpb $0x45, %ah
++ je 13f // jump if x is NaN
++
++ cmpb $0x40, %ah
++ je 14f // jump if |x| == 1
++
++ shlb $1, %ah
++ xorb %ah, %dl
++ andl $2, %edx
++#ifdef PIC
++ lea inf_zero(%rip),%rcx
++ fldl (%rcx, %rdx, 4)
++#else
++ fldl inf_zero(,%rdx, 4)
++#endif
++ ret
++
++ .align ALIGNARG(4)
++14: fldl MO(one)
++ ret
++
++ .align ALIGNARG(4)
++13: fldt 8(%rsp) // load x == NaN
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±inf
++15: fstp %st(0) // y
++ testb $2, %dh
++ jz 16f // jump if x == +inf
++
++ // We must find out whether y is an odd integer.
++ fld %st // y : y
++ fistpll -8(%rsp) // y
++ fildll -8(%rsp) // int(y) : y
++ fucomip %st(1),%st
++ ffreep %st // <empty>
++ jne 17f
++
++ // OK, the value is an integer, but is it odd?
++ mov -8(%rsp), %eax
++ mov -4(%rsp), %edx
++ andb $1, %al
++ jz 18f // jump if not odd
++ // It's an odd integer.
++ shrl $31, %edx
++#ifdef PIC
++ lea minf_mzero(%rip),%rcx
++ fldl (%rcx, %rdx, 8)
++#else
++ fldl minf_mzero(,%rdx, 8)
++#endif
++ ret
++
++ .align ALIGNARG(4)
++16: fcompl MO(zero)
++ fnstsw
++ shrl $5, %eax
++ andl $8, %eax
++#ifdef PIC
++ lea inf_zero(%rip),%rcx
++ fldl (%rcx, %rax, 1)
++#else
++ fldl inf_zero(,%rax, 1)
++#endif
++ ret
++
++ .align ALIGNARG(4)
++17: shll $30, %edx // sign bit for y in right position
++18: shrl $31, %edx
++#ifdef PIC
++ lea inf_zero(%rip),%rcx
++ fldl (%rcx, %rdx, 8)
++#else
++ fldl inf_zero(,%rdx, 8)
++#endif
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±0
++20: fstp %st(0) // y
++ testb $2, %dl
++ jz 21f // y > 0
++
++ // x is ±0 and y is < 0. We must find out whether y is an odd integer.
++ testb $2, %dh
++ jz 25f
++
++ fld %st // y : y
++ fistpll -8(%rsp) // y
++ fildll -8(%rsp) // int(y) : y
++ fucomip %st(1),%st
++ ffreep %st // <empty>
++ jne 26f
++
++ // OK, the value is an integer, but is it odd?
++ mov -8(%rsp),%eax
++ mov -4(%rsp),%edx
++ andb $1, %al
++ jz 27f // jump if not odd
++ // It's an odd integer.
++ // Raise divide-by-zero exception and get minus infinity value.
++ fldl MO(one)
++ fdivl MO(zero)
++ fchs
++ ret
++
++25: fstp %st(0)
++26:
++27: // Raise divide-by-zero exception and get infinity value.
++ fldl MO(one)
++ fdivl MO(zero)
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±0 and y is > 0. We must find out whether y is an odd integer.
++21: testb $2, %dh
++ jz 22f
++
++ fld %st // y : y
++ fistpll -8(%rsp) // y
++ fildll -8(%rsp) // int(y) : y
++ fucomip %st(1),%st
++ ffreep %st // <empty>
++ jne 23f
++
++ // OK, the value is an integer, but is it odd?
++ mov -8(%rsp),%eax
++ mov -4(%rsp),%edx
++ andb $1, %al
++ jz 24f // jump if not odd
++ // It's an odd integer.
++ fldl MO(mzero)
++ ret
++
++22: fstp %st(0)
++23:
++24: fldl MO(zero)
++ ret
++
++END(__ieee754_powl)
++
++weak_alias(__ieee754_powl,powl)
+Index: qemu/bsd/amd64/e_remainderl.S
+@@ -0,0 +1,23 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ * Adapted for x86-64 by Andreas Jaeger <aj at suse.de>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++ENTRY(__ieee754_remainderl)
++ fldt 24(%rsp)
++ fldt 8(%rsp)
++1: fprem1
++ fstsw %ax
++ testl $0x400,%eax
++ jnz 1b
++ fstp %st(1)
++ ret
++END (__ieee754_remainderl)
++
++weak_alias(__ieee754_remainderl,remainderl)
+Index: qemu/bsd/amd64/e_sqrtl.c
+@@ -0,0 +1,20 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <sysdep.h>
++
++long double
++__ieee754_sqrtl (long double x)
++{
++ long double res;
++
++ asm ("fsqrt" : "=t" (res) : "0" (x));
++
++ return res;
++}
++
++weak_alias(__ieee754_sqrtl,sqrtl)
+Index: qemu/bsd/amd64/s_ceill.S
+@@ -0,0 +1,247 @@
++/*
++ * ====================================================
++ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
++ *
++ * Developed at SunPro, a Sun Microsystems, Inc. business.
++ * Permission to use, copy, modify, and distribute this
++ * software is freely granted, provided that this notice
++ * is preserved.
++ * ====================================================
++ *
++ * From: @(#)s_ceil.c 5.1 93/09/24
++ */
++/* XXX: generated from src/lib/msun/src/s_ceill.c */
++
++#include <machine/asm.h>
++
++__FBSDID("$FreeBSD: src/lib/msun/src/s_ceill.c,v 1.3 2005/04/22 09:57:55 stefanf Exp $")
++
++ .file "s_ceill.c"
++ .section .rodata.cst8,"aM", at progbits,8
++ .p2align 3
++.LC0:
++ .long 2281731484
++ .long 2117592124
++ .p2align 3
++.LC3:
++ .long 0
++ .long 0
++ .text
++ .p2align 4,,15
++.globl ceill
++ .type ceill, @function
++ceill:
++.LFB17:
++ pushq %rbp
++.LCFI0:
++ pushq %rbx
++.LCFI1:
++ fldt 24(%rsp)
++ movq $0, -16(%rsp)
++ fld %st(0)
++ fstpt -56(%rsp)
++ movl -48(%rsp), %edi
++ movq -56(%rsp), %rsi
++ movl %edi, -16(%rsp)
++ movl -16(%rsp), %r11d
++ movq %rsi, -24(%rsp)
++ movl %r11d, %r10d
++ andl $32767, %r10d
++ leal -16383(%r10), %r8d
++ cmpl $30, %r8d
++ jg .L2
++ testl %r8d, %r8d
++ js .L38
++ movl -20(%rsp), %r9d
++ leal 1(%r8), %ecx
++ mov -24(%rsp), %eax
++ movl $4294967295, %ebp
++ movq %rsi, -56(%rsp)
++ movl %edi, -48(%rsp)
++ shrq %cl, %rbp
++ mov %r9d, %ebx
++ movq %rbx, %rdx
++ andq %rbp, %rdx
++ orq %rax, %rdx
++ fldt -56(%rsp)
++ je .L42
++ ffreep %st(0)
++ testb $-128, -15(%rsp)
++ jne .L12
++ movl $31, %ecx
++ movl $1, %eax
++ subl %r8d, %ecx
++ salq %cl, %rax
++ addl %eax, %r9d
++ mov %r9d, %eax
++ cmpq %rbx, %rax
++ jae .L32
++ leal 1(%r10), %edx
++ movl %r11d, %eax
++ orl $-2147483648, %r9d
++ andw $-32768, %ax
++ andw $32767, %dx
++ orl %edx, %eax
++ movw %ax, -16(%rsp)
++.L32:
++ movl %r9d, -20(%rsp)
++.L12:
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L31
++ movl %ebp, %eax
++ movl $0, -24(%rsp)
++ notl %eax
++ andl %eax, %r9d
++ movl %r9d, -20(%rsp)
++ .p2align 4,,7
++.L31:
++ movq -24(%rsp), %rsi
++ movl -16(%rsp), %edi
++ movq %rsi, -56(%rsp)
++ movl %edi, -48(%rsp)
++ fldt -56(%rsp)
++ popq %rbx
++ popq %rbp
++ ret
++ .p2align 4,,7
++.L2:
++ cmpl $62, %r8d
++ jle .L43
++ ffreep %st(0)
++.L17:
++ movq %rsi, -56(%rsp)
++ movl %edi, -48(%rsp)
++ fldt -56(%rsp)
++ popq %rbx
++ popq %rbp
++ ret
++ .p2align 4,,7
++.L43:
++ movl -24(%rsp), %edx
++ leal 1(%r8), %ecx
++ movq $-1, %rbx
++ movq %rsi, -56(%rsp)
++ movl %edi, -48(%rsp)
++ shrq %cl, %rbx
++ mov %edx, %r9d
++ testq %rbx, %r9
++ fldt -56(%rsp)
++ je .L42
++ ffreep %st(0)
++ testb $-128, -15(%rsp)
++ jne .L20
++ cmpl $31, %r8d
++ je .L36
++ movl $63, %ecx
++ movl $1, %eax
++ subl %r8d, %ecx
++ salq %cl, %rax
++ leal (%rdx,%rax), %eax
++ movl %eax, -24(%rsp)
++ mov %eax, %eax
++ cmpq %r9, %rax
++ jae .L20
++.L36:
++ movl -20(%rsp), %eax
++ leal 1(%rax), %ecx
++ cmpl %eax, %ecx
++ jae .L34
++ leal 1(%r10), %edx
++ movl %r11d, %eax
++ orl $-2147483648, %ecx
++ andw $-32768, %ax
++ andw $32767, %dx
++ orl %edx, %eax
++ movw %ax, -16(%rsp)
++.L34:
++ movl %ecx, -20(%rsp)
++ .p2align 4,,7
++.L20:
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L31
++ movl %ebx, %eax
++ notl %eax
++ andl %eax, -24(%rsp)
++ jmp .L31
++ .p2align 4,,7
++.L42:
++ fstp %st(1)
++ popq %rbx
++ popq %rbp
++ ret
++ .p2align 4,,7
++.L38:
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L17
++ testl %r10d, %r10d
++ jle .L39
++.L7:
++ movabsq $-9223372036854775808, %rsi
++ movl $16383, %edi
++ testb $-128, -15(%rsp)
++ movq %rsi, -56(%rsp)
++ movl %edi, -48(%rsp)
++ fldz
++ fldt -56(%rsp)
++ fcmovne %st(1), %st
++ fstp %st(1)
++ fstpt -56(%rsp)
++ movq -56(%rsp), %rsi
++ movl -48(%rsp), %edi
++ movq %rsi, -24(%rsp)
++ movl %edi, -16(%rsp)
++ jmp .L17
++.L39:
++ movl -24(%rsp), %eax
++ orl -20(%rsp), %eax
++ je .L17
++ jmp .L7
++.LFE17:
++ .size ceill, .-ceill
++ .section .eh_frame,"a", at progbits
++.Lframe1:
++ .long .LECIE1-.LSCIE1
++.LSCIE1:
++ .long 0x0
++ .byte 0x1
++ .string ""
++ .uleb128 0x1
++ .sleb128 -8
++ .byte 0x10
++ .byte 0xc
++ .uleb128 0x7
++ .uleb128 0x8
++ .byte 0x90
++ .uleb128 0x1
++ .p2align 3
++.LECIE1:
++.LSFDE1:
++ .long .LEFDE1-.LASFDE1
++.LASFDE1:
++ .long .LASFDE1-.Lframe1
++ .quad .LFB17
++ .quad .LFE17-.LFB17
++ .byte 0x4
++ .long .LCFI0-.LFB17
++ .byte 0xe
++ .uleb128 0x10
++ .byte 0x4
++ .long .LCFI1-.LCFI0
++ .byte 0xe
++ .uleb128 0x18
++ .byte 0x83
++ .uleb128 0x3
++ .byte 0x86
++ .uleb128 0x2
++ .p2align 3
++.LEFDE1:
++ .ident "GCC: (GNU) 3.4.4 [FreeBSD] 20050408"
+Index: qemu/bsd/amd64/s_cosl.S
+@@ -0,0 +1,33 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ * Adapted for x86-64 by Andreas Jaeger <aj at suse.de>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__cosl)
++ fldt 8(%rsp)
++ fcos
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ ret
++ .align ALIGNARG(4)
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fcos
++ ret
++END (__cosl)
++weak_alias (__cosl, cosl)
+Index: qemu/bsd/amd64/s_floorl.S
+@@ -0,0 +1,209 @@
++/*
++ * ====================================================
++ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
++ *
++ * Developed at SunPro, a Sun Microsystems, Inc. business.
++ * Permission to use, copy, modify, and distribute this
++ * software is freely granted, provided that this notice
++ * is preserved.
++ * ====================================================
++ *
++ * From: @(#)s_floor.c 5.1 93/09/24
++ */
++/* XXX: generated from src/lib/msun/src/s_floorl.c */
++
++#include <machine/asm.h>
++
++__FBSDID("$FreeBSD: src/lib/msun/src/s_floorl.c,v 1.3 2005/04/22 09:57:55 stefanf Exp $")
++
++ .file "s_floorl.c"
++ .section .rodata.cst8,"aM", at progbits,8
++ .p2align 3
++.LC0:
++ .long 2281731484
++ .long 2117592124
++ .section .rodata.cst4,"aM", at progbits,4
++ .p2align 2
++.LC2:
++ .long 3212836864
++ .section .rodata.cst8
++ .p2align 3
++.LC3:
++ .long 0
++ .long 0
++ .text
++ .p2align 4,,15
++.globl floorl
++ .type floorl, @function
++floorl:
++.LFB17:
++ fldt 8(%rsp)
++ movq $0, -16(%rsp)
++ fld %st(0)
++ fstpt -24(%rsp)
++ movl -16(%rsp), %r9d
++ fld %st(0)
++ movl %r9d, %r8d
++ andl $32767, %r8d
++ leal -16383(%r8), %esi
++ cmpl $30, %esi
++ jg .L2
++ testl %esi, %esi
++ js .L40
++ movl -20(%rsp), %edi
++ leal 1(%rsi), %ecx
++ mov -24(%rsp), %eax
++ movl $4294967295, %r11d
++ shrq %cl, %r11
++ mov %edi, %r10d
++ movq %r10, %rdx
++ andq %r11, %rdx
++ orq %rax, %rdx
++ je .L44
++ ffreep %st(0)
++ testb $-128, -15(%rsp)
++ je .L12
++ movl $31, %ecx
++ movl $1, %eax
++ subl %esi, %ecx
++ salq %cl, %rax
++ addl %eax, %edi
++ mov %edi, %eax
++ cmpq %r10, %rax
++ jae .L32
++ leal 1(%r8), %edx
++ movl %r9d, %eax
++ orl $-2147483648, %edi
++ andw $-32768, %ax
++ andw $32767, %dx
++ orl %edx, %eax
++ movw %ax, -16(%rsp)
++.L32:
++ movl %edi, -20(%rsp)
++.L12:
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L46
++ movl %r11d, %eax
++ movl $0, -24(%rsp)
++ notl %eax
++ andl %eax, %edi
++ movl %edi, -20(%rsp)
++.L46:
++ fldt -24(%rsp)
++ ret
++ .p2align 4,,7
++.L2:
++ cmpl $62, %esi
++ jg .L44
++ movl -24(%rsp), %edx
++ leal 1(%rsi), %ecx
++ movq $-1, %r10
++ shrq %cl, %r10
++ mov %edx, %edi
++ testq %r10, %rdi
++ je .L44
++ ffreep %st(0)
++ testb $-128, -15(%rsp)
++ je .L20
++ cmpl $31, %esi
++ je .L37
++ movl $63, %ecx
++ movl $1, %eax
++ subl %esi, %ecx
++ salq %cl, %rax
++ leal (%rdx,%rax), %eax
++ movl %eax, -24(%rsp)
++ mov %eax, %eax
++ cmpq %rdi, %rax
++ jae .L20
++.L37:
++ movl -20(%rsp), %eax
++ leal 1(%rax), %ecx
++ cmpl %eax, %ecx
++ jae .L34
++ leal 1(%r8), %edx
++ movl %r9d, %eax
++ orl $-2147483648, %ecx
++ andw $-32768, %ax
++ andw $32767, %dx
++ orl %edx, %eax
++ movw %ax, -16(%rsp)
++.L34:
++ movl %ecx, -20(%rsp)
++ .p2align 4,,7
++.L20:
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L31
++ movl %r10d, %eax
++ notl %eax
++ andl %eax, -24(%rsp)
++ fldt -24(%rsp)
++ ret
++ .p2align 4,,7
++.L44:
++ fstp %st(1)
++.L47:
++ rep ; ret
++ .p2align 4,,7
++.L40:
++ fxch %st(1)
++ fstpl -32(%rsp)
++ movlpd -32(%rsp), %xmm0
++ addsd .LC0(%rip), %xmm0
++ ucomisd .LC3(%rip), %xmm0
++ jbe .L47
++ testl %r8d, %r8d
++ jle .L41
++.L45:
++ ffreep %st(0)
++ testb $-128, -15(%rsp)
++ fldz
++ je .L9
++ ffreep %st(0)
++ flds .LC2(%rip)
++.L9:
++ fld %st(0)
++ fstpt -24(%rsp)
++ ret
++.L31:
++ fldt -24(%rsp)
++ ret
++.L41:
++ movl -24(%rsp), %eax
++ orl -20(%rsp), %eax
++ jne .L45
++ rep ; ret
++.LFE17:
++ .size floorl, .-floorl
++ .section .eh_frame,"a", at progbits
++.Lframe1:
++ .long .LECIE1-.LSCIE1
++.LSCIE1:
++ .long 0x0
++ .byte 0x1
++ .string ""
++ .uleb128 0x1
++ .sleb128 -8
++ .byte 0x10
++ .byte 0xc
++ .uleb128 0x7
++ .uleb128 0x8
++ .byte 0x90
++ .uleb128 0x1
++ .p2align 3
++.LECIE1:
++.LSFDE1:
++ .long .LEFDE1-.LASFDE1
++.LASFDE1:
++ .long .LASFDE1-.Lframe1
++ .quad .LFB17
++ .quad .LFE17-.LFB17
++ .p2align 3
++.LEFDE1:
++ .ident "GCC: (GNU) 3.4.4 [FreeBSD] 20050408"
+Index: qemu/bsd/amd64/s_isnormal.c
+@@ -0,0 +1,85 @@
++/*-
++ * Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++ * Copyright (c) 2002-2004 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ *
++ * $FreeBSD: src/lib/msun/src/s_isnormal.c,v 1.1 2004/07/09 03:32:39 das Exp $
++ */
++
++union IEEEf2bits {
++ float f;
++ struct {
++ unsigned int man :23;
++ unsigned int exp :8;
++ unsigned int sign :1;
++ } bits;
++};
++
++union IEEEd2bits {
++ double d;
++ struct {
++ unsigned int manl :32;
++ unsigned int manh :20;
++ unsigned int exp :11;
++ unsigned int sign :1;
++ } bits;
++};
++
++union IEEEl2bits {
++ long double e;
++ struct {
++ unsigned int manl :32;
++ unsigned int manh :32;
++ unsigned int exp :15;
++ unsigned int sign :1;
++ unsigned int junk :16;
++ } bits;
++};
++
++int
++__isnormal(double d)
++{
++ union IEEEd2bits u;
++
++ u.d = d;
++ return (u.bits.exp != 0 && u.bits.exp != 2047);
++}
++
++int
++__isnormalf(float f)
++{
++ union IEEEf2bits u;
++
++ u.f = f;
++ return (u.bits.exp != 0 && u.bits.exp != 255);
++}
++
++int
++__isnormall(long double e)
++{
++ union IEEEl2bits u;
++
++ u.e = e;
++ return (u.bits.exp != 0 && u.bits.exp != 32767);
++}
+Index: qemu/bsd/amd64/s_llrint.S
+@@ -0,0 +1,6 @@
++#include <machine/asm.h>
++__FBSDID("$FreeBSD: src/lib/msun/amd64/s_llrint.S,v 1.1 2005/01/15 03:32:28 das Exp $")
++
++/* sizeof(long) == sizeof(long long) */
++#define fn llrint
++#include "s_lrint.S"
+Index: qemu/bsd/amd64/s_llrintf.S
+@@ -0,0 +1,6 @@
++#include <machine/asm.h>
++__FBSDID("$FreeBSD: src/lib/msun/amd64/s_llrintf.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++
++/* sizeof(long) == sizeof(long long) */
++#define fn llrintf
++#include "s_lrintf.S"
+Index: qemu/bsd/amd64/s_llrintl.S
+@@ -0,0 +1,35 @@
++/* Round argument to nearest integral value according to current rounding
++ direction.
++ Copyright (C) 1997, 2002 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++ .text
++ENTRY(__llrintl)
++ fldt 8(%rsp)
++ fistpll -8(%rsp)
++ fwait
++ movq -8(%rsp),%rax
++ ret
++END(__llrintl)
++weak_alias (__llrintl, llrintl)
++strong_alias (__llrintl, __lrintl)
++weak_alias (__llrintl, lrintl)
++
+Index: qemu/bsd/amd64/s_lrint.S
+@@ -0,0 +1,36 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++
++#ifndef fn
++__FBSDID("$FreeBSD: src/lib/msun/amd64/s_lrint.S,v 1.1 2005/01/15 03:32:28 das Exp $")
++#define fn lrint
++#endif
++
++ENTRY(fn)
++ cvtsd2si %xmm0, %rax
++ ret
+Index: qemu/bsd/amd64/s_lrintf.S
+@@ -0,0 +1,36 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++
++#ifndef fn
++__FBSDID("$FreeBSD: src/lib/msun/amd64/s_lrintf.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++#define fn lrintf
++#endif
++
++ENTRY(fn)
++ cvtss2si %xmm0, %rax
++ ret
+Index: qemu/bsd/amd64/s_lrintl.S
+@@ -0,0 +1 @@
++/* Not needed, see s_llrintl.S. */
+Index: qemu/bsd/amd64/s_rintl.c
+@@ -0,0 +1,18 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Changes for long double by Ulrich Drepper <drepper at cygnus.com>
++ * Public domain.
++ */
++
++#include <sysdep.h>
++
++long double
++__rintl (long double x)
++{
++ long double res;
++
++ asm ("frndint" : "=t" (res) : "0" (x));
++ return res;
++}
++
++weak_alias (__rintl, rintl)
+Index: qemu/bsd/amd64/s_round.c
+@@ -0,0 +1,51 @@
++/*-
++ * Copyright (c) 2003, Steven G. Kargl
++ * All rights reserved.
++ *
++ * 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 unmodified, 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD: src/lib/msun/src/s_round.c,v 1.3 2005/01/13 15:43:41 das Exp $");
++
++#include <math.h>
++
++double
++round(double x)
++{
++ double t;
++
++ if (!isfinite(x))
++ return (x);
++
++ if (x >= 0.0) {
++ t = ceil(x);
++ if (t - x > 0.5)
++ t -= 1.0;
++ return (t);
++ } else {
++ t = ceil(-x);
++ if (t + x > 0.5)
++ t -= 1.0;
++ return (-t);
++ }
++}
+Index: qemu/bsd/amd64/s_sinl.S
+@@ -0,0 +1,31 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ * Adapted for x86-64 by Andreas Jaeger <aj at suse.de>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++ENTRY(__sinl)
++ fldt 8(%rsp)
++ fsin
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ ret
++ .align ALIGNARG(4)
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fsin
++ ret
++END (__sinl)
++weak_alias (__sinl, sinl)
+Index: qemu/bsd/amd64/s_tanl.S
+@@ -0,0 +1,34 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ * Adapted for x86-64 by Andreas Jaeger <aj at suse.de>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__tanl)
++ fldt 8(%rsp)
++ fptan
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ fstp %st(0)
++ ret
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fptan
++ fstp %st(0)
++ ret
++END (__tanl)
++weak_alias (__tanl, tanl)
+Index: qemu/bsd/i386/e_atan2l.c
+@@ -0,0 +1,20 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <sysdep.h>
++
++long double
++__ieee754_atan2l (long double y, long double x)
++{
++ long double res;
++
++ asm ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
++
++ return res;
++}
++
++weak_alias(__ieee754_atan2l, atan2l)
+Index: qemu/bsd/i386/e_logl.S
+@@ -0,0 +1,63 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++
++#ifdef __ELF__
++ .section .rodata
++#else
++ .text
++#endif
++ .align ALIGNARG(4)
++ ASM_TYPE_DIRECTIVE(one, at object)
++one: .double 1.0
++ ASM_SIZE_DIRECTIVE(one)
++ /* It is not important that this constant is precise. It is only
++ a value which is known to be on the safe side for using the
++ fyl2xp1 instruction. */
++ ASM_TYPE_DIRECTIVE(limit, at object)
++limit: .double 0.29
++ ASM_SIZE_DIRECTIVE(limit)
++
++
++#ifdef PIC
++#define MO(op) op##@GOTOFF(%edx)
++#else
++#define MO(op) op
++#endif
++
++ .text
++ENTRY(__ieee754_logl)
++ fldln2 // log(2)
++ fldt 4(%esp) // x : log(2)
++#ifdef PIC
++ call 1f
++1: popl %edx
++ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
++#endif
++ fld %st // x : x : log(2)
++ fsubl MO(one) // x-1 : x : log(2)
++ fld %st // x-1 : x-1 : x : log(2)
++ fabs // |x-1| : x-1 : x : log(2)
++ fcompl MO(limit) // x-1 : x : log(2)
++ fnstsw // x-1 : x : log(2)
++ andb $0x45, %ah
++ jz 2f
++ fstp %st(1) // x-1 : log(2)
++ fyl2xp1 // log(x)
++ ret
++
++2: fstp %st(0) // x : log(2)
++ fyl2x // log(x)
++ ret
++END (__ieee754_logl)
++
++weak_alias(__ieee754_logl,logl)
+Index: qemu/bsd/i386/e_powl.S
+@@ -0,0 +1,341 @@
++/* ix87 specific implementation of pow function.
++ Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004
++ Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Ulrich Drepper <drepper at cygnus.com>, 1996.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++#ifdef __ELF__
++ .section .rodata
++#else
++ .text
++#endif
++
++ .align ALIGNARG(4)
++ ASM_TYPE_DIRECTIVE(infinity, at object)
++inf_zero:
++infinity:
++ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
++ ASM_SIZE_DIRECTIVE(infinity)
++ ASM_TYPE_DIRECTIVE(zero, at object)
++zero: .double 0.0
++ ASM_SIZE_DIRECTIVE(zero)
++ ASM_TYPE_DIRECTIVE(minf_mzero, at object)
++minf_mzero:
++minfinity:
++ .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff
++mzero:
++ .byte 0, 0, 0, 0, 0, 0, 0, 0x80
++ ASM_SIZE_DIRECTIVE(minf_mzero)
++ ASM_TYPE_DIRECTIVE(one, at object)
++one: .double 1.0
++ ASM_SIZE_DIRECTIVE(one)
++ ASM_TYPE_DIRECTIVE(limit, at object)
++limit: .double 0.29
++ ASM_SIZE_DIRECTIVE(limit)
++ ASM_TYPE_DIRECTIVE(p63, at object)
++p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
++ ASM_SIZE_DIRECTIVE(p63)
++
++#ifdef PIC
++#define MO(op) op##@GOTOFF(%ecx)
++#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
++#else
++#define MO(op) op
++#define MOX(op,x,f) op(,x,f)
++#endif
++
++ .text
++ENTRY(__ieee754_powl)
++ fldt 16(%esp) // y
++ fxam
++
++#ifdef PIC
++ call 1f
++1: popl %ecx
++ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
++#endif
++
++ fnstsw
++ movb %ah, %dl
++ andb $0x45, %ah
++ cmpb $0x40, %ah // is y == 0 ?
++ je 11f
++
++ cmpb $0x05, %ah // is y == ±inf ?
++ je 12f
++
++ cmpb $0x01, %ah // is y == NaN ?
++ je 30f
++
++ fldt 4(%esp) // x : y
++
++ subl $8,%esp
++
++ fxam
++ fnstsw
++ movb %ah, %dh
++ andb $0x45, %ah
++ cmpb $0x40, %ah
++ je 20f // x is ±0
++
++ cmpb $0x05, %ah
++ je 15f // x is ±inf
++
++ fxch // y : x
++
++ /* fistpll raises invalid exception for |y| >= 1L<<63. */
++ fld %st // y : y : x
++ fabs // |y| : y : x
++ fcompl MO(p63) // y : x
++ fnstsw
++ sahf
++ jnc 2f
++
++ /* First see whether `y' is a natural number. In this case we
++ can use a more precise algorithm. */
++ fld %st // y : y : x
++ fistpll (%esp) // y : x
++ fildll (%esp) // int(y) : y : x
++ fucomp %st(1) // y : x
++ fnstsw
++ sahf
++ jne 2f
++
++ /* OK, we have an integer value for y. */
++ popl %eax
++ popl %edx
++ orl $0, %edx
++ fstp %st(0) // x
++ jns 4f // y >= 0, jump
++ fdivrl MO(one) // 1/x (now referred to as x)
++ negl %eax
++ adcl $0, %edx
++ negl %edx
++4: fldl MO(one) // 1 : x
++ fxch
++
++6: shrdl $1, %edx, %eax
++ jnc 5f
++ fxch
++ fmul %st(1) // x : ST*x
++ fxch
++5: fmul %st(0), %st // x*x : ST*x
++ shrl $1, %edx
++ movl %eax, %ecx
++ orl %edx, %ecx
++ jnz 6b
++ fstp %st(0) // ST*x
++ ret
++
++ /* y is ±NAN */
++30: fldt 4(%esp) // x : y
++ fldl MO(one) // 1.0 : x : y
++ fucomp %st(1) // x : y
++ fnstsw
++ sahf
++ je 31f
++ fxch // y : x
++31: fstp %st(1)
++ ret
++
++ .align ALIGNARG(4)
++2: /* y is a real number. */
++ fxch // x : y
++ fldl MO(one) // 1.0 : x : y
++ fld %st(1) // x : 1.0 : x : y
++ fsub %st(1) // x-1 : 1.0 : x : y
++ fabs // |x-1| : 1.0 : x : y
++ fcompl MO(limit) // 1.0 : x : y
++ fnstsw
++ fxch // x : 1.0 : y
++ sahf
++ ja 7f
++ fsub %st(1) // x-1 : 1.0 : y
++ fyl2xp1 // log2(x) : y
++ jmp 8f
++
++7: fyl2x // log2(x) : y
++8: fmul %st(1) // y*log2(x) : y
++ fxam
++ fnstsw
++ andb $0x45, %ah
++ cmpb $0x05, %ah // is y*log2(x) == ±inf ?
++ je 28f
++ fst %st(1) // y*log2(x) : y*log2(x)
++ frndint // int(y*log2(x)) : y*log2(x)
++ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
++ fxch // fract(y*log2(x)) : int(y*log2(x))
++ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
++ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
++ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
++ addl $8, %esp
++ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
++ ret
++
++28: fstp %st(1) // y*log2(x)
++ fldl MO(one) // 1 : y*log2(x)
++ fscale // 2^(y*log2(x)) : y*log2(x)
++ addl $8, %esp
++ fstp %st(1) // 2^(y*log2(x))
++ ret
++
++ // pow(x,±0) = 1
++ .align ALIGNARG(4)
++11: fstp %st(0) // pop y
++ fldl MO(one)
++ ret
++
++ // y == ±inf
++ .align ALIGNARG(4)
++12: fstp %st(0) // pop y
++ fldt 4(%esp) // x
++ fabs
++ fcompl MO(one) // < 1, == 1, or > 1
++ fnstsw
++ andb $0x45, %ah
++ cmpb $0x45, %ah
++ je 13f // jump if x is NaN
++
++ cmpb $0x40, %ah
++ je 14f // jump if |x| == 1
++
++ shlb $1, %ah
++ xorb %ah, %dl
++ andl $2, %edx
++ fldl MOX(inf_zero, %edx, 4)
++ ret
++
++ .align ALIGNARG(4)
++14: fldl MO(one)
++ ret
++
++ .align ALIGNARG(4)
++13: fldt 4(%esp) // load x == NaN
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±inf
++15: fstp %st(0) // y
++ testb $2, %dh
++ jz 16f // jump if x == +inf
++
++ // We must find out whether y is an odd integer.
++ fld %st // y : y
++ fistpll (%esp) // y
++ fildll (%esp) // int(y) : y
++ fucompp // <empty>
++ fnstsw
++ sahf
++ jne 17f
++
++ // OK, the value is an integer, but is it odd?
++ popl %eax
++ popl %edx
++ andb $1, %al
++ jz 18f // jump if not odd
++ // It's an odd integer.
++ shrl $31, %edx
++ fldl MOX(minf_mzero, %edx, 8)
++ ret
++
++ .align ALIGNARG(4)
++16: fcompl MO(zero)
++ addl $8, %esp
++ fnstsw
++ shrl $5, %eax
++ andl $8, %eax
++ fldl MOX(inf_zero, %eax, 1)
++ ret
++
++ .align ALIGNARG(4)
++17: shll $30, %edx // sign bit for y in right position
++ addl $8, %esp
++18: shrl $31, %edx
++ fldl MOX(inf_zero, %edx, 8)
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±0
++20: fstp %st(0) // y
++ testb $2, %dl
++ jz 21f // y > 0
++
++ // x is ±0 and y is < 0. We must find out whether y is an odd integer.
++ testb $2, %dh
++ jz 25f
++
++ fld %st // y : y
++ fistpll (%esp) // y
++ fildll (%esp) // int(y) : y
++ fucompp // <empty>
++ fnstsw
++ sahf
++ jne 26f
++
++ // OK, the value is an integer, but is it odd?
++ popl %eax
++ popl %edx
++ andb $1, %al
++ jz 27f // jump if not odd
++ // It's an odd integer.
++ // Raise divide-by-zero exception and get minus infinity value.
++ fldl MO(one)
++ fdivl MO(zero)
++ fchs
++ ret
++
++25: fstp %st(0)
++26: addl $8, %esp
++27: // Raise divide-by-zero exception and get infinity value.
++ fldl MO(one)
++ fdivl MO(zero)
++ ret
++
++ .align ALIGNARG(4)
++ // x is ±0 and y is > 0. We must find out whether y is an odd integer.
++21: testb $2, %dh
++ jz 22f
++
++ fld %st // y : y
++ fistpll (%esp) // y
++ fildll (%esp) // int(y) : y
++ fucompp // <empty>
++ fnstsw
++ sahf
++ jne 23f
++
++ // OK, the value is an integer, but is it odd?
++ popl %eax
++ popl %edx
++ andb $1, %al
++ jz 24f // jump if not odd
++ // It's an odd integer.
++ fldl MO(mzero)
++ ret
++
++22: fstp %st(0)
++23: addl $8, %esp // Don't use 2 x pop
++24: fldl MO(zero)
++ ret
++
++END(__ieee754_powl)
++
++weak_alias(__ieee754_powl,powl)
+Index: qemu/bsd/i386/e_remainderl.S
+@@ -0,0 +1,24 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__ieee754_remainderl)
++ fldt 16(%esp)
++ fldt 4(%esp)
++1: fprem1
++ fstsw %ax
++ sahf
++ jp 1b
++ fstp %st(1)
++ ret
++END (__ieee754_remainderl)
++
++weak_alias(__ieee754_remainderl,remainderl)
+Index: qemu/bsd/i386/e_sqrtl.c
+@@ -0,0 +1,20 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <sysdep.h>
++
++long double
++__ieee754_sqrtl (long double x)
++{
++ long double res;
++
++ asm ("fsqrt" : "=t" (res) : "0" (x));
++
++ return res;
++}
++
++weak_alias(__ieee754_sqrtl,sqrtl)
+Index: qemu/bsd/i386/s_ceill.S
+@@ -0,0 +1,27 @@
++/*
++ * Based on code written by J.T. Conklin <jtc at NetBSD.org>.
++ * Public domain.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_ceill.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++
++ENTRY(ceill)
++ pushl %ebp
++ movl %esp,%ebp
++ subl $8,%esp
++
++ fstcw -4(%ebp) /* store fpu control word */
++ movw -4(%ebp),%dx
++ orw $0x0800,%dx /* round towards +oo */
++ andw $0xfbff,%dx
++ movw %dx,-8(%ebp)
++ fldcw -8(%ebp) /* load modfied control word */
++
++ fldt 8(%ebp) /* round */
++ frndint
++
++ fldcw -4(%ebp) /* restore original control word */
++
++ leave
++ ret
+Index: qemu/bsd/i386/s_cosl.S
+@@ -0,0 +1,32 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__cosl)
++ fldt 4(%esp)
++ fcos
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ ret
++ .align ALIGNARG(4)
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fcos
++ ret
++END (__cosl)
++weak_alias (__cosl, cosl)
+Index: qemu/bsd/i386/s_floorl.S
+@@ -0,0 +1,27 @@
++/*
++ * Based on code written by J.T. Conklin <jtc at NetBSD.org>.
++ * Public domain.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_floorl.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++
++ENTRY(floorl)
++ pushl %ebp
++ movl %esp,%ebp
++ subl $8,%esp
++
++ fstcw -4(%ebp) /* store fpu control word */
++ movw -4(%ebp),%dx
++ orw $0x0400,%dx /* round towards -oo */
++ andw $0xf7ff,%dx
++ movw %dx,-8(%ebp)
++ fldcw -8(%ebp) /* load modfied control word */
++
++ fldt 8(%ebp) /* round */
++ frndint
++
++ fldcw -4(%ebp) /* restore original control word */
++
++ leave
++ ret
+Index: qemu/bsd/i386/s_isnormal.c
+@@ -0,0 +1,85 @@
++/*-
++ * Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++ * Copyright (c) 2002-2004 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ *
++ * $FreeBSD: src/lib/msun/src/s_isnormal.c,v 1.1 2004/07/09 03:32:39 das Exp $
++ */
++
++union IEEEf2bits {
++ float f;
++ struct {
++ unsigned int man :23;
++ unsigned int exp :8;
++ unsigned int sign :1;
++ } bits;
++};
++
++union IEEEd2bits {
++ double d;
++ struct {
++ unsigned int manl :32;
++ unsigned int manh :20;
++ unsigned int exp :11;
++ unsigned int sign :1;
++ } bits;
++};
++
++union IEEEl2bits {
++ long double e;
++ struct {
++ unsigned int manl :32;
++ unsigned int manh :32;
++ unsigned int exp :15;
++ unsigned int sign :1;
++ unsigned int junk :16;
++ } bits;
++};
++
++int
++__isnormal(double d)
++{
++ union IEEEd2bits u;
++
++ u.d = d;
++ return (u.bits.exp != 0 && u.bits.exp != 2047);
++}
++
++int
++__isnormalf(float f)
++{
++ union IEEEf2bits u;
++
++ u.f = f;
++ return (u.bits.exp != 0 && u.bits.exp != 255);
++}
++
++int
++__isnormall(long double e)
++{
++ union IEEEl2bits u;
++
++ u.e = e;
++ return (u.bits.exp != 0 && u.bits.exp != 32767);
++}
+Index: qemu/bsd/i386/s_llrint.S
+@@ -0,0 +1,36 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_llrint.S,v 1.1 2005/01/11 23:10:53 das Exp $");
++
++ENTRY(llrint)
++ fldl 4(%esp)
++ subl $8,%esp
++ fistpll (%esp)
++ popl %eax
++ popl %edx
++ ret
+Index: qemu/bsd/i386/s_llrintf.S
+@@ -0,0 +1,36 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_llrintf.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++
++ENTRY(llrintf)
++ flds 4(%esp)
++ subl $8,%esp
++ fistpll (%esp)
++ popl %eax
++ popl %edx
++ ret
+Index: qemu/bsd/i386/s_llrintl.S
+@@ -0,0 +1,35 @@
++/* Round argument to nearest integral value according to current rounding
++ direction.
++ Copyright (C) 1997 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Ulrich Drepper <drepper at cygnus.com>, 1997.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++ .text
++ENTRY(__llrintl)
++ fldt 4(%esp)
++ subl $8, %esp
++ fistpll (%esp)
++ fwait
++ popl %eax
++ popl %edx
++ ret
++END(__llrintl)
++weak_alias (__llrintl, llrintl)
+Index: qemu/bsd/i386/s_lrint.S
+@@ -0,0 +1,35 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_lrint.S,v 1.1 2005/01/11 23:10:53 das Exp $");
++
++ENTRY(lrint)
++ fldl 4(%esp)
++ subl $4,%esp
++ fistpl (%esp)
++ popl %eax
++ ret
+Index: qemu/bsd/i386/s_lrintf.S
+@@ -0,0 +1,35 @@
++/*-
++ * Copyright (c) 2005 David Schultz <das at FreeBSD.ORG>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
++ */
++
++#include <machine/asm.h>
++RCSID("$FreeBSD: src/lib/msun/i387/s_lrintf.S,v 1.1 2005/04/16 21:12:55 das Exp $")
++
++ENTRY(lrintf)
++ flds 4(%esp)
++ subl $4,%esp
++ fistpl (%esp)
++ popl %eax
++ ret
+Index: qemu/bsd/i386/s_lrintl.S
+@@ -0,0 +1,34 @@
++/* Round argument to nearest integral value according to current rounding
++ direction.
++ Copyright (C) 1997 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Ulrich Drepper <drepper at cygnus.com>, 1997.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, write to the Free
++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA. */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++ .text
++ENTRY(__lrintl)
++ fldt 4(%esp)
++ subl $4, %esp
++ fistpl (%esp)
++ fwait
++ popl %eax
++ ret
++END(__lrintl)
++weak_alias (__lrintl, lrintl)
+Index: qemu/bsd/i386/s_rintl.c
+@@ -0,0 +1,18 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Changes for long double by Ulrich Drepper <drepper at cygnus.com>
++ * Public domain.
++ */
++
++#include <sysdep.h>
++
++long double
++__rintl (long double x)
++{
++ long double res;
++
++ asm ("frndint" : "=t" (res) : "0" (x));
++ return res;
++}
++
++weak_alias (__rintl, rintl)
+Index: qemu/bsd/i386/s_round.c
+@@ -0,0 +1,51 @@
++/*-
++ * Copyright (c) 2003, Steven G. Kargl
++ * All rights reserved.
++ *
++ * 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 unmodified, 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.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
++ */
++
++#include <sys/cdefs.h>
++__FBSDID("$FreeBSD: src/lib/msun/src/s_round.c,v 1.3 2005/01/13 15:43:41 das Exp $");
++
++#include <math.h>
++
++double
++round(double x)
++{
++ double t;
++
++ if (!isfinite(x))
++ return (x);
++
++ if (x >= 0.0) {
++ t = ceil(x);
++ if (t - x > 0.5)
++ t -= 1.0;
++ return (t);
++ } else {
++ t = ceil(-x);
++ if (t + x > 0.5)
++ t -= 1.0;
++ return (-t);
++ }
++}
+Index: qemu/bsd/i386/s_sinl.S
+@@ -0,0 +1,32 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__sinl)
++ fldt 4(%esp)
++ fsin
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ ret
++ .align ALIGNARG(4)
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fsin
++ ret
++END (__sinl)
++weak_alias (__sinl, sinl)
+Index: qemu/bsd/i386/s_tanl.S
+@@ -0,0 +1,33 @@
++/*
++ * Written by J.T. Conklin <jtc at netbsd.org>.
++ * Public domain.
++ *
++ * Adapted for `long double' by Ulrich Drepper <drepper at cygnus.com>.
++ */
++
++#include <machine/asm.h>
++#include <sysdep.h>
++
++RCSID("$NetBSD: $")
++
++ENTRY(__tanl)
++ fldt 4(%esp)
++ fptan
++ fnstsw %ax
++ testl $0x400,%eax
++ jnz 1f
++ fstp %st(0)
++ ret
++1: fldpi
++ fadd %st(0)
++ fxch %st(1)
++2: fprem1
++ fstsw %ax
++ testl $0x400,%eax
++ jnz 2b
++ fstp %st(1)
++ fptan
++ fstp %st(0)
++ ret
++END (__tanl)
++weak_alias (__tanl, tanl)
+Index: qemu/bsd/sysdep.h
+@@ -0,0 +1,20 @@
++#ifndef _QEMU_BSD_SYSDEP_H_
++#define _QEMU_BSD_SYSDEP_H_
++
++#include <sys/cdefs.h>
++
++#define HAVE_ELF
++
++#ifdef __ASSEMBLER__
++#define ALIGNARG(log2) 1<<log2
++#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
++#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
++#define END(x)
++#define strong_alias(sym,alias) .set alias,sym;
++#define weak_alias(sym,alias) .weak alias; .equ alias,sym;
++#else
++#define strong_alias(sym,alias) __strong_reference(sym,alias);
++#define weak_alias(sym,alias) __weak_reference(sym,alias);
++#endif
++
++#endif
More information about the freebsd-amd64
mailing list