i386/125012: ports/math/ldouble for 128bit long double on i386

Satoshi Kimura satosi.kimura at nifty.com
Thu Jun 26 16:10:08 UTC 2008


>Number:         125012
>Category:       i386
>Synopsis:       ports/math/ldouble for 128bit long double on i386
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-i386
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jun 26 16:10:08 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Satoshi Kimura
>Release:        6.2
>Organization:
private use
>Environment:
FreeBSD 6.2-RELEASE #0: Fri Jan 12 11:05:30 UTC 2007
    root at dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP

>Description:
1. problem
  On FreeBSD/i386 and /pc98, some functions of ports/math/ldouble
did not work at 128bit "long double", i.e "long double" compiled
by gcc with -m128bit-long-double option.

>How-To-Repeat:
(1) add in makefile to make test code "mtstl"
  all: mtstl

make it, and run it. This program makes no trouble.

% mtstl

(2) add the line of "CFLAGS=" of makefile
 -m128bit-long-double

make mtstl again, and run it. This program makes troubles.

>Fix:
2. patch
  Following patches are available to solve this problem.
These modifications did not effect to 96bit long double,
so we did not need to prepare two kind of sources and libraries. 

(1) patch for libml

--- floorl.c.org        Mon May 29 00:19:17 2000
+++ floorl.c    Tue Jun  3 00:24:43 2008
@@ -116,7 +116,7 @@
 union
   {
     long double d;
-    short i[6];
+    short i[8];
   } u;
 
 u.d = x;
@@ -189,7 +189,7 @@
 union
   {
     long double y;
-    unsigned short sh[6];
+    unsigned short sh[8];
   } u;
 int e;
 
@@ -260,7 +260,7 @@
 union
   {
     long double y;
-    unsigned short sh[6];
+    unsigned short sh[8];
   } u;
 int i, k;
 short *q;
@@ -349,7 +349,7 @@
 union
   {
     long double y;
-    unsigned short sh[6];
+    unsigned short sh[8];
   } u;
 unsigned short *q;
 long e;--- isnanl.c.org        Mon Jun 15 21:16:45 1998
+++ isnanl.c    Tue Jun  3 00:30:48 2008
@@ -58,8 +58,8 @@
 union
        {
        long double d;
-       short s[6];
-       int i[3];
+       short s[8];
+       int i[4];
        } u;
 
 u.d = x;
@@ -94,8 +94,8 @@
 union
        {
        long double d;
-       unsigned short s[6];
-       unsigned int i[3];
+       unsigned short s[8];
+       unsigned int i[4];
        } u;
 
 u.d = x;
@@ -149,8 +149,8 @@
 union
        {
        long double d;
-       unsigned short s[6];
-       unsigned int i[3];
+       unsigned short s[8];
+       unsigned int i[4];
        } u;
 
 u.d = x;
--- ldrand.c.org        Mon May 29 00:17:29 2000
+++ ldrand.c    Tue Jun  3 00:29:13 2008
@@ -114,7 +114,11 @@
 unkans.d -= r;
 unkans.d += 1.0L;
 
+#ifdef __FreeBSD__
+if( 0 )
+#else
 if( sizeof(long double) == 16 )
+#endif  /*  __FreeBSD__  */
   {
 #ifdef MIEEE
     ranwh();
--- nantst.c.org        Sun May 28 06:17:31 2000
+++ nantst.c    Tue Jun  3 00:33:16 2008
@@ -14,7 +14,7 @@
 union
   {
     long double f;
-    unsigned int i[3];
+    unsigned int i[4];
   }u;
 int k;
 
--- testvect.c.org      Sun Jun 14 02:30:29 1998
+++ testvect.c  Tue Jun  3 00:32:34 2008
@@ -374,7 +374,7 @@
   union
     {
       long double d;
-      char c[12];
+      char c[16];
     } u, v;
 
     /* This masks off fpu exceptions on i386.  */

(2) patch for mtstl (not used in ldouble as ports)

--- mtstl.c.org Sun Nov 12 09:24:27 2000
+++ mtstl.c     Tue Jun  3 00:25:43 2008
@@ -35,6 +35,11 @@
 Copyright 1984, 1987, 1988, 1995 by Stephen L. Moshier
 */
 
+#include <stdio.h>
+#ifdef __FreeBSD__
+#include <floatingpoint.h>
+#endif
+
 #include "mconf.h"
 
 /* C9X spells lgam lgamma.  */
@@ -239,7 +244,7 @@
 static double da, db, dc, dd;
 
 int ldrand();
-int printf();
+/* int printf(); */
 
 int
 main()
@@ -249,6 +254,11 @@
 struct fundef *d;
 int i, k, itst;
 int m, ntr;
+
+#if defined __FreeBSD__
+   fpsetprec(FP_PE);                /*  set double to 64 bit mode  */
+   fputs("** set double to 64 bit mode\n",stdout);
+#endif
 
 ntr = NTRIALS;
 printf( "Consistency test of math functions.\n" );


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-i386 mailing list