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, &sectorsize) &&
-+        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-emulation mailing list