xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 30057)
122152Sdist /*
222152Sdist  * Copyright (c) 1980 Regents of the University of California.
322152Sdist  * All rights reserved.  The Berkeley software License Agreement
422152Sdist  * specifies the terms and conditions for redistribution.
522152Sdist  */
62080Smckusick 
722152Sdist #ifndef lint
8*30057Smckusick static char sccsid[] = "@(#)interp.c	5.4 (Berkeley) 11/12/86";
922152Sdist #endif not lint
102080Smckusick 
112080Smckusick #include <math.h>
1210576Smckusick #include <signal.h>
132950Smckusic #include "whoami.h"
1410576Smckusick #include "vars.h"
152950Smckusic #include "objfmt.h"
162080Smckusick #include "h02opcs.h"
172080Smckusick #include "machdep.h"
182080Smckusick #include "libpc.h"
192080Smckusick 
202080Smckusick /*
212080Smckusick  * program variables
222080Smckusick  */
2310576Smckusick union display _display;
2410576Smckusick struct dispsave	*_dp;
252080Smckusick long	_lino = 0;
262080Smckusick int	_argc;
272080Smckusick char	**_argv;
282080Smckusick long	_mode;
2910576Smckusick long	_runtst = (long)TRUE;
302950Smckusic bool	_nodump = FALSE;
312080Smckusick long	_stlim = 500000;
322080Smckusick long	_stcnt = 0;
332191Smckusic long	_seed = 1;
3410576Smckusick #ifdef ADDR32
352080Smckusick char	*_minptr = (char *)0x7fffffff;
3610576Smckusick #endif ADDR32
3710576Smckusick #ifdef ADDR16
382950Smckusic char	*_minptr = (char *)0xffff;
3910576Smckusick #endif ADDR16
402080Smckusick char	*_maxptr = (char *)0;
412080Smckusick long	*_pcpcount = (long *)0;
422080Smckusick long	_cntrs = 0;
432080Smckusick long	_rtns = 0;
442080Smckusick 
452080Smckusick /*
462080Smckusick  * standard files
472080Smckusick  */
482080Smckusick char		_inwin, _outwin, _errwin;
492950Smckusic struct iorechd	_err = {
502950Smckusic 	&_errwin,		/* fileptr */
512080Smckusick 	0,			/* lcount  */
522080Smckusick 	0x7fffffff,		/* llimit  */
532950Smckusic 	&_iob[2],		/* fbuf    */
542950Smckusic 	FILNIL,			/* fchain  */
552080Smckusick 	STDLVL,			/* flev    */
562950Smckusic 	"Message file",		/* pfname  */
572950Smckusic 	FTEXT | FWRITE | EOFF,	/* funit   */
582950Smckusic 	2,			/* fblk    */
592080Smckusick 	1			/* fsize   */
602080Smckusick };
612080Smckusick struct iorechd	output = {
622080Smckusick 	&_outwin,		/* fileptr */
632080Smckusick 	0,			/* lcount  */
642080Smckusick 	0x7fffffff,		/* llimit  */
652080Smckusick 	&_iob[1],		/* fbuf    */
662080Smckusick 	ERR,			/* fchain  */
672080Smckusick 	STDLVL,			/* flev    */
682080Smckusick 	"standard output",	/* pfname  */
692080Smckusick 	FTEXT | FWRITE | EOFF,	/* funit   */
702080Smckusick 	1,			/* fblk    */
712080Smckusick 	1			/* fsize   */
722080Smckusick };
732950Smckusic struct iorechd	input = {
742950Smckusic 	&_inwin,		/* fileptr */
752080Smckusick 	0,			/* lcount  */
762080Smckusick 	0x7fffffff,		/* llimit  */
772950Smckusic 	&_iob[0],		/* fbuf    */
782950Smckusic 	OUTPUT,			/* fchain  */
792080Smckusick 	STDLVL,			/* flev    */
802950Smckusic 	"standard input",	/* pfname  */
817569Smckusick 	FTEXT|FREAD|SYNC|EOLN,	/* funit   */
822950Smckusic 	0,			/* fblk    */
832080Smckusick 	1			/* fsize   */
842080Smckusick };
852080Smckusick 
862109Smckusic /*
872950Smckusic  * file record variables
882950Smckusic  */
892950Smckusic long		_filefre = PREDEF;
902950Smckusic struct iorechd	_fchain = {
912950Smckusic 	0, 0, 0, 0,		/* only use fchain field */
922950Smckusic 	INPUT			/* fchain  */
932950Smckusic };
942950Smckusic struct iorec	*_actfile[MAXFILES] = {
952950Smckusic 	INPUT,
962950Smckusic 	OUTPUT,
972950Smckusic 	ERR
982950Smckusic };
992950Smckusic 
1002950Smckusic /*
1015658Slinton  * stuff for pdx
1025658Slinton  */
1035658Slinton 
1045658Slinton union progcntr *pcaddrp;
1055658Slinton asm(".globl _loopaddr");
1065658Slinton 
1075658Slinton /*
1082109Smckusic  * Px profile array
1092109Smckusic  */
1102109Smckusic #ifdef PROFILE
1112109Smckusic long _profcnts[NUMOPS];
1122109Smckusic #endif PROFILE
1132109Smckusic 
1142109Smckusic /*
1152109Smckusic  * debugging variables
1162109Smckusic  */
1172109Smckusic #ifdef DEBUG
1182109Smckusic char opc[10];
1192109Smckusic long opcptr = 9;
1202109Smckusic #endif DEBUG
1212109Smckusic 
1222080Smckusick interpreter(base)
1232080Smckusick 	char *base;
1242080Smckusick {
1252080Smckusick 	union progcntr pc;		/* interpreted program cntr */
1262080Smckusick 	register char *vpc;		/* register used for "pc" */
1272080Smckusick 	struct iorec *curfile;		/* active file */
12810576Smckusick 	register struct blockmark *stp;	/* active stack frame ptr */
1292080Smckusick 	/*
1302080Smckusick 	 * the following variables are used as scratch
1312080Smckusick 	 */
1322239Smckusic 	register char *tcp;
13310576Smckusick 	register short *tsp;
134*30057Smckusick 	register long tl, tl1, tl2, tl3;
1352080Smckusick 	double td, td1;
1362239Smckusic 	struct sze8 t8;
13710576Smckusick 	register short *tsp1;
138*30057Smckusick 	long *tlp;
13910576Smckusick 	char *tcp1;
1402950Smckusic 	bool tb;
14110576Smckusick 	struct blockmark *tstp;
14210576Smckusick 	register struct formalrtn *tfp;
1432080Smckusick 	union progcntr tpc;
1442080Smckusick 	struct iorec **ip;
14510792Smckusick 	int mypid;
1462080Smckusick 
1475658Slinton 	pcaddrp = &pc;
14810792Smckusick 	mypid = getpid();
1495658Slinton 
1502080Smckusick 	/*
1512239Smckusic 	 * Setup sets up any hardware specific parameters before
1522239Smckusic 	 * starting the interpreter. Typically this is inline replaced
1532239Smckusic 	 * by interp.sed to utilize specific machine instructions.
1542239Smckusic 	 */
1552239Smckusic 	 setup();
1562239Smckusic 	/*
1572080Smckusick 	 * necessary only on systems which do not initialize
1582080Smckusick 	 * memory to zero
1592080Smckusick 	 */
1602080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1612080Smckusick 		/* void */;
1622080Smckusick 	/*
1632080Smckusick 	 * set up global environment, then ``call'' the main program
1642080Smckusick 	 */
165*30057Smckusick 	STACKALIGN(tl, 2 * sizeof(struct iorec *));
166*30057Smckusick 	_display.frame[0].locvars = pushsp(tl);
1672950Smckusic 	_display.frame[0].locvars += 2 * sizeof(struct iorec *);
1682950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1692950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
170*30057Smckusick 	STACKALIGN(tl, sizeof(struct blockmark));
171*30057Smckusick 	stp = (struct blockmark *)pushsp(tl);
1722109Smckusic 	_dp = &_display.frame[0];
1732080Smckusick 	pc.cp = base;
1745658Slinton 
1755658Slinton 	asm("_loopaddr:");
1762080Smckusick 	for(;;) {
1772109Smckusic #		ifdef DEBUG
1782080Smckusick 		if (++opcptr == 10)
1792080Smckusick 			opcptr = 0;
1802080Smckusick 		opc[opcptr] = *pc.ucp;
1812109Smckusic #		endif DEBUG
1822109Smckusic #		ifdef PROFILE
1832109Smckusic 		_profcnts[*pc.ucp]++;
1842109Smckusic #		endif PROFILE
1852080Smckusick 		switch (*pc.ucp++) {
1865658Slinton 		case O_BPT:			/* breakpoint trap */
1875873Slinton 			PFLUSH();
18810792Smckusick 			kill(mypid, SIGILL);
1895658Slinton 			pc.ucp--;
1905658Slinton 			continue;
1912080Smckusick 		case O_NODUMP:
1922191Smckusic 			_nodump = TRUE;
1932080Smckusick 			/* and fall through */
1942080Smckusick 		case O_BEG:
1952080Smckusick 			_dp += 1;		/* enter local scope */
1962080Smckusick 			stp->odisp = *_dp;	/* save old display value */
1972080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
1982080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
1992191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
2002191Smckusic 			_lino = pc.hdrp->offset;
2012191Smckusic 			_runtst = pc.hdrp->tests;
2022191Smckusic 			disableovrflo();
2032191Smckusic 			if (_runtst)
2042191Smckusic 				enableovrflo();
2052950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
2062080Smckusick 			stp->file = curfile;	/* save active file */
207*30057Smckusick 			STACKALIGN(tl2, tl1);
208*30057Smckusick 			tcp = pushsp(tl2);	/* tcp = new top of stack */
2092950Smckusic 			if (_runtst)		/* zero stack frame */
2109231Smckusick 				blkclr(tcp, tl1);
2112950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
2122109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
2132109Smckusic 			_dp->stp = stp;
2142950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2152080Smckusick 			continue;
2162080Smckusick 		case O_END:
2172080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2182080Smckusick 			stp = _dp->stp;
2192080Smckusick 			curfile = stp->file;	/* restore old active file */
2202080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2212109Smckusic 			if (_dp == &_display.frame[1])
2222080Smckusick 				return;		/* exiting main proc ??? */
2232080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
22410576Smckusick 			pc.cp = stp->pc;
2252080Smckusick 			_dp = stp->dp;
2262191Smckusic 			_runtst = stp->entry->tests;
2272191Smckusic 			disableovrflo();
2282191Smckusic 			if (_runtst)
2292191Smckusic 				enableovrflo();
230*30057Smckusick 			STACKALIGN(tl, stp->entry->framesze);
231*30057Smckusick 			STACKALIGN(tl1, sizeof(struct blockmark));
232*30057Smckusick 			popsp(tl +		/* pop local vars */
233*30057Smckusick 			     tl1 +		/* pop stack frame */
234*30057Smckusick 			     stp->entry->nargs);/* pop parms */
2352080Smckusick 			continue;
2362080Smckusick 		case O_CALL:
2372080Smckusick 			tl = *pc.cp++;
238*30057Smckusick 			PCLONGVAL(tl1);
239*30057Smckusick 			tcp = base + tl1 + sizeof(short);/* new entry point */
240*30057Smckusick 			GETLONGVAL(tl1, tcp);
241*30057Smckusick 			tcp = base + tl1;
242*30057Smckusick 			STACKALIGN(tl1, sizeof(struct blockmark));
243*30057Smckusick 			stp = (struct blockmark *)pushsp(tl1);
2442080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
24510576Smckusick 			stp->pc = pc.cp;
2462080Smckusick 			stp->dp = _dp;
2472109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2482080Smckusick 			pc.cp = tcp;
2492080Smckusick 			continue;
2502080Smckusick 		case O_FCALL:
2513294Smckusic 			pc.cp++;
2524016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2532080Smckusick 			tfp = (struct formalrtn *)popaddr();
254*30057Smckusick 			STACKALIGN(tl, sizeof(struct blockmark));
255*30057Smckusick 			stp = (struct blockmark *)pushsp(tl);
2562080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
25710576Smckusick 			stp->pc = pc.cp;
2582080Smckusick 			stp->dp = _dp;
25910576Smckusick 			pc.cp = (char *)(tfp->fentryaddr);/* new entry point */
2603436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2619231Smckusick  			blkcpy(&_display.frame[1], tcp,
26210576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2639231Smckusick 			blkcpy(&tfp->fdisp[0], &_display.frame[1],
26410576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2652080Smckusick 			continue;
2662080Smckusick 		case O_FRTN:
2672080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2682080Smckusick 			if (tl == 0)
2692080Smckusick 				tl = *pc.usp++;
2702950Smckusic 			tcp = pushsp((long)(0));
2712080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2724016Smckusic  			tcp1 = *(char **)
2734016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2743861Smckusic 			if (tl != 0) {
2759231Smckusick 				blkcpy(tcp, tcp + sizeof(struct formalrtn *)
2769231Smckusick 				    + sizeof(char *), tl);
2773861Smckusic 			}
278*30057Smckusick 			STACKALIGN(tl,
279*30057Smckusick 				sizeof(struct formalrtn *) + sizeof (char *));
280*30057Smckusick  			popsp(tl);
2819231Smckusick  			blkcpy(tcp1, &_display.frame[1],
28210576Smckusick 			    tfp->fbn * sizeof(struct dispsave));
2832080Smckusick 			continue;
2842080Smckusick 		case O_FSAV:
2852080Smckusick 			tfp = (struct formalrtn *)popaddr();
2863436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
287*30057Smckusick 			PCLONGVAL(tl);
288*30057Smckusick 			tcp = base + tl + sizeof(short);/* new entry point */
289*30057Smckusick 			GETLONGVAL(tl, tcp);
290*30057Smckusick 			tfp->fentryaddr = (long (*)())(base + tl);
2919231Smckusick 			blkcpy(&_display.frame[1], &tfp->fdisp[0],
29210576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2932080Smckusick 			pushaddr(tfp);
2942080Smckusick 			continue;
2952080Smckusick 		case O_SDUP2:
2962080Smckusick 			pc.cp++;
2972080Smckusick 			tl = pop2();
2982950Smckusic 			push2((short)(tl));
2992950Smckusic 			push2((short)(tl));
3002080Smckusick 			continue;
3012080Smckusick 		case O_SDUP4:
3022080Smckusick 			pc.cp++;
3032080Smckusick 			tl = pop4();
3042080Smckusick 			push4(tl);
3052080Smckusick 			push4(tl);
3062080Smckusick 			continue;
3072080Smckusick 		case O_TRA:
3082080Smckusick 			pc.cp++;
3092080Smckusick 			pc.cp += *pc.sp;
3102080Smckusick 			continue;
3112080Smckusick 		case O_TRA4:
3122080Smckusick 			pc.cp++;
313*30057Smckusick 			PCLONGVAL(tl);
314*30057Smckusick 			pc.cp = base + tl;
3152080Smckusick 			continue;
3162080Smckusick 		case O_GOTO:
3172109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
3182109Smckusic 								exit frame */
319*30057Smckusick 			PCLONGVAL(tl);
320*30057Smckusick 			pc.cp = base + tl;
3212080Smckusick 			stp = _dp->stp;
3222080Smckusick 			while (tstp != stp) {
3232109Smckusic 				if (_dp == &_display.frame[1])
3243872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3252080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3262080Smckusick 				curfile = stp->file;  /* restore active file */
3272080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3282080Smckusick 				_dp = stp->dp;	      /* restore dp */
3292080Smckusick 				stp = _dp->stp;
3302080Smckusick 			}
3312080Smckusick 			/* pop locals, stack frame, parms, and return values */
3322950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3332080Smckusick 			continue;
3342080Smckusick 		case O_LINO:
3352950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3365682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3372080Smckusick 			_lino = *pc.cp++;	/* set line number */
3382080Smckusick 			if (_lino == 0)
3392080Smckusick 				_lino = *pc.sp++;
3402950Smckusic 			if (_runtst) {
3412950Smckusic 				LINO();		/* inc statement count */
3422950Smckusic 				continue;
3432950Smckusic 			}
3442950Smckusic 			_stcnt++;
3452080Smckusick 			continue;
3462080Smckusick 		case O_PUSH:
3472080Smckusick 			tl = *pc.cp++;
3482080Smckusick 			if (tl == 0)
349*30057Smckusick 				PCLONGVAL(tl);
350*30057Smckusick 			STACKALIGN(tl1, -tl);
351*30057Smckusick 			tcp = pushsp(tl1);
3522950Smckusic 			if (_runtst)
353*30057Smckusick 				blkclr(tcp, tl1);
3542080Smckusick 			continue;
3552080Smckusick 		case O_IF:
3562080Smckusick 			pc.cp++;
3572191Smckusic 			if (pop2()) {
3582080Smckusick 				pc.sp++;
3592191Smckusic 				continue;
3602191Smckusic 			}
3612191Smckusic 			pc.cp += *pc.sp;
3622080Smckusick 			continue;
3632080Smckusick 		case O_REL2:
3642080Smckusick 			tl = pop2();
3652080Smckusick 			tl1 = pop2();
3662080Smckusick 			goto cmplong;
3672080Smckusick 		case O_REL24:
3682080Smckusick 			tl = pop2();
3692080Smckusick 			tl1 = pop4();
3702080Smckusick 			goto cmplong;
3712080Smckusick 		case O_REL42:
3722080Smckusick 			tl = pop4();
3732080Smckusick 			tl1 = pop2();
3742080Smckusick 			goto cmplong;
3752080Smckusick 		case O_REL4:
3762080Smckusick 			tl = pop4();
3772080Smckusick 			tl1 = pop4();
3782080Smckusick 		cmplong:
3795682Smckusic 			switch (*pc.cp++) {
3802080Smckusick 			case releq:
3812080Smckusick 				push2(tl1 == tl);
3822080Smckusick 				continue;
3832080Smckusick 			case relne:
3842080Smckusick 				push2(tl1 != tl);
3852080Smckusick 				continue;
3862080Smckusick 			case rellt:
3872080Smckusick 				push2(tl1 < tl);
3882080Smckusick 				continue;
3892080Smckusick 			case relgt:
3902080Smckusick 				push2(tl1 > tl);
3912080Smckusick 				continue;
3922080Smckusick 			case relle:
3932080Smckusick 				push2(tl1 <= tl);
3942080Smckusick 				continue;
3952080Smckusick 			case relge:
3962080Smckusick 				push2(tl1 >= tl);
3972080Smckusick 				continue;
3982080Smckusick 			default:
3995682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
4005682Smckusic 				    *(pc.cp - 1));
4012080Smckusick 				continue;
4022080Smckusick 			}
4032080Smckusick 		case O_RELG:
4042080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4052080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
406*30057Smckusick 			STACKALIGN(tl1, tl);	/* tl1 has arg stack length */
4072950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4082080Smckusick 			switch (tl2) {
4092080Smckusick 			case releq:
4102950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
4112080Smckusick 				break;
4122080Smckusick 			case relne:
4132950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
4142080Smckusick 				break;
4152080Smckusick 			case rellt:
4162950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
4172080Smckusick 				break;
4182080Smckusick 			case relgt:
4192950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
4202080Smckusick 				break;
4212080Smckusick 			case relle:
4222950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4232080Smckusick 				break;
4242080Smckusick 			case relge:
4252950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4262080Smckusick 				break;
4272080Smckusick 			default:
4285682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4292080Smckusick 				break;
4302080Smckusick 			}
4312080Smckusick 			popsp(tl1 << 1);
4322950Smckusic 			push2((short)(tb));
4332080Smckusick 			continue;
4342080Smckusick 		case O_RELT:
4352080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4362080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4372950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4382080Smckusick 			switch (tl2) {
4392080Smckusick 			case releq:
4402950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4412080Smckusick 				break;
4422080Smckusick 			case relne:
4432950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4442080Smckusick 				break;
4452080Smckusick 			case rellt:
4462950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4472080Smckusick 				break;
4482080Smckusick 			case relgt:
4492950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4502080Smckusick 				break;
4512080Smckusick 			case relle:
4522950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4532080Smckusick 				break;
4542080Smckusick 			case relge:
4552950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4562080Smckusick 				break;
4572080Smckusick 			default:
4585682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4592080Smckusick 				break;
4602080Smckusick 			}
461*30057Smckusick 			STACKALIGN(tl, tl1);
462*30057Smckusick 			popsp(tl << 1);
4632950Smckusic 			push2((short)(tb));
4642080Smckusick 			continue;
4652080Smckusick 		case O_REL28:
4662080Smckusick 			td = pop2();
4672080Smckusick 			td1 = pop8();
4682080Smckusick 			goto cmpdbl;
4692080Smckusick 		case O_REL48:
4702080Smckusick 			td = pop4();
4712080Smckusick 			td1 = pop8();
4722080Smckusick 			goto cmpdbl;
4732080Smckusick 		case O_REL82:
4742080Smckusick 			td = pop8();
4752080Smckusick 			td1 = pop2();
4762080Smckusick 			goto cmpdbl;
4772080Smckusick 		case O_REL84:
4782080Smckusick 			td = pop8();
4792080Smckusick 			td1 = pop4();
4802080Smckusick 			goto cmpdbl;
4812080Smckusick 		case O_REL8:
4822080Smckusick 			td = pop8();
4832080Smckusick 			td1 = pop8();
4842080Smckusick 		cmpdbl:
4852080Smckusick 			switch (*pc.cp++) {
4862080Smckusick 			case releq:
4872080Smckusick 				push2(td1 == td);
4882080Smckusick 				continue;
4892080Smckusick 			case relne:
4902080Smckusick 				push2(td1 != td);
4912080Smckusick 				continue;
4922080Smckusick 			case rellt:
4932080Smckusick 				push2(td1 < td);
4942080Smckusick 				continue;
4952080Smckusick 			case relgt:
4962080Smckusick 				push2(td1 > td);
4972080Smckusick 				continue;
4982080Smckusick 			case relle:
4992080Smckusick 				push2(td1 <= td);
5002080Smckusick 				continue;
5012080Smckusick 			case relge:
5022080Smckusick 				push2(td1 >= td);
5032080Smckusick 				continue;
5042080Smckusick 			default:
5055682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
5065682Smckusic 				    *(pc.cp - 1));
5072080Smckusick 				continue;
5082080Smckusick 			}
5092080Smckusick 		case O_AND:
5102080Smckusick 			pc.cp++;
51110576Smckusick 			tl = pop2();
51210576Smckusick 			tl1 = pop2();
51310787Smckusick 			push2(tl1 & tl);
5142080Smckusick 			continue;
5152080Smckusick 		case O_OR:
5162080Smckusick 			pc.cp++;
51710576Smckusick 			tl = pop2();
51810576Smckusick 			tl1 = pop2();
51910787Smckusick 			push2(tl1 | tl);
5202080Smckusick 			continue;
5212080Smckusick 		case O_NOT:
5222080Smckusick 			pc.cp++;
52310576Smckusick 			tl = pop2();
52410576Smckusick 			push2(tl ^ 1);
5252080Smckusick 			continue;
5262080Smckusick 		case O_AS2:
5272080Smckusick 			pc.cp++;
5282080Smckusick 			tl = pop2();
5292080Smckusick 			*(short *)popaddr() = tl;
5302080Smckusick 			continue;
5312080Smckusick 		case O_AS4:
5322080Smckusick 			pc.cp++;
5332080Smckusick 			tl = pop4();
5342080Smckusick 			*(long *)popaddr() = tl;
5352080Smckusick 			continue;
5362080Smckusick 		case O_AS24:
5372080Smckusick 			pc.cp++;
5382080Smckusick 			tl = pop2();
5392080Smckusick 			*(long *)popaddr() = tl;
5402080Smckusick 			continue;
5412080Smckusick 		case O_AS42:
5422080Smckusick 			pc.cp++;
5432080Smckusick 			tl = pop4();
5442080Smckusick 			*(short *)popaddr() = tl;
5452080Smckusick 			continue;
5462080Smckusick 		case O_AS21:
5472080Smckusick 			pc.cp++;
5482080Smckusick 			tl = pop2();
5492080Smckusick 			*popaddr() = tl;
5502080Smckusick 			continue;
5512080Smckusick 		case O_AS41:
5522080Smckusick 			pc.cp++;
5532080Smckusick 			tl = pop4();
5542080Smckusick 			*popaddr() = tl;
5552080Smckusick 			continue;
5562080Smckusick 		case O_AS28:
5572080Smckusick 			pc.cp++;
5582080Smckusick 			tl = pop2();
5592080Smckusick 			*(double *)popaddr() = tl;
5602080Smckusick 			continue;
5612080Smckusick 		case O_AS48:
5622080Smckusick 			pc.cp++;
5632080Smckusick 			tl = pop4();
5642080Smckusick 			*(double *)popaddr() = tl;
5652080Smckusick 			continue;
5662080Smckusick 		case O_AS8:
5672080Smckusick 			pc.cp++;
5682239Smckusic 			t8 = popsze8();
5692239Smckusic 			*(struct sze8 *)popaddr() = t8;
5702080Smckusick 			continue;
5712080Smckusick 		case O_AS:
5722080Smckusick 			tl = *pc.cp++;
5732080Smckusick 			if (tl == 0)
5742080Smckusick 				tl = *pc.usp++;
575*30057Smckusick 			STACKALIGN(tl1, tl);
5762950Smckusic 			tcp = pushsp((long)(0));
5779231Smckusick 			blkcpy(tcp, *(char **)(tcp + tl1), tl);
5782080Smckusick 			popsp(tl1 + sizeof(char *));
5792080Smckusick 			continue;
58015976Smckusick 		case O_VAS:
58115976Smckusick 			pc.cp++;
58215976Smckusick 			tl = pop4();
58315976Smckusick 			tcp1 = popaddr();
58415976Smckusick 			tcp = popaddr();
58515976Smckusick 			blkcpy(tcp1, tcp, tl);
58615976Smckusick 			continue;
5872080Smckusick 		case O_INX2P2:
5882080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
58910576Smckusick 			tl1 = pop2();
59010576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
59110576Smckusick 			tcp = popaddr();
59210576Smckusick 			pushaddr(tcp + tl1);
5932080Smckusick 			continue;
5942080Smckusick 		case O_INX4P2:
5952080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
59610576Smckusick 			tl1 = pop4();
59710576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
59810576Smckusick 			tcp = popaddr();
59910576Smckusick 			pushaddr(tcp + tl1);
6002080Smckusick 			continue;
6012080Smckusick 		case O_INX2:
6022080Smckusick 			tl = *pc.cp++;		/* tl has element size */
6032080Smckusick 			if (tl == 0)
6042080Smckusick 				tl = *pc.usp++;
6052080Smckusick 			tl1 = pop2();		/* index */
6062080Smckusick 			tl2 = *pc.sp++;
60710576Smckusick 			tcp = popaddr();
60810576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
6092191Smckusic 			tl = *pc.usp++;
6102191Smckusic 			if (_runtst)
6112191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
6122080Smckusick 			continue;
6132080Smckusick 		case O_INX4:
6142080Smckusick 			tl = *pc.cp++;		/* tl has element size */
6152080Smckusick 			if (tl == 0)
6162080Smckusick 				tl = *pc.usp++;
6172080Smckusick 			tl1 = pop4();		/* index */
6182080Smckusick 			tl2 = *pc.sp++;
61910576Smckusick 			tcp = popaddr();
62010576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
6212191Smckusic 			tl = *pc.usp++;
6222191Smckusic 			if (_runtst)
6232191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
6242080Smckusick 			continue;
62515976Smckusick 		case O_VINX2:
62615976Smckusick 			pc.cp++;
62715976Smckusick 			tl = pop2();		/* tl has element size */
62815976Smckusick 			tl1 = pop2();		/* upper bound */
62915976Smckusick 			tl2 = pop2();		/* lower bound */
63015976Smckusick 			tl3 = pop2();		/* index */
63115976Smckusick 			tcp = popaddr();
63215976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
63315976Smckusick 			if (_runtst)
63415976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
63515976Smckusick 			continue;
63615976Smckusick 		case O_VINX24:
63715976Smckusick 			pc.cp++;
63815976Smckusick 			tl = pop2();		/* tl has element size */
63915976Smckusick 			tl1 = pop2();		/* upper bound */
64015976Smckusick 			tl2 = pop2();		/* lower bound */
64115976Smckusick 			tl3 = pop4();		/* index */
64215976Smckusick 			tcp = popaddr();
64315976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
64415976Smckusick 			if (_runtst)
64515976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
64615976Smckusick 			continue;
64715976Smckusick 		case O_VINX42:
64815976Smckusick 			pc.cp++;
64915976Smckusick 			tl = pop4();		/* tl has element size */
65015976Smckusick 			tl1 = pop4();		/* upper bound */
65115976Smckusick 			tl2 = pop4();		/* lower bound */
65215976Smckusick 			tl3 = pop2();		/* index */
65315976Smckusick 			tcp = popaddr();
65415976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
65515976Smckusick 			if (_runtst)
65615976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
65715976Smckusick 			continue;
65815976Smckusick 		case O_VINX4:
65915976Smckusick 			pc.cp++;
66015976Smckusick 			tl = pop4();		/* tl has element size */
66115976Smckusick 			tl1 = pop4();		/* upper bound */
66215976Smckusick 			tl2 = pop4();		/* lower bound */
66315976Smckusick 			tl3 = pop4();		/* index */
66415976Smckusick 			tcp = popaddr();
66515976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
66615976Smckusick 			if (_runtst)
66715976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
66815976Smckusick 			continue;
6692080Smckusick 		case O_OFF:
6702080Smckusick 			tl = *pc.cp++;
6712080Smckusick 			if (tl == 0)
6722080Smckusick 				tl = *pc.usp++;
67310576Smckusick 			tcp = popaddr();
67410576Smckusick 			pushaddr(tcp + tl);
6752080Smckusick 			continue;
6762080Smckusick 		case O_NIL:
6772080Smckusick 			pc.cp++;
67824938Smckusick 			tcp = popaddr();
67924938Smckusick 			NIL(tcp);
68024938Smckusick 			pushaddr(tcp);
6812080Smckusick 			continue;
6822080Smckusick 		case O_ADD2:
6832080Smckusick 			pc.cp++;
68410576Smckusick 			tl = pop2();
68510576Smckusick 			tl1 = pop2();
68610576Smckusick 			push4(tl1 + tl);
6872080Smckusick 			continue;
6882080Smckusick 		case O_ADD4:
6892080Smckusick 			pc.cp++;
69010576Smckusick 			tl = pop4();
69110576Smckusick 			tl1 = pop4();
69210576Smckusick 			push4(tl1 + tl);
6932080Smckusick 			continue;
6942080Smckusick 		case O_ADD24:
6952080Smckusick 			pc.cp++;
6962080Smckusick 			tl = pop2();
69710576Smckusick 			tl1 = pop4();
69810576Smckusick 			push4(tl1 + tl);
6992080Smckusick 			continue;
7002080Smckusick 		case O_ADD42:
7012080Smckusick 			pc.cp++;
7022080Smckusick 			tl = pop4();
70310576Smckusick 			tl1 = pop2();
70410576Smckusick 			push4(tl1 + tl);
7052080Smckusick 			continue;
7062080Smckusick 		case O_ADD28:
7072080Smckusick 			pc.cp++;
7082080Smckusick 			tl = pop2();
70910576Smckusick 			td = pop8();
71010576Smckusick 			push8(td + tl);
7112080Smckusick 			continue;
7122080Smckusick 		case O_ADD48:
7132080Smckusick 			pc.cp++;
7142080Smckusick 			tl = pop4();
71510576Smckusick 			td = pop8();
71610576Smckusick 			push8(td + tl);
7172080Smckusick 			continue;
7182080Smckusick 		case O_ADD82:
7192080Smckusick 			pc.cp++;
7202080Smckusick 			td = pop8();
72110576Smckusick 			td1 = pop2();
72210576Smckusick 			push8(td1 + td);
7232080Smckusick 			continue;
7242080Smckusick 		case O_ADD84:
7252080Smckusick 			pc.cp++;
7262080Smckusick 			td = pop8();
72710576Smckusick 			td1 = pop4();
72810576Smckusick 			push8(td1 + td);
7292080Smckusick 			continue;
7302080Smckusick 		case O_SUB2:
7312080Smckusick 			pc.cp++;
7322080Smckusick 			tl = pop2();
73310576Smckusick 			tl1 = pop2();
73410576Smckusick 			push4(tl1 - tl);
7352080Smckusick 			continue;
7362080Smckusick 		case O_SUB4:
7372080Smckusick 			pc.cp++;
7382080Smckusick 			tl = pop4();
73910576Smckusick 			tl1 = pop4();
74010576Smckusick 			push4(tl1 - tl);
7412080Smckusick 			continue;
7422080Smckusick 		case O_SUB24:
7432080Smckusick 			pc.cp++;
7442080Smckusick 			tl = pop2();
74510576Smckusick 			tl1 = pop4();
74610576Smckusick 			push4(tl1 - tl);
7472080Smckusick 			continue;
7482080Smckusick 		case O_SUB42:
7492080Smckusick 			pc.cp++;
7502080Smckusick 			tl = pop4();
75110576Smckusick 			tl1 = pop2();
75210576Smckusick 			push4(tl1 - tl);
7532080Smckusick 			continue;
7542080Smckusick 		case O_SUB28:
7552080Smckusick 			pc.cp++;
7562080Smckusick 			tl = pop2();
75710576Smckusick 			td = pop8();
75810576Smckusick 			push8(td - tl);
7592080Smckusick 			continue;
7602080Smckusick 		case O_SUB48:
7612080Smckusick 			pc.cp++;
7622080Smckusick 			tl = pop4();
76310576Smckusick 			td = pop8();
76410576Smckusick 			push8(td - tl);
7652080Smckusick 			continue;
7662080Smckusick 		case O_SUB82:
7672080Smckusick 			pc.cp++;
7682080Smckusick 			td = pop8();
76910576Smckusick 			td1 = pop2();
77010576Smckusick 			push8(td1 - td);
7712080Smckusick 			continue;
7722080Smckusick 		case O_SUB84:
7732080Smckusick 			pc.cp++;
7742080Smckusick 			td = pop8();
77510576Smckusick 			td1 = pop4();
77610576Smckusick 			push8(td1 - td);
7772080Smckusick 			continue;
7782080Smckusick 		case O_MUL2:
7792080Smckusick 			pc.cp++;
78010576Smckusick 			tl = pop2();
78110576Smckusick 			tl1 = pop2();
78210576Smckusick 			push4(tl1 * tl);
7832080Smckusick 			continue;
7842080Smckusick 		case O_MUL4:
7852080Smckusick 			pc.cp++;
78610576Smckusick 			tl = pop4();
78710576Smckusick 			tl1 = pop4();
78810576Smckusick 			push4(tl1 * tl);
7892080Smckusick 			continue;
7902080Smckusick 		case O_MUL24:
7912080Smckusick 			pc.cp++;
7922080Smckusick 			tl = pop2();
79310576Smckusick 			tl1 = pop4();
79410576Smckusick 			push4(tl1 * tl);
7952080Smckusick 			continue;
7962080Smckusick 		case O_MUL42:
7972080Smckusick 			pc.cp++;
7982080Smckusick 			tl = pop4();
79910576Smckusick 			tl1 = pop2();
80010576Smckusick 			push4(tl1 * tl);
8012080Smckusick 			continue;
8022080Smckusick 		case O_MUL28:
8032080Smckusick 			pc.cp++;
8042080Smckusick 			tl = pop2();
80510576Smckusick 			td = pop8();
80610576Smckusick 			push8(td * tl);
8072080Smckusick 			continue;
8082080Smckusick 		case O_MUL48:
8092080Smckusick 			pc.cp++;
8102080Smckusick 			tl = pop4();
81110576Smckusick 			td = pop8();
81210576Smckusick 			push8(td * tl);
8132080Smckusick 			continue;
8142080Smckusick 		case O_MUL82:
8152080Smckusick 			pc.cp++;
8162080Smckusick 			td = pop8();
81710576Smckusick 			td1 = pop2();
81810576Smckusick 			push8(td1 * td);
8192080Smckusick 			continue;
8202080Smckusick 		case O_MUL84:
8212080Smckusick 			pc.cp++;
8222080Smckusick 			td = pop8();
82310576Smckusick 			td1 = pop4();
82410576Smckusick 			push8(td1 * td);
8252080Smckusick 			continue;
8262080Smckusick 		case O_ABS2:
8272080Smckusick 		case O_ABS4:
8282080Smckusick 			pc.cp++;
8292080Smckusick 			tl = pop4();
8302080Smckusick 			push4(tl >= 0 ? tl : -tl);
8312080Smckusick 			continue;
8322080Smckusick 		case O_ABS8:
8332080Smckusick 			pc.cp++;
8342080Smckusick 			td = pop8();
8352080Smckusick 			push8(td >= 0.0 ? td : -td);
8362080Smckusick 			continue;
8372080Smckusick 		case O_NEG2:
8382080Smckusick 			pc.cp++;
8392950Smckusic 			push4((long)(-pop2()));
8402080Smckusick 			continue;
8412080Smckusick 		case O_NEG4:
8422080Smckusick 			pc.cp++;
8432080Smckusick 			push4(-pop4());
8442080Smckusick 			continue;
8452080Smckusick 		case O_NEG8:
8462080Smckusick 			pc.cp++;
8472080Smckusick 			push8(-pop8());
8482080Smckusick 			continue;
8492080Smckusick 		case O_DIV2:
8502080Smckusick 			pc.cp++;
8512080Smckusick 			tl = pop2();
85210576Smckusick 			tl1 = pop2();
85310576Smckusick 			push4(tl1 / tl);
8542080Smckusick 			continue;
8552080Smckusick 		case O_DIV4:
8562080Smckusick 			pc.cp++;
8572080Smckusick 			tl = pop4();
85810576Smckusick 			tl1 = pop4();
85910576Smckusick 			push4(tl1 / tl);
8602080Smckusick 			continue;
8612080Smckusick 		case O_DIV24:
8622080Smckusick 			pc.cp++;
8632080Smckusick 			tl = pop2();
86410576Smckusick 			tl1 = pop4();
86510576Smckusick 			push4(tl1 / tl);
8662080Smckusick 			continue;
8672080Smckusick 		case O_DIV42:
8682080Smckusick 			pc.cp++;
8692080Smckusick 			tl = pop4();
87010576Smckusick 			tl1 = pop2();
87110576Smckusick 			push4(tl1 / tl);
8722080Smckusick 			continue;
8732080Smckusick 		case O_MOD2:
8742080Smckusick 			pc.cp++;
8752080Smckusick 			tl = pop2();
87610576Smckusick 			tl1 = pop2();
87710576Smckusick 			push4(tl1 % tl);
8782080Smckusick 			continue;
8792080Smckusick 		case O_MOD4:
8802080Smckusick 			pc.cp++;
8812080Smckusick 			tl = pop4();
88210576Smckusick 			tl1 = pop4();
88310576Smckusick 			push4(tl1 % tl);
8842080Smckusick 			continue;
8852080Smckusick 		case O_MOD24:
8862080Smckusick 			pc.cp++;
8872080Smckusick 			tl = pop2();
88810576Smckusick 			tl1 = pop4();
88910576Smckusick 			push4(tl1 % tl);
8902080Smckusick 			continue;
8912080Smckusick 		case O_MOD42:
8922080Smckusick 			pc.cp++;
8932080Smckusick 			tl = pop4();
89410576Smckusick 			tl1 = pop2();
89510576Smckusick 			push4(tl1 % tl);
8962080Smckusick 			continue;
8972080Smckusick 		case O_ADD8:
8982080Smckusick 			pc.cp++;
89910576Smckusick 			td = pop8();
90010576Smckusick 			td1 = pop8();
90110787Smckusick 			push8(td1 + td);
9022080Smckusick 			continue;
9032080Smckusick 		case O_SUB8:
9042080Smckusick 			pc.cp++;
9052080Smckusick 			td = pop8();
90610576Smckusick 			td1 = pop8();
90710787Smckusick 			push8(td1 - td);
9082080Smckusick 			continue;
9092080Smckusick 		case O_MUL8:
9102080Smckusick 			pc.cp++;
91110576Smckusick 			td = pop8();
91210576Smckusick 			td1 = pop8();
91310787Smckusick 			push8(td1 * td);
9142080Smckusick 			continue;
9152080Smckusick 		case O_DVD8:
9162080Smckusick 			pc.cp++;
9172080Smckusick 			td = pop8();
91810576Smckusick 			td1 = pop8();
91910787Smckusick 			push8(td1 / td);
9202080Smckusick 			continue;
9212080Smckusick 		case O_STOI:
9222080Smckusick 			pc.cp++;
9232950Smckusic 			push4((long)(pop2()));
9242080Smckusick 			continue;
9252080Smckusick 		case O_STOD:
9262080Smckusick 			pc.cp++;
9272080Smckusick 			td = pop2();
9282080Smckusick 			push8(td);
9292080Smckusick 			continue;
9302080Smckusick 		case O_ITOD:
9312080Smckusick 			pc.cp++;
9322080Smckusick 			td = pop4();
9332080Smckusick 			push8(td);
9342080Smckusick 			continue;
9352080Smckusick 		case O_ITOS:
9362080Smckusick 			pc.cp++;
9372950Smckusic 			push2((short)(pop4()));
9382080Smckusick 			continue;
9392080Smckusick 		case O_DVD2:
9402080Smckusick 			pc.cp++;
9412080Smckusick 			td = pop2();
94210576Smckusick 			td1 = pop2();
94310576Smckusick 			push8(td1 / td);
9442080Smckusick 			continue;
9452080Smckusick 		case O_DVD4:
9462080Smckusick 			pc.cp++;
9472080Smckusick 			td = pop4();
94810576Smckusick 			td1 = pop4();
94910576Smckusick 			push8(td1 / td);
9502080Smckusick 			continue;
9512080Smckusick 		case O_DVD24:
9522080Smckusick 			pc.cp++;
9532080Smckusick 			td = pop2();
95410576Smckusick 			td1 = pop4();
95510576Smckusick 			push8(td1 / td);
9562080Smckusick 			continue;
9572080Smckusick 		case O_DVD42:
9582080Smckusick 			pc.cp++;
9592080Smckusick 			td = pop4();
96010576Smckusick 			td1 = pop2();
96110576Smckusick 			push8(td1 / td);
9622080Smckusick 			continue;
9632080Smckusick 		case O_DVD28:
9642080Smckusick 			pc.cp++;
9652080Smckusick 			td = pop2();
96610576Smckusick 			td1 = pop8();
96710576Smckusick 			push8(td1 / td);
9682080Smckusick 			continue;
9692080Smckusick 		case O_DVD48:
9702080Smckusick 			pc.cp++;
97110787Smckusick 			td = pop4();
97210787Smckusick 			td1 = pop8();
97310787Smckusick 			push8(td1 / td);
9742080Smckusick 			continue;
9752080Smckusick 		case O_DVD82:
9762080Smckusick 			pc.cp++;
9772080Smckusick 			td = pop8();
97810576Smckusick 			td1 = pop2();
97910576Smckusick 			push8(td1 / td);
9802080Smckusick 			continue;
9812080Smckusick 		case O_DVD84:
9822080Smckusick 			pc.cp++;
9832080Smckusick 			td = pop8();
98410576Smckusick 			td1 = pop4();
98510576Smckusick 			push8(td1 / td);
9862080Smckusick 			continue;
9872080Smckusick 		case O_RV1:
9882109Smckusic 			tcp = _display.raw[*pc.ucp++];
9892950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
9902080Smckusick 			continue;
9912080Smckusick 		case O_RV14:
9922109Smckusic 			tcp = _display.raw[*pc.ucp++];
9932950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
9942080Smckusick 			continue;
9952080Smckusick 		case O_RV2:
9962109Smckusic 			tcp = _display.raw[*pc.ucp++];
9972080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
9982080Smckusick 			continue;
9992080Smckusick 		case O_RV24:
10002109Smckusic 			tcp = _display.raw[*pc.ucp++];
10012950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
10022080Smckusick 			continue;
10032080Smckusick 		case O_RV4:
10042109Smckusic 			tcp = _display.raw[*pc.ucp++];
10052080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
10062080Smckusick 			continue;
10072080Smckusick 		case O_RV8:
10082109Smckusic 			tcp = _display.raw[*pc.ucp++];
10092239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
10102080Smckusick 			continue;
10112080Smckusick 		case O_RV:
10122109Smckusic 			tcp = _display.raw[*pc.ucp++];
10132080Smckusick 			tcp += *pc.sp++;
10142080Smckusick 			tl = *pc.usp++;
1015*30057Smckusick 			STACKALIGN(tl1, tl);
1016*30057Smckusick 			tcp1 = pushsp(tl1);
10179231Smckusick 			blkcpy(tcp, tcp1, tl);
10182080Smckusick 			continue;
10192080Smckusick 		case O_LV:
10202109Smckusic 			tcp = _display.raw[*pc.ucp++];
10212080Smckusick 			pushaddr(tcp + *pc.sp++);
10222080Smckusick 			continue;
10232080Smckusick 		case O_LRV1:
10242109Smckusic 			tcp = _display.raw[*pc.ucp++];
1025*30057Smckusick 			PCLONGVAL(tl);
1026*30057Smckusick 			push2((short)(*(tcp + tl)));
10272080Smckusick 			continue;
10282080Smckusick 		case O_LRV14:
10292109Smckusic 			tcp = _display.raw[*pc.ucp++];
1030*30057Smckusick 			PCLONGVAL(tl);
1031*30057Smckusick 			push4((long)(*(tcp + tl)));
10322080Smckusick 			continue;
10332080Smckusick 		case O_LRV2:
10342109Smckusic 			tcp = _display.raw[*pc.ucp++];
1035*30057Smckusick 			PCLONGVAL(tl);
1036*30057Smckusick 			push2(*(short *)(tcp + tl));
10372080Smckusick 			continue;
10382080Smckusick 		case O_LRV24:
10392109Smckusic 			tcp = _display.raw[*pc.ucp++];
1040*30057Smckusick 			PCLONGVAL(tl);
1041*30057Smckusick 			push4((long)(*(short *)(tcp + tl)));
10422080Smckusick 			continue;
10432080Smckusick 		case O_LRV4:
10442109Smckusic 			tcp = _display.raw[*pc.ucp++];
1045*30057Smckusick 			PCLONGVAL(tl);
1046*30057Smckusick 			push4(*(long *)(tcp + tl));
10472080Smckusick 			continue;
10482080Smckusick 		case O_LRV8:
10492109Smckusic 			tcp = _display.raw[*pc.ucp++];
1050*30057Smckusick 			PCLONGVAL(tl);
1051*30057Smckusick 			pushsze8(*(struct sze8 *)(tcp + tl));
10522080Smckusick 			continue;
10532080Smckusick 		case O_LRV:
10542109Smckusic 			tcp = _display.raw[*pc.ucp++];
1055*30057Smckusick 			PCLONGVAL(tl);
1056*30057Smckusick 			tcp += tl;
10572080Smckusick 			tl = *pc.usp++;
1058*30057Smckusick 			STACKALIGN(tl1, tl);
1059*30057Smckusick 			tcp1 = pushsp(tl1);
10609231Smckusick 			blkcpy(tcp, tcp1, tl);
10612080Smckusick 			continue;
10622080Smckusick 		case O_LLV:
10632109Smckusic 			tcp = _display.raw[*pc.ucp++];
1064*30057Smckusick 			PCLONGVAL(tl);
1065*30057Smckusick 			pushaddr(tcp + tl);
10662080Smckusick 			continue;
10672080Smckusick 		case O_IND1:
10682080Smckusick 			pc.cp++;
10692950Smckusic 			push2((short)(*popaddr()));
10702080Smckusick 			continue;
10712080Smckusick 		case O_IND14:
10722080Smckusick 			pc.cp++;
10732950Smckusic 			push4((long)(*popaddr()));
10742080Smckusick 			continue;
10752080Smckusick 		case O_IND2:
10762080Smckusick 			pc.cp++;
10772080Smckusick 			push2(*(short *)(popaddr()));
10782080Smckusick 			continue;
10792080Smckusick 		case O_IND24:
10802080Smckusick 			pc.cp++;
10812950Smckusic 			push4((long)(*(short *)(popaddr())));
10822080Smckusick 			continue;
10832080Smckusick 		case O_IND4:
10842080Smckusick 			pc.cp++;
10852080Smckusick 			push4(*(long *)(popaddr()));
10862080Smckusick 			continue;
10872080Smckusick 		case O_IND8:
10882080Smckusick 			pc.cp++;
10892239Smckusic 			pushsze8(*(struct sze8 *)(popaddr()));
10902080Smckusick 			continue;
10912080Smckusick 		case O_IND:
10922080Smckusick 			tl = *pc.cp++;
10932080Smckusick 			if (tl == 0)
10942080Smckusick 				tl = *pc.usp++;
10952080Smckusick 			tcp = popaddr();
1096*30057Smckusick 			STACKALIGN(tl1, tl);
1097*30057Smckusick 			tcp1 = pushsp(tl1);
10989231Smckusick 			blkcpy(tcp, tcp1, tl);
10992080Smckusick 			continue;
11002080Smckusick 		case O_CON1:
11012950Smckusic 			push2((short)(*pc.cp++));
11022080Smckusick 			continue;
11032080Smckusick 		case O_CON14:
11042950Smckusic 			push4((long)(*pc.cp++));
11052080Smckusick 			continue;
11062080Smckusick 		case O_CON2:
11072080Smckusick 			pc.cp++;
11082080Smckusick 			push2(*pc.sp++);
11092080Smckusick 			continue;
11102080Smckusick 		case O_CON24:
11112080Smckusick 			pc.cp++;
11122950Smckusic 			push4((long)(*pc.sp++));
11132080Smckusick 			continue;
11142080Smckusick 		case O_CON4:
11152080Smckusick 			pc.cp++;
1116*30057Smckusick 			PCLONGVAL(tl);
1117*30057Smckusick 			push4(tl);
11182080Smckusick 			continue;
11192080Smckusick 		case O_CON8:
11202080Smckusick 			pc.cp++;
1121*30057Smckusick 			tcp = pushsp(sizeof(double));
1122*30057Smckusick 			blkcpy(pc.cp, tcp, sizeof(double));
1123*30057Smckusick 			pc.dbp++;
11242080Smckusick 			continue;
11252080Smckusick 		case O_CON:
11262080Smckusick 			tl = *pc.cp++;
11272080Smckusick 			if (tl == 0)
11282080Smckusick 				tl = *pc.usp++;
1129*30057Smckusick 			STACKALIGN(tl1, tl);
1130*30057Smckusick 			tcp = pushsp(tl1);
11319231Smckusick 			blkcpy(pc.cp, tcp, tl);
11322950Smckusic 			pc.cp += (int)tl;
11332080Smckusick 			continue;
11342950Smckusic 		case O_CONG:
11352950Smckusic 			tl = *pc.cp++;
11362950Smckusic 			if (tl == 0)
11372950Smckusic 				tl = *pc.usp++;
1138*30057Smckusick 			STACKALIGN(tl1, tl);
11392950Smckusic 			tcp = pushsp(tl1);
11409231Smckusick 			blkcpy(pc.cp, tcp, tl1);
11412950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
11422950Smckusic 			continue;
11432080Smckusick 		case O_LVCON:
11442080Smckusick 			tl = *pc.cp++;
11452080Smckusick 			if (tl == 0)
11462080Smckusick 				tl = *pc.usp++;
1147*30057Smckusick 			pushaddr(pc.cp);
11482080Smckusick 			tl = (tl + 1) & ~1;
11492950Smckusic 			pc.cp += (int)tl;
11502080Smckusick 			continue;
11512080Smckusick 		case O_RANG2:
11522080Smckusick 			tl = *pc.cp++;
11532080Smckusick 			if (tl == 0)
11542080Smckusick 				tl = *pc.sp++;
11552080Smckusick 			tl1 = pop2();
11564026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
11572080Smckusick 			continue;
11582080Smckusick 		case O_RANG42:
11592080Smckusick 			tl = *pc.cp++;
11602080Smckusick 			if (tl == 0)
11612080Smckusick 				tl = *pc.sp++;
11622080Smckusick 			tl1 = pop4();
11634026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
11642080Smckusick 			continue;
11652080Smckusick 		case O_RSNG2:
11662080Smckusick 			tl = *pc.cp++;
11672080Smckusick 			if (tl == 0)
11682080Smckusick 				tl = *pc.sp++;
11692080Smckusick 			tl1 = pop2();
11702950Smckusic 			push2((short)(RSNG4(tl1, tl)));
11712080Smckusick 			continue;
11722080Smckusick 		case O_RSNG42:
11732080Smckusick 			tl = *pc.cp++;
11742080Smckusick 			if (tl == 0)
11752080Smckusick 				tl = *pc.sp++;
11762080Smckusick 			tl1 = pop4();
11772080Smckusick 			push4(RSNG4(tl1, tl));
11782080Smckusick 			continue;
11792080Smckusick 		case O_RANG4:
11804026Smckusic 			tl = *pc.cp++;
11814026Smckusic 			if (tl == 0)
1182*30057Smckusick 				PCLONGVAL(tl);
11832080Smckusick 			tl1 = pop4();
1184*30057Smckusick 			PCLONGVAL(tl2);
1185*30057Smckusick 			push4(RANG4(tl1, tl, tl2));
11862080Smckusick 			continue;
11872080Smckusick 		case O_RANG24:
11884026Smckusic 			tl = *pc.cp++;
11894026Smckusic 			if (tl == 0)
1190*30057Smckusick 				PCLONGVAL(tl);
11912080Smckusick 			tl1 = pop2();
1192*30057Smckusick 			PCLONGVAL(tl2);
1193*30057Smckusick 			push2((short)(RANG4(tl1, tl, tl2)));
11942080Smckusick 			continue;
11952080Smckusick 		case O_RSNG4:
11964026Smckusic 			tl = *pc.cp++;
11974026Smckusic 			if (tl == 0)
1198*30057Smckusick 				PCLONGVAL(tl);
11994026Smckusic 			tl1 = pop4();
12004026Smckusic 			push4(RSNG4(tl1, tl));
12012080Smckusick 			continue;
12022080Smckusick 		case O_RSNG24:
12034026Smckusic 			tl = *pc.cp++;
12044026Smckusic 			if (tl == 0)
1205*30057Smckusick 				PCLONGVAL(tl);
12064026Smckusic 			tl1 = pop2();
12074026Smckusic 			push2((short)(RSNG4(tl1, tl)));
12082080Smckusick 			continue;
12092080Smckusick 		case O_STLIM:
12102080Smckusick 			pc.cp++;
12112121Smckusic 			STLIM();
12122950Smckusic 			popsp((long)(sizeof(long)));
12132080Smckusick 			continue;
12142080Smckusick 		case O_LLIMIT:
12152080Smckusick 			pc.cp++;
12162080Smckusick 			LLIMIT();
12172950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
12182080Smckusick 			continue;
12192080Smckusick 		case O_BUFF:
12202950Smckusic 			BUFF((long)(*pc.cp++));
12212080Smckusick 			continue;
12222080Smckusick 		case O_HALT:
12232080Smckusick 			pc.cp++;
12245682Smckusic 			if (_nodump == TRUE)
12255682Smckusic 				psexit(0);
12265682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
12275682Smckusic 			backtrace("Halted");
12285682Smckusic 			psexit(0);
12292080Smckusick 			continue;
12302080Smckusick 		case O_PXPBUF:
12312080Smckusick 			pc.cp++;
1232*30057Smckusick 			PCLONGVAL(tl);
1233*30057Smckusick 			_cntrs = tl;
1234*30057Smckusick 			PCLONGVAL(tl);
1235*30057Smckusick 			_rtns = tl;
12369231Smckusick 			NEW(&_pcpcount, (_cntrs + 1) * sizeof(long));
12379231Smckusick 			blkclr(_pcpcount, (_cntrs + 1) * sizeof(long));
12382080Smckusick 			continue;
12392080Smckusick 		case O_COUNT:
12402080Smckusick 			pc.cp++;
12412080Smckusick 			_pcpcount[*pc.usp++]++;
12422080Smckusick 			continue;
12432080Smckusick 		case O_CASE1OP:
12442080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
12452080Smckusick 			if (tl == 0)
12462080Smckusick 				tl = *pc.usp++;
12472080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
12482080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
12492080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
12502080Smckusick 			for(; tl > 0; tl--)	/* look for element */
12512080Smckusick 				if (tl1 == *tcp++)
12522080Smckusick 					break;
12532080Smckusick 			if (tl == 0)		/* default case => error */
12545666Smckusic 				CASERNG(tl1);
12552080Smckusick 			pc.cp += *(tsp - tl);
12562080Smckusick 			continue;
12572080Smckusick 		case O_CASE2OP:
12582080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
12592080Smckusick 			if (tl == 0)
12602080Smckusick 				tl = *pc.usp++;
12612080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
12622080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
12632080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
12642080Smckusick 			for(; tl > 0; tl--)	/* look for element */
1265*30057Smckusick 				if (tl1 == *tsp++)
12662080Smckusick 					break;
12672080Smckusick 			if (tl == 0)		/* default case => error */
12685666Smckusic 				CASERNG(tl1);
1269*30057Smckusick 			pc.cp += *(tsp1 - tl);
12702080Smckusick 			continue;
12712080Smckusick 		case O_CASE4OP:
12722080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
12732080Smckusick 			if (tl == 0)
12742080Smckusick 				tl = *pc.usp++;
1275*30057Smckusick 			tsp1 = pc.sp + tl;	/* ptr to end of jump table */
1276*30057Smckusick 			tlp = (long *)tsp1;	/* tlp = ptr to case values */
12772080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
1278*30057Smckusick 			for(; tl > 0; tl--) {	/* look for element */
1279*30057Smckusick 				GETLONGVAL(tl2, tlp++);
1280*30057Smckusick 				if (tl1 == tl2)
12812080Smckusick 					break;
1282*30057Smckusick 			}
12832080Smckusick 			if (tl == 0)		/* default case => error */
12845666Smckusic 				CASERNG(tl1);
1285*30057Smckusick 			pc.cp += *(tsp1 - tl);
12862080Smckusick 			continue;
12872080Smckusick 		case O_ADDT:
12882080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12892080Smckusick 			if (tl == 0)
12902080Smckusick 				tl = *pc.usp++;
12912950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12922080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
12932080Smckusick 			popsp(tl);
12942080Smckusick 			continue;
12952080Smckusick 		case O_SUBT:
12962080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12972080Smckusick 			if (tl == 0)
12982080Smckusick 				tl = *pc.usp++;
12992950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
13002080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
13012080Smckusick 			popsp(tl);
13022080Smckusick 			continue;
13032080Smckusick 		case O_MULT:
13042080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13052080Smckusick 			if (tl == 0)
13062080Smckusick 				tl = *pc.usp++;
13072950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
13082080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
13092080Smckusick 			popsp(tl);
13102080Smckusick 			continue;
13112080Smckusick 		case O_INCT:
13122080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
13132080Smckusick 			if (tl == 0)
13142080Smckusick 				tl = *pc.usp++;
13152950Smckusic 			tb = INCT();
13162950Smckusic 			popsp(tl*sizeof(long));
13172950Smckusic 			push2((short)(tb));
13182080Smckusick 			continue;
13192080Smckusick 		case O_CTTOT:
13202080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
13212080Smckusick 			if (tl == 0)
13222080Smckusick 				tl = *pc.usp++;
13232080Smckusick 			tl1 = tl * sizeof(long);
13242950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
13252080Smckusick 			CTTOT(tcp);
13262950Smckusic 			popsp(tl*sizeof(long));
13272080Smckusick 			continue;
13282080Smckusick 		case O_CARD:
13292080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13302080Smckusick 			if (tl == 0)
13312080Smckusick 				tl = *pc.usp++;
13322950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
13332080Smckusick 			tl1 = CARD(tcp, tl);
13342080Smckusick 			popsp(tl);
13352950Smckusic 			push2((short)(tl1));
13362080Smckusick 			continue;
13372080Smckusick 		case O_IN:
13382080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13392080Smckusick 			if (tl == 0)
13402080Smckusick 				tl = *pc.usp++;
13412080Smckusick 			tl1 = pop4();		/* tl1 is the element */
13422950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
13434026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
13442950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
13452080Smckusick 			popsp(tl);
13462950Smckusic 			push2((short)(tb));
13472080Smckusick 			continue;
13482080Smckusick 		case O_ASRT:
13492080Smckusick 			pc.cp++;
135024938Smckusick 			tl = pop4();
135124938Smckusick 			tcp = popaddr();
135224938Smckusick 			ASRTS(tl, tcp);
13532080Smckusick 			continue;
13542080Smckusick 		case O_FOR1U:
135510792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
135610576Smckusick 			if (tl1 == 0)
135710576Smckusick 				tl1 = *pc.sp++;
135810576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
135910792Smckusick 			tl = pop4();		/* tl upper bound */
136010792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
136110576Smckusick 				continue;
136210792Smckusick 			*tcp += 1;		/* inc index var */
136310792Smckusick 			pc.cp += tl1;		/* return to top of loop */
136410576Smckusick 			continue;
13652080Smckusick 		case O_FOR2U:
136610792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
13674026Smckusic 			if (tl1 == 0)
13684026Smckusic 				tl1 = *pc.sp++;
136910576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
137010792Smckusick 			tl = pop4();		/* tl upper bound */
137110792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
13722080Smckusick 				continue;
137310792Smckusick 			*tsp += 1;		/* inc index var */
137410792Smckusick 			pc.cp += tl1;		/* return to top of loop */
13752080Smckusick 			continue;
13762080Smckusick 		case O_FOR4U:
137710792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
13784026Smckusic 			if (tl1 == 0)
137910792Smckusick 				tl1 = *pc.sp++;
13802950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
138110792Smckusick 			tl = pop4();		/* tl upper bound */
138210792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
13832080Smckusick 				continue;
138410792Smckusick 			*tlp += 1;		/* inc index var */
138510792Smckusick 			pc.cp += tl1;		/* return to top of loop */
13862080Smckusick 			continue;
13872080Smckusick 		case O_FOR1D:
138810792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
138910576Smckusick 			if (tl1 == 0)
139010576Smckusick 				tl1 = *pc.sp++;
139110576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
139210792Smckusick 			tl = pop4();		/* tl upper bound */
139310792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
139410576Smckusick 				continue;
139510792Smckusick 			*tcp -= 1;		/* dec index var */
139610792Smckusick 			pc.cp += tl1;		/* return to top of loop */
139710576Smckusick 			continue;
13982080Smckusick 		case O_FOR2D:
139910792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14004026Smckusic 			if (tl1 == 0)
14014026Smckusic 				tl1 = *pc.sp++;
140210576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
140310792Smckusick 			tl = pop4();		/* tl upper bound */
140410792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
14052080Smckusick 				continue;
140610792Smckusick 			*tsp -= 1;		/* dec index var */
140710792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14082080Smckusick 			continue;
14092080Smckusick 		case O_FOR4D:
141010792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14114026Smckusic 			if (tl1 == 0)
141210792Smckusick 				tl1 = *pc.sp++;
14132950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
141410792Smckusick 			tl = pop4();		/* tl upper bound */
141510792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
14162080Smckusick 				continue;
141710792Smckusick 			*tlp -= 1;		/* dec index var */
141810792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14192080Smckusick 			continue;
14202080Smckusick 		case O_READE:
14212080Smckusick 			pc.cp++;
1422*30057Smckusick 			PCLONGVAL(tl);
1423*30057Smckusick 			push2((short)(READE(curfile, base + tl)));
14242080Smckusick 			continue;
14252080Smckusick 		case O_READ4:
14262080Smckusick 			pc.cp++;
14272080Smckusick 			push4(READ4(curfile));
14282080Smckusick 			continue;
14292080Smckusick 		case O_READC:
14302080Smckusick 			pc.cp++;
14312950Smckusic 			push2((short)(READC(curfile)));
14322080Smckusick 			continue;
14332080Smckusick 		case O_READ8:
14342080Smckusick 			pc.cp++;
14352080Smckusick 			push8(READ8(curfile));
14362080Smckusick 			continue;
14372080Smckusick 		case O_READLN:
14382080Smckusick 			pc.cp++;
14392080Smckusick 			READLN(curfile);
14402080Smckusick 			continue;
14412080Smckusick 		case O_EOF:
14422080Smckusick 			pc.cp++;
14432950Smckusic 			push2((short)(TEOF(popaddr())));
14442080Smckusick 			continue;
14452080Smckusick 		case O_EOLN:
14462080Smckusick 			pc.cp++;
14472950Smckusic 			push2((short)(TEOLN(popaddr())));
14482080Smckusick 			continue;
14492080Smckusick 		case O_WRITEC:
14502191Smckusic 			if (_runtst) {
14512191Smckusic 				WRITEC(curfile);
14523166Smckusic 				popsp((long)(*pc.cp++));
14532191Smckusic 				continue;
14542191Smckusic 			}
145524938Smckusick 			tl = *pc.cp++;
145624938Smckusick 			switch (tl - sizeof(FILE *)) {
145724938Smckusick 			case 2:
145824938Smckusick 				tl1 = pop2();
145924938Smckusick 				break;
146024938Smckusick 			case 4:
146124938Smckusick 				tl1 = pop4();
146224938Smckusick 				break;
146324938Smckusick 			default:
146424938Smckusick 				ERROR("Panic: bad size to O_WRITEC");
146524938Smckusick 				/* NOT REACHED */
146624938Smckusick 			}
146724938Smckusick 			tcp = popaddr();
146824938Smckusick 			fputc(tl1, tcp);
14692080Smckusick 			continue;
14702080Smckusick 		case O_WRITES:
14712191Smckusic 			if (_runtst) {
14722191Smckusic 				WRITES(curfile);
14733166Smckusic 				popsp((long)(*pc.cp++));
14742191Smckusic 				continue;
14752191Smckusic 			}
14762191Smckusic 			fwrite();
14773166Smckusic 			popsp((long)(*pc.cp++));
14782080Smckusick 			continue;
14792080Smckusick 		case O_WRITEF:
14802191Smckusic 			if (_runtst) {
14812191Smckusic 				WRITEF(curfile);
14823166Smckusic 				popsp((long)(*pc.cp++));
14832191Smckusic 				continue;
14842191Smckusic 			}
14852191Smckusic 			fprintf();
14863166Smckusic 			popsp((long)(*pc.cp++));
14872080Smckusick 			continue;
14882080Smckusick 		case O_WRITLN:
14892080Smckusick 			pc.cp++;
14902191Smckusic 			if (_runtst) {
14912191Smckusic 				WRITLN(curfile);
14922191Smckusic 				continue;
14932191Smckusic 			}
14942191Smckusic 			fputc('\n', ACTFILE(curfile));
14952080Smckusick 			continue;
14962080Smckusick 		case O_PAGE:
14972080Smckusick 			pc.cp++;
14982191Smckusic 			if (_runtst) {
14992191Smckusic 				PAGE(curfile);
15002191Smckusic 				continue;
15012191Smckusic 			}
15022950Smckusic 			fputc('', ACTFILE(curfile));
15032080Smckusick 			continue;
15042080Smckusick 		case O_NAM:
15052080Smckusick 			pc.cp++;
15062080Smckusick 			tl = pop4();
1507*30057Smckusick 			PCLONGVAL(tl1);
1508*30057Smckusick 			pushaddr(NAM(tl, base + tl1));
15092080Smckusick 			continue;
15102080Smckusick 		case O_MAX:
15112080Smckusick 			tl = *pc.cp++;
15122080Smckusick 			if (tl == 0)
15132080Smckusick 				tl = *pc.usp++;
15142080Smckusick 			tl1 = pop4();
15152191Smckusic 			if (_runtst) {
15162950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
15172191Smckusic 				continue;
15182191Smckusic 			}
15192191Smckusic 			tl1 -= tl;
15202191Smckusic 			tl = *pc.usp++;
15212191Smckusic 			push4(tl1 > tl ? tl1 : tl);
15222080Smckusick 			continue;
15232080Smckusick 		case O_MIN:
15242080Smckusick 			tl = *pc.cp++;
15252080Smckusick 			if (tl == 0)
15262080Smckusick 				tl = *pc.usp++;
15272080Smckusick 			tl1 = pop4();
15282080Smckusick 			push4(tl1 < tl ? tl1 : tl);
15292080Smckusick 			continue;
15302080Smckusick 		case O_UNIT:
15312080Smckusick 			pc.cp++;
15322080Smckusick 			curfile = UNIT(popaddr());
15332080Smckusick 			continue;
15342080Smckusick 		case O_UNITINP:
15352080Smckusick 			pc.cp++;
15362080Smckusick 			curfile = INPUT;
15372080Smckusick 			continue;
15382080Smckusick 		case O_UNITOUT:
15392080Smckusick 			pc.cp++;
15402080Smckusick 			curfile = OUTPUT;
15412080Smckusick 			continue;
15422080Smckusick 		case O_MESSAGE:
15432080Smckusick 			pc.cp++;
15442080Smckusick 			PFLUSH();
15452080Smckusick 			curfile = ERR;
15462080Smckusick 			continue;
15472109Smckusic 		case O_PUT:
15482109Smckusic 			pc.cp++;
15492109Smckusic 			PUT(curfile);
15502109Smckusic 			continue;
15512080Smckusick 		case O_GET:
15522080Smckusick 			pc.cp++;
15532080Smckusick 			GET(curfile);
15542080Smckusick 			continue;
15552080Smckusick 		case O_FNIL:
15562080Smckusick 			pc.cp++;
15572080Smckusick 			pushaddr(FNIL(popaddr()));
15582080Smckusick 			continue;
15592080Smckusick 		case O_DEFNAME:
15602080Smckusick 			pc.cp++;
15612080Smckusick 			DEFNAME();
15622950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
15632080Smckusick 			continue;
15642080Smckusick 		case O_RESET:
15652080Smckusick 			pc.cp++;
15662080Smckusick 			RESET();
15672950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
15682080Smckusick 			continue;
15692080Smckusick 		case O_REWRITE:
15702080Smckusick 			pc.cp++;
15712080Smckusick 			REWRITE();
15722950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
15732080Smckusick 			continue;
15742080Smckusick 		case O_FILE:
15752080Smckusick 			pc.cp++;
15762080Smckusick 			pushaddr(ACTFILE(curfile));
15772080Smckusick 			continue;
15782080Smckusick 		case O_REMOVE:
15792080Smckusick 			pc.cp++;
15802080Smckusick 			REMOVE();
15812950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
15822080Smckusick 			continue;
15832080Smckusick 		case O_FLUSH:
15842080Smckusick 			pc.cp++;
15852080Smckusick 			FLUSH();
15862950Smckusic 			popsp((long)(sizeof(char *)));
15872080Smckusick 			continue;
15882080Smckusick 		case O_PACK:
15892080Smckusick 			pc.cp++;
15902080Smckusick 			PACK();
15912950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
15922080Smckusick 			continue;
15932080Smckusick 		case O_UNPACK:
15942080Smckusick 			pc.cp++;
15952080Smckusick 			UNPACK();
15962950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
15972080Smckusick 			continue;
15982080Smckusick 		case O_ARGC:
15992080Smckusick 			pc.cp++;
16002950Smckusic 			push4((long)_argc);
16012080Smckusick 			continue;
16022080Smckusick 		case O_ARGV:
16032080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
16042080Smckusick 			if (tl == 0)
16052080Smckusick 				tl = *pc.usp++;
16062080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
16072080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
16082080Smckusick 			ARGV(tl1, tcp, tl);
16092080Smckusick 			continue;
16102080Smckusick 		case O_CLCK:
16112080Smckusick 			pc.cp++;
16122080Smckusick 			push4(CLCK());
16132080Smckusick 			continue;
16142080Smckusick 		case O_WCLCK:
16152080Smckusick 			pc.cp++;
16162080Smckusick 			push4(time(0));
16172080Smckusick 			continue;
16182080Smckusick 		case O_SCLCK:
16192080Smckusick 			pc.cp++;
16202080Smckusick 			push4(SCLCK());
16212080Smckusick 			continue;
16222080Smckusick 		case O_NEW:
16232080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
16242080Smckusick 			if (tl == 0)
16252080Smckusick 				tl = *pc.usp++;
16262080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
16279231Smckusick 			NEW(tcp, tl);
16282191Smckusic 			if (_runtst) {
16299263Smckusick 				blkclr(*((char **)(tcp)), tl);
16302191Smckusic 			}
16312080Smckusick 			continue;
16327961Smckusick 		case O_DISPOSE:
16337961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
16347961Smckusick 			if (tl == 0)
16357961Smckusick 				tl = *pc.usp++;
16367961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
16377961Smckusick 			DISPOSE(tcp, tl);
16387961Smckusick 			*(char **)tcp = (char *)0;
16397961Smckusick 			continue;
16407961Smckusick 		case O_DFDISP:
16417961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
16427961Smckusick 			if (tl == 0)
16437961Smckusick 				tl = *pc.usp++;
16447961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
16457961Smckusick 			DFDISPOSE(tcp, tl);
16467961Smckusick 			*(char **)tcp = (char *)0;
16477961Smckusick 			continue;
16482080Smckusick 		case O_DATE:
16492080Smckusick 			pc.cp++;
16502080Smckusick 			DATE(popaddr());
16512080Smckusick 			continue;
16522080Smckusick 		case O_TIME:
16532080Smckusick 			pc.cp++;
16542080Smckusick 			TIME(popaddr());
16552080Smckusick 			continue;
16562080Smckusick 		case O_UNDEF:
16572080Smckusick 			pc.cp++;
1658*30057Smckusick 			td = pop8();
16592950Smckusic 			push2((short)(0));
16602080Smckusick 			continue;
16612080Smckusick 		case O_ATAN:
16622080Smckusick 			pc.cp++;
16635723Smckusic 			if (_runtst) {
16645723Smckusic 				push8(ATAN(pop8()));
16655723Smckusic 				continue;
16665723Smckusic 			}
16672080Smckusick 			push8(atan(pop8()));
16682080Smckusick 			continue;
16692080Smckusick 		case O_COS:
16702080Smckusick 			pc.cp++;
16715723Smckusic 			if (_runtst) {
16725723Smckusic 				push8(COS(pop8()));
16735723Smckusic 				continue;
16745723Smckusic 			}
16752080Smckusick 			push8(cos(pop8()));
16762080Smckusick 			continue;
16772080Smckusick 		case O_EXP:
16782080Smckusick 			pc.cp++;
16795723Smckusic 			if (_runtst) {
16805723Smckusic 				push8(EXP(pop8()));
16815723Smckusic 				continue;
16825723Smckusic 			}
16832080Smckusick 			push8(exp(pop8()));
16842080Smckusick 			continue;
16852080Smckusick 		case O_LN:
16862080Smckusick 			pc.cp++;
16872191Smckusic 			if (_runtst) {
16882191Smckusic 				push8(LN(pop8()));
16892191Smckusic 				continue;
16902191Smckusic 			}
16912191Smckusic 			push8(log(pop8()));
16922080Smckusick 			continue;
16932080Smckusick 		case O_SIN:
16942080Smckusick 			pc.cp++;
16955723Smckusic 			if (_runtst) {
16965723Smckusic 				push8(SIN(pop8()));
16975723Smckusic 				continue;
16985723Smckusic 			}
16992080Smckusick 			push8(sin(pop8()));
17002080Smckusick 			continue;
17012080Smckusick 		case O_SQRT:
17022080Smckusick 			pc.cp++;
17032191Smckusic 			if (_runtst) {
17042191Smckusic 				push8(SQRT(pop8()));
17052191Smckusic 				continue;
17062191Smckusic 			}
17072191Smckusic 			push8(sqrt(pop8()));
17082080Smckusick 			continue;
17092080Smckusick 		case O_CHR2:
17102080Smckusick 		case O_CHR4:
17112080Smckusick 			pc.cp++;
17122191Smckusic 			if (_runtst) {
17132950Smckusic 				push2((short)(CHR(pop4())));
17142191Smckusic 				continue;
17152191Smckusic 			}
17162950Smckusic 			push2((short)(pop4()));
17172080Smckusick 			continue;
17182080Smckusick 		case O_ODD2:
17192080Smckusick 		case O_ODD4:
17202080Smckusick 			pc.cp++;
172110576Smckusick 			tl = pop4();
172210576Smckusick 			push2((short)(tl & 1));
17232080Smckusick 			continue;
17242080Smckusick 		case O_SUCC2:
17252109Smckusic 			tl = *pc.cp++;
17262109Smckusic 			if (tl == 0)
17272109Smckusic 				tl = *pc.sp++;
17282109Smckusic 			tl1 = pop4();
17292191Smckusic 			if (_runtst) {
17302950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
17312191Smckusic 				continue;
17322191Smckusic 			}
17332950Smckusic 			push2((short)(tl1 + 1));
17342191Smckusic 			pc.sp++;
17352080Smckusick 			continue;
17362080Smckusick 		case O_SUCC24:
17372109Smckusic 			tl = *pc.cp++;
17382109Smckusic 			if (tl == 0)
17392109Smckusic 				tl = *pc.sp++;
17402109Smckusic 			tl1 = pop4();
17412191Smckusic 			if (_runtst) {
17422950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
17432191Smckusic 				continue;
17442191Smckusic 			}
17452191Smckusic 			push4(tl1 + 1);
17462191Smckusic 			pc.sp++;
17472109Smckusic 			continue;
17482080Smckusick 		case O_SUCC4:
17492109Smckusic 			tl = *pc.cp++;
17502109Smckusic 			if (tl == 0)
1751*30057Smckusick 				PCLONGVAL(tl);
17522109Smckusic 			tl1 = pop4();
17532191Smckusic 			if (_runtst) {
1754*30057Smckusick 				PCLONGVAL(tl2);
1755*30057Smckusick 				push4(SUCC(tl1, tl, (long)(tl2)));
17562191Smckusic 				continue;
17572191Smckusic 			}
17582191Smckusic 			push4(tl1 + 1);
17592191Smckusic 			pc.lp++;
17602080Smckusick 			continue;
17612080Smckusick 		case O_PRED2:
17622109Smckusic 			tl = *pc.cp++;
17632109Smckusic 			if (tl == 0)
17642109Smckusic 				tl = *pc.sp++;
17652109Smckusic 			tl1 = pop4();
17662191Smckusic 			if (_runtst) {
17672950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
17682191Smckusic 				continue;
17692191Smckusic 			}
17702950Smckusic 			push2((short)(tl1 - 1));
17712191Smckusic 			pc.sp++;
17722080Smckusick 			continue;
17732080Smckusick 		case O_PRED24:
17742109Smckusic 			tl = *pc.cp++;
17752109Smckusic 			if (tl == 0)
17762109Smckusic 				tl = *pc.sp++;
17772109Smckusic 			tl1 = pop4();
17782191Smckusic 			if (_runtst) {
17792950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
17802191Smckusic 				continue;
17812191Smckusic 			}
17822191Smckusic 			push4(tl1 - 1);
17832191Smckusic 			pc.sp++;
17842109Smckusic 			continue;
17852080Smckusick 		case O_PRED4:
17862109Smckusic 			tl = *pc.cp++;
17872109Smckusic 			if (tl == 0)
1788*30057Smckusick 				PCLONGVAL(tl);
17892109Smckusic 			tl1 = pop4();
17902191Smckusic 			if (_runtst) {
1791*30057Smckusick 				PCLONGVAL(tl2);
1792*30057Smckusick 				push4(PRED(tl1, tl, (long)(tl2)));
17932191Smckusic 				continue;
17942191Smckusic 			}
17952191Smckusic 			push4(tl1 - 1);
17962191Smckusic 			pc.lp++;
17972080Smckusick 			continue;
17982080Smckusick 		case O_SEED:
17992080Smckusick 			pc.cp++;
18002080Smckusick 			push4(SEED(pop4()));
18012080Smckusick 			continue;
18022080Smckusick 		case O_RANDOM:
18032080Smckusick 			pc.cp++;
18042080Smckusick 			push8(RANDOM(pop8()));
18052080Smckusick 			continue;
18062080Smckusick 		case O_EXPO:
18072080Smckusick 			pc.cp++;
18082080Smckusick 			push4(EXPO(pop8()));
18092080Smckusick 			continue;
18102080Smckusick 		case O_SQR2:
18112080Smckusick 		case O_SQR4:
18122080Smckusick 			pc.cp++;
18132080Smckusick 			tl = pop4();
18142080Smckusick 			push4(tl * tl);
18152080Smckusick 			continue;
18162080Smckusick 		case O_SQR8:
18172080Smckusick 			pc.cp++;
18182080Smckusick 			td = pop8();
18192080Smckusick 			push8(td * td);
18202080Smckusick 			continue;
18212080Smckusick 		case O_ROUND:
18222080Smckusick 			pc.cp++;
18232080Smckusick 			push4(ROUND(pop8()));
18242080Smckusick 			continue;
18252080Smckusick 		case O_TRUNC:
18262080Smckusick 			pc.cp++;
18272080Smckusick 			push4(TRUNC(pop8()));
18282080Smckusick 			continue;
18292950Smckusic 		default:
18305682Smckusic 			ERROR("Panic: bad op code\n");
18312950Smckusic 			continue;
18322080Smckusick 		}
18332080Smckusick 	}
18342080Smckusick }
1835