xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 5723)
12080Smckusick /* Copyright (c) 1979 Regents of the University of California */
22080Smckusick 
3*5723Smckusic static char sccsid[] = "@(#)interp.c 1.20 02/08/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  */
732950Smckusic 	FTEXT | FREAD | SYNC,	/* 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 */
1745658Slinton 			asm(".byte 0");
1755658Slinton 			pc.ucp--;
1765658Slinton 			continue;
1772080Smckusick 		case O_NODUMP:
1782191Smckusic 			_nodump = TRUE;
1792080Smckusick 			/* and fall through */
1802080Smckusick 		case O_BEG:
1812080Smckusick 			_dp += 1;		/* enter local scope */
1822080Smckusick 			stp->odisp = *_dp;	/* save old display value */
1832080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
1842080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
1852191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
1862191Smckusic 			_lino = pc.hdrp->offset;
1872191Smckusic 			_runtst = pc.hdrp->tests;
1882191Smckusic 			disableovrflo();
1892191Smckusic 			if (_runtst)
1902191Smckusic 				enableovrflo();
1912950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
1922080Smckusick 			stp->file = curfile;	/* save active file */
1932080Smckusick 			tcp = pushsp(tl1);	/* tcp = new top of stack */
1942950Smckusic 			if (_runtst)		/* zero stack frame */
1952950Smckusic 				blkclr(tl1, tcp);
1962950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
1972109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
1982109Smckusic 			_dp->stp = stp;
1992950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2002080Smckusick 			continue;
2012080Smckusick 		case O_END:
2022080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2032080Smckusick 			stp = _dp->stp;
2042080Smckusick 			curfile = stp->file;	/* restore old active file */
2052080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2062109Smckusic 			if (_dp == &_display.frame[1])
2072080Smckusick 				return;		/* exiting main proc ??? */
2082080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
2092080Smckusick 			pc.cp = stp->pc.cp;
2102080Smckusick 			_dp = stp->dp;
2112191Smckusic 			_runtst = stp->entry->tests;
2122191Smckusic 			disableovrflo();
2132191Smckusic 			if (_runtst)
2142191Smckusic 				enableovrflo();
2152109Smckusic 			popsp(stp->entry->framesze +	/* pop local vars */
2162080Smckusick 			      sizeof(struct stack) +	/* pop stack frame */
2172080Smckusick 			      stp->entry->nargs);	/* pop parms */
2182080Smckusick 			continue;
2192080Smckusick 		case O_CALL:
2202080Smckusick 			tl = *pc.cp++;
2212080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
2222080Smckusick 			tcp += sizeof(short);
2232080Smckusick 			tcp = base + *(long *)tcp;
2242950Smckusic 			stp = (struct stack *)
2252950Smckusic 				pushsp((long)(sizeof(struct stack)));
2262080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
2272080Smckusick 			stp->pc.cp = pc.cp;
2282080Smckusick 			stp->dp = _dp;
2292109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2302080Smckusick 			pc.cp = tcp;
2312080Smckusick 			continue;
2322080Smckusick 		case O_FCALL:
2333294Smckusic 			pc.cp++;
2344016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2352080Smckusick 			tfp = (struct formalrtn *)popaddr();
2362950Smckusic 			stp = (struct stack *)
2372950Smckusic 				pushsp((long)(sizeof(struct stack)));
2382080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
2392080Smckusick 			stp->pc.cp = pc.cp;
2402080Smckusick 			stp->dp = _dp;
2413436Smckusic 			pc.cp = tfp->fentryaddr;/* calc new entry point */
2423436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2433436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2444016Smckusic  				&_display.frame[1], tcp);
2453436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2463436Smckusic 				&tfp->fdisp[0], &_display.frame[1]);
2472080Smckusick 			continue;
2482080Smckusick 		case O_FRTN:
2492080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2502080Smckusick 			if (tl == 0)
2512080Smckusick 				tl = *pc.usp++;
2522950Smckusic 			tcp = pushsp((long)(0));
2532080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2544016Smckusic  			tcp1 = *(char **)
2554016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2563861Smckusic 			if (tl != 0) {
2574016Smckusic 				blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)
2584016Smckusic 				    + sizeof(char *));
2593861Smckusic 			}
2604016Smckusic  			popsp((long)
2614016Smckusic  			    (sizeof(struct formalrtn *) + sizeof (char *)));
2623436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2634016Smckusic  			    tcp1, &_display.frame[1]);
2642080Smckusick 			continue;
2652080Smckusick 		case O_FSAV:
2662080Smckusick 			tfp = (struct formalrtn *)popaddr();
2673436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
2683861Smckusic 			tcp = base + *pc.lp++;	/* calc new entry point */
2692080Smckusick 			tcp += sizeof(short);
2703436Smckusic 			tfp->fentryaddr = base + *(long *)tcp;
2713436Smckusic 			blkcpy(tfp->fbn * sizeof(struct disp),
2723436Smckusic 				&_display.frame[1], &tfp->fdisp[0]);
2732080Smckusick 			pushaddr(tfp);
2742080Smckusick 			continue;
2752080Smckusick 		case O_SDUP2:
2762080Smckusick 			pc.cp++;
2772080Smckusick 			tl = pop2();
2782950Smckusic 			push2((short)(tl));
2792950Smckusic 			push2((short)(tl));
2802080Smckusick 			continue;
2812080Smckusick 		case O_SDUP4:
2822080Smckusick 			pc.cp++;
2832080Smckusick 			tl = pop4();
2842080Smckusick 			push4(tl);
2852080Smckusick 			push4(tl);
2862080Smckusick 			continue;
2872080Smckusick 		case O_TRA:
2882080Smckusick 			pc.cp++;
2892080Smckusick 			pc.cp += *pc.sp;
2902080Smckusick 			continue;
2912080Smckusick 		case O_TRA4:
2922080Smckusick 			pc.cp++;
2932080Smckusick 			pc.cp = base + *pc.lp;
2942080Smckusick 			continue;
2952080Smckusick 		case O_GOTO:
2962109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
2972109Smckusic 								exit frame */
2982080Smckusick 			pc.cp = base + *pc.lp;
2992080Smckusick 			stp = _dp->stp;
3002080Smckusick 			while (tstp != stp) {
3012109Smckusic 				if (_dp == &_display.frame[1])
3023872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3032080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3042080Smckusick 				curfile = stp->file;  /* restore active file */
3052080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3062080Smckusick 				_dp = stp->dp;	      /* restore dp */
3072080Smckusick 				stp = _dp->stp;
3082080Smckusick 			}
3092080Smckusick 			/* pop locals, stack frame, parms, and return values */
3102950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3112080Smckusick 			continue;
3122080Smckusick 		case O_LINO:
3132950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3145682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3152080Smckusick 			_lino = *pc.cp++;	/* set line number */
3162080Smckusick 			if (_lino == 0)
3172080Smckusick 				_lino = *pc.sp++;
3182950Smckusic 			if (_runtst) {
3192950Smckusic 				LINO();		/* inc statement count */
3202950Smckusic 				continue;
3212950Smckusic 			}
3222950Smckusic 			_stcnt++;
3232080Smckusick 			continue;
3242080Smckusick 		case O_PUSH:
3252080Smckusick 			tl = *pc.cp++;
3262080Smckusick 			if (tl == 0)
3272080Smckusick 				tl = *pc.usp++;
3282080Smckusick 			tl = (-tl + 1) & ~1;
3292080Smckusick 			tcp = pushsp(tl);
3302950Smckusic 			if (_runtst)
3312950Smckusic 				blkclr(tl, tcp);
3322080Smckusick 			continue;
3332080Smckusick 		case O_IF:
3342080Smckusick 			pc.cp++;
3352191Smckusic 			if (pop2()) {
3362080Smckusick 				pc.sp++;
3372191Smckusic 				continue;
3382191Smckusic 			}
3392191Smckusic 			pc.cp += *pc.sp;
3402080Smckusick 			continue;
3412080Smckusick 		case O_REL2:
3422080Smckusick 			tl = pop2();
3432080Smckusick 			tl1 = pop2();
3442080Smckusick 			goto cmplong;
3452080Smckusick 		case O_REL24:
3462080Smckusick 			tl = pop2();
3472080Smckusick 			tl1 = pop4();
3482080Smckusick 			goto cmplong;
3492080Smckusick 		case O_REL42:
3502080Smckusick 			tl = pop4();
3512080Smckusick 			tl1 = pop2();
3522080Smckusick 			goto cmplong;
3532080Smckusick 		case O_REL4:
3542080Smckusick 			tl = pop4();
3552080Smckusick 			tl1 = pop4();
3562080Smckusick 		cmplong:
3575682Smckusic 			switch (*pc.cp++) {
3582080Smckusick 			case releq:
3592080Smckusick 				push2(tl1 == tl);
3602080Smckusick 				continue;
3612080Smckusick 			case relne:
3622080Smckusick 				push2(tl1 != tl);
3632080Smckusick 				continue;
3642080Smckusick 			case rellt:
3652080Smckusick 				push2(tl1 < tl);
3662080Smckusick 				continue;
3672080Smckusick 			case relgt:
3682080Smckusick 				push2(tl1 > tl);
3692080Smckusick 				continue;
3702080Smckusick 			case relle:
3712080Smckusick 				push2(tl1 <= tl);
3722080Smckusick 				continue;
3732080Smckusick 			case relge:
3742080Smckusick 				push2(tl1 >= tl);
3752080Smckusick 				continue;
3762080Smckusick 			default:
3775682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
3785682Smckusic 				    *(pc.cp - 1));
3792080Smckusick 				continue;
3802080Smckusick 			}
3812080Smckusick 		case O_RELG:
3822080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
3832080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
3842080Smckusick 			tl1 = (tl + 1) & ~1;	/* tl1 has arg stack length */
3852950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
3862080Smckusick 			switch (tl2) {
3872080Smckusick 			case releq:
3882950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
3892080Smckusick 				break;
3902080Smckusick 			case relne:
3912950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
3922080Smckusick 				break;
3932080Smckusick 			case rellt:
3942950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
3952080Smckusick 				break;
3962080Smckusick 			case relgt:
3972950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
3982080Smckusick 				break;
3992080Smckusick 			case relle:
4002950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4012080Smckusick 				break;
4022080Smckusick 			case relge:
4032950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4042080Smckusick 				break;
4052080Smckusick 			default:
4065682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4072080Smckusick 				break;
4082080Smckusick 			}
4092080Smckusick 			popsp(tl1 << 1);
4102950Smckusic 			push2((short)(tb));
4112080Smckusick 			continue;
4122080Smckusick 		case O_RELT:
4132080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4142080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4152950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4162080Smckusick 			switch (tl2) {
4172080Smckusick 			case releq:
4182950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4192080Smckusick 				break;
4202080Smckusick 			case relne:
4212950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4222080Smckusick 				break;
4232080Smckusick 			case rellt:
4242950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4252080Smckusick 				break;
4262080Smckusick 			case relgt:
4272950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4282080Smckusick 				break;
4292080Smckusick 			case relle:
4302950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4312080Smckusick 				break;
4322080Smckusick 			case relge:
4332950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4342080Smckusick 				break;
4352080Smckusick 			default:
4365682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4372080Smckusick 				break;
4382080Smckusick 			}
4392080Smckusick 			popsp(tl1 << 1);
4402950Smckusic 			push2((short)(tb));
4412080Smckusick 			continue;
4422080Smckusick 		case O_REL28:
4432080Smckusick 			td = pop2();
4442080Smckusick 			td1 = pop8();
4452080Smckusick 			goto cmpdbl;
4462080Smckusick 		case O_REL48:
4472080Smckusick 			td = pop4();
4482080Smckusick 			td1 = pop8();
4492080Smckusick 			goto cmpdbl;
4502080Smckusick 		case O_REL82:
4512080Smckusick 			td = pop8();
4522080Smckusick 			td1 = pop2();
4532080Smckusick 			goto cmpdbl;
4542080Smckusick 		case O_REL84:
4552080Smckusick 			td = pop8();
4562080Smckusick 			td1 = pop4();
4572080Smckusick 			goto cmpdbl;
4582080Smckusick 		case O_REL8:
4592080Smckusick 			td = pop8();
4602080Smckusick 			td1 = pop8();
4612080Smckusick 		cmpdbl:
4622080Smckusick 			switch (*pc.cp++) {
4632080Smckusick 			case releq:
4642080Smckusick 				push2(td1 == td);
4652080Smckusick 				continue;
4662080Smckusick 			case relne:
4672080Smckusick 				push2(td1 != td);
4682080Smckusick 				continue;
4692080Smckusick 			case rellt:
4702080Smckusick 				push2(td1 < td);
4712080Smckusick 				continue;
4722080Smckusick 			case relgt:
4732080Smckusick 				push2(td1 > td);
4742080Smckusick 				continue;
4752080Smckusick 			case relle:
4762080Smckusick 				push2(td1 <= td);
4772080Smckusick 				continue;
4782080Smckusick 			case relge:
4792080Smckusick 				push2(td1 >= td);
4802080Smckusick 				continue;
4812080Smckusick 			default:
4825682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
4835682Smckusic 				    *(pc.cp - 1));
4842080Smckusick 				continue;
4852080Smckusick 			}
4862080Smckusick 		case O_AND:
4872080Smckusick 			pc.cp++;
4882080Smckusick 			push2(pop2() & pop2());
4892080Smckusick 			continue;
4902080Smckusick 		case O_OR:
4912080Smckusick 			pc.cp++;
4922080Smckusick 			push2(pop2() | pop2());
4932080Smckusick 			continue;
4942080Smckusick 		case O_NOT:
4952080Smckusick 			pc.cp++;
4962080Smckusick 			push2(pop2() ^ 1);
4972080Smckusick 			continue;
4982080Smckusick 		case O_AS2:
4992080Smckusick 			pc.cp++;
5002080Smckusick 			tl = pop2();
5012080Smckusick 			*(short *)popaddr() = tl;
5022080Smckusick 			continue;
5032080Smckusick 		case O_AS4:
5042080Smckusick 			pc.cp++;
5052080Smckusick 			tl = pop4();
5062080Smckusick 			*(long *)popaddr() = tl;
5072080Smckusick 			continue;
5082080Smckusick 		case O_AS24:
5092080Smckusick 			pc.cp++;
5102080Smckusick 			tl = pop2();
5112080Smckusick 			*(long *)popaddr() = tl;
5122080Smckusick 			continue;
5132080Smckusick 		case O_AS42:
5142080Smckusick 			pc.cp++;
5152080Smckusick 			tl = pop4();
5162080Smckusick 			*(short *)popaddr() = tl;
5172080Smckusick 			continue;
5182080Smckusick 		case O_AS21:
5192080Smckusick 			pc.cp++;
5202080Smckusick 			tl = pop2();
5212080Smckusick 			*popaddr() = tl;
5222080Smckusick 			continue;
5232080Smckusick 		case O_AS41:
5242080Smckusick 			pc.cp++;
5252080Smckusick 			tl = pop4();
5262080Smckusick 			*popaddr() = tl;
5272080Smckusick 			continue;
5282080Smckusick 		case O_AS28:
5292080Smckusick 			pc.cp++;
5302080Smckusick 			tl = pop2();
5312080Smckusick 			*(double *)popaddr() = tl;
5322080Smckusick 			continue;
5332080Smckusick 		case O_AS48:
5342080Smckusick 			pc.cp++;
5352080Smckusick 			tl = pop4();
5362080Smckusick 			*(double *)popaddr() = tl;
5372080Smckusick 			continue;
5382080Smckusick 		case O_AS8:
5392080Smckusick 			pc.cp++;
5402239Smckusic 			t8 = popsze8();
5412239Smckusic 			*(struct sze8 *)popaddr() = t8;
5422080Smckusick 			continue;
5432080Smckusick 		case O_AS:
5442080Smckusick 			tl = *pc.cp++;
5452080Smckusick 			if (tl == 0)
5462080Smckusick 				tl = *pc.usp++;
5472080Smckusick 			tl1 = (tl + 1) & ~1;
5482950Smckusic 			tcp = pushsp((long)(0));
5492080Smckusick 			blkcpy(tl, tcp, *(char **)(tcp + tl1));
5502080Smckusick 			popsp(tl1 + sizeof(char *));
5512080Smckusick 			continue;
5522080Smckusick 		case O_INX2P2:
5532080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
5542080Smckusick 			tl1 = (pop2() - *pc.sp++) << tl;
5552080Smckusick 			pushaddr(popaddr() + tl1);
5562080Smckusick 			continue;
5572080Smckusick 		case O_INX4P2:
5582080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
5592080Smckusick 			tl1 = (pop4() - *pc.sp++) << tl;
5602080Smckusick 			pushaddr(popaddr() + tl1);
5612080Smckusick 			continue;
5622080Smckusick 		case O_INX2:
5632080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5642080Smckusick 			if (tl == 0)
5652080Smckusick 				tl = *pc.usp++;
5662080Smckusick 			tl1 = pop2();		/* index */
5672080Smckusick 			tl2 = *pc.sp++;
5682080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
5692191Smckusic 			tl = *pc.usp++;
5702191Smckusic 			if (_runtst)
5712191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5722080Smckusick 			continue;
5732080Smckusick 		case O_INX4:
5742080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5752080Smckusick 			if (tl == 0)
5762080Smckusick 				tl = *pc.usp++;
5772080Smckusick 			tl1 = pop4();		/* index */
5782080Smckusick 			tl2 = *pc.sp++;
5792080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
5802191Smckusic 			tl = *pc.usp++;
5812191Smckusic 			if (_runtst)
5822191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5832080Smckusick 			continue;
5842080Smckusick 		case O_OFF:
5852080Smckusick 			tl = *pc.cp++;
5862080Smckusick 			if (tl == 0)
5872080Smckusick 				tl = *pc.usp++;
5882950Smckusic 			pushaddr(popaddr() + tl);
5892080Smckusick 			continue;
5902080Smckusick 		case O_NIL:
5912080Smckusick 			pc.cp++;
5922080Smckusick 			NIL();
5932080Smckusick 			continue;
5942080Smckusick 		case O_ADD2:
5952080Smckusick 			pc.cp++;
5962950Smckusic 			push4((long)(pop2() + pop2()));
5972080Smckusick 			continue;
5982080Smckusick 		case O_ADD4:
5992080Smckusick 			pc.cp++;
6002080Smckusick 			push4(pop4() + pop4());
6012080Smckusick 			continue;
6022080Smckusick 		case O_ADD24:
6032080Smckusick 			pc.cp++;
6042080Smckusick 			tl = pop2();
6052080Smckusick 			push4(pop4() + tl);
6062080Smckusick 			continue;
6072080Smckusick 		case O_ADD42:
6082080Smckusick 			pc.cp++;
6092080Smckusick 			tl = pop4();
6102080Smckusick 			push4(pop2() + tl);
6112080Smckusick 			continue;
6122080Smckusick 		case O_ADD28:
6132080Smckusick 			pc.cp++;
6142080Smckusick 			tl = pop2();
6152080Smckusick 			push8(pop8() + tl);
6162080Smckusick 			continue;
6172080Smckusick 		case O_ADD48:
6182080Smckusick 			pc.cp++;
6192080Smckusick 			tl = pop4();
6202080Smckusick 			push8(pop8() + tl);
6212080Smckusick 			continue;
6222080Smckusick 		case O_ADD82:
6232080Smckusick 			pc.cp++;
6242080Smckusick 			td = pop8();
6252080Smckusick 			push8(pop2() + td);
6262080Smckusick 			continue;
6272080Smckusick 		case O_ADD84:
6282080Smckusick 			pc.cp++;
6292080Smckusick 			td = pop8();
6302080Smckusick 			push8(pop4() + td);
6312080Smckusick 			continue;
6322080Smckusick 		case O_SUB2:
6332080Smckusick 			pc.cp++;
6342080Smckusick 			tl = pop2();
6352080Smckusick 			push4(pop2() - tl);
6362080Smckusick 			continue;
6372080Smckusick 		case O_SUB4:
6382080Smckusick 			pc.cp++;
6392080Smckusick 			tl = pop4();
6402080Smckusick 			push4(pop4() - tl);
6412080Smckusick 			continue;
6422080Smckusick 		case O_SUB24:
6432080Smckusick 			pc.cp++;
6442080Smckusick 			tl = pop2();
6452080Smckusick 			push4(pop4() - tl);
6462080Smckusick 			continue;
6472080Smckusick 		case O_SUB42:
6482080Smckusick 			pc.cp++;
6492080Smckusick 			tl = pop4();
6502080Smckusick 			push4(pop2() - tl);
6512080Smckusick 			continue;
6522080Smckusick 		case O_SUB28:
6532080Smckusick 			pc.cp++;
6542080Smckusick 			tl = pop2();
6552080Smckusick 			push8(pop8() - tl);
6562080Smckusick 			continue;
6572080Smckusick 		case O_SUB48:
6582080Smckusick 			pc.cp++;
6592080Smckusick 			tl = pop4();
6602080Smckusick 			push8(pop8() - tl);
6612080Smckusick 			continue;
6622080Smckusick 		case O_SUB82:
6632080Smckusick 			pc.cp++;
6642080Smckusick 			td = pop8();
6652080Smckusick 			push8(pop2() - td);
6662080Smckusick 			continue;
6672080Smckusick 		case O_SUB84:
6682080Smckusick 			pc.cp++;
6692080Smckusick 			td = pop8();
6702080Smckusick 			push8(pop4() - td);
6712080Smckusick 			continue;
6722080Smckusick 		case O_MUL2:
6732080Smckusick 			pc.cp++;
6742950Smckusic 			push4((long)(pop2() * pop2()));
6752080Smckusick 			continue;
6762080Smckusick 		case O_MUL4:
6772080Smckusick 			pc.cp++;
6782080Smckusick 			push4(pop4() * pop4());
6792080Smckusick 			continue;
6802080Smckusick 		case O_MUL24:
6812080Smckusick 			pc.cp++;
6822080Smckusick 			tl = pop2();
6832080Smckusick 			push4(pop4() * tl);
6842080Smckusick 			continue;
6852080Smckusick 		case O_MUL42:
6862080Smckusick 			pc.cp++;
6872080Smckusick 			tl = pop4();
6882080Smckusick 			push4(pop2() * tl);
6892080Smckusick 			continue;
6902080Smckusick 		case O_MUL28:
6912080Smckusick 			pc.cp++;
6922080Smckusick 			tl = pop2();
6932080Smckusick 			push8(pop8() * tl);
6942080Smckusick 			continue;
6952080Smckusick 		case O_MUL48:
6962080Smckusick 			pc.cp++;
6972080Smckusick 			tl = pop4();
6982080Smckusick 			push8(pop8() * tl);
6992080Smckusick 			continue;
7002080Smckusick 		case O_MUL82:
7012080Smckusick 			pc.cp++;
7022080Smckusick 			td = pop8();
7032080Smckusick 			push8(pop2() * td);
7042080Smckusick 			continue;
7052080Smckusick 		case O_MUL84:
7062080Smckusick 			pc.cp++;
7072080Smckusick 			td = pop8();
7082080Smckusick 			push8(pop4() * td);
7092080Smckusick 			continue;
7102080Smckusick 		case O_ABS2:
7112080Smckusick 		case O_ABS4:
7122080Smckusick 			pc.cp++;
7132080Smckusick 			tl = pop4();
7142080Smckusick 			push4(tl >= 0 ? tl : -tl);
7152080Smckusick 			continue;
7162080Smckusick 		case O_ABS8:
7172080Smckusick 			pc.cp++;
7182080Smckusick 			td = pop8();
7192080Smckusick 			push8(td >= 0.0 ? td : -td);
7202080Smckusick 			continue;
7212080Smckusick 		case O_NEG2:
7222080Smckusick 			pc.cp++;
7232950Smckusic 			push4((long)(-pop2()));
7242080Smckusick 			continue;
7252080Smckusick 		case O_NEG4:
7262080Smckusick 			pc.cp++;
7272080Smckusick 			push4(-pop4());
7282080Smckusick 			continue;
7292080Smckusick 		case O_NEG8:
7302080Smckusick 			pc.cp++;
7312080Smckusick 			push8(-pop8());
7322080Smckusick 			continue;
7332080Smckusick 		case O_DIV2:
7342080Smckusick 			pc.cp++;
7352080Smckusick 			tl = pop2();
7362080Smckusick 			push4(pop2() / tl);
7372080Smckusick 			continue;
7382080Smckusick 		case O_DIV4:
7392080Smckusick 			pc.cp++;
7402080Smckusick 			tl = pop4();
7412080Smckusick 			push4(pop4() / tl);
7422080Smckusick 			continue;
7432080Smckusick 		case O_DIV24:
7442080Smckusick 			pc.cp++;
7452080Smckusick 			tl = pop2();
7462080Smckusick 			push4(pop4() / tl);
7472080Smckusick 			continue;
7482080Smckusick 		case O_DIV42:
7492080Smckusick 			pc.cp++;
7502080Smckusick 			tl = pop4();
7512080Smckusick 			push4(pop2() / tl);
7522080Smckusick 			continue;
7532080Smckusick 		case O_MOD2:
7542080Smckusick 			pc.cp++;
7552080Smckusick 			tl = pop2();
7562080Smckusick 			push4(pop2() % tl);
7572080Smckusick 			continue;
7582080Smckusick 		case O_MOD4:
7592080Smckusick 			pc.cp++;
7602080Smckusick 			tl = pop4();
7612080Smckusick 			push4(pop4() % tl);
7622080Smckusick 			continue;
7632080Smckusick 		case O_MOD24:
7642080Smckusick 			pc.cp++;
7652080Smckusick 			tl = pop2();
7662080Smckusick 			push4(pop4() % tl);
7672080Smckusick 			continue;
7682080Smckusick 		case O_MOD42:
7692080Smckusick 			pc.cp++;
7702080Smckusick 			tl = pop4();
7712080Smckusick 			push4(pop2() % tl);
7722080Smckusick 			continue;
7732080Smckusick 		case O_ADD8:
7742080Smckusick 			pc.cp++;
7752080Smckusick 			push8(pop8() + pop8());
7762080Smckusick 			continue;
7772080Smckusick 		case O_SUB8:
7782080Smckusick 			pc.cp++;
7792080Smckusick 			td = pop8();
7802080Smckusick 			push8(pop8() - td);
7812080Smckusick 			continue;
7822080Smckusick 		case O_MUL8:
7832080Smckusick 			pc.cp++;
7842080Smckusick 			push8(pop8() * pop8());
7852080Smckusick 			continue;
7862080Smckusick 		case O_DVD8:
7872080Smckusick 			pc.cp++;
7882080Smckusick 			td = pop8();
7892080Smckusick 			push8(pop8() / td);
7902080Smckusick 			continue;
7912080Smckusick 		case O_STOI:
7922080Smckusick 			pc.cp++;
7932950Smckusic 			push4((long)(pop2()));
7942080Smckusick 			continue;
7952080Smckusick 		case O_STOD:
7962080Smckusick 			pc.cp++;
7972080Smckusick 			td = pop2();
7982080Smckusick 			push8(td);
7992080Smckusick 			continue;
8002080Smckusick 		case O_ITOD:
8012080Smckusick 			pc.cp++;
8022080Smckusick 			td = pop4();
8032080Smckusick 			push8(td);
8042080Smckusick 			continue;
8052080Smckusick 		case O_ITOS:
8062080Smckusick 			pc.cp++;
8072950Smckusic 			push2((short)(pop4()));
8082080Smckusick 			continue;
8092080Smckusick 		case O_DVD2:
8102080Smckusick 			pc.cp++;
8112080Smckusick 			td = pop2();
8122080Smckusick 			push8(pop2() / td);
8132080Smckusick 			continue;
8142080Smckusick 		case O_DVD4:
8152080Smckusick 			pc.cp++;
8162080Smckusick 			td = pop4();
8172080Smckusick 			push8(pop4() / td);
8182080Smckusick 			continue;
8192080Smckusick 		case O_DVD24:
8202080Smckusick 			pc.cp++;
8212080Smckusick 			td = pop2();
8222080Smckusick 			push8(pop4() / td);
8232080Smckusick 			continue;
8242080Smckusick 		case O_DVD42:
8252080Smckusick 			pc.cp++;
8262080Smckusick 			td = pop4();
8272080Smckusick 			push8(pop2() / td);
8282080Smckusick 			continue;
8292080Smckusick 		case O_DVD28:
8302080Smckusick 			pc.cp++;
8312080Smckusick 			td = pop2();
8322080Smckusick 			push8(pop8() / td);
8332080Smckusick 			continue;
8342080Smckusick 		case O_DVD48:
8352080Smckusick 			pc.cp++;
8362080Smckusick 			td = pop4();
8372080Smckusick 			push8(pop8() / td);
8382080Smckusick 			continue;
8392080Smckusick 		case O_DVD82:
8402080Smckusick 			pc.cp++;
8412080Smckusick 			td = pop8();
8422080Smckusick 			push8(pop2() / td);
8432080Smckusick 			continue;
8442080Smckusick 		case O_DVD84:
8452080Smckusick 			pc.cp++;
8462080Smckusick 			td = pop8();
8472080Smckusick 			push8(pop4() / td);
8482080Smckusick 			continue;
8492080Smckusick 		case O_RV1:
8502109Smckusic 			tcp = _display.raw[*pc.ucp++];
8512950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
8522080Smckusick 			continue;
8532080Smckusick 		case O_RV14:
8542109Smckusic 			tcp = _display.raw[*pc.ucp++];
8552950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
8562080Smckusick 			continue;
8572080Smckusick 		case O_RV2:
8582109Smckusic 			tcp = _display.raw[*pc.ucp++];
8592080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
8602080Smckusick 			continue;
8612080Smckusick 		case O_RV24:
8622109Smckusic 			tcp = _display.raw[*pc.ucp++];
8632950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
8642080Smckusick 			continue;
8652080Smckusick 		case O_RV4:
8662109Smckusic 			tcp = _display.raw[*pc.ucp++];
8672080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
8682080Smckusick 			continue;
8692080Smckusick 		case O_RV8:
8702109Smckusic 			tcp = _display.raw[*pc.ucp++];
8712239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
8722080Smckusick 			continue;
8732080Smckusick 		case O_RV:
8742109Smckusic 			tcp = _display.raw[*pc.ucp++];
8752080Smckusick 			tcp += *pc.sp++;
8762080Smckusick 			tl = *pc.usp++;
8772338Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
8782080Smckusick 			blkcpy(tl, tcp, tcp1);
8792080Smckusick 			continue;
8802080Smckusick 		case O_LV:
8812109Smckusic 			tcp = _display.raw[*pc.ucp++];
8822080Smckusick 			pushaddr(tcp + *pc.sp++);
8832080Smckusick 			continue;
8842080Smckusick 		case O_LRV1:
8852109Smckusic 			tcp = _display.raw[*pc.ucp++];
8862950Smckusic 			push2((short)(*(tcp + *pc.lp++)));
8872080Smckusick 			continue;
8882080Smckusick 		case O_LRV14:
8892109Smckusic 			tcp = _display.raw[*pc.ucp++];
8902950Smckusic 			push4((long)(*(tcp + *pc.lp++)));
8912080Smckusick 			continue;
8922080Smckusick 		case O_LRV2:
8932109Smckusic 			tcp = _display.raw[*pc.ucp++];
8942080Smckusick 			push2(*(short *)(tcp + *pc.lp++));
8952080Smckusick 			continue;
8962080Smckusick 		case O_LRV24:
8972109Smckusic 			tcp = _display.raw[*pc.ucp++];
8982950Smckusic 			push4((long)(*(short *)(tcp + *pc.lp++)));
8992080Smckusick 			continue;
9002080Smckusick 		case O_LRV4:
9012109Smckusic 			tcp = _display.raw[*pc.ucp++];
9022080Smckusick 			push4(*(long *)(tcp + *pc.lp++));
9032080Smckusick 			continue;
9042080Smckusick 		case O_LRV8:
9052109Smckusic 			tcp = _display.raw[*pc.ucp++];
9062239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.lp++));
9072080Smckusick 			continue;
9082080Smckusick 		case O_LRV:
9092109Smckusic 			tcp = _display.raw[*pc.ucp++];
9102950Smckusic 			tcp += (int)*pc.lp++;
9112080Smckusick 			tl = *pc.usp++;
9122950Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9132080Smckusick 			blkcpy(tl, tcp, tcp1);
9142080Smckusick 			continue;
9152080Smckusick 		case O_LLV:
9162109Smckusic 			tcp = _display.raw[*pc.ucp++];
9172080Smckusick 			pushaddr(tcp + *pc.lp++);
9182080Smckusick 			continue;
9192080Smckusick 		case O_IND1:
9202080Smckusick 			pc.cp++;
9212950Smckusic 			push2((short)(*popaddr()));
9222080Smckusick 			continue;
9232080Smckusick 		case O_IND14:
9242080Smckusick 			pc.cp++;
9252950Smckusic 			push4((long)(*popaddr()));
9262080Smckusick 			continue;
9272080Smckusick 		case O_IND2:
9282080Smckusick 			pc.cp++;
9292080Smckusick 			push2(*(short *)(popaddr()));
9302080Smckusick 			continue;
9312080Smckusick 		case O_IND24:
9322080Smckusick 			pc.cp++;
9332950Smckusic 			push4((long)(*(short *)(popaddr())));
9342080Smckusick 			continue;
9352080Smckusick 		case O_IND4:
9362080Smckusick 			pc.cp++;
9372080Smckusick 			push4(*(long *)(popaddr()));
9382080Smckusick 			continue;
9392080Smckusick 		case O_IND8:
9402080Smckusick 			pc.cp++;
9412239Smckusic 			pushsze8(*(struct sze8 *)(popaddr()));
9422080Smckusick 			continue;
9432080Smckusick 		case O_IND:
9442080Smckusick 			tl = *pc.cp++;
9452080Smckusick 			if (tl == 0)
9462080Smckusick 				tl = *pc.usp++;
9472080Smckusick 			tcp = popaddr();
9482080Smckusick 			tcp1 = pushsp((tl + 1) & ~1);
9492080Smckusick 			blkcpy(tl, tcp, tcp1);
9502080Smckusick 			continue;
9512080Smckusick 		case O_CON1:
9522950Smckusic 			push2((short)(*pc.cp++));
9532080Smckusick 			continue;
9542080Smckusick 		case O_CON14:
9552950Smckusic 			push4((long)(*pc.cp++));
9562080Smckusick 			continue;
9572080Smckusick 		case O_CON2:
9582080Smckusick 			pc.cp++;
9592080Smckusick 			push2(*pc.sp++);
9602080Smckusick 			continue;
9612080Smckusick 		case O_CON24:
9622080Smckusick 			pc.cp++;
9632950Smckusic 			push4((long)(*pc.sp++));
9642080Smckusick 			continue;
9652080Smckusick 		case O_CON4:
9662080Smckusick 			pc.cp++;
9672080Smckusick 			push4(*pc.lp++);
9682080Smckusick 			continue;
9692080Smckusick 		case O_CON8:
9702080Smckusick 			pc.cp++;
9712950Smckusic 			push8(*pc.dbp++);
9722080Smckusick 			continue;
9732080Smckusick 		case O_CON:
9742080Smckusick 			tl = *pc.cp++;
9752080Smckusick 			if (tl == 0)
9762080Smckusick 				tl = *pc.usp++;
9772080Smckusick 			tl = (tl + 1) & ~1;
9782080Smckusick 			tcp = pushsp(tl);
9792080Smckusick 			blkcpy(tl, pc.cp, tcp);
9802950Smckusic 			pc.cp += (int)tl;
9812080Smckusick 			continue;
9822950Smckusic 		case O_CONG:
9832950Smckusic 			tl = *pc.cp++;
9842950Smckusic 			if (tl == 0)
9852950Smckusic 				tl = *pc.usp++;
9862950Smckusic 			tl1 = (tl + 1) & ~1;
9872950Smckusic 			tcp = pushsp(tl1);
9882950Smckusic 			blkcpy(tl1, pc.cp, tcp);
9892950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
9902950Smckusic 			continue;
9912080Smckusick 		case O_LVCON:
9922080Smckusick 			tl = *pc.cp++;
9932080Smckusick 			if (tl == 0)
9942080Smckusick 				tl = *pc.usp++;
9952080Smckusick 			tl = (tl + 1) & ~1;
9962080Smckusick 			pushaddr(pc.cp);
9972950Smckusic 			pc.cp += (int)tl;
9982080Smckusick 			continue;
9992080Smckusick 		case O_RANG2:
10002080Smckusick 			tl = *pc.cp++;
10012080Smckusick 			if (tl == 0)
10022080Smckusick 				tl = *pc.sp++;
10032080Smckusick 			tl1 = pop2();
10044026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
10052080Smckusick 			continue;
10062080Smckusick 		case O_RANG42:
10072080Smckusick 			tl = *pc.cp++;
10082080Smckusick 			if (tl == 0)
10092080Smckusick 				tl = *pc.sp++;
10102080Smckusick 			tl1 = pop4();
10114026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
10122080Smckusick 			continue;
10132080Smckusick 		case O_RSNG2:
10142080Smckusick 			tl = *pc.cp++;
10152080Smckusick 			if (tl == 0)
10162080Smckusick 				tl = *pc.sp++;
10172080Smckusick 			tl1 = pop2();
10182950Smckusic 			push2((short)(RSNG4(tl1, tl)));
10192080Smckusick 			continue;
10202080Smckusick 		case O_RSNG42:
10212080Smckusick 			tl = *pc.cp++;
10222080Smckusick 			if (tl == 0)
10232080Smckusick 				tl = *pc.sp++;
10242080Smckusick 			tl1 = pop4();
10252080Smckusick 			push4(RSNG4(tl1, tl));
10262080Smckusick 			continue;
10272080Smckusick 		case O_RANG4:
10284026Smckusic 			tl = *pc.cp++;
10294026Smckusic 			if (tl == 0)
10304026Smckusic 				tl = *pc.lp++;
10312080Smckusick 			tl1 = pop4();
10322080Smckusick 			push4(RANG4(tl1, tl, *pc.lp++));
10332080Smckusick 			continue;
10342080Smckusick 		case O_RANG24:
10354026Smckusic 			tl = *pc.cp++;
10364026Smckusic 			if (tl == 0)
10374026Smckusic 				tl = *pc.lp++;
10382080Smckusick 			tl1 = pop2();
10392950Smckusic 			push2((short)(RANG4(tl1, tl, *pc.lp++)));
10402080Smckusick 			continue;
10412080Smckusick 		case O_RSNG4:
10424026Smckusic 			tl = *pc.cp++;
10434026Smckusic 			if (tl == 0)
10444026Smckusic 				tl = *pc.lp++;
10454026Smckusic 			tl1 = pop4();
10464026Smckusic 			push4(RSNG4(tl1, tl));
10472080Smckusick 			continue;
10482080Smckusick 		case O_RSNG24:
10494026Smckusic 			tl = *pc.cp++;
10504026Smckusic 			if (tl == 0)
10514026Smckusic 				tl = *pc.lp++;
10524026Smckusic 			tl1 = pop2();
10534026Smckusic 			push2((short)(RSNG4(tl1, tl)));
10542080Smckusick 			continue;
10552080Smckusick 		case O_STLIM:
10562080Smckusick 			pc.cp++;
10572121Smckusic 			STLIM();
10582950Smckusic 			popsp((long)(sizeof(long)));
10592080Smckusick 			continue;
10602080Smckusick 		case O_LLIMIT:
10612080Smckusick 			pc.cp++;
10622080Smckusick 			LLIMIT();
10632950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
10642080Smckusick 			continue;
10652080Smckusick 		case O_BUFF:
10662950Smckusic 			BUFF((long)(*pc.cp++));
10672080Smckusick 			continue;
10682080Smckusick 		case O_HALT:
10692080Smckusick 			pc.cp++;
10705682Smckusic 			if (_nodump == TRUE)
10715682Smckusic 				psexit(0);
10725682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
10735682Smckusic 			backtrace("Halted");
10745682Smckusic 			psexit(0);
10752080Smckusick 			continue;
10762080Smckusick 		case O_PXPBUF:
10772080Smckusick 			pc.cp++;
10782080Smckusick 			_cntrs = *pc.lp++;
10792080Smckusick 			_rtns = *pc.lp++;
10802950Smckusic 			NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long));
10812080Smckusick 			continue;
10822080Smckusick 		case O_COUNT:
10832080Smckusick 			pc.cp++;
10842080Smckusick 			_pcpcount[*pc.usp++]++;
10852080Smckusick 			continue;
10862080Smckusick 		case O_CASE1OP:
10872080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
10882080Smckusick 			if (tl == 0)
10892080Smckusick 				tl = *pc.usp++;
10902080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
10912080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
10922080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
10932080Smckusick 			for(; tl > 0; tl--)	/* look for element */
10942080Smckusick 				if (tl1 == *tcp++)
10952080Smckusick 					break;
10962080Smckusick 			if (tl == 0)		/* default case => error */
10975666Smckusic 				CASERNG(tl1);
10982080Smckusick 			pc.cp += *(tsp - tl);
10992080Smckusick 			continue;
11002080Smckusick 		case O_CASE2OP:
11012080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11022080Smckusick 			if (tl == 0)
11032080Smckusick 				tl = *pc.usp++;
11042080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11052080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
11062080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
11072080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11082080Smckusick 				if (tl1 == *tsp1++)
11092080Smckusick 					break;
11102080Smckusick 			if (tl == 0)		/* default case => error */
11115666Smckusic 				CASERNG(tl1);
11122080Smckusick 			pc.cp += *(tsp - tl);
11132080Smckusick 			continue;
11142080Smckusick 		case O_CASE4OP:
11152080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11162080Smckusick 			if (tl == 0)
11172080Smckusick 				tl = *pc.usp++;
11182080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11192080Smckusick 			tlp = (long *)tsp;	/* tlp = ptr to case values */
11202080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
11212080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11222080Smckusick 				if (tl1 == *tlp++)
11232080Smckusick 					break;
11242080Smckusick 			if (tl == 0)		/* default case => error */
11255666Smckusic 				CASERNG(tl1);
11262080Smckusick 			pc.cp += *(tsp - tl);
11272080Smckusick 			continue;
11282080Smckusick 		case O_ADDT:
11292080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11302080Smckusick 			if (tl == 0)
11312080Smckusick 				tl = *pc.usp++;
11322950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11332080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
11342080Smckusick 			popsp(tl);
11352080Smckusick 			continue;
11362080Smckusick 		case O_SUBT:
11372080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11382080Smckusick 			if (tl == 0)
11392080Smckusick 				tl = *pc.usp++;
11402950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11412080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
11422080Smckusick 			popsp(tl);
11432080Smckusick 			continue;
11442080Smckusick 		case O_MULT:
11452080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11462080Smckusick 			if (tl == 0)
11472080Smckusick 				tl = *pc.usp++;
11482950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
11492080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
11502080Smckusick 			popsp(tl);
11512080Smckusick 			continue;
11522080Smckusick 		case O_INCT:
11532080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
11542080Smckusick 			if (tl == 0)
11552080Smckusick 				tl = *pc.usp++;
11562950Smckusic 			tb = INCT();
11572950Smckusic 			popsp(tl*sizeof(long));
11582950Smckusic 			push2((short)(tb));
11592080Smckusick 			continue;
11602080Smckusick 		case O_CTTOT:
11612080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
11622080Smckusick 			if (tl == 0)
11632080Smckusick 				tl = *pc.usp++;
11642080Smckusick 			tl1 = tl * sizeof(long);
11652950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
11662080Smckusick 			CTTOT(tcp);
11672950Smckusic 			popsp(tl*sizeof(long));
11682080Smckusick 			continue;
11692080Smckusick 		case O_CARD:
11702080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11712080Smckusick 			if (tl == 0)
11722080Smckusick 				tl = *pc.usp++;
11732950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
11742080Smckusick 			tl1 = CARD(tcp, tl);
11752080Smckusick 			popsp(tl);
11762950Smckusic 			push2((short)(tl1));
11772080Smckusick 			continue;
11782080Smckusick 		case O_IN:
11792080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11802080Smckusick 			if (tl == 0)
11812080Smckusick 				tl = *pc.usp++;
11822080Smckusick 			tl1 = pop4();		/* tl1 is the element */
11832950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
11844026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
11852950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
11862080Smckusick 			popsp(tl);
11872950Smckusic 			push2((short)(tb));
11882080Smckusick 			continue;
11892080Smckusick 		case O_ASRT:
11902080Smckusick 			pc.cp++;
11912950Smckusic 			ts = pop2();
11922950Smckusic 			ASRT(ts, "");
11932080Smckusick 			continue;
11942080Smckusick 		case O_FOR1U:
11954026Smckusic 			/*
11964026Smckusic 			 * with the shadowing of for loop variables
11974026Smckusic 			 * the variable is always sizeof(long) hence
11984026Smckusic 			 * nullifying the need for shorter length
11994026Smckusic 			 * assignments
12004026Smckusic 			 */
12012080Smckusick 		case O_FOR2U:
12024026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12034026Smckusic 			if (tl1 == 0)
12044026Smckusic 				tl1 = *pc.sp++;
12054026Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12064026Smckusic 			if (*tlp < pop4()) {	/* still going up */
12074026Smckusic 				tl = *tlp + 1;	/* inc index var */
12082191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
12092191Smckusic 				if (_runtst)
12102191Smckusic 					RANG4(tl, tl1, tl2);
12114026Smckusic 				*tlp = tl;	/* update index var */
12122080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12132080Smckusick 				continue;
12142080Smckusick 			}
12154026Smckusic 			pc.sp += 2;		/* else fall through */
12162080Smckusick 			continue;
12172080Smckusick 		case O_FOR4U:
12184026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12194026Smckusic 			if (tl1 == 0)
12204026Smckusic 				tl1 = *pc.lp++;
12212950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12222080Smckusick 			if (*tlp < pop4()) {	/* still going up */
12232191Smckusic 				tl = *tlp + 1;	/* inc index var */
12242191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
12252191Smckusic 				if (_runtst)
12262191Smckusic 					RANG4(tl, tl1, tl2);
12272191Smckusic 				*tlp = tl;	/* update index var */
12282080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12292080Smckusick 				continue;
12302080Smckusick 			}
12314026Smckusic 			pc.sp += 3;		/* else fall through */
12322080Smckusick 			continue;
12332080Smckusick 		case O_FOR1D:
12344026Smckusic 			/*
12354026Smckusic 			 * with the shadowing of for loop variables
12364026Smckusic 			 * the variable is always sizeof(long) hence
12374026Smckusic 			 * nullifying the need for shorter length
12384026Smckusic 			 * assignments
12394026Smckusic 			 */
12402080Smckusick 		case O_FOR2D:
12414026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12424026Smckusic 			if (tl1 == 0)
12434026Smckusic 				tl1 = *pc.sp++;
12444026Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12454026Smckusic 			if (*tlp > pop4()) {	/* still going down */
12464026Smckusic 				tl = *tlp - 1;	/* inc index var */
12472191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
12482191Smckusic 				if (_runtst)
12492191Smckusic 					RANG4(tl, tl1, tl2);
12504026Smckusic 				*tlp = tl;	/* update index var */
12512080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12522080Smckusick 				continue;
12532080Smckusick 			}
12544026Smckusic 			pc.sp += 2;		/* else fall through */
12552080Smckusick 			continue;
12562080Smckusick 		case O_FOR4D:
12574026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12584026Smckusic 			if (tl1 == 0)
12594026Smckusic 				tl1 = *pc.lp++;
12602950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
12612080Smckusick 			if (*tlp > pop4()) {	/* still going down */
12622191Smckusic 				tl = *tlp - 1;	/* inc index var */
12632191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
12642191Smckusic 				if (_runtst)
12652191Smckusic 					RANG4(tl, tl1, tl2);
12662191Smckusic 				*tlp = tl;	/* update index var */
12672080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12682080Smckusick 				continue;
12692080Smckusick 			}
12704026Smckusic 			pc.sp += 3;		/* else fall through */
12712080Smckusick 			continue;
12722080Smckusick 		case O_READE:
12732080Smckusick 			pc.cp++;
12742950Smckusic 			push2((short)(READE(curfile, base + *pc.lp++)));
12752080Smckusick 			continue;
12762080Smckusick 		case O_READ4:
12772080Smckusick 			pc.cp++;
12782080Smckusick 			push4(READ4(curfile));
12792080Smckusick 			continue;
12802080Smckusick 		case O_READC:
12812080Smckusick 			pc.cp++;
12822950Smckusic 			push2((short)(READC(curfile)));
12832080Smckusick 			continue;
12842080Smckusick 		case O_READ8:
12852080Smckusick 			pc.cp++;
12862080Smckusick 			push8(READ8(curfile));
12872080Smckusick 			continue;
12882080Smckusick 		case O_READLN:
12892080Smckusick 			pc.cp++;
12902080Smckusick 			READLN(curfile);
12912080Smckusick 			continue;
12922080Smckusick 		case O_EOF:
12932080Smckusick 			pc.cp++;
12942950Smckusic 			push2((short)(TEOF(popaddr())));
12952080Smckusick 			continue;
12962080Smckusick 		case O_EOLN:
12972080Smckusick 			pc.cp++;
12982950Smckusic 			push2((short)(TEOLN(popaddr())));
12992080Smckusick 			continue;
13002080Smckusick 		case O_WRITEC:
13012191Smckusic 			if (_runtst) {
13022191Smckusic 				WRITEC(curfile);
13033166Smckusic 				popsp((long)(*pc.cp++));
13042191Smckusic 				continue;
13052191Smckusic 			}
13062191Smckusic 			fputc();
13073166Smckusic 			popsp((long)(*pc.cp++));
13082080Smckusick 			continue;
13092080Smckusick 		case O_WRITES:
13102191Smckusic 			if (_runtst) {
13112191Smckusic 				WRITES(curfile);
13123166Smckusic 				popsp((long)(*pc.cp++));
13132191Smckusic 				continue;
13142191Smckusic 			}
13152191Smckusic 			fwrite();
13163166Smckusic 			popsp((long)(*pc.cp++));
13172080Smckusick 			continue;
13182080Smckusick 		case O_WRITEF:
13192191Smckusic 			if (_runtst) {
13202191Smckusic 				WRITEF(curfile);
13213166Smckusic 				popsp((long)(*pc.cp++));
13222191Smckusic 				continue;
13232191Smckusic 			}
13242191Smckusic 			fprintf();
13253166Smckusic 			popsp((long)(*pc.cp++));
13262080Smckusick 			continue;
13272080Smckusick 		case O_WRITLN:
13282080Smckusick 			pc.cp++;
13292191Smckusic 			if (_runtst) {
13302191Smckusic 				WRITLN(curfile);
13312191Smckusic 				continue;
13322191Smckusic 			}
13332191Smckusic 			fputc('\n', ACTFILE(curfile));
13342080Smckusick 			continue;
13352080Smckusick 		case O_PAGE:
13362080Smckusick 			pc.cp++;
13372191Smckusic 			if (_runtst) {
13382191Smckusic 				PAGE(curfile);
13392191Smckusic 				continue;
13402191Smckusic 			}
13412950Smckusic 			fputc('', ACTFILE(curfile));
13422080Smckusick 			continue;
13432080Smckusick 		case O_NAM:
13442080Smckusick 			pc.cp++;
13452080Smckusick 			tl = pop4();
13462080Smckusick 			pushaddr(NAM(tl, base + *pc.lp++));
13472080Smckusick 			continue;
13482080Smckusick 		case O_MAX:
13492080Smckusick 			tl = *pc.cp++;
13502080Smckusick 			if (tl == 0)
13512080Smckusick 				tl = *pc.usp++;
13522080Smckusick 			tl1 = pop4();
13532191Smckusic 			if (_runtst) {
13542950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
13552191Smckusic 				continue;
13562191Smckusic 			}
13572191Smckusic 			tl1 -= tl;
13582191Smckusic 			tl = *pc.usp++;
13592191Smckusic 			push4(tl1 > tl ? tl1 : tl);
13602080Smckusick 			continue;
13612080Smckusick 		case O_MIN:
13622080Smckusick 			tl = *pc.cp++;
13632080Smckusick 			if (tl == 0)
13642080Smckusick 				tl = *pc.usp++;
13652080Smckusick 			tl1 = pop4();
13662080Smckusick 			push4(tl1 < tl ? tl1 : tl);
13672080Smckusick 			continue;
13682080Smckusick 		case O_UNIT:
13692080Smckusick 			pc.cp++;
13702080Smckusick 			curfile = UNIT(popaddr());
13712080Smckusick 			continue;
13722080Smckusick 		case O_UNITINP:
13732080Smckusick 			pc.cp++;
13742080Smckusick 			curfile = INPUT;
13752080Smckusick 			continue;
13762080Smckusick 		case O_UNITOUT:
13772080Smckusick 			pc.cp++;
13782080Smckusick 			curfile = OUTPUT;
13792080Smckusick 			continue;
13802080Smckusick 		case O_MESSAGE:
13812080Smckusick 			pc.cp++;
13822080Smckusick 			PFLUSH();
13832080Smckusick 			curfile = ERR;
13842080Smckusick 			continue;
13852109Smckusic 		case O_PUT:
13862109Smckusic 			pc.cp++;
13872109Smckusic 			PUT(curfile);
13882109Smckusic 			continue;
13892080Smckusick 		case O_GET:
13902080Smckusick 			pc.cp++;
13912080Smckusick 			GET(curfile);
13922080Smckusick 			continue;
13932080Smckusick 		case O_FNIL:
13942080Smckusick 			pc.cp++;
13952080Smckusick 			pushaddr(FNIL(popaddr()));
13962080Smckusick 			continue;
13972080Smckusick 		case O_DEFNAME:
13982080Smckusick 			pc.cp++;
13992080Smckusick 			DEFNAME();
14002950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14012080Smckusick 			continue;
14022080Smckusick 		case O_RESET:
14032080Smckusick 			pc.cp++;
14042080Smckusick 			RESET();
14052950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14062080Smckusick 			continue;
14072080Smckusick 		case O_REWRITE:
14082080Smckusick 			pc.cp++;
14092080Smckusick 			REWRITE();
14102950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14112080Smckusick 			continue;
14122080Smckusick 		case O_FILE:
14132080Smckusick 			pc.cp++;
14142080Smckusick 			pushaddr(ACTFILE(curfile));
14152080Smckusick 			continue;
14162080Smckusick 		case O_REMOVE:
14172080Smckusick 			pc.cp++;
14182080Smckusick 			REMOVE();
14192950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
14202080Smckusick 			continue;
14212080Smckusick 		case O_FLUSH:
14222080Smckusick 			pc.cp++;
14232080Smckusick 			FLUSH();
14242950Smckusic 			popsp((long)(sizeof(char *)));
14252080Smckusick 			continue;
14262080Smckusick 		case O_PACK:
14272080Smckusick 			pc.cp++;
14282080Smckusick 			PACK();
14292950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14302080Smckusick 			continue;
14312080Smckusick 		case O_UNPACK:
14322080Smckusick 			pc.cp++;
14332080Smckusick 			UNPACK();
14342950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14352080Smckusick 			continue;
14362080Smckusick 		case O_ARGC:
14372080Smckusick 			pc.cp++;
14382950Smckusic 			push4((long)_argc);
14392080Smckusick 			continue;
14402080Smckusick 		case O_ARGV:
14412080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
14422080Smckusick 			if (tl == 0)
14432080Smckusick 				tl = *pc.usp++;
14442080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
14452080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
14462080Smckusick 			ARGV(tl1, tcp, tl);
14472080Smckusick 			continue;
14482080Smckusick 		case O_CLCK:
14492080Smckusick 			pc.cp++;
14502080Smckusick 			push4(CLCK());
14512080Smckusick 			continue;
14522080Smckusick 		case O_WCLCK:
14532080Smckusick 			pc.cp++;
14542080Smckusick 			push4(time(0));
14552080Smckusick 			continue;
14562080Smckusick 		case O_SCLCK:
14572080Smckusick 			pc.cp++;
14582080Smckusick 			push4(SCLCK());
14592080Smckusick 			continue;
14602080Smckusick 		case O_DISPOSE:
14612080Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
14622080Smckusick 			if (tl == 0)
14632080Smckusick 				tl = *pc.usp++;
14642080Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
14652080Smckusick 			DISPOSE(tcp, tl);
14662080Smckusick 			*(char **)tcp = (char *)0;
14672080Smckusick 			continue;
14682080Smckusick 		case O_NEW:
14692080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
14702080Smckusick 			if (tl == 0)
14712080Smckusick 				tl = *pc.usp++;
14722080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
14732191Smckusic 			if (_runtst) {
14742191Smckusic 				NEWZ(tcp, tl);
14752191Smckusic 				continue;
14762191Smckusic 			}
14772191Smckusic 			NEW(tcp, tl);
14782080Smckusick 			continue;
14792080Smckusick 		case O_DATE:
14802080Smckusick 			pc.cp++;
14812080Smckusick 			DATE(popaddr());
14822080Smckusick 			continue;
14832080Smckusick 		case O_TIME:
14842080Smckusick 			pc.cp++;
14852080Smckusick 			TIME(popaddr());
14862080Smckusick 			continue;
14872080Smckusick 		case O_UNDEF:
14882080Smckusick 			pc.cp++;
14892080Smckusick 			pop8();
14902950Smckusic 			push2((short)(0));
14912080Smckusick 			continue;
14922080Smckusick 		case O_ATAN:
14932080Smckusick 			pc.cp++;
1494*5723Smckusic 			if (_runtst) {
1495*5723Smckusic 				push8(ATAN(pop8()));
1496*5723Smckusic 				continue;
1497*5723Smckusic 			}
14982080Smckusick 			push8(atan(pop8()));
14992080Smckusick 			continue;
15002080Smckusick 		case O_COS:
15012080Smckusick 			pc.cp++;
1502*5723Smckusic 			if (_runtst) {
1503*5723Smckusic 				push8(COS(pop8()));
1504*5723Smckusic 				continue;
1505*5723Smckusic 			}
15062080Smckusick 			push8(cos(pop8()));
15072080Smckusick 			continue;
15082080Smckusick 		case O_EXP:
15092080Smckusick 			pc.cp++;
1510*5723Smckusic 			if (_runtst) {
1511*5723Smckusic 				push8(EXP(pop8()));
1512*5723Smckusic 				continue;
1513*5723Smckusic 			}
15142080Smckusick 			push8(exp(pop8()));
15152080Smckusick 			continue;
15162080Smckusick 		case O_LN:
15172080Smckusick 			pc.cp++;
15182191Smckusic 			if (_runtst) {
15192191Smckusic 				push8(LN(pop8()));
15202191Smckusic 				continue;
15212191Smckusic 			}
15222191Smckusic 			push8(log(pop8()));
15232080Smckusick 			continue;
15242080Smckusick 		case O_SIN:
15252080Smckusick 			pc.cp++;
1526*5723Smckusic 			if (_runtst) {
1527*5723Smckusic 				push8(SIN(pop8()));
1528*5723Smckusic 				continue;
1529*5723Smckusic 			}
15302080Smckusick 			push8(sin(pop8()));
15312080Smckusick 			continue;
15322080Smckusick 		case O_SQRT:
15332080Smckusick 			pc.cp++;
15342191Smckusic 			if (_runtst) {
15352191Smckusic 				push8(SQRT(pop8()));
15362191Smckusic 				continue;
15372191Smckusic 			}
15382191Smckusic 			push8(sqrt(pop8()));
15392080Smckusick 			continue;
15402080Smckusick 		case O_CHR2:
15412080Smckusick 		case O_CHR4:
15422080Smckusick 			pc.cp++;
15432191Smckusic 			if (_runtst) {
15442950Smckusic 				push2((short)(CHR(pop4())));
15452191Smckusic 				continue;
15462191Smckusic 			}
15472950Smckusic 			push2((short)(pop4()));
15482080Smckusick 			continue;
15492080Smckusick 		case O_ODD2:
15502080Smckusick 		case O_ODD4:
15512080Smckusick 			pc.cp++;
15522950Smckusic 			push2((short)(pop4() & 1));
15532080Smckusick 			continue;
15542080Smckusick 		case O_SUCC2:
15552109Smckusic 			tl = *pc.cp++;
15562109Smckusic 			if (tl == 0)
15572109Smckusic 				tl = *pc.sp++;
15582109Smckusic 			tl1 = pop4();
15592191Smckusic 			if (_runtst) {
15602950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
15612191Smckusic 				continue;
15622191Smckusic 			}
15632950Smckusic 			push2((short)(tl1 + 1));
15642191Smckusic 			pc.sp++;
15652080Smckusick 			continue;
15662080Smckusick 		case O_SUCC24:
15672109Smckusic 			tl = *pc.cp++;
15682109Smckusic 			if (tl == 0)
15692109Smckusic 				tl = *pc.sp++;
15702109Smckusic 			tl1 = pop4();
15712191Smckusic 			if (_runtst) {
15722950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
15732191Smckusic 				continue;
15742191Smckusic 			}
15752191Smckusic 			push4(tl1 + 1);
15762191Smckusic 			pc.sp++;
15772109Smckusic 			continue;
15782080Smckusick 		case O_SUCC4:
15792109Smckusic 			tl = *pc.cp++;
15802109Smckusic 			if (tl == 0)
15812109Smckusic 				tl = *pc.lp++;
15822109Smckusic 			tl1 = pop4();
15832191Smckusic 			if (_runtst) {
15842950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.lp++)));
15852191Smckusic 				continue;
15862191Smckusic 			}
15872191Smckusic 			push4(tl1 + 1);
15882191Smckusic 			pc.lp++;
15892080Smckusick 			continue;
15902080Smckusick 		case O_PRED2:
15912109Smckusic 			tl = *pc.cp++;
15922109Smckusic 			if (tl == 0)
15932109Smckusic 				tl = *pc.sp++;
15942109Smckusic 			tl1 = pop4();
15952191Smckusic 			if (_runtst) {
15962950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
15972191Smckusic 				continue;
15982191Smckusic 			}
15992950Smckusic 			push2((short)(tl1 - 1));
16002191Smckusic 			pc.sp++;
16012080Smckusick 			continue;
16022080Smckusick 		case O_PRED24:
16032109Smckusic 			tl = *pc.cp++;
16042109Smckusic 			if (tl == 0)
16052109Smckusic 				tl = *pc.sp++;
16062109Smckusic 			tl1 = pop4();
16072191Smckusic 			if (_runtst) {
16082950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
16092191Smckusic 				continue;
16102191Smckusic 			}
16112191Smckusic 			push4(tl1 - 1);
16122191Smckusic 			pc.sp++;
16132109Smckusic 			continue;
16142080Smckusick 		case O_PRED4:
16152109Smckusic 			tl = *pc.cp++;
16162109Smckusic 			if (tl == 0)
16172109Smckusic 				tl = *pc.lp++;
16182109Smckusic 			tl1 = pop4();
16192191Smckusic 			if (_runtst) {
16202950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.lp++)));
16212191Smckusic 				continue;
16222191Smckusic 			}
16232191Smckusic 			push4(tl1 - 1);
16242191Smckusic 			pc.lp++;
16252080Smckusick 			continue;
16262080Smckusick 		case O_SEED:
16272080Smckusick 			pc.cp++;
16282080Smckusick 			push4(SEED(pop4()));
16292080Smckusick 			continue;
16302080Smckusick 		case O_RANDOM:
16312080Smckusick 			pc.cp++;
16322080Smckusick 			push8(RANDOM(pop8()));
16332080Smckusick 			continue;
16342080Smckusick 		case O_EXPO:
16352080Smckusick 			pc.cp++;
16362080Smckusick 			push4(EXPO(pop8()));
16372080Smckusick 			continue;
16382080Smckusick 		case O_SQR2:
16392080Smckusick 		case O_SQR4:
16402080Smckusick 			pc.cp++;
16412080Smckusick 			tl = pop4();
16422080Smckusick 			push4(tl * tl);
16432080Smckusick 			continue;
16442080Smckusick 		case O_SQR8:
16452080Smckusick 			pc.cp++;
16462080Smckusick 			td = pop8();
16472080Smckusick 			push8(td * td);
16482080Smckusick 			continue;
16492080Smckusick 		case O_ROUND:
16502080Smckusick 			pc.cp++;
16512080Smckusick 			push4(ROUND(pop8()));
16522080Smckusick 			continue;
16532080Smckusick 		case O_TRUNC:
16542080Smckusick 			pc.cp++;
16552080Smckusick 			push4(TRUNC(pop8()));
16562080Smckusick 			continue;
16572950Smckusic 		default:
16585682Smckusic 			ERROR("Panic: bad op code\n");
16592950Smckusic 			continue;
16602080Smckusick 		}
16612080Smckusick 	}
16622080Smckusick }
1663