xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 7961)
12080Smckusick /* Copyright (c) 1979 Regents of the University of California */
22080Smckusick 
3*7961Smckusick static char sccsid[] = "@(#)interp.c 1.24 08/29/82";
42080Smckusick 
52080Smckusick #include <math.h>
62950Smckusic #include "whoami.h"
72950Smckusic #include "objfmt.h"
82080Smckusick #include "vars.h"
92080Smckusick #include "h02opcs.h"
102080Smckusick #include "machdep.h"
112080Smckusick #include "libpc.h"
122080Smckusick 
132080Smckusick /*
142080Smckusick  * program variables
152080Smckusick  */
162109Smckusic union disply	_display;
172080Smckusick struct disp	*_dp;
182080Smckusick long	_lino = 0;
192080Smckusick int	_argc;
202080Smckusick char	**_argv;
212080Smckusick long	_mode;
222950Smckusic bool	_runtst = TRUE;
232950Smckusic bool	_nodump = FALSE;
242080Smckusick long	_stlim = 500000;
252080Smckusick long	_stcnt = 0;
262191Smckusic long	_seed = 1;
272950Smckusic #ifdef VAX
282080Smckusick char	*_minptr = (char *)0x7fffffff;
292950Smckusic #else
302950Smckusic char	*_minptr = (char *)0xffff;
312950Smckusic #endif VAX
322080Smckusick char	*_maxptr = (char *)0;
332080Smckusick long	*_pcpcount = (long *)0;
342080Smckusick long	_cntrs = 0;
352080Smckusick long	_rtns = 0;
362080Smckusick 
372080Smckusick /*
382080Smckusick  * standard files
392080Smckusick  */
402080Smckusick char		_inwin, _outwin, _errwin;
412950Smckusic struct iorechd	_err = {
422950Smckusic 	&_errwin,		/* fileptr */
432080Smckusick 	0,			/* lcount  */
442080Smckusick 	0x7fffffff,		/* llimit  */
452950Smckusic 	&_iob[2],		/* fbuf    */
462950Smckusic 	FILNIL,			/* fchain  */
472080Smckusick 	STDLVL,			/* flev    */
482950Smckusic 	"Message file",		/* pfname  */
492950Smckusic 	FTEXT | FWRITE | EOFF,	/* funit   */
502950Smckusic 	2,			/* fblk    */
512080Smckusick 	1			/* fsize   */
522080Smckusick };
532080Smckusick struct iorechd	output = {
542080Smckusick 	&_outwin,		/* fileptr */
552080Smckusick 	0,			/* lcount  */
562080Smckusick 	0x7fffffff,		/* llimit  */
572080Smckusick 	&_iob[1],		/* fbuf    */
582080Smckusick 	ERR,			/* fchain  */
592080Smckusick 	STDLVL,			/* flev    */
602080Smckusick 	"standard output",	/* pfname  */
612080Smckusick 	FTEXT | FWRITE | EOFF,	/* funit   */
622080Smckusick 	1,			/* fblk    */
632080Smckusick 	1			/* fsize   */
642080Smckusick };
652950Smckusic struct iorechd	input = {
662950Smckusic 	&_inwin,		/* fileptr */
672080Smckusick 	0,			/* lcount  */
682080Smckusick 	0x7fffffff,		/* llimit  */
692950Smckusic 	&_iob[0],		/* fbuf    */
702950Smckusic 	OUTPUT,			/* fchain  */
712080Smckusick 	STDLVL,			/* flev    */
722950Smckusic 	"standard input",	/* pfname  */
737569Smckusick 	FTEXT|FREAD|SYNC|EOLN,	/* funit   */
742950Smckusic 	0,			/* fblk    */
752080Smckusick 	1			/* fsize   */
762080Smckusick };
772080Smckusick 
782109Smckusic /*
792950Smckusic  * file record variables
802950Smckusic  */
812950Smckusic long		_filefre = PREDEF;
822950Smckusic struct iorechd	_fchain = {
832950Smckusic 	0, 0, 0, 0,		/* only use fchain field */
842950Smckusic 	INPUT			/* fchain  */
852950Smckusic };
862950Smckusic struct iorec	*_actfile[MAXFILES] = {
872950Smckusic 	INPUT,
882950Smckusic 	OUTPUT,
892950Smckusic 	ERR
902950Smckusic };
912950Smckusic 
922950Smckusic /*
935658Slinton  * stuff for pdx
945658Slinton  */
955658Slinton 
965658Slinton union progcntr *pcaddrp;
975658Slinton asm(".globl _loopaddr");
985658Slinton 
995658Slinton /*
1002109Smckusic  * Px profile array
1012109Smckusic  */
1022109Smckusic #ifdef PROFILE
1032109Smckusic long _profcnts[NUMOPS];
1042109Smckusic #endif PROFILE
1052109Smckusic 
1062109Smckusic /*
1072109Smckusic  * debugging variables
1082109Smckusic  */
1092109Smckusic #ifdef DEBUG
1102109Smckusic char opc[10];
1112109Smckusic long opcptr = 9;
1122109Smckusic #endif DEBUG
1132109Smckusic 
1142080Smckusick interpreter(base)
1152080Smckusick 	char *base;
1162080Smckusick {
1172080Smckusick 	union progcntr pc;		/* interpreted program cntr */
1182080Smckusick 	register char *vpc;		/* register used for "pc" */
1192080Smckusick 	struct iorec *curfile;		/* active file */
1202080Smckusick 	register struct stack *stp;	/* active stack frame ptr */
1212080Smckusick 	/*
1222080Smckusick 	 * the following variables are used as scratch
1232080Smckusick 	 */
1242239Smckusic 	register char *tcp;
1252239Smckusic 	register long tl, tl1, tl2;
1262080Smckusick 	double td, td1;
1272239Smckusic 	struct sze8 t8;
1282080Smckusick 	long *tlp;
1292950Smckusic 	register short *tsp, *tsp1, ts;
1302950Smckusic 	bool tb;
1312080Smckusick 	char *tcp1;
1322080Smckusick 	struct stack *tstp;
1332080Smckusick 	struct formalrtn *tfp;
1342080Smckusick 	union progcntr tpc;
1352080Smckusick 	struct iorec **ip;
1362080Smckusick 
1375658Slinton 	pcaddrp = &pc;
1385658Slinton 
1392080Smckusick 	/*
1402239Smckusic 	 * Setup sets up any hardware specific parameters before
1412239Smckusic 	 * starting the interpreter. Typically this is inline replaced
1422239Smckusic 	 * by interp.sed to utilize specific machine instructions.
1432239Smckusic 	 */
1442239Smckusic 	 setup();
1452239Smckusic 	/*
1462080Smckusick 	 * necessary only on systems which do not initialize
1472080Smckusick 	 * memory to zero
1482080Smckusick 	 */
1492080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1502080Smckusick 		/* void */;
1512080Smckusick 	/*
1522080Smckusick 	 * set up global environment, then ``call'' the main program
1532080Smckusick 	 */
1542950Smckusic 	_display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *)));
1552950Smckusic 	_display.frame[0].locvars += 2 * sizeof(struct iorec *);
1562950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1572950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
1582950Smckusic 	stp = (struct stack *)pushsp((long)(sizeof(struct stack)));
1592109Smckusic 	_dp = &_display.frame[0];
1602080Smckusick 	pc.cp = base;
1615658Slinton 
1625658Slinton 	asm("_loopaddr:");
1632080Smckusick 	for(;;) {
1642109Smckusic #		ifdef DEBUG
1652080Smckusick 		if (++opcptr == 10)
1662080Smckusick 			opcptr = 0;
1672080Smckusick 		opc[opcptr] = *pc.ucp;
1682109Smckusic #		endif DEBUG
1692109Smckusic #		ifdef PROFILE
1702109Smckusic 		_profcnts[*pc.ucp]++;
1712109Smckusic #		endif PROFILE
1722080Smckusick 		switch (*pc.ucp++) {
1735658Slinton 		case O_BPT:			/* breakpoint trap */
1745873Slinton 			PFLUSH();
1755658Slinton 			asm(".byte 0");
1765658Slinton 			pc.ucp--;
1775658Slinton 			continue;
1782080Smckusick 		case O_NODUMP:
1792191Smckusic 			_nodump = TRUE;
1802080Smckusick 			/* and fall through */
1812080Smckusick 		case O_BEG:
1822080Smckusick 			_dp += 1;		/* enter local scope */
1832080Smckusick 			stp->odisp = *_dp;	/* save old display value */
1842080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
1852080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
1862191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
1872191Smckusic 			_lino = pc.hdrp->offset;
1882191Smckusic 			_runtst = pc.hdrp->tests;
1892191Smckusic 			disableovrflo();
1902191Smckusic 			if (_runtst)
1912191Smckusic 				enableovrflo();
1922950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
1932080Smckusick 			stp->file = curfile;	/* save active file */
1942080Smckusick 			tcp = pushsp(tl1);	/* tcp = new top of stack */
1952950Smckusic 			if (_runtst)		/* zero stack frame */
1962950Smckusic 				blkclr(tl1, tcp);
1972950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
1982109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
1992109Smckusic 			_dp->stp = stp;
2002950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2012080Smckusick 			continue;
2022080Smckusick 		case O_END:
2032080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2042080Smckusick 			stp = _dp->stp;
2052080Smckusick 			curfile = stp->file;	/* restore old active file */
2062080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2072109Smckusic 			if (_dp == &_display.frame[1])
2082080Smckusick 				return;		/* exiting main proc ??? */
2092080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
2102080Smckusick 			pc.cp = stp->pc.cp;
2112080Smckusick 			_dp = stp->dp;
2122191Smckusic 			_runtst = stp->entry->tests;
2132191Smckusic 			disableovrflo();
2142191Smckusic 			if (_runtst)
2152191Smckusic 				enableovrflo();
2162109Smckusic 			popsp(stp->entry->framesze +	/* pop local vars */
2172080Smckusick 			      sizeof(struct stack) +	/* pop stack frame */
2182080Smckusick 			      stp->entry->nargs);	/* pop parms */
2192080Smckusick 			continue;
2202080Smckusick 		case O_CALL:
2212080Smckusick 			tl = *pc.cp++;
2222080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
2232080Smckusick 			tcp += sizeof(short);
2242080Smckusick 			tcp = base + *(long *)tcp;
2252950Smckusic 			stp = (struct stack *)
2262950Smckusic 				pushsp((long)(sizeof(struct stack)));
2272080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
2282080Smckusick 			stp->pc.cp = pc.cp;
2292080Smckusick 			stp->dp = _dp;
2302109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2312080Smckusick 			pc.cp = tcp;
2322080Smckusick 			continue;
2332080Smckusick 		case O_FCALL:
2343294Smckusic 			pc.cp++;
2354016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2362080Smckusick 			tfp = (struct formalrtn *)popaddr();
2372950Smckusic 			stp = (struct stack *)
2382950Smckusic 				pushsp((long)(sizeof(struct stack)));
2392080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
2402080Smckusick 			stp->pc.cp = pc.cp;
2412080Smckusick 			stp->dp = _dp;
2423436Smckusic 			pc.cp = tfp->fentryaddr;/* calc new entry point */
2433436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2443436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2454016Smckusic  				&_display.frame[1], tcp);
2463436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2473436Smckusic 				&tfp->fdisp[0], &_display.frame[1]);
2482080Smckusick 			continue;
2492080Smckusick 		case O_FRTN:
2502080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2512080Smckusick 			if (tl == 0)
2522080Smckusick 				tl = *pc.usp++;
2532950Smckusic 			tcp = pushsp((long)(0));
2542080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2554016Smckusic  			tcp1 = *(char **)
2564016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2573861Smckusic 			if (tl != 0) {
2584016Smckusic 				blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)
2594016Smckusic 				    + sizeof(char *));
2603861Smckusic 			}
2614016Smckusic  			popsp((long)
2624016Smckusic  			    (sizeof(struct formalrtn *) + sizeof (char *)));
2633436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2644016Smckusic  			    tcp1, &_display.frame[1]);
2652080Smckusick 			continue;
2662080Smckusick 		case O_FSAV:
2672080Smckusick 			tfp = (struct formalrtn *)popaddr();
2683436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
2693861Smckusic 			tcp = base + *pc.lp++;	/* calc new entry point */
2702080Smckusick 			tcp += sizeof(short);
2713436Smckusic 			tfp->fentryaddr = base + *(long *)tcp;
2723436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2733436Smckusic 				&_display.frame[1], &tfp->fdisp[0]);
2742080Smckusick 			pushaddr(tfp);
2752080Smckusick 			continue;
2762080Smckusick 		case O_SDUP2:
2772080Smckusick 			pc.cp++;
2782080Smckusick 			tl = pop2();
2792950Smckusic 			push2((short)(tl));
2802950Smckusic 			push2((short)(tl));
2812080Smckusick 			continue;
2822080Smckusick 		case O_SDUP4:
2832080Smckusick 			pc.cp++;
2842080Smckusick 			tl = pop4();
2852080Smckusick 			push4(tl);
2862080Smckusick 			push4(tl);
2872080Smckusick 			continue;
2882080Smckusick 		case O_TRA:
2892080Smckusick 			pc.cp++;
2902080Smckusick 			pc.cp += *pc.sp;
2912080Smckusick 			continue;
2922080Smckusick 		case O_TRA4:
2932080Smckusick 			pc.cp++;
2942080Smckusick 			pc.cp = base + *pc.lp;
2952080Smckusick 			continue;
2962080Smckusick 		case O_GOTO:
2972109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
2982109Smckusic 								exit frame */
2992080Smckusick 			pc.cp = base + *pc.lp;
3002080Smckusick 			stp = _dp->stp;
3012080Smckusick 			while (tstp != stp) {
3022109Smckusic 				if (_dp == &_display.frame[1])
3033872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3042080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3052080Smckusick 				curfile = stp->file;  /* restore active file */
3062080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3072080Smckusick 				_dp = stp->dp;	      /* restore dp */
3082080Smckusick 				stp = _dp->stp;
3092080Smckusick 			}
3102080Smckusick 			/* pop locals, stack frame, parms, and return values */
3112950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3122080Smckusick 			continue;
3132080Smckusick 		case O_LINO:
3142950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3155682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3162080Smckusick 			_lino = *pc.cp++;	/* set line number */
3172080Smckusick 			if (_lino == 0)
3182080Smckusick 				_lino = *pc.sp++;
3192950Smckusic 			if (_runtst) {
3202950Smckusic 				LINO();		/* inc statement count */
3212950Smckusic 				continue;
3222950Smckusic 			}
3232950Smckusic 			_stcnt++;
3242080Smckusick 			continue;
3252080Smckusick 		case O_PUSH:
3262080Smckusick 			tl = *pc.cp++;
3272080Smckusick 			if (tl == 0)
3282080Smckusick 				tl = *pc.usp++;
3292080Smckusick 			tl = (-tl + 1) & ~1;
3302080Smckusick 			tcp = pushsp(tl);
3312950Smckusic 			if (_runtst)
3322950Smckusic 				blkclr(tl, tcp);
3332080Smckusick 			continue;
3342080Smckusick 		case O_IF:
3352080Smckusick 			pc.cp++;
3362191Smckusic 			if (pop2()) {
3372080Smckusick 				pc.sp++;
3382191Smckusic 				continue;
3392191Smckusic 			}
3402191Smckusic 			pc.cp += *pc.sp;
3412080Smckusick 			continue;
3422080Smckusick 		case O_REL2:
3432080Smckusick 			tl = pop2();
3442080Smckusick 			tl1 = pop2();
3452080Smckusick 			goto cmplong;
3462080Smckusick 		case O_REL24:
3472080Smckusick 			tl = pop2();
3482080Smckusick 			tl1 = pop4();
3492080Smckusick 			goto cmplong;
3502080Smckusick 		case O_REL42:
3512080Smckusick 			tl = pop4();
3522080Smckusick 			tl1 = pop2();
3532080Smckusick 			goto cmplong;
3542080Smckusick 		case O_REL4:
3552080Smckusick 			tl = pop4();
3562080Smckusick 			tl1 = pop4();
3572080Smckusick 		cmplong:
3585682Smckusic 			switch (*pc.cp++) {
3592080Smckusick 			case releq:
3602080Smckusick 				push2(tl1 == tl);
3612080Smckusick 				continue;
3622080Smckusick 			case relne:
3632080Smckusick 				push2(tl1 != tl);
3642080Smckusick 				continue;
3652080Smckusick 			case rellt:
3662080Smckusick 				push2(tl1 < tl);
3672080Smckusick 				continue;
3682080Smckusick 			case relgt:
3692080Smckusick 				push2(tl1 > tl);
3702080Smckusick 				continue;
3712080Smckusick 			case relle:
3722080Smckusick 				push2(tl1 <= tl);
3732080Smckusick 				continue;
3742080Smckusick 			case relge:
3752080Smckusick 				push2(tl1 >= tl);
3762080Smckusick 				continue;
3772080Smckusick 			default:
3785682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
3795682Smckusic 				    *(pc.cp - 1));
3802080Smckusick 				continue;
3812080Smckusick 			}
3822080Smckusick 		case O_RELG:
3832080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
3842080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
3852080Smckusick 			tl1 = (tl + 1) & ~1;	/* tl1 has arg stack length */
3862950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
3872080Smckusick 			switch (tl2) {
3882080Smckusick 			case releq:
3892950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
3902080Smckusick 				break;
3912080Smckusick 			case relne:
3922950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
3932080Smckusick 				break;
3942080Smckusick 			case rellt:
3952950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
3962080Smckusick 				break;
3972080Smckusick 			case relgt:
3982950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
3992080Smckusick 				break;
4002080Smckusick 			case relle:
4012950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4022080Smckusick 				break;
4032080Smckusick 			case relge:
4042950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4052080Smckusick 				break;
4062080Smckusick 			default:
4075682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4082080Smckusick 				break;
4092080Smckusick 			}
4102080Smckusick 			popsp(tl1 << 1);
4112950Smckusic 			push2((short)(tb));
4122080Smckusick 			continue;
4132080Smckusick 		case O_RELT:
4142080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4152080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4162950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4172080Smckusick 			switch (tl2) {
4182080Smckusick 			case releq:
4192950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4202080Smckusick 				break;
4212080Smckusick 			case relne:
4222950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4232080Smckusick 				break;
4242080Smckusick 			case rellt:
4252950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4262080Smckusick 				break;
4272080Smckusick 			case relgt:
4282950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4292080Smckusick 				break;
4302080Smckusick 			case relle:
4312950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4322080Smckusick 				break;
4332080Smckusick 			case relge:
4342950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4352080Smckusick 				break;
4362080Smckusick 			default:
4375682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4382080Smckusick 				break;
4392080Smckusick 			}
4402080Smckusick 			popsp(tl1 << 1);
4412950Smckusic 			push2((short)(tb));
4422080Smckusick 			continue;
4432080Smckusick 		case O_REL28:
4442080Smckusick 			td = pop2();
4452080Smckusick 			td1 = pop8();
4462080Smckusick 			goto cmpdbl;
4472080Smckusick 		case O_REL48:
4482080Smckusick 			td = pop4();
4492080Smckusick 			td1 = pop8();
4502080Smckusick 			goto cmpdbl;
4512080Smckusick 		case O_REL82:
4522080Smckusick 			td = pop8();
4532080Smckusick 			td1 = pop2();
4542080Smckusick 			goto cmpdbl;
4552080Smckusick 		case O_REL84:
4562080Smckusick 			td = pop8();
4572080Smckusick 			td1 = pop4();
4582080Smckusick 			goto cmpdbl;
4592080Smckusick 		case O_REL8:
4602080Smckusick 			td = pop8();
4612080Smckusick 			td1 = pop8();
4622080Smckusick 		cmpdbl:
4632080Smckusick 			switch (*pc.cp++) {
4642080Smckusick 			case releq:
4652080Smckusick 				push2(td1 == td);
4662080Smckusick 				continue;
4672080Smckusick 			case relne:
4682080Smckusick 				push2(td1 != td);
4692080Smckusick 				continue;
4702080Smckusick 			case rellt:
4712080Smckusick 				push2(td1 < td);
4722080Smckusick 				continue;
4732080Smckusick 			case relgt:
4742080Smckusick 				push2(td1 > td);
4752080Smckusick 				continue;
4762080Smckusick 			case relle:
4772080Smckusick 				push2(td1 <= td);
4782080Smckusick 				continue;
4792080Smckusick 			case relge:
4802080Smckusick 				push2(td1 >= td);
4812080Smckusick 				continue;
4822080Smckusick 			default:
4835682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
4845682Smckusic 				    *(pc.cp - 1));
4852080Smckusick 				continue;
4862080Smckusick 			}
4872080Smckusick 		case O_AND:
4882080Smckusick 			pc.cp++;
4892080Smckusick 			push2(pop2() & pop2());
4902080Smckusick 			continue;
4912080Smckusick 		case O_OR:
4922080Smckusick 			pc.cp++;
4932080Smckusick 			push2(pop2() | pop2());
4942080Smckusick 			continue;
4952080Smckusick 		case O_NOT:
4962080Smckusick 			pc.cp++;
4972080Smckusick 			push2(pop2() ^ 1);
4982080Smckusick 			continue;
4992080Smckusick 		case O_AS2:
5002080Smckusick 			pc.cp++;
5012080Smckusick 			tl = pop2();
5022080Smckusick 			*(short *)popaddr() = tl;
5032080Smckusick 			continue;
5042080Smckusick 		case O_AS4:
5052080Smckusick 			pc.cp++;
5062080Smckusick 			tl = pop4();
5072080Smckusick 			*(long *)popaddr() = tl;
5082080Smckusick 			continue;
5092080Smckusick 		case O_AS24:
5102080Smckusick 			pc.cp++;
5112080Smckusick 			tl = pop2();
5122080Smckusick 			*(long *)popaddr() = tl;
5132080Smckusick 			continue;
5142080Smckusick 		case O_AS42:
5152080Smckusick 			pc.cp++;
5162080Smckusick 			tl = pop4();
5172080Smckusick 			*(short *)popaddr() = tl;
5182080Smckusick 			continue;
5192080Smckusick 		case O_AS21:
5202080Smckusick 			pc.cp++;
5212080Smckusick 			tl = pop2();
5222080Smckusick 			*popaddr() = tl;
5232080Smckusick 			continue;
5242080Smckusick 		case O_AS41:
5252080Smckusick 			pc.cp++;
5262080Smckusick 			tl = pop4();
5272080Smckusick 			*popaddr() = tl;
5282080Smckusick 			continue;
5292080Smckusick 		case O_AS28:
5302080Smckusick 			pc.cp++;
5312080Smckusick 			tl = pop2();
5322080Smckusick 			*(double *)popaddr() = tl;
5332080Smckusick 			continue;
5342080Smckusick 		case O_AS48:
5352080Smckusick 			pc.cp++;
5362080Smckusick 			tl = pop4();
5372080Smckusick 			*(double *)popaddr() = tl;
5382080Smckusick 			continue;
5392080Smckusick 		case O_AS8:
5402080Smckusick 			pc.cp++;
5412239Smckusic 			t8 = popsze8();
5422239Smckusic 			*(struct sze8 *)popaddr() = t8;
5432080Smckusick 			continue;
5442080Smckusick 		case O_AS:
5452080Smckusick 			tl = *pc.cp++;
5462080Smckusick 			if (tl == 0)
5472080Smckusick 				tl = *pc.usp++;
5482080Smckusick 			tl1 = (tl + 1) & ~1;
5492950Smckusic 			tcp = pushsp((long)(0));
5502080Smckusick 			blkcpy(tl, tcp, *(char **)(tcp + tl1));
5512080Smckusick 			popsp(tl1 + sizeof(char *));
5522080Smckusick 			continue;
5532080Smckusick 		case O_INX2P2:
5542080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
5552080Smckusick 			tl1 = (pop2() - *pc.sp++) << tl;
5562080Smckusick 			pushaddr(popaddr() + tl1);
5572080Smckusick 			continue;
5582080Smckusick 		case O_INX4P2:
5592080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
5602080Smckusick 			tl1 = (pop4() - *pc.sp++) << tl;
5612080Smckusick 			pushaddr(popaddr() + tl1);
5622080Smckusick 			continue;
5632080Smckusick 		case O_INX2:
5642080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5652080Smckusick 			if (tl == 0)
5662080Smckusick 				tl = *pc.usp++;
5672080Smckusick 			tl1 = pop2();		/* index */
5682080Smckusick 			tl2 = *pc.sp++;
5692080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
5702191Smckusic 			tl = *pc.usp++;
5712191Smckusic 			if (_runtst)
5722191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5732080Smckusick 			continue;
5742080Smckusick 		case O_INX4:
5752080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5762080Smckusick 			if (tl == 0)
5772080Smckusick 				tl = *pc.usp++;
5782080Smckusick 			tl1 = pop4();		/* index */
5792080Smckusick 			tl2 = *pc.sp++;
5802080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
5812191Smckusic 			tl = *pc.usp++;
5822191Smckusic 			if (_runtst)
5832191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5842080Smckusick 			continue;
5852080Smckusick 		case O_OFF:
5862080Smckusick 			tl = *pc.cp++;
5872080Smckusick 			if (tl == 0)
5882080Smckusick 				tl = *pc.usp++;
5892950Smckusic 			pushaddr(popaddr() + tl);
5902080Smckusick 			continue;
5912080Smckusick 		case O_NIL:
5922080Smckusick 			pc.cp++;
5932080Smckusick 			NIL();
5942080Smckusick 			continue;
5952080Smckusick 		case O_ADD2:
5962080Smckusick 			pc.cp++;
5972950Smckusic 			push4((long)(pop2() + pop2()));
5982080Smckusick 			continue;
5992080Smckusick 		case O_ADD4:
6002080Smckusick 			pc.cp++;
6012080Smckusick 			push4(pop4() + pop4());
6022080Smckusick 			continue;
6032080Smckusick 		case O_ADD24:
6042080Smckusick 			pc.cp++;
6052080Smckusick 			tl = pop2();
6062080Smckusick 			push4(pop4() + tl);
6072080Smckusick 			continue;
6082080Smckusick 		case O_ADD42:
6092080Smckusick 			pc.cp++;
6102080Smckusick 			tl = pop4();
6112080Smckusick 			push4(pop2() + tl);
6122080Smckusick 			continue;
6132080Smckusick 		case O_ADD28:
6142080Smckusick 			pc.cp++;
6152080Smckusick 			tl = pop2();
6162080Smckusick 			push8(pop8() + tl);
6172080Smckusick 			continue;
6182080Smckusick 		case O_ADD48:
6192080Smckusick 			pc.cp++;
6202080Smckusick 			tl = pop4();
6212080Smckusick 			push8(pop8() + tl);
6222080Smckusick 			continue;
6232080Smckusick 		case O_ADD82:
6242080Smckusick 			pc.cp++;
6252080Smckusick 			td = pop8();
6262080Smckusick 			push8(pop2() + td);
6272080Smckusick 			continue;
6282080Smckusick 		case O_ADD84:
6292080Smckusick 			pc.cp++;
6302080Smckusick 			td = pop8();
6312080Smckusick 			push8(pop4() + td);
6322080Smckusick 			continue;
6332080Smckusick 		case O_SUB2:
6342080Smckusick 			pc.cp++;
6352080Smckusick 			tl = pop2();
6362080Smckusick 			push4(pop2() - tl);
6372080Smckusick 			continue;
6382080Smckusick 		case O_SUB4:
6392080Smckusick 			pc.cp++;
6402080Smckusick 			tl = pop4();
6412080Smckusick 			push4(pop4() - tl);
6422080Smckusick 			continue;
6432080Smckusick 		case O_SUB24:
6442080Smckusick 			pc.cp++;
6452080Smckusick 			tl = pop2();
6462080Smckusick 			push4(pop4() - tl);
6472080Smckusick 			continue;
6482080Smckusick 		case O_SUB42:
6492080Smckusick 			pc.cp++;
6502080Smckusick 			tl = pop4();
6512080Smckusick 			push4(pop2() - tl);
6522080Smckusick 			continue;
6532080Smckusick 		case O_SUB28:
6542080Smckusick 			pc.cp++;
6552080Smckusick 			tl = pop2();
6562080Smckusick 			push8(pop8() - tl);
6572080Smckusick 			continue;
6582080Smckusick 		case O_SUB48:
6592080Smckusick 			pc.cp++;
6602080Smckusick 			tl = pop4();
6612080Smckusick 			push8(pop8() - tl);
6622080Smckusick 			continue;
6632080Smckusick 		case O_SUB82:
6642080Smckusick 			pc.cp++;
6652080Smckusick 			td = pop8();
6662080Smckusick 			push8(pop2() - td);
6672080Smckusick 			continue;
6682080Smckusick 		case O_SUB84:
6692080Smckusick 			pc.cp++;
6702080Smckusick 			td = pop8();
6712080Smckusick 			push8(pop4() - td);
6722080Smckusick 			continue;
6732080Smckusick 		case O_MUL2:
6742080Smckusick 			pc.cp++;
6752950Smckusic 			push4((long)(pop2() * pop2()));
6762080Smckusick 			continue;
6772080Smckusick 		case O_MUL4:
6782080Smckusick 			pc.cp++;
6792080Smckusick 			push4(pop4() * pop4());
6802080Smckusick 			continue;
6812080Smckusick 		case O_MUL24:
6822080Smckusick 			pc.cp++;
6832080Smckusick 			tl = pop2();
6842080Smckusick 			push4(pop4() * tl);
6852080Smckusick 			continue;
6862080Smckusick 		case O_MUL42:
6872080Smckusick 			pc.cp++;
6882080Smckusick 			tl = pop4();
6892080Smckusick 			push4(pop2() * tl);
6902080Smckusick 			continue;
6912080Smckusick 		case O_MUL28:
6922080Smckusick 			pc.cp++;
6932080Smckusick 			tl = pop2();
6942080Smckusick 			push8(pop8() * tl);
6952080Smckusick 			continue;
6962080Smckusick 		case O_MUL48:
6972080Smckusick 			pc.cp++;
6982080Smckusick 			tl = pop4();
6992080Smckusick 			push8(pop8() * tl);
7002080Smckusick 			continue;
7012080Smckusick 		case O_MUL82:
7022080Smckusick 			pc.cp++;
7032080Smckusick 			td = pop8();
7042080Smckusick 			push8(pop2() * td);
7052080Smckusick 			continue;
7062080Smckusick 		case O_MUL84:
7072080Smckusick 			pc.cp++;
7082080Smckusick 			td = pop8();
7092080Smckusick 			push8(pop4() * td);
7102080Smckusick 			continue;
7112080Smckusick 		case O_ABS2:
7122080Smckusick 		case O_ABS4:
7132080Smckusick 			pc.cp++;
7142080Smckusick 			tl = pop4();
7152080Smckusick 			push4(tl >= 0 ? tl : -tl);
7162080Smckusick 			continue;
7172080Smckusick 		case O_ABS8:
7182080Smckusick 			pc.cp++;
7192080Smckusick 			td = pop8();
7202080Smckusick 			push8(td >= 0.0 ? td : -td);
7212080Smckusick 			continue;
7222080Smckusick 		case O_NEG2:
7232080Smckusick 			pc.cp++;
7242950Smckusic 			push4((long)(-pop2()));
7252080Smckusick 			continue;
7262080Smckusick 		case O_NEG4:
7272080Smckusick 			pc.cp++;
7282080Smckusick 			push4(-pop4());
7292080Smckusick 			continue;
7302080Smckusick 		case O_NEG8:
7312080Smckusick 			pc.cp++;
7322080Smckusick 			push8(-pop8());
7332080Smckusick 			continue;
7342080Smckusick 		case O_DIV2:
7352080Smckusick 			pc.cp++;
7362080Smckusick 			tl = pop2();
7372080Smckusick 			push4(pop2() / tl);
7382080Smckusick 			continue;
7392080Smckusick 		case O_DIV4:
7402080Smckusick 			pc.cp++;
7412080Smckusick 			tl = pop4();
7422080Smckusick 			push4(pop4() / tl);
7432080Smckusick 			continue;
7442080Smckusick 		case O_DIV24:
7452080Smckusick 			pc.cp++;
7462080Smckusick 			tl = pop2();
7472080Smckusick 			push4(pop4() / tl);
7482080Smckusick 			continue;
7492080Smckusick 		case O_DIV42:
7502080Smckusick 			pc.cp++;
7512080Smckusick 			tl = pop4();
7522080Smckusick 			push4(pop2() / tl);
7532080Smckusick 			continue;
7542080Smckusick 		case O_MOD2:
7552080Smckusick 			pc.cp++;
7562080Smckusick 			tl = pop2();
7572080Smckusick 			push4(pop2() % tl);
7582080Smckusick 			continue;
7592080Smckusick 		case O_MOD4:
7602080Smckusick 			pc.cp++;
7612080Smckusick 			tl = pop4();
7622080Smckusick 			push4(pop4() % tl);
7632080Smckusick 			continue;
7642080Smckusick 		case O_MOD24:
7652080Smckusick 			pc.cp++;
7662080Smckusick 			tl = pop2();
7672080Smckusick 			push4(pop4() % tl);
7682080Smckusick 			continue;
7692080Smckusick 		case O_MOD42:
7702080Smckusick 			pc.cp++;
7712080Smckusick 			tl = pop4();
7722080Smckusick 			push4(pop2() % tl);
7732080Smckusick 			continue;
7742080Smckusick 		case O_ADD8:
7752080Smckusick 			pc.cp++;
7762080Smckusick 			push8(pop8() + pop8());
7772080Smckusick 			continue;
7782080Smckusick 		case O_SUB8:
7792080Smckusick 			pc.cp++;
7802080Smckusick 			td = pop8();
7812080Smckusick 			push8(pop8() - td);
7822080Smckusick 			continue;
7832080Smckusick 		case O_MUL8:
7842080Smckusick 			pc.cp++;
7852080Smckusick 			push8(pop8() * pop8());
7862080Smckusick 			continue;
7872080Smckusick 		case O_DVD8:
7882080Smckusick 			pc.cp++;
7892080Smckusick 			td = pop8();
7902080Smckusick 			push8(pop8() / td);
7912080Smckusick 			continue;
7922080Smckusick 		case O_STOI:
7932080Smckusick 			pc.cp++;
7942950Smckusic 			push4((long)(pop2()));
7952080Smckusick 			continue;
7962080Smckusick 		case O_STOD:
7972080Smckusick 			pc.cp++;
7982080Smckusick 			td = pop2();
7992080Smckusick 			push8(td);
8002080Smckusick 			continue;
8012080Smckusick 		case O_ITOD:
8022080Smckusick 			pc.cp++;
8032080Smckusick 			td = pop4();
8042080Smckusick 			push8(td);
8052080Smckusick 			continue;
8062080Smckusick 		case O_ITOS:
8072080Smckusick 			pc.cp++;
8082950Smckusic 			push2((short)(pop4()));
8092080Smckusick 			continue;
8102080Smckusick 		case O_DVD2:
8112080Smckusick 			pc.cp++;
8122080Smckusick 			td = pop2();
8132080Smckusick 			push8(pop2() / td);
8142080Smckusick 			continue;
8152080Smckusick 		case O_DVD4:
8162080Smckusick 			pc.cp++;
8172080Smckusick 			td = pop4();
8182080Smckusick 			push8(pop4() / td);
8192080Smckusick 			continue;
8202080Smckusick 		case O_DVD24:
8212080Smckusick 			pc.cp++;
8222080Smckusick 			td = pop2();
8232080Smckusick 			push8(pop4() / td);
8242080Smckusick 			continue;
8252080Smckusick 		case O_DVD42:
8262080Smckusick 			pc.cp++;
8272080Smckusick 			td = pop4();
8282080Smckusick 			push8(pop2() / td);
8292080Smckusick 			continue;
8302080Smckusick 		case O_DVD28:
8312080Smckusick 			pc.cp++;
8322080Smckusick 			td = pop2();
8332080Smckusick 			push8(pop8() / td);
8342080Smckusick 			continue;
8352080Smckusick 		case O_DVD48:
8362080Smckusick 			pc.cp++;
8372080Smckusick 			td = pop4();
8382080Smckusick 			push8(pop8() / td);
8392080Smckusick 			continue;
8402080Smckusick 		case O_DVD82:
8412080Smckusick 			pc.cp++;
8422080Smckusick 			td = pop8();
8432080Smckusick 			push8(pop2() / td);
8442080Smckusick 			continue;
8452080Smckusick 		case O_DVD84:
8462080Smckusick 			pc.cp++;
8472080Smckusick 			td = pop8();
8482080Smckusick 			push8(pop4() / td);
8492080Smckusick 			continue;
8502080Smckusick 		case O_RV1:
8512109Smckusic 			tcp = _display.raw[*pc.ucp++];
8522950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
8532080Smckusick 			continue;
8542080Smckusick 		case O_RV14:
8552109Smckusic 			tcp = _display.raw[*pc.ucp++];
8562950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
8572080Smckusick 			continue;
8582080Smckusick 		case O_RV2:
8592109Smckusic 			tcp = _display.raw[*pc.ucp++];
8602080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
8612080Smckusick 			continue;
8622080Smckusick 		case O_RV24:
8632109Smckusic 			tcp = _display.raw[*pc.ucp++];
8642950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
8652080Smckusick 			continue;
8662080Smckusick 		case O_RV4:
8672109Smckusic 			tcp = _display.raw[*pc.ucp++];
8682080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
8692080Smckusick 			continue;
8702080Smckusick 		case O_RV8:
8712109Smckusic 			tcp = _display.raw[*pc.ucp++];
8722239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
8732080Smckusick 			continue;
8742080Smckusick 		case O_RV:
8752109Smckusic 			tcp = _display.raw[*pc.ucp++];
8762080Smckusick 			tcp += *pc.sp++;
8772080Smckusick 			tl = *pc.usp++;
8782338Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
8792080Smckusick 			blkcpy(tl, tcp, tcp1);
8802080Smckusick 			continue;
8812080Smckusick 		case O_LV:
8822109Smckusic 			tcp = _display.raw[*pc.ucp++];
8832080Smckusick 			pushaddr(tcp + *pc.sp++);
8842080Smckusick 			continue;
8852080Smckusick 		case O_LRV1:
8862109Smckusic 			tcp = _display.raw[*pc.ucp++];
8872950Smckusic 			push2((short)(*(tcp + *pc.lp++)));
8882080Smckusick 			continue;
8892080Smckusick 		case O_LRV14:
8902109Smckusic 			tcp = _display.raw[*pc.ucp++];
8912950Smckusic 			push4((long)(*(tcp + *pc.lp++)));
8922080Smckusick 			continue;
8932080Smckusick 		case O_LRV2:
8942109Smckusic 			tcp = _display.raw[*pc.ucp++];
8952080Smckusick 			push2(*(short *)(tcp + *pc.lp++));
8962080Smckusick 			continue;
8972080Smckusick 		case O_LRV24:
8982109Smckusic 			tcp = _display.raw[*pc.ucp++];
8992950Smckusic 			push4((long)(*(short *)(tcp + *pc.lp++)));
9002080Smckusick 			continue;
9012080Smckusick 		case O_LRV4:
9022109Smckusic 			tcp = _display.raw[*pc.ucp++];
9032080Smckusick 			push4(*(long *)(tcp + *pc.lp++));
9042080Smckusick 			continue;
9052080Smckusick 		case O_LRV8:
9062109Smckusic 			tcp = _display.raw[*pc.ucp++];
9072239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.lp++));
9082080Smckusick 			continue;
9092080Smckusick 		case O_LRV:
9102109Smckusic 			tcp = _display.raw[*pc.ucp++];
9112950Smckusic 			tcp += (int)*pc.lp++;
9122080Smckusick 			tl = *pc.usp++;
9132950Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9142080Smckusick 			blkcpy(tl, tcp, tcp1);
9152080Smckusick 			continue;
9162080Smckusick 		case O_LLV:
9172109Smckusic 			tcp = _display.raw[*pc.ucp++];
9182080Smckusick 			pushaddr(tcp + *pc.lp++);
9192080Smckusick 			continue;
9202080Smckusick 		case O_IND1:
9212080Smckusick 			pc.cp++;
9222950Smckusic 			push2((short)(*popaddr()));
9232080Smckusick 			continue;
9242080Smckusick 		case O_IND14:
9252080Smckusick 			pc.cp++;
9262950Smckusic 			push4((long)(*popaddr()));
9272080Smckusick 			continue;
9282080Smckusick 		case O_IND2:
9292080Smckusick 			pc.cp++;
9302080Smckusick 			push2(*(short *)(popaddr()));
9312080Smckusick 			continue;
9322080Smckusick 		case O_IND24:
9332080Smckusick 			pc.cp++;
9342950Smckusic 			push4((long)(*(short *)(popaddr())));
9352080Smckusick 			continue;
9362080Smckusick 		case O_IND4:
9372080Smckusick 			pc.cp++;
9382080Smckusick 			push4(*(long *)(popaddr()));
9392080Smckusick 			continue;
9402080Smckusick 		case O_IND8:
9412080Smckusick 			pc.cp++;
9422239Smckusic 			pushsze8(*(struct sze8 *)(popaddr()));
9432080Smckusick 			continue;
9442080Smckusick 		case O_IND:
9452080Smckusick 			tl = *pc.cp++;
9462080Smckusick 			if (tl == 0)
9472080Smckusick 				tl = *pc.usp++;
9482080Smckusick 			tcp = popaddr();
9492080Smckusick 			tcp1 = pushsp((tl + 1) & ~1);
9502080Smckusick 			blkcpy(tl, tcp, tcp1);
9512080Smckusick 			continue;
9522080Smckusick 		case O_CON1:
9532950Smckusic 			push2((short)(*pc.cp++));
9542080Smckusick 			continue;
9552080Smckusick 		case O_CON14:
9562950Smckusic 			push4((long)(*pc.cp++));
9572080Smckusick 			continue;
9582080Smckusick 		case O_CON2:
9592080Smckusick 			pc.cp++;
9602080Smckusick 			push2(*pc.sp++);
9612080Smckusick 			continue;
9622080Smckusick 		case O_CON24:
9632080Smckusick 			pc.cp++;
9642950Smckusic 			push4((long)(*pc.sp++));
9652080Smckusick 			continue;
9662080Smckusick 		case O_CON4:
9672080Smckusick 			pc.cp++;
9682080Smckusick 			push4(*pc.lp++);
9692080Smckusick 			continue;
9702080Smckusick 		case O_CON8:
9712080Smckusick 			pc.cp++;
9722950Smckusic 			push8(*pc.dbp++);
9732080Smckusick 			continue;
9742080Smckusick 		case O_CON:
9752080Smckusick 			tl = *pc.cp++;
9762080Smckusick 			if (tl == 0)
9772080Smckusick 				tl = *pc.usp++;
9782080Smckusick 			tl = (tl + 1) & ~1;
9792080Smckusick 			tcp = pushsp(tl);
9802080Smckusick 			blkcpy(tl, pc.cp, tcp);
9812950Smckusic 			pc.cp += (int)tl;
9822080Smckusick 			continue;
9832950Smckusic 		case O_CONG:
9842950Smckusic 			tl = *pc.cp++;
9852950Smckusic 			if (tl == 0)
9862950Smckusic 				tl = *pc.usp++;
9872950Smckusic 			tl1 = (tl + 1) & ~1;
9882950Smckusic 			tcp = pushsp(tl1);
9892950Smckusic 			blkcpy(tl1, pc.cp, tcp);
9902950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
9912950Smckusic 			continue;
9922080Smckusick 		case O_LVCON:
9932080Smckusick 			tl = *pc.cp++;
9942080Smckusick 			if (tl == 0)
9952080Smckusick 				tl = *pc.usp++;
9962080Smckusick 			tl = (tl + 1) & ~1;
9972080Smckusick 			pushaddr(pc.cp);
9982950Smckusic 			pc.cp += (int)tl;
9992080Smckusick 			continue;
10002080Smckusick 		case O_RANG2:
10012080Smckusick 			tl = *pc.cp++;
10022080Smckusick 			if (tl == 0)
10032080Smckusick 				tl = *pc.sp++;
10042080Smckusick 			tl1 = pop2();
10054026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
10062080Smckusick 			continue;
10072080Smckusick 		case O_RANG42:
10082080Smckusick 			tl = *pc.cp++;
10092080Smckusick 			if (tl == 0)
10102080Smckusick 				tl = *pc.sp++;
10112080Smckusick 			tl1 = pop4();
10124026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
10132080Smckusick 			continue;
10142080Smckusick 		case O_RSNG2:
10152080Smckusick 			tl = *pc.cp++;
10162080Smckusick 			if (tl == 0)
10172080Smckusick 				tl = *pc.sp++;
10182080Smckusick 			tl1 = pop2();
10192950Smckusic 			push2((short)(RSNG4(tl1, tl)));
10202080Smckusick 			continue;
10212080Smckusick 		case O_RSNG42:
10222080Smckusick 			tl = *pc.cp++;
10232080Smckusick 			if (tl == 0)
10242080Smckusick 				tl = *pc.sp++;
10252080Smckusick 			tl1 = pop4();
10262080Smckusick 			push4(RSNG4(tl1, tl));
10272080Smckusick 			continue;
10282080Smckusick 		case O_RANG4:
10294026Smckusic 			tl = *pc.cp++;
10304026Smckusic 			if (tl == 0)
10314026Smckusic 				tl = *pc.lp++;
10322080Smckusick 			tl1 = pop4();
10332080Smckusick 			push4(RANG4(tl1, tl, *pc.lp++));
10342080Smckusick 			continue;
10352080Smckusick 		case O_RANG24:
10364026Smckusic 			tl = *pc.cp++;
10374026Smckusic 			if (tl == 0)
10384026Smckusic 				tl = *pc.lp++;
10392080Smckusick 			tl1 = pop2();
10402950Smckusic 			push2((short)(RANG4(tl1, tl, *pc.lp++)));
10412080Smckusick 			continue;
10422080Smckusick 		case O_RSNG4:
10434026Smckusic 			tl = *pc.cp++;
10444026Smckusic 			if (tl == 0)
10454026Smckusic 				tl = *pc.lp++;
10464026Smckusic 			tl1 = pop4();
10474026Smckusic 			push4(RSNG4(tl1, tl));
10482080Smckusick 			continue;
10492080Smckusick 		case O_RSNG24:
10504026Smckusic 			tl = *pc.cp++;
10514026Smckusic 			if (tl == 0)
10524026Smckusic 				tl = *pc.lp++;
10534026Smckusic 			tl1 = pop2();
10544026Smckusic 			push2((short)(RSNG4(tl1, tl)));
10552080Smckusick 			continue;
10562080Smckusick 		case O_STLIM:
10572080Smckusick 			pc.cp++;
10582121Smckusic 			STLIM();
10592950Smckusic 			popsp((long)(sizeof(long)));
10602080Smckusick 			continue;
10612080Smckusick 		case O_LLIMIT:
10622080Smckusick 			pc.cp++;
10632080Smckusick 			LLIMIT();
10642950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
10652080Smckusick 			continue;
10662080Smckusick 		case O_BUFF:
10672950Smckusic 			BUFF((long)(*pc.cp++));
10682080Smckusick 			continue;
10692080Smckusick 		case O_HALT:
10702080Smckusick 			pc.cp++;
10715682Smckusic 			if (_nodump == TRUE)
10725682Smckusic 				psexit(0);
10735682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
10745682Smckusic 			backtrace("Halted");
10755682Smckusic 			psexit(0);
10762080Smckusick 			continue;
10772080Smckusick 		case O_PXPBUF:
10782080Smckusick 			pc.cp++;
10792080Smckusick 			_cntrs = *pc.lp++;
10802080Smckusick 			_rtns = *pc.lp++;
10812950Smckusic 			NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long));
10822080Smckusick 			continue;
10832080Smckusick 		case O_COUNT:
10842080Smckusick 			pc.cp++;
10852080Smckusick 			_pcpcount[*pc.usp++]++;
10862080Smckusick 			continue;
10872080Smckusick 		case O_CASE1OP:
10882080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
10892080Smckusick 			if (tl == 0)
10902080Smckusick 				tl = *pc.usp++;
10912080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
10922080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
10932080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
10942080Smckusick 			for(; tl > 0; tl--)	/* look for element */
10952080Smckusick 				if (tl1 == *tcp++)
10962080Smckusick 					break;
10972080Smckusick 			if (tl == 0)		/* default case => error */
10985666Smckusic 				CASERNG(tl1);
10992080Smckusick 			pc.cp += *(tsp - tl);
11002080Smckusick 			continue;
11012080Smckusick 		case O_CASE2OP:
11022080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11032080Smckusick 			if (tl == 0)
11042080Smckusick 				tl = *pc.usp++;
11052080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11062080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
11072080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
11082080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11092080Smckusick 				if (tl1 == *tsp1++)
11102080Smckusick 					break;
11112080Smckusick 			if (tl == 0)		/* default case => error */
11125666Smckusic 				CASERNG(tl1);
11132080Smckusick 			pc.cp += *(tsp - tl);
11142080Smckusick 			continue;
11152080Smckusick 		case O_CASE4OP:
11162080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11172080Smckusick 			if (tl == 0)
11182080Smckusick 				tl = *pc.usp++;
11192080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11202080Smckusick 			tlp = (long *)tsp;	/* tlp = ptr to case values */
11212080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
11222080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11232080Smckusick 				if (tl1 == *tlp++)
11242080Smckusick 					break;
11252080Smckusick 			if (tl == 0)		/* default case => error */
11265666Smckusic 				CASERNG(tl1);
11272080Smckusick 			pc.cp += *(tsp - tl);
11282080Smckusick 			continue;
11292080Smckusick 		case O_ADDT:
11302080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11312080Smckusick 			if (tl == 0)
11322080Smckusick 				tl = *pc.usp++;
11332950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11342080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
11352080Smckusick 			popsp(tl);
11362080Smckusick 			continue;
11372080Smckusick 		case O_SUBT:
11382080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11392080Smckusick 			if (tl == 0)
11402080Smckusick 				tl = *pc.usp++;
11412950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11422080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
11432080Smckusick 			popsp(tl);
11442080Smckusick 			continue;
11452080Smckusick 		case O_MULT:
11462080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11472080Smckusick 			if (tl == 0)
11482080Smckusick 				tl = *pc.usp++;
11492950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11502080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
11512080Smckusick 			popsp(tl);
11522080Smckusick 			continue;
11532080Smckusick 		case O_INCT:
11542080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
11552080Smckusick 			if (tl == 0)
11562080Smckusick 				tl = *pc.usp++;
11572950Smckusic 			tb = INCT();
11582950Smckusic 			popsp(tl*sizeof(long));
11592950Smckusic 			push2((short)(tb));
11602080Smckusick 			continue;
11612080Smckusick 		case O_CTTOT:
11622080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
11632080Smckusick 			if (tl == 0)
11642080Smckusick 				tl = *pc.usp++;
11652080Smckusick 			tl1 = tl * sizeof(long);
11662950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
11672080Smckusick 			CTTOT(tcp);
11682950Smckusic 			popsp(tl*sizeof(long));
11692080Smckusick 			continue;
11702080Smckusick 		case O_CARD:
11712080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11722080Smckusick 			if (tl == 0)
11732080Smckusick 				tl = *pc.usp++;
11742950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
11752080Smckusick 			tl1 = CARD(tcp, tl);
11762080Smckusick 			popsp(tl);
11772950Smckusic 			push2((short)(tl1));
11782080Smckusick 			continue;
11792080Smckusick 		case O_IN:
11802080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11812080Smckusick 			if (tl == 0)
11822080Smckusick 				tl = *pc.usp++;
11832080Smckusick 			tl1 = pop4();		/* tl1 is the element */
11842950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
11854026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
11862950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
11872080Smckusick 			popsp(tl);
11882950Smckusic 			push2((short)(tb));
11892080Smckusick 			continue;
11902080Smckusick 		case O_ASRT:
11912080Smckusick 			pc.cp++;
11927923Smckusick 			ASRT();
11937923Smckusick 			popsp((long)(sizeof(long)+sizeof(char *)));
11942080Smckusick 			continue;
11952080Smckusick 		case O_FOR1U:
11964026Smckusic 			/*
11974026Smckusic 			 * with the shadowing of for loop variables
11984026Smckusic 			 * the variable is always sizeof(long) hence
11994026Smckusic 			 * nullifying the need for shorter length
12004026Smckusic 			 * assignments
12014026Smckusic 			 */
12022080Smckusick 		case O_FOR2U:
12034026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12044026Smckusic 			if (tl1 == 0)
12054026Smckusic 				tl1 = *pc.sp++;
12064026Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12074026Smckusic 			if (*tlp < pop4()) {	/* still going up */
12084026Smckusic 				tl = *tlp + 1;	/* inc index var */
12092191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
12102191Smckusic 				if (_runtst)
12112191Smckusic 					RANG4(tl, tl1, tl2);
12124026Smckusic 				*tlp = tl;	/* update index var */
12132080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12142080Smckusick 				continue;
12152080Smckusick 			}
12164026Smckusic 			pc.sp += 2;		/* else fall through */
12172080Smckusick 			continue;
12182080Smckusick 		case O_FOR4U:
12194026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12204026Smckusic 			if (tl1 == 0)
12214026Smckusic 				tl1 = *pc.lp++;
12222950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12232080Smckusick 			if (*tlp < pop4()) {	/* still going up */
12242191Smckusic 				tl = *tlp + 1;	/* inc index var */
12252191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
12262191Smckusic 				if (_runtst)
12272191Smckusic 					RANG4(tl, tl1, tl2);
12282191Smckusic 				*tlp = tl;	/* update index var */
12292080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12302080Smckusick 				continue;
12312080Smckusick 			}
12324026Smckusic 			pc.sp += 3;		/* else fall through */
12332080Smckusick 			continue;
12342080Smckusick 		case O_FOR1D:
12354026Smckusic 			/*
12364026Smckusic 			 * with the shadowing of for loop variables
12374026Smckusic 			 * the variable is always sizeof(long) hence
12384026Smckusic 			 * nullifying the need for shorter length
12394026Smckusic 			 * assignments
12404026Smckusic 			 */
12412080Smckusick 		case O_FOR2D:
12424026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12434026Smckusic 			if (tl1 == 0)
12444026Smckusic 				tl1 = *pc.sp++;
12454026Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12464026Smckusic 			if (*tlp > pop4()) {	/* still going down */
12474026Smckusic 				tl = *tlp - 1;	/* inc index var */
12482191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
12492191Smckusic 				if (_runtst)
12502191Smckusic 					RANG4(tl, tl1, tl2);
12514026Smckusic 				*tlp = tl;	/* update index var */
12522080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12532080Smckusick 				continue;
12542080Smckusick 			}
12554026Smckusic 			pc.sp += 2;		/* else fall through */
12562080Smckusick 			continue;
12572080Smckusick 		case O_FOR4D:
12584026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12594026Smckusic 			if (tl1 == 0)
12604026Smckusic 				tl1 = *pc.lp++;
12612950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12622080Smckusick 			if (*tlp > pop4()) {	/* still going down */
12632191Smckusic 				tl = *tlp - 1;	/* inc index var */
12642191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
12652191Smckusic 				if (_runtst)
12662191Smckusic 					RANG4(tl, tl1, tl2);
12672191Smckusic 				*tlp = tl;	/* update index var */
12682080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12692080Smckusick 				continue;
12702080Smckusick 			}
12714026Smckusic 			pc.sp += 3;		/* else fall through */
12722080Smckusick 			continue;
12732080Smckusick 		case O_READE:
12742080Smckusick 			pc.cp++;
12752950Smckusic 			push2((short)(READE(curfile, base + *pc.lp++)));
12762080Smckusick 			continue;
12772080Smckusick 		case O_READ4:
12782080Smckusick 			pc.cp++;
12792080Smckusick 			push4(READ4(curfile));
12802080Smckusick 			continue;
12812080Smckusick 		case O_READC:
12822080Smckusick 			pc.cp++;
12832950Smckusic 			push2((short)(READC(curfile)));
12842080Smckusick 			continue;
12852080Smckusick 		case O_READ8:
12862080Smckusick 			pc.cp++;
12872080Smckusick 			push8(READ8(curfile));
12882080Smckusick 			continue;
12892080Smckusick 		case O_READLN:
12902080Smckusick 			pc.cp++;
12912080Smckusick 			READLN(curfile);
12922080Smckusick 			continue;
12932080Smckusick 		case O_EOF:
12942080Smckusick 			pc.cp++;
12952950Smckusic 			push2((short)(TEOF(popaddr())));
12962080Smckusick 			continue;
12972080Smckusick 		case O_EOLN:
12982080Smckusick 			pc.cp++;
12992950Smckusic 			push2((short)(TEOLN(popaddr())));
13002080Smckusick 			continue;
13012080Smckusick 		case O_WRITEC:
13022191Smckusic 			if (_runtst) {
13032191Smckusic 				WRITEC(curfile);
13043166Smckusic 				popsp((long)(*pc.cp++));
13052191Smckusic 				continue;
13062191Smckusic 			}
13072191Smckusic 			fputc();
13083166Smckusic 			popsp((long)(*pc.cp++));
13092080Smckusick 			continue;
13102080Smckusick 		case O_WRITES:
13112191Smckusic 			if (_runtst) {
13122191Smckusic 				WRITES(curfile);
13133166Smckusic 				popsp((long)(*pc.cp++));
13142191Smckusic 				continue;
13152191Smckusic 			}
13162191Smckusic 			fwrite();
13173166Smckusic 			popsp((long)(*pc.cp++));
13182080Smckusick 			continue;
13192080Smckusick 		case O_WRITEF:
13202191Smckusic 			if (_runtst) {
13212191Smckusic 				WRITEF(curfile);
13223166Smckusic 				popsp((long)(*pc.cp++));
13232191Smckusic 				continue;
13242191Smckusic 			}
13252191Smckusic 			fprintf();
13263166Smckusic 			popsp((long)(*pc.cp++));
13272080Smckusick 			continue;
13282080Smckusick 		case O_WRITLN:
13292080Smckusick 			pc.cp++;
13302191Smckusic 			if (_runtst) {
13312191Smckusic 				WRITLN(curfile);
13322191Smckusic 				continue;
13332191Smckusic 			}
13342191Smckusic 			fputc('\n', ACTFILE(curfile));
13352080Smckusick 			continue;
13362080Smckusick 		case O_PAGE:
13372080Smckusick 			pc.cp++;
13382191Smckusic 			if (_runtst) {
13392191Smckusic 				PAGE(curfile);
13402191Smckusic 				continue;
13412191Smckusic 			}
13422950Smckusic 			fputc('', ACTFILE(curfile));
13432080Smckusick 			continue;
13442080Smckusick 		case O_NAM:
13452080Smckusick 			pc.cp++;
13462080Smckusick 			tl = pop4();
13472080Smckusick 			pushaddr(NAM(tl, base + *pc.lp++));
13482080Smckusick 			continue;
13492080Smckusick 		case O_MAX:
13502080Smckusick 			tl = *pc.cp++;
13512080Smckusick 			if (tl == 0)
13522080Smckusick 				tl = *pc.usp++;
13532080Smckusick 			tl1 = pop4();
13542191Smckusic 			if (_runtst) {
13552950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
13562191Smckusic 				continue;
13572191Smckusic 			}
13582191Smckusic 			tl1 -= tl;
13592191Smckusic 			tl = *pc.usp++;
13602191Smckusic 			push4(tl1 > tl ? tl1 : tl);
13612080Smckusick 			continue;
13622080Smckusick 		case O_MIN:
13632080Smckusick 			tl = *pc.cp++;
13642080Smckusick 			if (tl == 0)
13652080Smckusick 				tl = *pc.usp++;
13662080Smckusick 			tl1 = pop4();
13672080Smckusick 			push4(tl1 < tl ? tl1 : tl);
13682080Smckusick 			continue;
13692080Smckusick 		case O_UNIT:
13702080Smckusick 			pc.cp++;
13712080Smckusick 			curfile = UNIT(popaddr());
13722080Smckusick 			continue;
13732080Smckusick 		case O_UNITINP:
13742080Smckusick 			pc.cp++;
13752080Smckusick 			curfile = INPUT;
13762080Smckusick 			continue;
13772080Smckusick 		case O_UNITOUT:
13782080Smckusick 			pc.cp++;
13792080Smckusick 			curfile = OUTPUT;
13802080Smckusick 			continue;
13812080Smckusick 		case O_MESSAGE:
13822080Smckusick 			pc.cp++;
13832080Smckusick 			PFLUSH();
13842080Smckusick 			curfile = ERR;
13852080Smckusick 			continue;
13862109Smckusic 		case O_PUT:
13872109Smckusic 			pc.cp++;
13882109Smckusic 			PUT(curfile);
13892109Smckusic 			continue;
13902080Smckusick 		case O_GET:
13912080Smckusick 			pc.cp++;
13922080Smckusick 			GET(curfile);
13932080Smckusick 			continue;
13942080Smckusick 		case O_FNIL:
13952080Smckusick 			pc.cp++;
13962080Smckusick 			pushaddr(FNIL(popaddr()));
13972080Smckusick 			continue;
13982080Smckusick 		case O_DEFNAME:
13992080Smckusick 			pc.cp++;
14002080Smckusick 			DEFNAME();
14012950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14022080Smckusick 			continue;
14032080Smckusick 		case O_RESET:
14042080Smckusick 			pc.cp++;
14052080Smckusick 			RESET();
14062950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14072080Smckusick 			continue;
14082080Smckusick 		case O_REWRITE:
14092080Smckusick 			pc.cp++;
14102080Smckusick 			REWRITE();
14112950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14122080Smckusick 			continue;
14132080Smckusick 		case O_FILE:
14142080Smckusick 			pc.cp++;
14152080Smckusick 			pushaddr(ACTFILE(curfile));
14162080Smckusick 			continue;
14172080Smckusick 		case O_REMOVE:
14182080Smckusick 			pc.cp++;
14192080Smckusick 			REMOVE();
14202950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
14212080Smckusick 			continue;
14222080Smckusick 		case O_FLUSH:
14232080Smckusick 			pc.cp++;
14242080Smckusick 			FLUSH();
14252950Smckusic 			popsp((long)(sizeof(char *)));
14262080Smckusick 			continue;
14272080Smckusick 		case O_PACK:
14282080Smckusick 			pc.cp++;
14292080Smckusick 			PACK();
14302950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14312080Smckusick 			continue;
14322080Smckusick 		case O_UNPACK:
14332080Smckusick 			pc.cp++;
14342080Smckusick 			UNPACK();
14352950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14362080Smckusick 			continue;
14372080Smckusick 		case O_ARGC:
14382080Smckusick 			pc.cp++;
14392950Smckusic 			push4((long)_argc);
14402080Smckusick 			continue;
14412080Smckusick 		case O_ARGV:
14422080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
14432080Smckusick 			if (tl == 0)
14442080Smckusick 				tl = *pc.usp++;
14452080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
14462080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
14472080Smckusick 			ARGV(tl1, tcp, tl);
14482080Smckusick 			continue;
14492080Smckusick 		case O_CLCK:
14502080Smckusick 			pc.cp++;
14512080Smckusick 			push4(CLCK());
14522080Smckusick 			continue;
14532080Smckusick 		case O_WCLCK:
14542080Smckusick 			pc.cp++;
14552080Smckusick 			push4(time(0));
14562080Smckusick 			continue;
14572080Smckusick 		case O_SCLCK:
14582080Smckusick 			pc.cp++;
14592080Smckusick 			push4(SCLCK());
14602080Smckusick 			continue;
14612080Smckusick 		case O_NEW:
14622080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
14632080Smckusick 			if (tl == 0)
14642080Smckusick 				tl = *pc.usp++;
14652080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
14662191Smckusic 			if (_runtst) {
14672191Smckusic 				NEWZ(tcp, tl);
14682191Smckusic 				continue;
14692191Smckusic 			}
14702191Smckusic 			NEW(tcp, tl);
14712080Smckusick 			continue;
1472*7961Smckusick 		case O_DISPOSE:
1473*7961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
1474*7961Smckusick 			if (tl == 0)
1475*7961Smckusick 				tl = *pc.usp++;
1476*7961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
1477*7961Smckusick 			DISPOSE(tcp, tl);
1478*7961Smckusick 			*(char **)tcp = (char *)0;
1479*7961Smckusick 			continue;
1480*7961Smckusick 		case O_DFDISP:
1481*7961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
1482*7961Smckusick 			if (tl == 0)
1483*7961Smckusick 				tl = *pc.usp++;
1484*7961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
1485*7961Smckusick 			DFDISPOSE(tcp, tl);
1486*7961Smckusick 			*(char **)tcp = (char *)0;
1487*7961Smckusick 			continue;
14882080Smckusick 		case O_DATE:
14892080Smckusick 			pc.cp++;
14902080Smckusick 			DATE(popaddr());
14912080Smckusick 			continue;
14922080Smckusick 		case O_TIME:
14932080Smckusick 			pc.cp++;
14942080Smckusick 			TIME(popaddr());
14952080Smckusick 			continue;
14962080Smckusick 		case O_UNDEF:
14972080Smckusick 			pc.cp++;
14982080Smckusick 			pop8();
14992950Smckusic 			push2((short)(0));
15002080Smckusick 			continue;
15012080Smckusick 		case O_ATAN:
15022080Smckusick 			pc.cp++;
15035723Smckusic 			if (_runtst) {
15045723Smckusic 				push8(ATAN(pop8()));
15055723Smckusic 				continue;
15065723Smckusic 			}
15072080Smckusick 			push8(atan(pop8()));
15082080Smckusick 			continue;
15092080Smckusick 		case O_COS:
15102080Smckusick 			pc.cp++;
15115723Smckusic 			if (_runtst) {
15125723Smckusic 				push8(COS(pop8()));
15135723Smckusic 				continue;
15145723Smckusic 			}
15152080Smckusick 			push8(cos(pop8()));
15162080Smckusick 			continue;
15172080Smckusick 		case O_EXP:
15182080Smckusick 			pc.cp++;
15195723Smckusic 			if (_runtst) {
15205723Smckusic 				push8(EXP(pop8()));
15215723Smckusic 				continue;
15225723Smckusic 			}
15232080Smckusick 			push8(exp(pop8()));
15242080Smckusick 			continue;
15252080Smckusick 		case O_LN:
15262080Smckusick 			pc.cp++;
15272191Smckusic 			if (_runtst) {
15282191Smckusic 				push8(LN(pop8()));
15292191Smckusic 				continue;
15302191Smckusic 			}
15312191Smckusic 			push8(log(pop8()));
15322080Smckusick 			continue;
15332080Smckusick 		case O_SIN:
15342080Smckusick 			pc.cp++;
15355723Smckusic 			if (_runtst) {
15365723Smckusic 				push8(SIN(pop8()));
15375723Smckusic 				continue;
15385723Smckusic 			}
15392080Smckusick 			push8(sin(pop8()));
15402080Smckusick 			continue;
15412080Smckusick 		case O_SQRT:
15422080Smckusick 			pc.cp++;
15432191Smckusic 			if (_runtst) {
15442191Smckusic 				push8(SQRT(pop8()));
15452191Smckusic 				continue;
15462191Smckusic 			}
15472191Smckusic 			push8(sqrt(pop8()));
15482080Smckusick 			continue;
15492080Smckusick 		case O_CHR2:
15502080Smckusick 		case O_CHR4:
15512080Smckusick 			pc.cp++;
15522191Smckusic 			if (_runtst) {
15532950Smckusic 				push2((short)(CHR(pop4())));
15542191Smckusic 				continue;
15552191Smckusic 			}
15562950Smckusic 			push2((short)(pop4()));
15572080Smckusick 			continue;
15582080Smckusick 		case O_ODD2:
15592080Smckusick 		case O_ODD4:
15602080Smckusick 			pc.cp++;
15612950Smckusic 			push2((short)(pop4() & 1));
15622080Smckusick 			continue;
15632080Smckusick 		case O_SUCC2:
15642109Smckusic 			tl = *pc.cp++;
15652109Smckusic 			if (tl == 0)
15662109Smckusic 				tl = *pc.sp++;
15672109Smckusic 			tl1 = pop4();
15682191Smckusic 			if (_runtst) {
15692950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
15702191Smckusic 				continue;
15712191Smckusic 			}
15722950Smckusic 			push2((short)(tl1 + 1));
15732191Smckusic 			pc.sp++;
15742080Smckusick 			continue;
15752080Smckusick 		case O_SUCC24:
15762109Smckusic 			tl = *pc.cp++;
15772109Smckusic 			if (tl == 0)
15782109Smckusic 				tl = *pc.sp++;
15792109Smckusic 			tl1 = pop4();
15802191Smckusic 			if (_runtst) {
15812950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
15822191Smckusic 				continue;
15832191Smckusic 			}
15842191Smckusic 			push4(tl1 + 1);
15852191Smckusic 			pc.sp++;
15862109Smckusic 			continue;
15872080Smckusick 		case O_SUCC4:
15882109Smckusic 			tl = *pc.cp++;
15892109Smckusic 			if (tl == 0)
15902109Smckusic 				tl = *pc.lp++;
15912109Smckusic 			tl1 = pop4();
15922191Smckusic 			if (_runtst) {
15932950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.lp++)));
15942191Smckusic 				continue;
15952191Smckusic 			}
15962191Smckusic 			push4(tl1 + 1);
15972191Smckusic 			pc.lp++;
15982080Smckusick 			continue;
15992080Smckusick 		case O_PRED2:
16002109Smckusic 			tl = *pc.cp++;
16012109Smckusic 			if (tl == 0)
16022109Smckusic 				tl = *pc.sp++;
16032109Smckusic 			tl1 = pop4();
16042191Smckusic 			if (_runtst) {
16052950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
16062191Smckusic 				continue;
16072191Smckusic 			}
16082950Smckusic 			push2((short)(tl1 - 1));
16092191Smckusic 			pc.sp++;
16102080Smckusick 			continue;
16112080Smckusick 		case O_PRED24:
16122109Smckusic 			tl = *pc.cp++;
16132109Smckusic 			if (tl == 0)
16142109Smckusic 				tl = *pc.sp++;
16152109Smckusic 			tl1 = pop4();
16162191Smckusic 			if (_runtst) {
16172950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
16182191Smckusic 				continue;
16192191Smckusic 			}
16202191Smckusic 			push4(tl1 - 1);
16212191Smckusic 			pc.sp++;
16222109Smckusic 			continue;
16232080Smckusick 		case O_PRED4:
16242109Smckusic 			tl = *pc.cp++;
16252109Smckusic 			if (tl == 0)
16262109Smckusic 				tl = *pc.lp++;
16272109Smckusic 			tl1 = pop4();
16282191Smckusic 			if (_runtst) {
16292950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.lp++)));
16302191Smckusic 				continue;
16312191Smckusic 			}
16322191Smckusic 			push4(tl1 - 1);
16332191Smckusic 			pc.lp++;
16342080Smckusick 			continue;
16352080Smckusick 		case O_SEED:
16362080Smckusick 			pc.cp++;
16372080Smckusick 			push4(SEED(pop4()));
16382080Smckusick 			continue;
16392080Smckusick 		case O_RANDOM:
16402080Smckusick 			pc.cp++;
16412080Smckusick 			push8(RANDOM(pop8()));
16422080Smckusick 			continue;
16432080Smckusick 		case O_EXPO:
16442080Smckusick 			pc.cp++;
16452080Smckusick 			push4(EXPO(pop8()));
16462080Smckusick 			continue;
16472080Smckusick 		case O_SQR2:
16482080Smckusick 		case O_SQR4:
16492080Smckusick 			pc.cp++;
16502080Smckusick 			tl = pop4();
16512080Smckusick 			push4(tl * tl);
16522080Smckusick 			continue;
16532080Smckusick 		case O_SQR8:
16542080Smckusick 			pc.cp++;
16552080Smckusick 			td = pop8();
16562080Smckusick 			push8(td * td);
16572080Smckusick 			continue;
16582080Smckusick 		case O_ROUND:
16592080Smckusick 			pc.cp++;
16602080Smckusick 			push4(ROUND(pop8()));
16612080Smckusick 			continue;
16622080Smckusick 		case O_TRUNC:
16632080Smckusick 			pc.cp++;
16642080Smckusick 			push4(TRUNC(pop8()));
16652080Smckusick 			continue;
16662950Smckusic 		default:
16675682Smckusic 			ERROR("Panic: bad op code\n");
16682950Smckusic 			continue;
16692080Smckusick 		}
16702080Smckusick 	}
16712080Smckusick }
1672