new floating point constant mechanism
This commit is contained in:
		
							parent
							
								
									1c848c8db3
								
							
						
					
					
						commit
						c820d77690
					
				
					 15 changed files with 30 additions and 610 deletions
				
			
		|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -40,153 +40,8 @@ con_mult(sz) word sz; { | |||
| 	fprintf(codefile,".data4 %s\n",str); | ||||
| } | ||||
| 
 | ||||
| #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 | ||||
| #if TBL68881 | ||||
| #define OWNFLOAT | ||||
| #else | ||||
| #define IEEEFLOAT | ||||
| #endif | ||||
| 
 | ||||
| con_float() { | ||||
| 	double f; | ||||
| 	double atof(); | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	double frexp(); | ||||
| #ifndef OWNFLOAT | ||||
| 	int sign = 0; | ||||
| 	int fraction[4] ; | ||||
| #else OWNFLOAT | ||||
| 	float fl; | ||||
| 	char *p; | ||||
| #endif OWNFLOAT | ||||
| 
 | ||||
| 	if (argval!= 4 && argval!= 8)	{ | ||||
| 		fprintf(stderr,"float constant size = %ld\n",argval); | ||||
| 		fatal("bad fcon size"); | ||||
| 	} | ||||
| 	fprintf(codefile,"!float %s sz %ld\n", str, argval); | ||||
| 	f = atof(str); | ||||
| 	if (f == 0) { | ||||
| 		if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		return; | ||||
| 	} | ||||
| #ifdef OWNFLOAT | ||||
| 	if (argval == 4) { | ||||
| 		/* careful: avoid overflow */ | ||||
| 		double ldexp(); | ||||
| 		f = frexp(f, &i); | ||||
| 		fl = f; | ||||
| 		fl = frexp(fl,&j); | ||||
| 		if (i+j > 127) { | ||||
| 			/* overflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0377, 0377, 0377 ! overflow\n", | ||||
| 				f < 0 ? 0377 : 0177); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (i+j < -127) { | ||||
| 			/* underflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0200, 0, 0 ! underflow\n", | ||||
| 				f < 0 ? 0200 : 0); | ||||
| 			return; | ||||
| 		} | ||||
| 		fl = ldexp(fl, i+j); | ||||
| 		p = (char *) &fl; | ||||
| 	} | ||||
| 	else { | ||||
| 		p = (char *) &f; | ||||
| 	} | ||||
| 	fprintf(codefile, ".data1 0%o", *p++ & 0377); | ||||
| 	for (i = argval-1; i; i--) { | ||||
| 		fprintf(codefile,",0%o", *p++ & 0377); | ||||
| 	} | ||||
| #else OWNFLOAT | ||||
| 	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 */ | ||||
| #ifdef IEEEFLOAT | ||||
| 	if (argval == 4) { | ||||
| #endif IEEEFLOAT | ||||
| 		i = (i + 128) & 0377; | ||||
| 		fraction[0] = (sign << 15) | (i << 7); | ||||
| 		for (j = 6; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				f -= 1.0; | ||||
| 				fraction[0] |= (1 << j); | ||||
| 			} | ||||
| 		} | ||||
| #ifdef IEEEFLOAT | ||||
| 	} | ||||
| 	else { | ||||
| 		i = (i + 1024) & 03777; | ||||
| 		fraction[0] = (sign << 15) | (i << 4); | ||||
| 		for (j = 3; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[0] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif IEEEFLOAT | ||||
| 	for (i = 1; i < argval / 2; i++) { | ||||
| 		fraction[i] = 0; | ||||
| 		for (j = 15; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[i] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	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 | ||||
| #define ACKFLOAT 1 | ||||
| #include <con_float> | ||||
| 
 | ||||
| regscore(off,size,typ,score,totyp) | ||||
| 	long off; | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -40,153 +40,8 @@ con_mult(sz) word sz; { | |||
| 	fprintf(codefile,".data4 %s\n",str); | ||||
| } | ||||
| 
 | ||||
| #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 | ||||
| #if TBL68881 | ||||
| #define OWNFLOAT | ||||
| #else | ||||
| #define IEEEFLOAT | ||||
| #endif | ||||
| 
 | ||||
| con_float() { | ||||
| 	double f; | ||||
| 	double atof(); | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	double frexp(); | ||||
| #ifndef OWNFLOAT | ||||
| 	int sign = 0; | ||||
| 	int fraction[4] ; | ||||
| #else OWNFLOAT | ||||
| 	float fl; | ||||
| 	char *p; | ||||
| #endif OWNFLOAT | ||||
| 
 | ||||
| 	if (argval!= 4 && argval!= 8)	{ | ||||
| 		fprintf(stderr,"float constant size = %ld\n",argval); | ||||
| 		fatal("bad fcon size"); | ||||
| 	} | ||||
| 	fprintf(codefile,"!float %s sz %ld\n", str, argval); | ||||
| 	f = atof(str); | ||||
| 	if (f == 0) { | ||||
| 		if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		return; | ||||
| 	} | ||||
| #ifdef OWNFLOAT | ||||
| 	if (argval == 4) { | ||||
| 		/* careful: avoid overflow */ | ||||
| 		double ldexp(); | ||||
| 		f = frexp(f, &i); | ||||
| 		fl = f; | ||||
| 		fl = frexp(fl,&j); | ||||
| 		if (i+j > 127) { | ||||
| 			/* overflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0377, 0377, 0377 ! overflow\n", | ||||
| 				f < 0 ? 0377 : 0177); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (i+j < -127) { | ||||
| 			/* underflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0200, 0, 0 ! underflow\n", | ||||
| 				f < 0 ? 0200 : 0); | ||||
| 			return; | ||||
| 		} | ||||
| 		fl = ldexp(fl, i+j); | ||||
| 		p = (char *) &fl; | ||||
| 	} | ||||
| 	else { | ||||
| 		p = (char *) &f; | ||||
| 	} | ||||
| 	fprintf(codefile, ".data1 0%o", *p++ & 0377); | ||||
| 	for (i = argval-1; i; i--) { | ||||
| 		fprintf(codefile,",0%o", *p++ & 0377); | ||||
| 	} | ||||
| #else OWNFLOAT | ||||
| 	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 */ | ||||
| #ifdef IEEEFLOAT | ||||
| 	if (argval == 4) { | ||||
| #endif IEEEFLOAT | ||||
| 		i = (i + 128) & 0377; | ||||
| 		fraction[0] = (sign << 15) | (i << 7); | ||||
| 		for (j = 6; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				f -= 1.0; | ||||
| 				fraction[0] |= (1 << j); | ||||
| 			} | ||||
| 		} | ||||
| #ifdef IEEEFLOAT | ||||
| 	} | ||||
| 	else { | ||||
| 		i = (i + 1024) & 03777; | ||||
| 		fraction[0] = (sign << 15) | (i << 4); | ||||
| 		for (j = 3; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[0] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif IEEEFLOAT | ||||
| 	for (i = 1; i < argval / 2; i++) { | ||||
| 		fraction[i] = 0; | ||||
| 		for (j = 15; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[i] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	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 | ||||
| #define ACKFLOAT 1 | ||||
| #include <con_float> | ||||
| 
 | ||||
| regscore(off,size,typ,score,totyp) | ||||
| 	long off; | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -40,153 +40,8 @@ con_mult(sz) word sz; { | |||
| 	fprintf(codefile,".data4 %s\n",str); | ||||
| } | ||||
| 
 | ||||
| #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 | ||||
| #if TBL68881 | ||||
| #define OWNFLOAT | ||||
| #else | ||||
| #define IEEEFLOAT | ||||
| #endif | ||||
| 
 | ||||
| con_float() { | ||||
| 	double f; | ||||
| 	double atof(); | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	double frexp(); | ||||
| #ifndef OWNFLOAT | ||||
| 	int sign = 0; | ||||
| 	int fraction[4] ; | ||||
| #else OWNFLOAT | ||||
| 	float fl; | ||||
| 	char *p; | ||||
| #endif OWNFLOAT | ||||
| 
 | ||||
| 	if (argval!= 4 && argval!= 8)	{ | ||||
| 		fprintf(stderr,"float constant size = %ld\n",argval); | ||||
| 		fatal("bad fcon size"); | ||||
| 	} | ||||
| 	fprintf(codefile,"!float %s sz %ld\n", str, argval); | ||||
| 	f = atof(str); | ||||
| 	if (f == 0) { | ||||
| 		if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		return; | ||||
| 	} | ||||
| #ifdef OWNFLOAT | ||||
| 	if (argval == 4) { | ||||
| 		/* careful: avoid overflow */ | ||||
| 		double ldexp(); | ||||
| 		f = frexp(f, &i); | ||||
| 		fl = f; | ||||
| 		fl = frexp(fl,&j); | ||||
| 		if (i+j > 127) { | ||||
| 			/* overflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0377, 0377, 0377 ! overflow\n", | ||||
| 				f < 0 ? 0377 : 0177); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (i+j < -127) { | ||||
| 			/* underflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0200, 0, 0 ! underflow\n", | ||||
| 				f < 0 ? 0200 : 0); | ||||
| 			return; | ||||
| 		} | ||||
| 		fl = ldexp(fl, i+j); | ||||
| 		p = (char *) &fl; | ||||
| 	} | ||||
| 	else { | ||||
| 		p = (char *) &f; | ||||
| 	} | ||||
| 	fprintf(codefile, ".data1 0%o", *p++ & 0377); | ||||
| 	for (i = argval-1; i; i--) { | ||||
| 		fprintf(codefile,",0%o", *p++ & 0377); | ||||
| 	} | ||||
| #else OWNFLOAT | ||||
| 	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 */ | ||||
| #ifdef IEEEFLOAT | ||||
| 	if (argval == 4) { | ||||
| #endif IEEEFLOAT | ||||
| 		i = (i + 128) & 0377; | ||||
| 		fraction[0] = (sign << 15) | (i << 7); | ||||
| 		for (j = 6; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				f -= 1.0; | ||||
| 				fraction[0] |= (1 << j); | ||||
| 			} | ||||
| 		} | ||||
| #ifdef IEEEFLOAT | ||||
| 	} | ||||
| 	else { | ||||
| 		i = (i + 1024) & 03777; | ||||
| 		fraction[0] = (sign << 15) | (i << 4); | ||||
| 		for (j = 3; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[0] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif IEEEFLOAT | ||||
| 	for (i = 1; i < argval / 2; i++) { | ||||
| 		fraction[i] = 0; | ||||
| 		for (j = 15; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[i] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	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 | ||||
| #define ACKFLOAT 1 | ||||
| #include <con_float> | ||||
| 
 | ||||
| regscore(off,size,typ,score,totyp) | ||||
| 	long off; | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -40,153 +40,8 @@ con_mult(sz) word sz; { | |||
| 	fprintf(codefile,".data4 %s\n",str); | ||||
| } | ||||
| 
 | ||||
| #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 | ||||
| #if TBL68881 | ||||
| #define OWNFLOAT | ||||
| #else | ||||
| #define IEEEFLOAT | ||||
| #endif | ||||
| 
 | ||||
| con_float() { | ||||
| 	double f; | ||||
| 	double atof(); | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	double frexp(); | ||||
| #ifndef OWNFLOAT | ||||
| 	int sign = 0; | ||||
| 	int fraction[4] ; | ||||
| #else OWNFLOAT | ||||
| 	float fl; | ||||
| 	char *p; | ||||
| #endif OWNFLOAT | ||||
| 
 | ||||
| 	if (argval!= 4 && argval!= 8)	{ | ||||
| 		fprintf(stderr,"float constant size = %ld\n",argval); | ||||
| 		fatal("bad fcon size"); | ||||
| 	} | ||||
| 	fprintf(codefile,"!float %s sz %ld\n", str, argval); | ||||
| 	f = atof(str); | ||||
| 	if (f == 0) { | ||||
| 		if (argval == 8) fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		fprintf(codefile, ".data2 0, 0\n"); | ||||
| 		return; | ||||
| 	} | ||||
| #ifdef OWNFLOAT | ||||
| 	if (argval == 4) { | ||||
| 		/* careful: avoid overflow */ | ||||
| 		double ldexp(); | ||||
| 		f = frexp(f, &i); | ||||
| 		fl = f; | ||||
| 		fl = frexp(fl,&j); | ||||
| 		if (i+j > 127) { | ||||
| 			/* overflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0377, 0377, 0377 ! overflow\n", | ||||
| 				f < 0 ? 0377 : 0177); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (i+j < -127) { | ||||
| 			/* underflow situation */ | ||||
| 			fprintf(codefile, ".data1 0%o, 0200, 0, 0 ! underflow\n", | ||||
| 				f < 0 ? 0200 : 0); | ||||
| 			return; | ||||
| 		} | ||||
| 		fl = ldexp(fl, i+j); | ||||
| 		p = (char *) &fl; | ||||
| 	} | ||||
| 	else { | ||||
| 		p = (char *) &f; | ||||
| 	} | ||||
| 	fprintf(codefile, ".data1 0%o", *p++ & 0377); | ||||
| 	for (i = argval-1; i; i--) { | ||||
| 		fprintf(codefile,",0%o", *p++ & 0377); | ||||
| 	} | ||||
| #else OWNFLOAT | ||||
| 	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 */ | ||||
| #ifdef IEEEFLOAT | ||||
| 	if (argval == 4) { | ||||
| #endif IEEEFLOAT | ||||
| 		i = (i + 128) & 0377; | ||||
| 		fraction[0] = (sign << 15) | (i << 7); | ||||
| 		for (j = 6; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				f -= 1.0; | ||||
| 				fraction[0] |= (1 << j); | ||||
| 			} | ||||
| 		} | ||||
| #ifdef IEEEFLOAT | ||||
| 	} | ||||
| 	else { | ||||
| 		i = (i + 1024) & 03777; | ||||
| 		fraction[0] = (sign << 15) | (i << 4); | ||||
| 		for (j = 3; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[0] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif IEEEFLOAT | ||||
| 	for (i = 1; i < argval / 2; i++) { | ||||
| 		fraction[i] = 0; | ||||
| 		for (j = 15; j>= 0; j--) { | ||||
| 			f *= 2; | ||||
| 			if (f >= 1.0) { | ||||
| 				fraction[i] |= (1 << j); | ||||
| 				f -= 1.0; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	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 | ||||
| #define ACKFLOAT 1 | ||||
| #include <con_float> | ||||
| 
 | ||||
| regscore(off,size,typ,score,totyp) | ||||
| 	long off; | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | |||
| #cgg options
 | ||||
| CGGFLAGS= | ||||
| 
 | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | ||||
| PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||
| PFLAGS= | ||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||
| LDFLAGS=-i $(PFLAGS) | ||||
| LINTOPTS=-bx | ||||
| LIBS=$(EMHOME)/lib/em_data.a | ||||
| LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||
| CDIR=$(EMHOME)/mach/proto/ncg | ||||
| CGG=$(EMHOME)/lib/ncgg | ||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue