do not call frexp with 0.0; the SUN4 cannot stand it

This commit is contained in:
ceriel 1988-04-20 10:01:35 +00:00
parent 865e5b607a
commit 06c28ad222
7 changed files with 128 additions and 59 deletions

View file

@ -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; {

View file

@ -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
/*

View file

@ -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 --;

View file

@ -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 --;

View file

@ -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 --;

View file

@ -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 --;

View file

@ -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 --;