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
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | 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); | 	fprintf(codefile,".data4 %s\n",str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef NOFLOAT | #define ACKFLOAT 1 | ||||||
| con_float() { | #include <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 |  | ||||||
| 
 | 
 | ||||||
| regscore(off,size,typ,score,totyp) | regscore(off,size,typ,score,totyp) | ||||||
| 	long off; | 	long off; | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | 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); | 	fprintf(codefile,".data4 %s\n",str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef NOFLOAT | #define ACKFLOAT 1 | ||||||
| con_float() { | #include <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 |  | ||||||
| 
 | 
 | ||||||
| regscore(off,size,typ,score,totyp) | regscore(off,size,typ,score,totyp) | ||||||
| 	long off; | 	long off; | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | 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); | 	fprintf(codefile,".data4 %s\n",str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef NOFLOAT | #define ACKFLOAT 1 | ||||||
| con_float() { | #include <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 |  | ||||||
| 
 | 
 | ||||||
| regscore(off,size,typ,score,totyp) | regscore(off,size,typ,score,totyp) | ||||||
| 	long off; | 	long off; | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | 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); | 	fprintf(codefile,".data4 %s\n",str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef NOFLOAT | #define ACKFLOAT 1 | ||||||
| con_float() { | #include <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 |  | ||||||
| 
 | 
 | ||||||
| regscore(off,size,typ,score,totyp) | regscore(off,size,typ,score,totyp) | ||||||
| 	long off; | 	long off; | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
|  | @ -6,12 +6,12 @@ TABLEFLAGS= | ||||||
| #cgg options
 | #cgg options
 | ||||||
| CGGFLAGS= | CGGFLAGS= | ||||||
| 
 | 
 | ||||||
| PREFLAGS=-I$(EMHOME)/h -I. -DNDEBUG | PREFLAGS=-I$(EMHOME)/h -I. -I$(EMHOME)/mach -I$(EMHOME)/modules/h -DNDEBUG | ||||||
| PFLAGS= | PFLAGS= | ||||||
| CFLAGS=$(PREFLAGS) $(PFLAGS) -O | CFLAGS=$(PREFLAGS) $(PFLAGS) -O | ||||||
| LDFLAGS=-i $(PFLAGS) | LDFLAGS=-i $(PFLAGS) | ||||||
| LINTOPTS=-bx | LINTOPTS=-bx | ||||||
| LIBS=$(EMHOME)/lib/em_data.a | LIBS=$(EMHOME)/lib/em_data.a $(EMHOME)/modules/lib/libflt.a | ||||||
| CDIR=$(EMHOME)/mach/proto/ncg | CDIR=$(EMHOME)/mach/proto/ncg | ||||||
| CGG=$(EMHOME)/lib/ncgg | CGG=$(EMHOME)/lib/ncgg | ||||||
| CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | CFILES=$(CDIR)/codegen.c $(CDIR)/compute.c $(CDIR)/equiv.c $(CDIR)/fillem.c \
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue