383 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Sources of the "CONVERT" group instructions
 | |
|  */
 | |
| 
 | |
| /* $Id$ */
 | |
| 
 | |
| #include	<em_abs.h>
 | |
| #include	"nofloat.h"
 | |
| #include	"global.h"
 | |
| #include	"log.h"
 | |
| #include	"mem.h"
 | |
| #include	"trap.h"
 | |
| #include	"text.h"
 | |
| #include	"fra.h"
 | |
| #include	"warn.h"
 | |
| 
 | |
| #ifndef	NOFLOAT
 | |
| extern double fpop();
 | |
| #endif	/* NOFLOAT */
 | |
| 
 | |
| DoCII()
 | |
| {
 | |
| 	/* CII -: Convert integer to integer (*) */
 | |
| 	register int newsize = swpop();
 | |
| 	register long s;
 | |
| 
 | |
| 	LOG(("@C6 DoCII()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 12:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		npush(spop(1L), 2L);
 | |
| 		return;
 | |
| 	case 14:
 | |
| 		npush(spop(1L), 4L);
 | |
| 		return;
 | |
| 	case 22:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		return;
 | |
| 	case 24:
 | |
| 		npush(spop(2L), 4L);
 | |
| 		return;
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		s = spop(4L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (s < I_MINS2 || s > I_MAXS2)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush(s, 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| DoCUI()
 | |
| {
 | |
| 	/* CUI -: Convert unsigned to integer (*) */
 | |
| 	register int newsize = swpop();
 | |
| 	register unsigned long u;
 | |
| 
 | |
| 	LOG(("@C6 DoCUI()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 22:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		u = upop(2L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (u > I_MAXS2)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) u, 2L);
 | |
| 		return;
 | |
| 	case 24:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		npush((long) upop(2L), 4L);
 | |
| 		return;
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		u = upop(4L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (u > I_MAXS2)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) u, 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		u = upop(4L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (u > I_MAXS4)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) u, 4L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| DoCFI()
 | |
| {
 | |
| 	/* CFI -: Convert floating to integer (*) */
 | |
| #ifndef	NOFLOAT
 | |
| 	register int newsize = swpop();
 | |
| 	double f;
 | |
| 
 | |
| 	LOG(("@C6 DoCFI()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		f = fpop(4L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (f <= (FL_MINS2 - 1.0) || f > FL_MAXS2)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) f, 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		f = fpop(4L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (f <= (FL_MINS4 - 1.0) || f > FL_MAXS4)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) f, 4L);
 | |
| 		return;
 | |
| 	case 82:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		f = fpop(8L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (f <= (FL_MINS2 - 1.0) || f > FL_MAXS2)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) f, 2L);
 | |
| 		return;
 | |
| 	case 84:
 | |
| 		f = fpop(8L);
 | |
| 		if (must_test && !(IgnMask&BIT(ECONV))) {
 | |
| 			if (f <= (FL_MINS4 - 1.0) || f > FL_MAXS4)
 | |
| 				trap(ECONV);
 | |
| 		}
 | |
| 		npush((long) f, 4L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| #else	/* NOFLOAT */
 | |
| 	nofloat();
 | |
| #endif	/* NOFLOAT */
 | |
| }
 | |
| 
 | |
| DoCIF()
 | |
| {
 | |
| 	/* CIF -: Convert integer to floating (*) */
 | |
| #ifndef	NOFLOAT
 | |
| 	register int newsize = swpop();
 | |
| 
 | |
| 	LOG(("@C6 DoCIF()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 24:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		fpush((double) spop(2L), 4L);
 | |
| 		return;
 | |
| 	case 28:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		fpush((double) spop(2L), 8L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		fpush((double) spop(4L), 4L);
 | |
| 		return;
 | |
| 	case 48:
 | |
| 		fpush((double) spop(4L), 8L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| #else	/* NOFLOAT */
 | |
| 	nofloat();
 | |
| #endif	/* NOFLOAT */
 | |
| }
 | |
| 
 | |
| DoCUF()
 | |
| {
 | |
| 	/* CUF -: Convert unsigned to floating (*) */
 | |
| #ifndef	NOFLOAT
 | |
| 	register int newsize = swpop();
 | |
| 	register unsigned long u;
 | |
| 
 | |
| 	LOG(("@C6 DoCUF()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 24:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		fpush((double) upop(2L), 4L);
 | |
| 		return;
 | |
| 	case 28:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		fpush((double) upop(2L), 8L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		if ((u = upop(4L)) > I_MAXS4) {
 | |
| 			u -= I_MAXS4;
 | |
| 			u -= 1;
 | |
| 			fpush(((double) u) - (double)(-I_MAXS4-1), 4L);
 | |
| 		}
 | |
| 		else fpush((double) u, 4L);
 | |
| 		return;
 | |
| 	case 48:
 | |
| 		if ((u = upop(4L)) > I_MAXS4) {
 | |
| 			u -= I_MAXS4;
 | |
| 			u -= 1;
 | |
| 			fpush(((double) u) - (double)(-I_MAXS4-1), 8L);
 | |
| 		}
 | |
| 		else fpush((double) u, 8L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| #else	/* NOFLOAT */
 | |
| 	nofloat();
 | |
| #endif	/* NOFLOAT */
 | |
| }
 | |
| 
 | |
| DoCFF()
 | |
| {
 | |
| 	/* CFF -: Convert floating to floating (*) */
 | |
| #ifndef	NOFLOAT
 | |
| 	register int newsize = swpop();
 | |
| 
 | |
| 	LOG(("@C6 DoCFF()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 44:
 | |
| 		return;
 | |
| 	case 48:
 | |
| 		fpush(fpop(4L), 8L);
 | |
| 		return;
 | |
| 	case 88:
 | |
| 		return;
 | |
| 	case 84:
 | |
| 		fpush(fpop(8L), 4L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| #else	/* NOFLOAT */
 | |
| 	nofloat();
 | |
| #endif	/* NOFLOAT */
 | |
| }
 | |
| 
 | |
| DoCIU()
 | |
| {
 | |
| 	/* CIU -: Convert integer to unsigned */
 | |
| 	register int newsize = swpop();
 | |
| 	register long u;
 | |
| 
 | |
| 	LOG(("@C6 DoCIU()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 22:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		return;
 | |
| 	case 24:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		npush((long) upop(2L), 4L);
 | |
| 		return;
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		u = upop(4L);
 | |
| 		npush(u, 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| DoCUU()
 | |
| {
 | |
| 	/* CUU -: Convert unsigned to unsigned */
 | |
| 	register int newsize = swpop();
 | |
| 
 | |
| 	LOG(("@C6 DoCUU()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 22:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		return;
 | |
| 	case 24:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		npush((long) upop(2L), 4L);
 | |
| 		return;
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		npush((long) upop(4L), 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| DoCFU()
 | |
| {
 | |
| 	/* CFU -: Convert floating to unsigned */
 | |
| #ifndef	NOFLOAT
 | |
| 	register int newsize = swpop();
 | |
| 	double f;
 | |
| 
 | |
| 	LOG(("@C6 DoCFU()"));
 | |
| 	spoilFRA();
 | |
| 	switch ((int)(10 * swpop() + newsize)) {
 | |
| 	case 42:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		f = fpop(4L);
 | |
| 		npush((unsigned long) f, 2L);
 | |
| 		return;
 | |
| 	case 44:
 | |
| 		f = fpop(4L);
 | |
| 		npush((unsigned long) f, 4L);
 | |
| 		return;
 | |
| 	case 82:
 | |
| 		if (wsize == 4) {
 | |
| 			wtrap(WILLCONV, EILLINS);
 | |
| 		}
 | |
| 		f = fpop(8L);
 | |
| 		npush((unsigned long) f, 2L);
 | |
| 		return;
 | |
| 	case 84:
 | |
| 		f = fpop(8L);
 | |
| 		npush((unsigned long) f, 4L);
 | |
| 		return;
 | |
| 	default:
 | |
| 		wtrap(WILLCONV, EILLINS);
 | |
| 	}
 | |
| #else	/* NOFLOAT */
 | |
| 	nofloat();
 | |
| #endif	/* NOFLOAT */
 | |
| }
 |