From 06c28ad222be0c398dba72dcbc3fd0ad477f0ec0 Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 20 Apr 1988 10:01:35 +0000 Subject: [PATCH] do not call frexp with 0.0; the SUN4 cannot stand it --- mach/i86/cg/mach.c | 68 +++++++++++++++++++++++++++++++----------- mach/i86/ncg/mach.c | 67 +++++++++++++++++++++++++++++++---------- mach/m68020/ncg/mach.c | 10 +++---- mach/m68k2/cg/mach.c | 12 ++++---- mach/m68k2/ncg/mach.c | 10 +++---- mach/m68k4/ncg/mach.c | 10 +++---- mach/moon3/ncg/mach.c | 10 +++---- 7 files changed, 128 insertions(+), 59 deletions(-) diff --git a/mach/i86/cg/mach.c b/mach/i86/cg/mach.c index 8dcccab46..431a870f6 100644 --- a/mach/i86/cg/mach.c +++ b/mach/i86/cg/mach.c @@ -41,20 +41,36 @@ con_mult(sz) word sz; { (int)l&0xFFFF,(int)(l>>16)&0xFFFF); } +#ifdef NOFLOAT +con_float() { + +static int been_here; + if (argval != 4 && argval != 8) + fatal("bad fcon size"); + fputs(".data4\t", codefile); + if (argval == 8) + fputs("0,", codefile); + fputs("0 !dummy float\n", codefile); + if ( !been_here++) + { + fputs("Warning : dummy float-constant(s)\n", stderr); + } +} +#else #define IEEEFLOAT con_float() { double f; double atof(); - float fl; int i; #ifndef OWNFLOAT double f1; double frexp(), modf(); int j; int sign = 0; - int fraction ; + int fraction[4] ; #else OWNFLOAT + float fl; char *p; #endif OWNFLOAT @@ -77,16 +93,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; @@ -96,35 +112,53 @@ con_float() { if (argval == 4) { #endif IEEEFLOAT i = (i + 128) & 0377; - fraction = (sign << 15) | (i << 7); + fraction[0] = (sign << 15) | (i << 7); for (j = 6; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[0] |= (1 << j); f = modf(2*f, &f1); } #ifdef IEEEFLOAT } else { i = (i + 1024) & 03777; - fraction = (sign << 15) | (i << 4); + fraction[0] = (sign << 15) | (i << 4); for (j = 3; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[0] |= (1 << j); f = modf(2*f, &f1); } } #endif IEEEFLOAT - fprintf(codefile, ".data1 0%o, 0%o", (fraction>>8)&0377, fraction&0377); - for (i = argval / 2 - 1; i; i--) { - fraction = 0; + for (i = 1; i < argval / 2; i++) { + fraction[i] = 0; for (j = 15; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[i] |= (1 << j); f = modf(2*f, &f1); } - fprintf(codefile, ", 0%o, 0%o", (fraction>>8)&0377, fraction&0377); + } + if (f >= 0.5) { + for (i = argval/2 - 1; i >= 0; i--) { + for (j = 0; j < 16; j++) { + if (fraction[i] & (1 << j)) { + fraction[i] &= ~(1 << j); + } + else { + fraction[i] |= (1 << j); + break; + } + } + if (j != 16) break; + } + } + for (i = 0; i < argval/2; i++) { + fprintf(codefile, + i != 0 ? ", 0%o, 0%o" : ".data1 0%o, 0%o", + (fraction[i]>>8)&0377, + fraction[i]&0377); } #endif OWNFLOAT putc('\n', codefile); } - +#endif /* string holstr(n) word n; { diff --git a/mach/i86/ncg/mach.c b/mach/i86/ncg/mach.c index 8dcccab46..b94b46ae7 100644 --- a/mach/i86/ncg/mach.c +++ b/mach/i86/ncg/mach.c @@ -41,20 +41,36 @@ con_mult(sz) word sz; { (int)l&0xFFFF,(int)(l>>16)&0xFFFF); } +#ifdef NOFLOAT +con_float() { + +static int been_here; + if (argval != 4 && argval != 8) + fatal("bad fcon size"); + fputs(".data4\t", codefile); + if (argval == 8) + fputs("0,", codefile); + fputs("0 !dummy float\n", codefile); + if ( !been_here++) + { + fputs("Warning : dummy float-constant(s)\n", stderr); + } +} +#else #define IEEEFLOAT con_float() { double f; double atof(); - float fl; int i; #ifndef OWNFLOAT double f1; double frexp(), modf(); int j; int sign = 0; - int fraction ; + int fraction[4] ; #else OWNFLOAT + float fl; char *p; #endif OWNFLOAT @@ -77,16 +93,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; @@ -96,34 +112,53 @@ con_float() { if (argval == 4) { #endif IEEEFLOAT i = (i + 128) & 0377; - fraction = (sign << 15) | (i << 7); + fraction[0] = (sign << 15) | (i << 7); for (j = 6; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[0] |= (1 << j); f = modf(2*f, &f1); } #ifdef IEEEFLOAT } else { i = (i + 1024) & 03777; - fraction = (sign << 15) | (i << 4); + fraction[0] = (sign << 15) | (i << 4); for (j = 3; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[0] |= (1 << j); f = modf(2*f, &f1); } } #endif IEEEFLOAT - fprintf(codefile, ".data1 0%o, 0%o", (fraction>>8)&0377, fraction&0377); - for (i = argval / 2 - 1; i; i--) { - fraction = 0; + for (i = 1; i < argval / 2; i++) { + fraction[i] = 0; for (j = 15; j>= 0; j--) { - if (f >= 0.5) fraction |= (1 << j); + if (f >= 0.5) fraction[i] |= (1 << j); f = modf(2*f, &f1); } - fprintf(codefile, ", 0%o, 0%o", (fraction>>8)&0377, fraction&0377); + } + if (f >= 0.5) { + for (i = argval/2 - 1; i >= 0; i--) { + for (j = 0; j < 16; j++) { + if (fraction[i] & (1 << j)) { + fraction[i] &= ~(1 << j); + } + else { + fraction[i] |= (1 << j); + break; + } + } + if (j != 16) break; + } + } + for (i = 0; i < argval/2; i++) { + fprintf(codefile, + i != 0 ? ", 0%o, 0%o" : ".data1 0%o, 0%o", + (fraction[i]>>8)&0377, + fraction[i]&0377); } #endif OWNFLOAT putc('\n', codefile); } +#endif /* diff --git a/mach/m68020/ncg/mach.c b/mach/m68020/ncg/mach.c index 2f1f05369..cf1056ece 100644 --- a/mach/m68020/ncg/mach.c +++ b/mach/m68020/ncg/mach.c @@ -92,16 +92,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; diff --git a/mach/m68k2/cg/mach.c b/mach/m68k2/cg/mach.c index 58601dd52..2fefd3f22 100644 --- a/mach/m68k2/cg/mach.c +++ b/mach/m68k2/cg/mach.c @@ -60,7 +60,6 @@ static int been_here; con_float() { double f; double atof(); - float fl; int i; #ifndef OWNFLOAT double f1; @@ -69,6 +68,7 @@ con_float() { int sign = 0; int fraction[4] ; #else OWNFLOAT + float fl; char *p; #endif OWNFLOAT @@ -91,16 +91,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; diff --git a/mach/m68k2/ncg/mach.c b/mach/m68k2/ncg/mach.c index 2f1f05369..cf1056ece 100644 --- a/mach/m68k2/ncg/mach.c +++ b/mach/m68k2/ncg/mach.c @@ -92,16 +92,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; diff --git a/mach/m68k4/ncg/mach.c b/mach/m68k4/ncg/mach.c index 2f1f05369..cf1056ece 100644 --- a/mach/m68k4/ncg/mach.c +++ b/mach/m68k4/ncg/mach.c @@ -92,16 +92,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; diff --git a/mach/moon3/ncg/mach.c b/mach/moon3/ncg/mach.c index 2f1f05369..cf1056ece 100644 --- a/mach/moon3/ncg/mach.c +++ b/mach/moon3/ncg/mach.c @@ -92,16 +92,16 @@ con_float() { fprintf(codefile,",0%o", *p++ & 0377); } #else OWNFLOAT - f = frexp(f, &i); - if (f < 0) { - f = -f; - sign = 1; - } if (f == 0) { if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); fprintf(codefile, ".data2 0, 0\n"); return; } + f = frexp(f, &i); + if (f < 0) { + f = -f; + sign = 1; + } while (f < 0.5) { f += f; i --; -- 2.34.1