From: ceriel Date: Wed, 4 Oct 1989 10:28:50 +0000 (+0000) Subject: use the con_float include file X-Git-Tag: release-5-5~2268 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=463a0e7f4056e8edc59524b00841f1b65e3d5f64;p=ack.git use the con_float include file --- diff --git a/mach/pdp/cg/mach.c b/mach/pdp/cg/mach.c index ae9e51e84..aa07b6f78 100644 --- a/mach/pdp/cg/mach.c +++ b/mach/pdp/cg/mach.c @@ -46,78 +46,42 @@ con_mult(sz) word sz; { #endif } -/* - * The next function is difficult to do when not running on a PDP 11 or VAX - * The strategy followed is to assume the code generator is running on a PDP 11 - * unless the ACK_ASS define is on. - */ +#define PDPFLOAT +#include -con_float() { -#ifdef ACK_ASS - double f; - double atof(), frexp(); - int i, j; - int sign = 0; - int fraction ; - - if (argval != 4 && argval != 8) - fatal("bad fcon size"); - f = atof(str); - 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 --; - } - f = 2*f - 1.0; /* hidden bit */ - i = (i + 128) & 0377; - fraction = (sign << 15) | (i << 7); - for (j = 6; j>= 0; j--) { - f *= 2; - if (f >= 1.0) { - fraction |= (1 << j); - f -= 1.0; - } - } - fprintf(codefile, ".data2 0%o", fraction); - for (i = argval / 2 - 1; i; i--) { - fraction = 0; - for (j = 15; j>= 0; j--) { - f *= 2; - if (f >= 1.0) { - fraction |= (1 << j); - f -= 1.0; - } - } - fprintf(codefile, ", 0%o", fraction); - } - putc('\n', codefile); -#else - double f; - double atof(); +con_float() +{ + char buf[8]; + int rval = float_cst(str, argval, buf); int i; - short *p; - if (argval != 4 && argval != 8) - fatal("bad fcon size"); - f = atof(str); - p = (short *) &f; - i = *p++; - if (argval == 8) { - fprintf(codefile,"\t%o;%o;",i,*p++); - i = *p++; - } - fprintf(codefile,"\t%o;%o\n",i,*p++); + if (rval == 1) { + fprintf(stderr,"float constant size = %d\n",argval); + fatal("bad fcon size"); + } +#ifdef ACK_ASS + fprintf(codefile,"! float %s sz %d\n", str, argval); +#else + fprintf(codefile,"/ float %s sz %d\n", str, argval); +#endif + if (rval == 2) { + fprintf(stderr, "Warning: overflow in floating point constant %s\n", str); + } +#ifdef ACK_ASS + fprintf(codefile, ".data1 0%o", buf[1] & 0377); + for (i = 1; i < argval; i++) { + /* use little trick to get bytes out in swapped order ... */ + fprintf(codefile, ",0%o", buf[i^1] & 0377); + } +#else + for (i = 0; i < argval; i++) { + /* use little trick to get bytes out in swapped order ... */ + fprintf(codefile, "??? %o", buf[i^1] & 0377); + } #endif + putc('\n', codefile); } +#endif /* ACK_ASS */ #ifdef REGVARS