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