xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 36537)
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*36537Smckusick static char sccsid[] = "@(#)interp.c	5.6 (Berkeley) 01/09/89";
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 /*
101*36537Smckusick  * stuff for pdx to watch what the interpreter is doing.
102*36537Smckusick  * The .globl is #ifndef DBX since it breaks DBX to have a global
103*36537Smckusick  * asm label in the middle of a function (see _loopaddr: below).
1045658Slinton  */
1055658Slinton 
106*36537Smckusick union progcntr pdx_pc;
107*36537Smckusick #ifndef DBX
1085658Slinton asm(".globl _loopaddr");
109*36537Smckusick #endif DBX
1105658Slinton 
1115658Slinton /*
1122109Smckusic  * Px profile array
1132109Smckusic  */
1142109Smckusic #ifdef PROFILE
1152109Smckusic long _profcnts[NUMOPS];
1162109Smckusic #endif PROFILE
1172109Smckusic 
1182109Smckusic /*
1192109Smckusic  * debugging variables
1202109Smckusic  */
12130058Smckusick #ifdef PXDEBUG
1222109Smckusic char opc[10];
1232109Smckusic long opcptr = 9;
12430058Smckusick #endif PXDEBUG
1252109Smckusic 
126*36537Smckusick void
1272080Smckusick interpreter(base)
1282080Smckusick 	char *base;
1292080Smckusick {
130*36537Smckusick 	/* register */ union progcntr pc;	/* interpreted program cntr */
1312080Smckusick 	struct iorec *curfile;		/* active file */
13210576Smckusick 	register struct blockmark *stp;	/* active stack frame ptr */
1332080Smckusick 	/*
1342080Smckusick 	 * the following variables are used as scratch
1352080Smckusick 	 */
1362239Smckusic 	register char *tcp;
13710576Smckusick 	register short *tsp;
13830057Smckusick 	register long tl, tl1, tl2, tl3;
139*36537Smckusick 	char *tcp2;
140*36537Smckusick 	long tl4;
1412080Smckusick 	double td, td1;
1422239Smckusic 	struct sze8 t8;
14310576Smckusick 	register short *tsp1;
14430057Smckusick 	long *tlp;
14510576Smckusick 	char *tcp1;
1462950Smckusic 	bool tb;
14710576Smckusick 	struct blockmark *tstp;
14810576Smckusick 	register struct formalrtn *tfp;
1492080Smckusick 	struct iorec **ip;
15010792Smckusick 	int mypid;
151*36537Smckusick 	int ti, ti2;
152*36537Smckusick 	short ts;
153*36537Smckusick 	FILE *tf;
154*36537Smckusick 	/* register */ union progcntr stack;	/* Interpreted stack */
1552080Smckusick 
15610792Smckusick 	mypid = getpid();
1575658Slinton 
1582080Smckusick 	/*
1592239Smckusic 	 * Setup sets up any hardware specific parameters before
160*36537Smckusick 	 * starting the interpreter. Typically this is macro- or inline-
161*36537Smckusick 	 * replaced by "machdep.h" or interp.sed.
1622239Smckusic 	 */
163*36537Smckusick 	setup();
1642239Smckusic 	/*
1652080Smckusick 	 * necessary only on systems which do not initialize
1662080Smckusick 	 * memory to zero
1672080Smckusick 	 */
1682080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1692080Smckusick 		/* void */;
1702080Smckusick 	/*
1712080Smckusick 	 * set up global environment, then ``call'' the main program
1722080Smckusick 	 */
17330057Smckusick 	STACKALIGN(tl, 2 * sizeof(struct iorec *));
17430057Smckusick 	_display.frame[0].locvars = pushsp(tl);
1752950Smckusic 	_display.frame[0].locvars += 2 * sizeof(struct iorec *);
1762950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1772950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
17830057Smckusick 	STACKALIGN(tl, sizeof(struct blockmark));
17930057Smckusick 	stp = (struct blockmark *)pushsp(tl);
1802109Smckusic 	_dp = &_display.frame[0];
1812080Smckusick 	pc.cp = base;
1825658Slinton 
1832080Smckusick 	for(;;) {
18430058Smckusick #		ifdef PXDEBUG
1852080Smckusick 		if (++opcptr == 10)
1862080Smckusick 			opcptr = 0;
1872080Smckusick 		opc[opcptr] = *pc.ucp;
18830058Smckusick #		endif PXDEBUG
1892109Smckusic #		ifdef PROFILE
1902109Smckusic 		_profcnts[*pc.ucp]++;
1912109Smckusic #		endif PROFILE
192*36537Smckusick 
193*36537Smckusick 		/*
194*36537Smckusick 		 * Save away the program counter to a fixed location for pdx.
195*36537Smckusick 		 */
196*36537Smckusick 		pdx_pc = pc;
197*36537Smckusick 
198*36537Smckusick 		/*
199*36537Smckusick 		 * Having the label below makes dbx not work
200*36537Smckusick 		 * to debug this interpreter,
201*36537Smckusick 		 * since it thinks a new function called loopaddr()
202*36537Smckusick 		 * has started here, and it won't display the local
203*36537Smckusick 		 * variables of interpreter().  You have to compile
204*36537Smckusick 		 * -DDBX to avoid this problem...
205*36537Smckusick 		 */
206*36537Smckusick #		ifndef DBX
207*36537Smckusick 	;asm("_loopaddr:");
208*36537Smckusick #		endif DBX
209*36537Smckusick 
2102080Smckusick 		switch (*pc.ucp++) {
2115658Slinton 		case O_BPT:			/* breakpoint trap */
2125873Slinton 			PFLUSH();
21310792Smckusick 			kill(mypid, SIGILL);
2145658Slinton 			pc.ucp--;
2155658Slinton 			continue;
2162080Smckusick 		case O_NODUMP:
2172191Smckusic 			_nodump = TRUE;
2182080Smckusick 			/* and fall through */
2192080Smckusick 		case O_BEG:
2202080Smckusick 			_dp += 1;		/* enter local scope */
2212080Smckusick 			stp->odisp = *_dp;	/* save old display value */
2222080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
2232080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
2242191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
2252191Smckusic 			_lino = pc.hdrp->offset;
2262191Smckusic 			_runtst = pc.hdrp->tests;
2272191Smckusic 			disableovrflo();
2282191Smckusic 			if (_runtst)
2292191Smckusic 				enableovrflo();
2302950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
2312080Smckusick 			stp->file = curfile;	/* save active file */
23230057Smckusick 			STACKALIGN(tl2, tl1);
23330057Smckusick 			tcp = pushsp(tl2);	/* tcp = new top of stack */
2342950Smckusic 			if (_runtst)		/* zero stack frame */
2359231Smckusick 				blkclr(tcp, tl1);
2362950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
2372109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
2382109Smckusic 			_dp->stp = stp;
2392950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2402080Smckusick 			continue;
2412080Smckusick 		case O_END:
2422080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2432080Smckusick 			stp = _dp->stp;
2442080Smckusick 			curfile = stp->file;	/* restore old active file */
2452080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2462109Smckusic 			if (_dp == &_display.frame[1])
2472080Smckusick 				return;		/* exiting main proc ??? */
2482080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
24910576Smckusick 			pc.cp = stp->pc;
2502080Smckusick 			_dp = stp->dp;
2512191Smckusic 			_runtst = stp->entry->tests;
2522191Smckusic 			disableovrflo();
2532191Smckusic 			if (_runtst)
2542191Smckusic 				enableovrflo();
25530057Smckusick 			STACKALIGN(tl, stp->entry->framesze);
25630057Smckusick 			STACKALIGN(tl1, sizeof(struct blockmark));
25730057Smckusick 			popsp(tl +		/* pop local vars */
25830057Smckusick 			     tl1 +		/* pop stack frame */
25930057Smckusick 			     stp->entry->nargs);/* pop parms */
2602080Smckusick 			continue;
2612080Smckusick 		case O_CALL:
2622080Smckusick 			tl = *pc.cp++;
26330057Smckusick 			PCLONGVAL(tl1);
26430057Smckusick 			tcp = base + tl1 + sizeof(short);/* new entry point */
26530057Smckusick 			GETLONGVAL(tl1, tcp);
26630057Smckusick 			tcp = base + tl1;
26730057Smckusick 			STACKALIGN(tl1, sizeof(struct blockmark));
26830057Smckusick 			stp = (struct blockmark *)pushsp(tl1);
2692080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
27010576Smckusick 			stp->pc = pc.cp;
2712080Smckusick 			stp->dp = _dp;
2722109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2732080Smckusick 			pc.cp = tcp;
2742080Smckusick 			continue;
2752080Smckusick 		case O_FCALL:
2763294Smckusic 			pc.cp++;
2774016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2782080Smckusick 			tfp = (struct formalrtn *)popaddr();
27930057Smckusick 			STACKALIGN(tl, sizeof(struct blockmark));
28030057Smckusick 			stp = (struct blockmark *)pushsp(tl);
2812080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
28210576Smckusick 			stp->pc = pc.cp;
2832080Smckusick 			stp->dp = _dp;
28410576Smckusick 			pc.cp = (char *)(tfp->fentryaddr);/* new entry point */
2853436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2869231Smckusick  			blkcpy(&_display.frame[1], tcp,
28710576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2889231Smckusick 			blkcpy(&tfp->fdisp[0], &_display.frame[1],
28910576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2902080Smckusick 			continue;
2912080Smckusick 		case O_FRTN:
2922080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2932080Smckusick 			if (tl == 0)
2942080Smckusick 				tl = *pc.usp++;
2952950Smckusic 			tcp = pushsp((long)(0));
2962080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2974016Smckusic  			tcp1 = *(char **)
2984016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2993861Smckusic 			if (tl != 0) {
3009231Smckusick 				blkcpy(tcp, tcp + sizeof(struct formalrtn *)
3019231Smckusick 				    + sizeof(char *), tl);
3023861Smckusic 			}
30330057Smckusick 			STACKALIGN(tl,
30430057Smckusick 				sizeof(struct formalrtn *) + sizeof (char *));
30530057Smckusick  			popsp(tl);
3069231Smckusick  			blkcpy(tcp1, &_display.frame[1],
30710576Smckusick 			    tfp->fbn * sizeof(struct dispsave));
3082080Smckusick 			continue;
3092080Smckusick 		case O_FSAV:
3102080Smckusick 			tfp = (struct formalrtn *)popaddr();
3113436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
31230057Smckusick 			PCLONGVAL(tl);
31330057Smckusick 			tcp = base + tl + sizeof(short);/* new entry point */
31430057Smckusick 			GETLONGVAL(tl, tcp);
31530057Smckusick 			tfp->fentryaddr = (long (*)())(base + tl);
3169231Smckusick 			blkcpy(&_display.frame[1], &tfp->fdisp[0],
31710576Smckusick 				tfp->fbn * sizeof(struct dispsave));
3182080Smckusick 			pushaddr(tfp);
3192080Smckusick 			continue;
3202080Smckusick 		case O_SDUP2:
3212080Smckusick 			pc.cp++;
3222080Smckusick 			tl = pop2();
3232950Smckusic 			push2((short)(tl));
3242950Smckusic 			push2((short)(tl));
3252080Smckusick 			continue;
3262080Smckusick 		case O_SDUP4:
3272080Smckusick 			pc.cp++;
3282080Smckusick 			tl = pop4();
3292080Smckusick 			push4(tl);
3302080Smckusick 			push4(tl);
3312080Smckusick 			continue;
3322080Smckusick 		case O_TRA:
3332080Smckusick 			pc.cp++;
3342080Smckusick 			pc.cp += *pc.sp;
3352080Smckusick 			continue;
3362080Smckusick 		case O_TRA4:
3372080Smckusick 			pc.cp++;
33830057Smckusick 			PCLONGVAL(tl);
33930057Smckusick 			pc.cp = base + tl;
3402080Smckusick 			continue;
3412080Smckusick 		case O_GOTO:
3422109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
3432109Smckusic 								exit frame */
34430057Smckusick 			PCLONGVAL(tl);
34530057Smckusick 			pc.cp = base + tl;
3462080Smckusick 			stp = _dp->stp;
3472080Smckusick 			while (tstp != stp) {
3482109Smckusic 				if (_dp == &_display.frame[1])
3493872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3502080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3512080Smckusick 				curfile = stp->file;  /* restore active file */
3522080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3532080Smckusick 				_dp = stp->dp;	      /* restore dp */
3542080Smckusick 				stp = _dp->stp;
3552080Smckusick 			}
3562080Smckusick 			/* pop locals, stack frame, parms, and return values */
3572950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3582080Smckusick 			continue;
3592080Smckusick 		case O_LINO:
3602950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3615682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3622080Smckusick 			_lino = *pc.cp++;	/* set line number */
3632080Smckusick 			if (_lino == 0)
3642080Smckusick 				_lino = *pc.sp++;
3652950Smckusic 			if (_runtst) {
3662950Smckusic 				LINO();		/* inc statement count */
3672950Smckusic 				continue;
3682950Smckusic 			}
3692950Smckusic 			_stcnt++;
3702080Smckusick 			continue;
3712080Smckusick 		case O_PUSH:
3722080Smckusick 			tl = *pc.cp++;
3732080Smckusick 			if (tl == 0)
37430057Smckusick 				PCLONGVAL(tl);
37530057Smckusick 			STACKALIGN(tl1, -tl);
37630057Smckusick 			tcp = pushsp(tl1);
3772950Smckusic 			if (_runtst)
37830057Smckusick 				blkclr(tcp, tl1);
3792080Smckusick 			continue;
3802080Smckusick 		case O_IF:
3812080Smckusick 			pc.cp++;
3822191Smckusic 			if (pop2()) {
3832080Smckusick 				pc.sp++;
3842191Smckusic 				continue;
3852191Smckusic 			}
3862191Smckusic 			pc.cp += *pc.sp;
3872080Smckusick 			continue;
3882080Smckusick 		case O_REL2:
3892080Smckusick 			tl = pop2();
3902080Smckusick 			tl1 = pop2();
3912080Smckusick 			goto cmplong;
3922080Smckusick 		case O_REL24:
3932080Smckusick 			tl = pop2();
3942080Smckusick 			tl1 = pop4();
3952080Smckusick 			goto cmplong;
3962080Smckusick 		case O_REL42:
3972080Smckusick 			tl = pop4();
3982080Smckusick 			tl1 = pop2();
3992080Smckusick 			goto cmplong;
4002080Smckusick 		case O_REL4:
4012080Smckusick 			tl = pop4();
4022080Smckusick 			tl1 = pop4();
4032080Smckusick 		cmplong:
4045682Smckusic 			switch (*pc.cp++) {
4052080Smckusick 			case releq:
4062080Smckusick 				push2(tl1 == tl);
4072080Smckusick 				continue;
4082080Smckusick 			case relne:
4092080Smckusick 				push2(tl1 != tl);
4102080Smckusick 				continue;
4112080Smckusick 			case rellt:
4122080Smckusick 				push2(tl1 < tl);
4132080Smckusick 				continue;
4142080Smckusick 			case relgt:
4152080Smckusick 				push2(tl1 > tl);
4162080Smckusick 				continue;
4172080Smckusick 			case relle:
4182080Smckusick 				push2(tl1 <= tl);
4192080Smckusick 				continue;
4202080Smckusick 			case relge:
4212080Smckusick 				push2(tl1 >= tl);
4222080Smckusick 				continue;
4232080Smckusick 			default:
4245682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
4255682Smckusic 				    *(pc.cp - 1));
4262080Smckusick 				continue;
4272080Smckusick 			}
4282080Smckusick 		case O_RELG:
4292080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4302080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
43130057Smckusick 			STACKALIGN(tl1, tl);	/* tl1 has arg stack length */
4322950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4332080Smckusick 			switch (tl2) {
4342080Smckusick 			case releq:
4352950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
4362080Smckusick 				break;
4372080Smckusick 			case relne:
4382950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
4392080Smckusick 				break;
4402080Smckusick 			case rellt:
4412950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
4422080Smckusick 				break;
4432080Smckusick 			case relgt:
4442950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
4452080Smckusick 				break;
4462080Smckusick 			case relle:
4472950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4482080Smckusick 				break;
4492080Smckusick 			case relge:
4502950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4512080Smckusick 				break;
4522080Smckusick 			default:
4535682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4542080Smckusick 				break;
4552080Smckusick 			}
4562080Smckusick 			popsp(tl1 << 1);
4572950Smckusic 			push2((short)(tb));
4582080Smckusick 			continue;
4592080Smckusick 		case O_RELT:
4602080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4612080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4622950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4632080Smckusick 			switch (tl2) {
4642080Smckusick 			case releq:
4652950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4662080Smckusick 				break;
4672080Smckusick 			case relne:
4682950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4692080Smckusick 				break;
4702080Smckusick 			case rellt:
4712950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4722080Smckusick 				break;
4732080Smckusick 			case relgt:
4742950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4752080Smckusick 				break;
4762080Smckusick 			case relle:
4772950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4782080Smckusick 				break;
4792080Smckusick 			case relge:
4802950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4812080Smckusick 				break;
4822080Smckusick 			default:
4835682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4842080Smckusick 				break;
4852080Smckusick 			}
48630057Smckusick 			STACKALIGN(tl, tl1);
48730057Smckusick 			popsp(tl << 1);
4882950Smckusic 			push2((short)(tb));
4892080Smckusick 			continue;
4902080Smckusick 		case O_REL28:
4912080Smckusick 			td = pop2();
4922080Smckusick 			td1 = pop8();
4932080Smckusick 			goto cmpdbl;
4942080Smckusick 		case O_REL48:
4952080Smckusick 			td = pop4();
4962080Smckusick 			td1 = pop8();
4972080Smckusick 			goto cmpdbl;
4982080Smckusick 		case O_REL82:
4992080Smckusick 			td = pop8();
5002080Smckusick 			td1 = pop2();
5012080Smckusick 			goto cmpdbl;
5022080Smckusick 		case O_REL84:
5032080Smckusick 			td = pop8();
5042080Smckusick 			td1 = pop4();
5052080Smckusick 			goto cmpdbl;
5062080Smckusick 		case O_REL8:
5072080Smckusick 			td = pop8();
5082080Smckusick 			td1 = pop8();
5092080Smckusick 		cmpdbl:
5102080Smckusick 			switch (*pc.cp++) {
5112080Smckusick 			case releq:
5122080Smckusick 				push2(td1 == td);
5132080Smckusick 				continue;
5142080Smckusick 			case relne:
5152080Smckusick 				push2(td1 != td);
5162080Smckusick 				continue;
5172080Smckusick 			case rellt:
5182080Smckusick 				push2(td1 < td);
5192080Smckusick 				continue;
5202080Smckusick 			case relgt:
5212080Smckusick 				push2(td1 > td);
5222080Smckusick 				continue;
5232080Smckusick 			case relle:
5242080Smckusick 				push2(td1 <= td);
5252080Smckusick 				continue;
5262080Smckusick 			case relge:
5272080Smckusick 				push2(td1 >= td);
5282080Smckusick 				continue;
5292080Smckusick 			default:
5305682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
5315682Smckusic 				    *(pc.cp - 1));
5322080Smckusick 				continue;
5332080Smckusick 			}
5342080Smckusick 		case O_AND:
5352080Smckusick 			pc.cp++;
53610576Smckusick 			tl = pop2();
53710576Smckusick 			tl1 = pop2();
53810787Smckusick 			push2(tl1 & tl);
5392080Smckusick 			continue;
5402080Smckusick 		case O_OR:
5412080Smckusick 			pc.cp++;
54210576Smckusick 			tl = pop2();
54310576Smckusick 			tl1 = pop2();
54410787Smckusick 			push2(tl1 | tl);
5452080Smckusick 			continue;
5462080Smckusick 		case O_NOT:
5472080Smckusick 			pc.cp++;
54810576Smckusick 			tl = pop2();
54910576Smckusick 			push2(tl ^ 1);
5502080Smckusick 			continue;
5512080Smckusick 		case O_AS2:
5522080Smckusick 			pc.cp++;
5532080Smckusick 			tl = pop2();
5542080Smckusick 			*(short *)popaddr() = tl;
5552080Smckusick 			continue;
5562080Smckusick 		case O_AS4:
5572080Smckusick 			pc.cp++;
5582080Smckusick 			tl = pop4();
5592080Smckusick 			*(long *)popaddr() = tl;
5602080Smckusick 			continue;
5612080Smckusick 		case O_AS24:
5622080Smckusick 			pc.cp++;
5632080Smckusick 			tl = pop2();
5642080Smckusick 			*(long *)popaddr() = tl;
5652080Smckusick 			continue;
5662080Smckusick 		case O_AS42:
5672080Smckusick 			pc.cp++;
5682080Smckusick 			tl = pop4();
5692080Smckusick 			*(short *)popaddr() = tl;
5702080Smckusick 			continue;
5712080Smckusick 		case O_AS21:
5722080Smckusick 			pc.cp++;
5732080Smckusick 			tl = pop2();
5742080Smckusick 			*popaddr() = tl;
5752080Smckusick 			continue;
5762080Smckusick 		case O_AS41:
5772080Smckusick 			pc.cp++;
5782080Smckusick 			tl = pop4();
5792080Smckusick 			*popaddr() = tl;
5802080Smckusick 			continue;
5812080Smckusick 		case O_AS28:
5822080Smckusick 			pc.cp++;
5832080Smckusick 			tl = pop2();
5842080Smckusick 			*(double *)popaddr() = tl;
5852080Smckusick 			continue;
5862080Smckusick 		case O_AS48:
5872080Smckusick 			pc.cp++;
5882080Smckusick 			tl = pop4();
5892080Smckusick 			*(double *)popaddr() = tl;
5902080Smckusick 			continue;
5912080Smckusick 		case O_AS8:
5922080Smckusick 			pc.cp++;
5932239Smckusic 			t8 = popsze8();
5942239Smckusic 			*(struct sze8 *)popaddr() = t8;
5952080Smckusick 			continue;
5962080Smckusick 		case O_AS:
5972080Smckusick 			tl = *pc.cp++;
5982080Smckusick 			if (tl == 0)
5992080Smckusick 				tl = *pc.usp++;
60030057Smckusick 			STACKALIGN(tl1, tl);
6012950Smckusic 			tcp = pushsp((long)(0));
6029231Smckusick 			blkcpy(tcp, *(char **)(tcp + tl1), tl);
6032080Smckusick 			popsp(tl1 + sizeof(char *));
6042080Smckusick 			continue;
60515976Smckusick 		case O_VAS:
60615976Smckusick 			pc.cp++;
60715976Smckusick 			tl = pop4();
60815976Smckusick 			tcp1 = popaddr();
60915976Smckusick 			tcp = popaddr();
61015976Smckusick 			blkcpy(tcp1, tcp, tl);
61115976Smckusick 			continue;
6122080Smckusick 		case O_INX2P2:
6132080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
61410576Smckusick 			tl1 = pop2();
61510576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
61610576Smckusick 			tcp = popaddr();
61710576Smckusick 			pushaddr(tcp + tl1);
6182080Smckusick 			continue;
6192080Smckusick 		case O_INX4P2:
6202080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
62110576Smckusick 			tl1 = pop4();
62210576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
62310576Smckusick 			tcp = popaddr();
62410576Smckusick 			pushaddr(tcp + tl1);
6252080Smckusick 			continue;
6262080Smckusick 		case O_INX2:
6272080Smckusick 			tl = *pc.cp++;		/* tl has element size */
6282080Smckusick 			if (tl == 0)
6292080Smckusick 				tl = *pc.usp++;
6302080Smckusick 			tl1 = pop2();		/* index */
6312080Smckusick 			tl2 = *pc.sp++;
63210576Smckusick 			tcp = popaddr();
63310576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
6342191Smckusic 			tl = *pc.usp++;
6352191Smckusic 			if (_runtst)
6362191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
6372080Smckusick 			continue;
6382080Smckusick 		case O_INX4:
6392080Smckusick 			tl = *pc.cp++;		/* tl has element size */
6402080Smckusick 			if (tl == 0)
6412080Smckusick 				tl = *pc.usp++;
6422080Smckusick 			tl1 = pop4();		/* index */
6432080Smckusick 			tl2 = *pc.sp++;
64410576Smckusick 			tcp = popaddr();
64510576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
6462191Smckusic 			tl = *pc.usp++;
6472191Smckusic 			if (_runtst)
6482191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
6492080Smckusick 			continue;
65015976Smckusick 		case O_VINX2:
65115976Smckusick 			pc.cp++;
65215976Smckusick 			tl = pop2();		/* tl has element size */
65315976Smckusick 			tl1 = pop2();		/* upper bound */
65415976Smckusick 			tl2 = pop2();		/* lower bound */
65515976Smckusick 			tl3 = pop2();		/* index */
65615976Smckusick 			tcp = popaddr();
65715976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
65815976Smckusick 			if (_runtst)
65915976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
66015976Smckusick 			continue;
66115976Smckusick 		case O_VINX24:
66215976Smckusick 			pc.cp++;
66315976Smckusick 			tl = pop2();		/* tl has element size */
66415976Smckusick 			tl1 = pop2();		/* upper bound */
66515976Smckusick 			tl2 = pop2();		/* lower bound */
66615976Smckusick 			tl3 = pop4();		/* index */
66715976Smckusick 			tcp = popaddr();
66815976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
66915976Smckusick 			if (_runtst)
67015976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
67115976Smckusick 			continue;
67215976Smckusick 		case O_VINX42:
67315976Smckusick 			pc.cp++;
67415976Smckusick 			tl = pop4();		/* tl has element size */
67515976Smckusick 			tl1 = pop4();		/* upper bound */
67615976Smckusick 			tl2 = pop4();		/* lower bound */
67715976Smckusick 			tl3 = pop2();		/* index */
67815976Smckusick 			tcp = popaddr();
67915976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
68015976Smckusick 			if (_runtst)
68115976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
68215976Smckusick 			continue;
68315976Smckusick 		case O_VINX4:
68415976Smckusick 			pc.cp++;
68515976Smckusick 			tl = pop4();		/* tl has element size */
68615976Smckusick 			tl1 = pop4();		/* upper bound */
68715976Smckusick 			tl2 = pop4();		/* lower bound */
68815976Smckusick 			tl3 = pop4();		/* index */
68915976Smckusick 			tcp = popaddr();
69015976Smckusick 			pushaddr(tcp + (tl3 - tl2) * tl);
69115976Smckusick 			if (_runtst)
69215976Smckusick 				SUBSC(tl3, tl2, tl1); /* range check */
69315976Smckusick 			continue;
6942080Smckusick 		case O_OFF:
6952080Smckusick 			tl = *pc.cp++;
6962080Smckusick 			if (tl == 0)
6972080Smckusick 				tl = *pc.usp++;
69810576Smckusick 			tcp = popaddr();
69910576Smckusick 			pushaddr(tcp + tl);
7002080Smckusick 			continue;
7012080Smckusick 		case O_NIL:
7022080Smckusick 			pc.cp++;
70324938Smckusick 			tcp = popaddr();
70424938Smckusick 			NIL(tcp);
70524938Smckusick 			pushaddr(tcp);
7062080Smckusick 			continue;
7072080Smckusick 		case O_ADD2:
7082080Smckusick 			pc.cp++;
70910576Smckusick 			tl = pop2();
71010576Smckusick 			tl1 = pop2();
71110576Smckusick 			push4(tl1 + tl);
7122080Smckusick 			continue;
7132080Smckusick 		case O_ADD4:
7142080Smckusick 			pc.cp++;
71510576Smckusick 			tl = pop4();
71610576Smckusick 			tl1 = pop4();
71710576Smckusick 			push4(tl1 + tl);
7182080Smckusick 			continue;
7192080Smckusick 		case O_ADD24:
7202080Smckusick 			pc.cp++;
7212080Smckusick 			tl = pop2();
72210576Smckusick 			tl1 = pop4();
72310576Smckusick 			push4(tl1 + tl);
7242080Smckusick 			continue;
7252080Smckusick 		case O_ADD42:
7262080Smckusick 			pc.cp++;
7272080Smckusick 			tl = pop4();
72810576Smckusick 			tl1 = pop2();
72910576Smckusick 			push4(tl1 + tl);
7302080Smckusick 			continue;
7312080Smckusick 		case O_ADD28:
7322080Smckusick 			pc.cp++;
7332080Smckusick 			tl = pop2();
73410576Smckusick 			td = pop8();
73510576Smckusick 			push8(td + tl);
7362080Smckusick 			continue;
7372080Smckusick 		case O_ADD48:
7382080Smckusick 			pc.cp++;
7392080Smckusick 			tl = pop4();
74010576Smckusick 			td = pop8();
74110576Smckusick 			push8(td + tl);
7422080Smckusick 			continue;
7432080Smckusick 		case O_ADD82:
7442080Smckusick 			pc.cp++;
7452080Smckusick 			td = pop8();
74610576Smckusick 			td1 = pop2();
74710576Smckusick 			push8(td1 + td);
7482080Smckusick 			continue;
7492080Smckusick 		case O_ADD84:
7502080Smckusick 			pc.cp++;
7512080Smckusick 			td = pop8();
75210576Smckusick 			td1 = pop4();
75310576Smckusick 			push8(td1 + td);
7542080Smckusick 			continue;
7552080Smckusick 		case O_SUB2:
7562080Smckusick 			pc.cp++;
7572080Smckusick 			tl = pop2();
75810576Smckusick 			tl1 = pop2();
75910576Smckusick 			push4(tl1 - tl);
7602080Smckusick 			continue;
7612080Smckusick 		case O_SUB4:
7622080Smckusick 			pc.cp++;
7632080Smckusick 			tl = pop4();
76410576Smckusick 			tl1 = pop4();
76510576Smckusick 			push4(tl1 - tl);
7662080Smckusick 			continue;
7672080Smckusick 		case O_SUB24:
7682080Smckusick 			pc.cp++;
7692080Smckusick 			tl = pop2();
77010576Smckusick 			tl1 = pop4();
77110576Smckusick 			push4(tl1 - tl);
7722080Smckusick 			continue;
7732080Smckusick 		case O_SUB42:
7742080Smckusick 			pc.cp++;
7752080Smckusick 			tl = pop4();
77610576Smckusick 			tl1 = pop2();
77710576Smckusick 			push4(tl1 - tl);
7782080Smckusick 			continue;
7792080Smckusick 		case O_SUB28:
7802080Smckusick 			pc.cp++;
7812080Smckusick 			tl = pop2();
78210576Smckusick 			td = pop8();
78310576Smckusick 			push8(td - tl);
7842080Smckusick 			continue;
7852080Smckusick 		case O_SUB48:
7862080Smckusick 			pc.cp++;
7872080Smckusick 			tl = pop4();
78810576Smckusick 			td = pop8();
78910576Smckusick 			push8(td - tl);
7902080Smckusick 			continue;
7912080Smckusick 		case O_SUB82:
7922080Smckusick 			pc.cp++;
7932080Smckusick 			td = pop8();
79410576Smckusick 			td1 = pop2();
79510576Smckusick 			push8(td1 - td);
7962080Smckusick 			continue;
7972080Smckusick 		case O_SUB84:
7982080Smckusick 			pc.cp++;
7992080Smckusick 			td = pop8();
80010576Smckusick 			td1 = pop4();
80110576Smckusick 			push8(td1 - td);
8022080Smckusick 			continue;
8032080Smckusick 		case O_MUL2:
8042080Smckusick 			pc.cp++;
80510576Smckusick 			tl = pop2();
80610576Smckusick 			tl1 = pop2();
80710576Smckusick 			push4(tl1 * tl);
8082080Smckusick 			continue;
8092080Smckusick 		case O_MUL4:
8102080Smckusick 			pc.cp++;
81110576Smckusick 			tl = pop4();
81210576Smckusick 			tl1 = pop4();
81310576Smckusick 			push4(tl1 * tl);
8142080Smckusick 			continue;
8152080Smckusick 		case O_MUL24:
8162080Smckusick 			pc.cp++;
8172080Smckusick 			tl = pop2();
81810576Smckusick 			tl1 = pop4();
81910576Smckusick 			push4(tl1 * tl);
8202080Smckusick 			continue;
8212080Smckusick 		case O_MUL42:
8222080Smckusick 			pc.cp++;
8232080Smckusick 			tl = pop4();
82410576Smckusick 			tl1 = pop2();
82510576Smckusick 			push4(tl1 * tl);
8262080Smckusick 			continue;
8272080Smckusick 		case O_MUL28:
8282080Smckusick 			pc.cp++;
8292080Smckusick 			tl = pop2();
83010576Smckusick 			td = pop8();
83110576Smckusick 			push8(td * tl);
8322080Smckusick 			continue;
8332080Smckusick 		case O_MUL48:
8342080Smckusick 			pc.cp++;
8352080Smckusick 			tl = pop4();
83610576Smckusick 			td = pop8();
83710576Smckusick 			push8(td * tl);
8382080Smckusick 			continue;
8392080Smckusick 		case O_MUL82:
8402080Smckusick 			pc.cp++;
8412080Smckusick 			td = pop8();
84210576Smckusick 			td1 = pop2();
84310576Smckusick 			push8(td1 * td);
8442080Smckusick 			continue;
8452080Smckusick 		case O_MUL84:
8462080Smckusick 			pc.cp++;
8472080Smckusick 			td = pop8();
84810576Smckusick 			td1 = pop4();
84910576Smckusick 			push8(td1 * td);
8502080Smckusick 			continue;
8512080Smckusick 		case O_ABS2:
8522080Smckusick 		case O_ABS4:
8532080Smckusick 			pc.cp++;
8542080Smckusick 			tl = pop4();
8552080Smckusick 			push4(tl >= 0 ? tl : -tl);
8562080Smckusick 			continue;
8572080Smckusick 		case O_ABS8:
8582080Smckusick 			pc.cp++;
8592080Smckusick 			td = pop8();
8602080Smckusick 			push8(td >= 0.0 ? td : -td);
8612080Smckusick 			continue;
8622080Smckusick 		case O_NEG2:
8632080Smckusick 			pc.cp++;
864*36537Smckusick 			ts = -pop2();
865*36537Smckusick 			push4((long)ts);
8662080Smckusick 			continue;
8672080Smckusick 		case O_NEG4:
8682080Smckusick 			pc.cp++;
869*36537Smckusick 			tl = -pop4();
870*36537Smckusick 			push4(tl);
8712080Smckusick 			continue;
8722080Smckusick 		case O_NEG8:
8732080Smckusick 			pc.cp++;
874*36537Smckusick 			td = -pop8();
875*36537Smckusick 			push8(td);
8762080Smckusick 			continue;
8772080Smckusick 		case O_DIV2:
8782080Smckusick 			pc.cp++;
8792080Smckusick 			tl = pop2();
88010576Smckusick 			tl1 = pop2();
88110576Smckusick 			push4(tl1 / tl);
8822080Smckusick 			continue;
8832080Smckusick 		case O_DIV4:
8842080Smckusick 			pc.cp++;
8852080Smckusick 			tl = pop4();
88610576Smckusick 			tl1 = pop4();
88710576Smckusick 			push4(tl1 / tl);
8882080Smckusick 			continue;
8892080Smckusick 		case O_DIV24:
8902080Smckusick 			pc.cp++;
8912080Smckusick 			tl = pop2();
89210576Smckusick 			tl1 = pop4();
89310576Smckusick 			push4(tl1 / tl);
8942080Smckusick 			continue;
8952080Smckusick 		case O_DIV42:
8962080Smckusick 			pc.cp++;
8972080Smckusick 			tl = pop4();
89810576Smckusick 			tl1 = pop2();
89910576Smckusick 			push4(tl1 / tl);
9002080Smckusick 			continue;
9012080Smckusick 		case O_MOD2:
9022080Smckusick 			pc.cp++;
9032080Smckusick 			tl = pop2();
90410576Smckusick 			tl1 = pop2();
90510576Smckusick 			push4(tl1 % tl);
9062080Smckusick 			continue;
9072080Smckusick 		case O_MOD4:
9082080Smckusick 			pc.cp++;
9092080Smckusick 			tl = pop4();
91010576Smckusick 			tl1 = pop4();
91110576Smckusick 			push4(tl1 % tl);
9122080Smckusick 			continue;
9132080Smckusick 		case O_MOD24:
9142080Smckusick 			pc.cp++;
9152080Smckusick 			tl = pop2();
91610576Smckusick 			tl1 = pop4();
91710576Smckusick 			push4(tl1 % tl);
9182080Smckusick 			continue;
9192080Smckusick 		case O_MOD42:
9202080Smckusick 			pc.cp++;
9212080Smckusick 			tl = pop4();
92210576Smckusick 			tl1 = pop2();
92310576Smckusick 			push4(tl1 % tl);
9242080Smckusick 			continue;
9252080Smckusick 		case O_ADD8:
9262080Smckusick 			pc.cp++;
92710576Smckusick 			td = pop8();
92810576Smckusick 			td1 = pop8();
92910787Smckusick 			push8(td1 + td);
9302080Smckusick 			continue;
9312080Smckusick 		case O_SUB8:
9322080Smckusick 			pc.cp++;
9332080Smckusick 			td = pop8();
93410576Smckusick 			td1 = pop8();
93510787Smckusick 			push8(td1 - td);
9362080Smckusick 			continue;
9372080Smckusick 		case O_MUL8:
9382080Smckusick 			pc.cp++;
93910576Smckusick 			td = pop8();
94010576Smckusick 			td1 = pop8();
94110787Smckusick 			push8(td1 * td);
9422080Smckusick 			continue;
9432080Smckusick 		case O_DVD8:
9442080Smckusick 			pc.cp++;
9452080Smckusick 			td = pop8();
94610576Smckusick 			td1 = pop8();
94710787Smckusick 			push8(td1 / td);
9482080Smckusick 			continue;
9492080Smckusick 		case O_STOI:
9502080Smckusick 			pc.cp++;
951*36537Smckusick 			ts = pop2();
952*36537Smckusick 			push4((long)ts);
9532080Smckusick 			continue;
9542080Smckusick 		case O_STOD:
9552080Smckusick 			pc.cp++;
9562080Smckusick 			td = pop2();
9572080Smckusick 			push8(td);
9582080Smckusick 			continue;
9592080Smckusick 		case O_ITOD:
9602080Smckusick 			pc.cp++;
9612080Smckusick 			td = pop4();
9622080Smckusick 			push8(td);
9632080Smckusick 			continue;
9642080Smckusick 		case O_ITOS:
9652080Smckusick 			pc.cp++;
966*36537Smckusick 			tl = pop4();
967*36537Smckusick 			push2((short)tl);
9682080Smckusick 			continue;
9692080Smckusick 		case O_DVD2:
9702080Smckusick 			pc.cp++;
9712080Smckusick 			td = pop2();
97210576Smckusick 			td1 = pop2();
97310576Smckusick 			push8(td1 / td);
9742080Smckusick 			continue;
9752080Smckusick 		case O_DVD4:
9762080Smckusick 			pc.cp++;
9772080Smckusick 			td = pop4();
97810576Smckusick 			td1 = pop4();
97910576Smckusick 			push8(td1 / td);
9802080Smckusick 			continue;
9812080Smckusick 		case O_DVD24:
9822080Smckusick 			pc.cp++;
9832080Smckusick 			td = pop2();
98410576Smckusick 			td1 = pop4();
98510576Smckusick 			push8(td1 / td);
9862080Smckusick 			continue;
9872080Smckusick 		case O_DVD42:
9882080Smckusick 			pc.cp++;
9892080Smckusick 			td = pop4();
99010576Smckusick 			td1 = pop2();
99110576Smckusick 			push8(td1 / td);
9922080Smckusick 			continue;
9932080Smckusick 		case O_DVD28:
9942080Smckusick 			pc.cp++;
9952080Smckusick 			td = pop2();
99610576Smckusick 			td1 = pop8();
99710576Smckusick 			push8(td1 / td);
9982080Smckusick 			continue;
9992080Smckusick 		case O_DVD48:
10002080Smckusick 			pc.cp++;
100110787Smckusick 			td = pop4();
100210787Smckusick 			td1 = pop8();
100310787Smckusick 			push8(td1 / td);
10042080Smckusick 			continue;
10052080Smckusick 		case O_DVD82:
10062080Smckusick 			pc.cp++;
10072080Smckusick 			td = pop8();
100810576Smckusick 			td1 = pop2();
100910576Smckusick 			push8(td1 / td);
10102080Smckusick 			continue;
10112080Smckusick 		case O_DVD84:
10122080Smckusick 			pc.cp++;
10132080Smckusick 			td = pop8();
101410576Smckusick 			td1 = pop4();
101510576Smckusick 			push8(td1 / td);
10162080Smckusick 			continue;
10172080Smckusick 		case O_RV1:
10182109Smckusic 			tcp = _display.raw[*pc.ucp++];
10192950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
10202080Smckusick 			continue;
10212080Smckusick 		case O_RV14:
10222109Smckusic 			tcp = _display.raw[*pc.ucp++];
10232950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
10242080Smckusick 			continue;
10252080Smckusick 		case O_RV2:
10262109Smckusic 			tcp = _display.raw[*pc.ucp++];
10272080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
10282080Smckusick 			continue;
10292080Smckusick 		case O_RV24:
10302109Smckusic 			tcp = _display.raw[*pc.ucp++];
10312950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
10322080Smckusick 			continue;
10332080Smckusick 		case O_RV4:
10342109Smckusic 			tcp = _display.raw[*pc.ucp++];
10352080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
10362080Smckusick 			continue;
10372080Smckusick 		case O_RV8:
10382109Smckusic 			tcp = _display.raw[*pc.ucp++];
10392239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
10402080Smckusick 			continue;
10412080Smckusick 		case O_RV:
10422109Smckusic 			tcp = _display.raw[*pc.ucp++];
10432080Smckusick 			tcp += *pc.sp++;
10442080Smckusick 			tl = *pc.usp++;
104530057Smckusick 			STACKALIGN(tl1, tl);
104630057Smckusick 			tcp1 = pushsp(tl1);
10479231Smckusick 			blkcpy(tcp, tcp1, tl);
10482080Smckusick 			continue;
10492080Smckusick 		case O_LV:
10502109Smckusic 			tcp = _display.raw[*pc.ucp++];
10512080Smckusick 			pushaddr(tcp + *pc.sp++);
10522080Smckusick 			continue;
10532080Smckusick 		case O_LRV1:
10542109Smckusic 			tcp = _display.raw[*pc.ucp++];
105530057Smckusick 			PCLONGVAL(tl);
105630057Smckusick 			push2((short)(*(tcp + tl)));
10572080Smckusick 			continue;
10582080Smckusick 		case O_LRV14:
10592109Smckusic 			tcp = _display.raw[*pc.ucp++];
106030057Smckusick 			PCLONGVAL(tl);
106130057Smckusick 			push4((long)(*(tcp + tl)));
10622080Smckusick 			continue;
10632080Smckusick 		case O_LRV2:
10642109Smckusic 			tcp = _display.raw[*pc.ucp++];
106530057Smckusick 			PCLONGVAL(tl);
106630057Smckusick 			push2(*(short *)(tcp + tl));
10672080Smckusick 			continue;
10682080Smckusick 		case O_LRV24:
10692109Smckusic 			tcp = _display.raw[*pc.ucp++];
107030057Smckusick 			PCLONGVAL(tl);
107130057Smckusick 			push4((long)(*(short *)(tcp + tl)));
10722080Smckusick 			continue;
10732080Smckusick 		case O_LRV4:
10742109Smckusic 			tcp = _display.raw[*pc.ucp++];
107530057Smckusick 			PCLONGVAL(tl);
107630057Smckusick 			push4(*(long *)(tcp + tl));
10772080Smckusick 			continue;
10782080Smckusick 		case O_LRV8:
10792109Smckusic 			tcp = _display.raw[*pc.ucp++];
108030057Smckusick 			PCLONGVAL(tl);
108130057Smckusick 			pushsze8(*(struct sze8 *)(tcp + tl));
10822080Smckusick 			continue;
10832080Smckusick 		case O_LRV:
10842109Smckusic 			tcp = _display.raw[*pc.ucp++];
108530057Smckusick 			PCLONGVAL(tl);
108630057Smckusick 			tcp += tl;
10872080Smckusick 			tl = *pc.usp++;
108830057Smckusick 			STACKALIGN(tl1, tl);
108930057Smckusick 			tcp1 = pushsp(tl1);
10909231Smckusick 			blkcpy(tcp, tcp1, tl);
10912080Smckusick 			continue;
10922080Smckusick 		case O_LLV:
10932109Smckusic 			tcp = _display.raw[*pc.ucp++];
109430057Smckusick 			PCLONGVAL(tl);
109530057Smckusick 			pushaddr(tcp + tl);
10962080Smckusick 			continue;
10972080Smckusick 		case O_IND1:
10982080Smckusick 			pc.cp++;
1099*36537Smckusick 			ts = *popaddr();
1100*36537Smckusick 			push2(ts);
11012080Smckusick 			continue;
11022080Smckusick 		case O_IND14:
11032080Smckusick 			pc.cp++;
1104*36537Smckusick 			ti = *popaddr();
1105*36537Smckusick 			push4((long)ti);
11062080Smckusick 			continue;
11072080Smckusick 		case O_IND2:
11082080Smckusick 			pc.cp++;
1109*36537Smckusick 			ts = *(short *)(popaddr());
1110*36537Smckusick 			push2(ts);
11112080Smckusick 			continue;
11122080Smckusick 		case O_IND24:
11132080Smckusick 			pc.cp++;
1114*36537Smckusick 			ts = *(short *)(popaddr());
1115*36537Smckusick 			push4((long)ts);
11162080Smckusick 			continue;
11172080Smckusick 		case O_IND4:
11182080Smckusick 			pc.cp++;
1119*36537Smckusick 			tl = *(long *)(popaddr());
1120*36537Smckusick 			push4(tl);
11212080Smckusick 			continue;
11222080Smckusick 		case O_IND8:
11232080Smckusick 			pc.cp++;
1124*36537Smckusick 			t8 = *(struct sze8 *)(popaddr());
1125*36537Smckusick 			pushsze8(t8);
11262080Smckusick 			continue;
11272080Smckusick 		case O_IND:
11282080Smckusick 			tl = *pc.cp++;
11292080Smckusick 			if (tl == 0)
11302080Smckusick 				tl = *pc.usp++;
11312080Smckusick 			tcp = popaddr();
113230057Smckusick 			STACKALIGN(tl1, tl);
113330057Smckusick 			tcp1 = pushsp(tl1);
11349231Smckusick 			blkcpy(tcp, tcp1, tl);
11352080Smckusick 			continue;
11362080Smckusick 		case O_CON1:
11372950Smckusic 			push2((short)(*pc.cp++));
11382080Smckusick 			continue;
11392080Smckusick 		case O_CON14:
11402950Smckusic 			push4((long)(*pc.cp++));
11412080Smckusick 			continue;
11422080Smckusick 		case O_CON2:
11432080Smckusick 			pc.cp++;
11442080Smckusick 			push2(*pc.sp++);
11452080Smckusick 			continue;
11462080Smckusick 		case O_CON24:
11472080Smckusick 			pc.cp++;
11482950Smckusic 			push4((long)(*pc.sp++));
11492080Smckusick 			continue;
11502080Smckusick 		case O_CON4:
11512080Smckusick 			pc.cp++;
115230057Smckusick 			PCLONGVAL(tl);
115330057Smckusick 			push4(tl);
11542080Smckusick 			continue;
11552080Smckusick 		case O_CON8:
11562080Smckusick 			pc.cp++;
115730057Smckusick 			tcp = pushsp(sizeof(double));
115830057Smckusick 			blkcpy(pc.cp, tcp, sizeof(double));
115930057Smckusick 			pc.dbp++;
11602080Smckusick 			continue;
11612080Smckusick 		case O_CON:
11622080Smckusick 			tl = *pc.cp++;
11632080Smckusick 			if (tl == 0)
11642080Smckusick 				tl = *pc.usp++;
116530057Smckusick 			STACKALIGN(tl1, tl);
116630057Smckusick 			tcp = pushsp(tl1);
11679231Smckusick 			blkcpy(pc.cp, tcp, tl);
11682950Smckusic 			pc.cp += (int)tl;
11692080Smckusick 			continue;
11702950Smckusic 		case O_CONG:
11712950Smckusic 			tl = *pc.cp++;
11722950Smckusic 			if (tl == 0)
11732950Smckusic 				tl = *pc.usp++;
117430057Smckusick 			STACKALIGN(tl1, tl);
11752950Smckusic 			tcp = pushsp(tl1);
11769231Smckusick 			blkcpy(pc.cp, tcp, tl1);
11772950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
11782950Smckusic 			continue;
11792080Smckusick 		case O_LVCON:
11802080Smckusick 			tl = *pc.cp++;
11812080Smckusick 			if (tl == 0)
11822080Smckusick 				tl = *pc.usp++;
118330057Smckusick 			pushaddr(pc.cp);
11842080Smckusick 			tl = (tl + 1) & ~1;
11852950Smckusic 			pc.cp += (int)tl;
11862080Smckusick 			continue;
11872080Smckusick 		case O_RANG2:
11882080Smckusick 			tl = *pc.cp++;
11892080Smckusick 			if (tl == 0)
11902080Smckusick 				tl = *pc.sp++;
11912080Smckusick 			tl1 = pop2();
11924026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
11932080Smckusick 			continue;
11942080Smckusick 		case O_RANG42:
11952080Smckusick 			tl = *pc.cp++;
11962080Smckusick 			if (tl == 0)
11972080Smckusick 				tl = *pc.sp++;
11982080Smckusick 			tl1 = pop4();
11994026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
12002080Smckusick 			continue;
12012080Smckusick 		case O_RSNG2:
12022080Smckusick 			tl = *pc.cp++;
12032080Smckusick 			if (tl == 0)
12042080Smckusick 				tl = *pc.sp++;
12052080Smckusick 			tl1 = pop2();
12062950Smckusic 			push2((short)(RSNG4(tl1, tl)));
12072080Smckusick 			continue;
12082080Smckusick 		case O_RSNG42:
12092080Smckusick 			tl = *pc.cp++;
12102080Smckusick 			if (tl == 0)
12112080Smckusick 				tl = *pc.sp++;
12122080Smckusick 			tl1 = pop4();
12132080Smckusick 			push4(RSNG4(tl1, tl));
12142080Smckusick 			continue;
12152080Smckusick 		case O_RANG4:
12164026Smckusic 			tl = *pc.cp++;
12174026Smckusic 			if (tl == 0)
121830057Smckusick 				PCLONGVAL(tl);
12192080Smckusick 			tl1 = pop4();
122030057Smckusick 			PCLONGVAL(tl2);
122130057Smckusick 			push4(RANG4(tl1, tl, tl2));
12222080Smckusick 			continue;
12232080Smckusick 		case O_RANG24:
12244026Smckusic 			tl = *pc.cp++;
12254026Smckusic 			if (tl == 0)
122630057Smckusick 				PCLONGVAL(tl);
12272080Smckusick 			tl1 = pop2();
122830057Smckusick 			PCLONGVAL(tl2);
122930057Smckusick 			push2((short)(RANG4(tl1, tl, tl2)));
12302080Smckusick 			continue;
12312080Smckusick 		case O_RSNG4:
12324026Smckusic 			tl = *pc.cp++;
12334026Smckusic 			if (tl == 0)
123430057Smckusick 				PCLONGVAL(tl);
12354026Smckusic 			tl1 = pop4();
12364026Smckusic 			push4(RSNG4(tl1, tl));
12372080Smckusick 			continue;
12382080Smckusick 		case O_RSNG24:
12394026Smckusic 			tl = *pc.cp++;
12404026Smckusic 			if (tl == 0)
124130057Smckusick 				PCLONGVAL(tl);
12424026Smckusic 			tl1 = pop2();
12434026Smckusic 			push2((short)(RSNG4(tl1, tl)));
12442080Smckusick 			continue;
12452080Smckusick 		case O_STLIM:
12462080Smckusick 			pc.cp++;
1247*36537Smckusick 			tl = pop4();
1248*36537Smckusick 			STLIM(tl);
12492080Smckusick 			continue;
12502080Smckusick 		case O_LLIMIT:
12512080Smckusick 			pc.cp++;
1252*36537Smckusick 			tcp = popaddr();
1253*36537Smckusick 			tl = pop4();
1254*36537Smckusick 			LLIMIT(tcp, tl);
12552080Smckusick 			continue;
12562080Smckusick 		case O_BUFF:
12572950Smckusic 			BUFF((long)(*pc.cp++));
12582080Smckusick 			continue;
12592080Smckusick 		case O_HALT:
12602080Smckusick 			pc.cp++;
12615682Smckusic 			if (_nodump == TRUE)
12625682Smckusic 				psexit(0);
12635682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
12645682Smckusic 			backtrace("Halted");
12655682Smckusic 			psexit(0);
12662080Smckusick 			continue;
12672080Smckusick 		case O_PXPBUF:
12682080Smckusick 			pc.cp++;
126930057Smckusick 			PCLONGVAL(tl);
127030057Smckusick 			_cntrs = tl;
127130057Smckusick 			PCLONGVAL(tl);
127230057Smckusick 			_rtns = tl;
12739231Smckusick 			NEW(&_pcpcount, (_cntrs + 1) * sizeof(long));
12749231Smckusick 			blkclr(_pcpcount, (_cntrs + 1) * sizeof(long));
12752080Smckusick 			continue;
12762080Smckusick 		case O_COUNT:
12772080Smckusick 			pc.cp++;
12782080Smckusick 			_pcpcount[*pc.usp++]++;
12792080Smckusick 			continue;
12802080Smckusick 		case O_CASE1OP:
12812080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
12822080Smckusick 			if (tl == 0)
12832080Smckusick 				tl = *pc.usp++;
12842080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
12852080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
12862080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
12872080Smckusick 			for(; tl > 0; tl--)	/* look for element */
12882080Smckusick 				if (tl1 == *tcp++)
12892080Smckusick 					break;
12902080Smckusick 			if (tl == 0)		/* default case => error */
12915666Smckusic 				CASERNG(tl1);
12922080Smckusick 			pc.cp += *(tsp - tl);
12932080Smckusick 			continue;
12942080Smckusick 		case O_CASE2OP:
12952080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
12962080Smckusick 			if (tl == 0)
12972080Smckusick 				tl = *pc.usp++;
12982080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
12992080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
13002080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
13012080Smckusick 			for(; tl > 0; tl--)	/* look for element */
130230057Smckusick 				if (tl1 == *tsp++)
13032080Smckusick 					break;
13042080Smckusick 			if (tl == 0)		/* default case => error */
13055666Smckusic 				CASERNG(tl1);
130630057Smckusick 			pc.cp += *(tsp1 - tl);
13072080Smckusick 			continue;
13082080Smckusick 		case O_CASE4OP:
13092080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
13102080Smckusick 			if (tl == 0)
13112080Smckusick 				tl = *pc.usp++;
131230057Smckusick 			tsp1 = pc.sp + tl;	/* ptr to end of jump table */
131330057Smckusick 			tlp = (long *)tsp1;	/* tlp = ptr to case values */
13142080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
131530057Smckusick 			for(; tl > 0; tl--) {	/* look for element */
131630057Smckusick 				GETLONGVAL(tl2, tlp++);
131730057Smckusick 				if (tl1 == tl2)
13182080Smckusick 					break;
131930057Smckusick 			}
13202080Smckusick 			if (tl == 0)		/* default case => error */
13215666Smckusic 				CASERNG(tl1);
132230057Smckusick 			pc.cp += *(tsp1 - tl);
13232080Smckusick 			continue;
13242080Smckusick 		case O_ADDT:
13252080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13262080Smckusick 			if (tl == 0)
13272080Smckusick 				tl = *pc.usp++;
13282950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
13292080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
13302080Smckusick 			popsp(tl);
13312080Smckusick 			continue;
13322080Smckusick 		case O_SUBT:
13332080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13342080Smckusick 			if (tl == 0)
13352080Smckusick 				tl = *pc.usp++;
13362950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
13372080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
13382080Smckusick 			popsp(tl);
13392080Smckusick 			continue;
13402080Smckusick 		case O_MULT:
13412080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13422080Smckusick 			if (tl == 0)
13432080Smckusick 				tl = *pc.usp++;
13442950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
13452080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
13462080Smckusick 			popsp(tl);
13472080Smckusick 			continue;
13482080Smckusick 		case O_INCT:
13492080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
13502080Smckusick 			if (tl == 0)
13512080Smckusick 				tl = *pc.usp++;
13522950Smckusic 			tb = INCT();
13532950Smckusic 			popsp(tl*sizeof(long));
13542950Smckusic 			push2((short)(tb));
13552080Smckusick 			continue;
13562080Smckusick 		case O_CTTOT:
13572080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
13582080Smckusick 			if (tl == 0)
13592080Smckusick 				tl = *pc.usp++;
1360*36537Smckusick 			tl1 = tl * sizeof(long);	/* Size of all args */
13612950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
1362*36537Smckusick 			tl1 = pop4();		/* Pop the 4 fixed args */
1363*36537Smckusick 			tl2 = pop4();
1364*36537Smckusick 			tl3 = pop4();
1365*36537Smckusick 			tl4 = pop4();
1366*36537Smckusick 			tcp2 = pushsp((long)0);	/* tcp2 -> data values */
1367*36537Smckusick 			CTTOTA(tcp, tl1, tl2, tl3, tl4, tcp2);
1368*36537Smckusick 			popsp(tl*sizeof(long) - 4*sizeof(long)); /* Pop data */
13692080Smckusick 			continue;
13702080Smckusick 		case O_CARD:
13712080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13722080Smckusick 			if (tl == 0)
13732080Smckusick 				tl = *pc.usp++;
13742950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
13752080Smckusick 			tl1 = CARD(tcp, tl);
13762080Smckusick 			popsp(tl);
13772950Smckusic 			push2((short)(tl1));
13782080Smckusick 			continue;
13792080Smckusick 		case O_IN:
13802080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
13812080Smckusick 			if (tl == 0)
13822080Smckusick 				tl = *pc.usp++;
13832080Smckusick 			tl1 = pop4();		/* tl1 is the element */
13842950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
13854026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
13862950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
13872080Smckusick 			popsp(tl);
13882950Smckusic 			push2((short)(tb));
13892080Smckusick 			continue;
13902080Smckusick 		case O_ASRT:
13912080Smckusick 			pc.cp++;
139224938Smckusick 			tl = pop4();
139324938Smckusick 			tcp = popaddr();
139424938Smckusick 			ASRTS(tl, tcp);
13952080Smckusick 			continue;
13962080Smckusick 		case O_FOR1U:
139710792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
139810576Smckusick 			if (tl1 == 0)
139910576Smckusick 				tl1 = *pc.sp++;
140010576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
140110792Smckusick 			tl = pop4();		/* tl upper bound */
140210792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
140310576Smckusick 				continue;
140410792Smckusick 			*tcp += 1;		/* inc index var */
140510792Smckusick 			pc.cp += tl1;		/* return to top of loop */
140610576Smckusick 			continue;
14072080Smckusick 		case O_FOR2U:
140810792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14094026Smckusic 			if (tl1 == 0)
14104026Smckusic 				tl1 = *pc.sp++;
141110576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
141210792Smckusick 			tl = pop4();		/* tl upper bound */
141310792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
14142080Smckusick 				continue;
141510792Smckusick 			*tsp += 1;		/* inc index var */
141610792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14172080Smckusick 			continue;
14182080Smckusick 		case O_FOR4U:
141910792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14204026Smckusic 			if (tl1 == 0)
142110792Smckusick 				tl1 = *pc.sp++;
14222950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
142310792Smckusick 			tl = pop4();		/* tl upper bound */
142410792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
14252080Smckusick 				continue;
142610792Smckusick 			*tlp += 1;		/* inc index var */
142710792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14282080Smckusick 			continue;
14292080Smckusick 		case O_FOR1D:
143010792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
143110576Smckusick 			if (tl1 == 0)
143210576Smckusick 				tl1 = *pc.sp++;
143310576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
143410792Smckusick 			tl = pop4();		/* tl upper bound */
143510792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
143610576Smckusick 				continue;
143710792Smckusick 			*tcp -= 1;		/* dec index var */
143810792Smckusick 			pc.cp += tl1;		/* return to top of loop */
143910576Smckusick 			continue;
14402080Smckusick 		case O_FOR2D:
144110792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14424026Smckusic 			if (tl1 == 0)
14434026Smckusic 				tl1 = *pc.sp++;
144410576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
144510792Smckusick 			tl = pop4();		/* tl upper bound */
144610792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
14472080Smckusick 				continue;
144810792Smckusick 			*tsp -= 1;		/* dec index var */
144910792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14502080Smckusick 			continue;
14512080Smckusick 		case O_FOR4D:
145210792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
14534026Smckusic 			if (tl1 == 0)
145410792Smckusick 				tl1 = *pc.sp++;
14552950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
145610792Smckusick 			tl = pop4();		/* tl upper bound */
145710792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
14582080Smckusick 				continue;
145910792Smckusick 			*tlp -= 1;		/* dec index var */
146010792Smckusick 			pc.cp += tl1;		/* return to top of loop */
14612080Smckusick 			continue;
14622080Smckusick 		case O_READE:
14632080Smckusick 			pc.cp++;
146430057Smckusick 			PCLONGVAL(tl);
146530057Smckusick 			push2((short)(READE(curfile, base + tl)));
14662080Smckusick 			continue;
14672080Smckusick 		case O_READ4:
14682080Smckusick 			pc.cp++;
14692080Smckusick 			push4(READ4(curfile));
14702080Smckusick 			continue;
14712080Smckusick 		case O_READC:
14722080Smckusick 			pc.cp++;
14732950Smckusic 			push2((short)(READC(curfile)));
14742080Smckusick 			continue;
14752080Smckusick 		case O_READ8:
14762080Smckusick 			pc.cp++;
14772080Smckusick 			push8(READ8(curfile));
14782080Smckusick 			continue;
14792080Smckusick 		case O_READLN:
14802080Smckusick 			pc.cp++;
14812080Smckusick 			READLN(curfile);
14822080Smckusick 			continue;
14832080Smckusick 		case O_EOF:
14842080Smckusick 			pc.cp++;
1485*36537Smckusick 			tcp = popaddr();
1486*36537Smckusick 			push2((short)(TEOF(tcp)));
14872080Smckusick 			continue;
14882080Smckusick 		case O_EOLN:
14892080Smckusick 			pc.cp++;
1490*36537Smckusick 			tcp = popaddr();
1491*36537Smckusick 			push2((short)(TEOLN(tcp)));
14922080Smckusick 			continue;
14932080Smckusick 		case O_WRITEC:
1494*36537Smckusick 			pc.cp++;
1495*36537Smckusick 			ti = popint();
1496*36537Smckusick 			tf = popfile();
14972191Smckusic 			if (_runtst) {
1498*36537Smckusick 				WRITEC(curfile, ti, tf);
14992191Smckusic 				continue;
15002191Smckusic 			}
1501*36537Smckusick 			fputc(ti, tf);
15022080Smckusick 			continue;
15032080Smckusick 		case O_WRITES:
1504*36537Smckusick 			pc.cp++;		/* Skip arg size */
1505*36537Smckusick 			tf = popfile();
1506*36537Smckusick 			ti = popint();
1507*36537Smckusick 			ti2 = popint();
1508*36537Smckusick 			tcp2 = popaddr();
15092191Smckusic 			if (_runtst) {
1510*36537Smckusick 				WRITES(curfile, tf, ti, ti2, tcp2);
15112191Smckusic 				continue;
15122191Smckusic 			}
1513*36537Smckusick 			fwrite(tf, ti, ti2, tcp2);
15142080Smckusick 			continue;
15152080Smckusick 		case O_WRITEF:
1516*36537Smckusick 			tf = popfile();
1517*36537Smckusick 			tcp = popaddr();
1518*36537Smckusick 			tcp2 = pushsp((long)0);	/* Addr of printf's args */
15192191Smckusic 			if (_runtst) {
1520*36537Smckusick 				VWRITEF(curfile, tf, tcp, tcp2);
1521*36537Smckusick 			} else {
1522*36537Smckusick 				vfprintf(tf, tcp, tcp2);
15232191Smckusic 			}
1524*36537Smckusick 			popsp((long)
1525*36537Smckusick 			    (*pc.cp++) - (sizeof (FILE *)) - sizeof (char *));
15262080Smckusick 			continue;
15272080Smckusick 		case O_WRITLN:
15282080Smckusick 			pc.cp++;
15292191Smckusic 			if (_runtst) {
15302191Smckusic 				WRITLN(curfile);
15312191Smckusic 				continue;
15322191Smckusic 			}
15332191Smckusic 			fputc('\n', ACTFILE(curfile));
15342080Smckusick 			continue;
15352080Smckusick 		case O_PAGE:
15362080Smckusick 			pc.cp++;
15372191Smckusic 			if (_runtst) {
15382191Smckusic 				PAGE(curfile);
15392191Smckusic 				continue;
15402191Smckusic 			}
15412950Smckusic 			fputc('', ACTFILE(curfile));
15422080Smckusick 			continue;
15432080Smckusick 		case O_NAM:
15442080Smckusick 			pc.cp++;
15452080Smckusick 			tl = pop4();
154630057Smckusick 			PCLONGVAL(tl1);
154730057Smckusick 			pushaddr(NAM(tl, base + tl1));
15482080Smckusick 			continue;
15492080Smckusick 		case O_MAX:
15502080Smckusick 			tl = *pc.cp++;
15512080Smckusick 			if (tl == 0)
15522080Smckusick 				tl = *pc.usp++;
15532080Smckusick 			tl1 = pop4();
15542191Smckusic 			if (_runtst) {
15552950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
15562191Smckusic 				continue;
15572191Smckusic 			}
15582191Smckusic 			tl1 -= tl;
15592191Smckusic 			tl = *pc.usp++;
15602191Smckusic 			push4(tl1 > tl ? tl1 : tl);
15612080Smckusick 			continue;
15622080Smckusick 		case O_MIN:
15632080Smckusick 			tl = *pc.cp++;
15642080Smckusick 			if (tl == 0)
15652080Smckusick 				tl = *pc.usp++;
15662080Smckusick 			tl1 = pop4();
15672080Smckusick 			push4(tl1 < tl ? tl1 : tl);
15682080Smckusick 			continue;
15692080Smckusick 		case O_UNIT:
15702080Smckusick 			pc.cp++;
15712080Smckusick 			curfile = UNIT(popaddr());
15722080Smckusick 			continue;
15732080Smckusick 		case O_UNITINP:
15742080Smckusick 			pc.cp++;
15752080Smckusick 			curfile = INPUT;
15762080Smckusick 			continue;
15772080Smckusick 		case O_UNITOUT:
15782080Smckusick 			pc.cp++;
15792080Smckusick 			curfile = OUTPUT;
15802080Smckusick 			continue;
15812080Smckusick 		case O_MESSAGE:
15822080Smckusick 			pc.cp++;
15832080Smckusick 			PFLUSH();
15842080Smckusick 			curfile = ERR;
15852080Smckusick 			continue;
15862109Smckusic 		case O_PUT:
15872109Smckusic 			pc.cp++;
15882109Smckusic 			PUT(curfile);
15892109Smckusic 			continue;
15902080Smckusick 		case O_GET:
15912080Smckusick 			pc.cp++;
15922080Smckusick 			GET(curfile);
15932080Smckusick 			continue;
15942080Smckusick 		case O_FNIL:
15952080Smckusick 			pc.cp++;
1596*36537Smckusick 			tcp = popaddr();
1597*36537Smckusick 			pushaddr(FNIL(tcp));
15982080Smckusick 			continue;
15992080Smckusick 		case O_DEFNAME:
16002080Smckusick 			pc.cp++;
1601*36537Smckusick 			tcp2 = popaddr();
1602*36537Smckusick 			tcp = popaddr();
1603*36537Smckusick 			tl = pop4();
1604*36537Smckusick 			tl2 = pop4();
1605*36537Smckusick 			DEFNAME((struct iorec *)tcp2, tcp, tl, tl2);
16062080Smckusick 			continue;
16072080Smckusick 		case O_RESET:
16082080Smckusick 			pc.cp++;
1609*36537Smckusick 			tcp2 = popaddr();
1610*36537Smckusick 			tcp = popaddr();
1611*36537Smckusick 			tl = pop4();
1612*36537Smckusick 			tl2 = pop4();
1613*36537Smckusick 			RESET((struct iorec *)tcp2, tcp, tl, tl2);
16142080Smckusick 			continue;
16152080Smckusick 		case O_REWRITE:
16162080Smckusick 			pc.cp++;
1617*36537Smckusick 			tcp2 = popaddr();
1618*36537Smckusick 			tcp = popaddr();
1619*36537Smckusick 			tl = pop4();
1620*36537Smckusick 			tl2 = pop4();
1621*36537Smckusick 			REWRITE((struct iorec *)tcp2, tcp, tl, tl2);
16222080Smckusick 			continue;
16232080Smckusick 		case O_FILE:
16242080Smckusick 			pc.cp++;
16252080Smckusick 			pushaddr(ACTFILE(curfile));
16262080Smckusick 			continue;
16272080Smckusick 		case O_REMOVE:
16282080Smckusick 			pc.cp++;
1629*36537Smckusick 			tcp = popaddr();
1630*36537Smckusick 			tl = pop4();
1631*36537Smckusick 			REMOVE(tcp, tl);
16322080Smckusick 			continue;
16332080Smckusick 		case O_FLUSH:
16342080Smckusick 			pc.cp++;
1635*36537Smckusick 			tcp = popaddr();
1636*36537Smckusick 			FLUSH((struct iorec *)tcp);
16372080Smckusick 			continue;
16382080Smckusick 		case O_PACK:
16392080Smckusick 			pc.cp++;
1640*36537Smckusick 			tl = pop4();
1641*36537Smckusick 			tcp = popaddr();
1642*36537Smckusick 			tcp2 = popaddr();
1643*36537Smckusick 			tl1 = pop4();
1644*36537Smckusick 			tl2 = pop4();
1645*36537Smckusick 			tl3 = pop4();
1646*36537Smckusick 			tl4 = pop4();
1647*36537Smckusick 			PACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4);
16482080Smckusick 			continue;
16492080Smckusick 		case O_UNPACK:
16502080Smckusick 			pc.cp++;
1651*36537Smckusick 			tl = pop4();
1652*36537Smckusick 			tcp = popaddr();
1653*36537Smckusick 			tcp2 = popaddr();
1654*36537Smckusick 			tl1 = pop4();
1655*36537Smckusick 			tl2 = pop4();
1656*36537Smckusick 			tl3 = pop4();
1657*36537Smckusick 			tl4 = pop4();
1658*36537Smckusick 			UNPACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4);
16592080Smckusick 			continue;
16602080Smckusick 		case O_ARGC:
16612080Smckusick 			pc.cp++;
16622950Smckusic 			push4((long)_argc);
16632080Smckusick 			continue;
16642080Smckusick 		case O_ARGV:
16652080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
16662080Smckusick 			if (tl == 0)
16672080Smckusick 				tl = *pc.usp++;
16682080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
16692080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
16702080Smckusick 			ARGV(tl1, tcp, tl);
16712080Smckusick 			continue;
16722080Smckusick 		case O_CLCK:
16732080Smckusick 			pc.cp++;
16742080Smckusick 			push4(CLCK());
16752080Smckusick 			continue;
16762080Smckusick 		case O_WCLCK:
16772080Smckusick 			pc.cp++;
16782080Smckusick 			push4(time(0));
16792080Smckusick 			continue;
16802080Smckusick 		case O_SCLCK:
16812080Smckusick 			pc.cp++;
16822080Smckusick 			push4(SCLCK());
16832080Smckusick 			continue;
16842080Smckusick 		case O_NEW:
16852080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
16862080Smckusick 			if (tl == 0)
16872080Smckusick 				tl = *pc.usp++;
16882080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
16899231Smckusick 			NEW(tcp, tl);
16902191Smckusic 			if (_runtst) {
16919263Smckusick 				blkclr(*((char **)(tcp)), tl);
16922191Smckusic 			}
16932080Smckusick 			continue;
16947961Smckusick 		case O_DISPOSE:
16957961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
16967961Smckusick 			if (tl == 0)
16977961Smckusick 				tl = *pc.usp++;
16987961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
16997961Smckusick 			DISPOSE(tcp, tl);
17007961Smckusick 			*(char **)tcp = (char *)0;
17017961Smckusick 			continue;
17027961Smckusick 		case O_DFDISP:
17037961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
17047961Smckusick 			if (tl == 0)
17057961Smckusick 				tl = *pc.usp++;
17067961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
17077961Smckusick 			DFDISPOSE(tcp, tl);
17087961Smckusick 			*(char **)tcp = (char *)0;
17097961Smckusick 			continue;
17102080Smckusick 		case O_DATE:
17112080Smckusick 			pc.cp++;
17122080Smckusick 			DATE(popaddr());
17132080Smckusick 			continue;
17142080Smckusick 		case O_TIME:
17152080Smckusick 			pc.cp++;
17162080Smckusick 			TIME(popaddr());
17172080Smckusick 			continue;
17182080Smckusick 		case O_UNDEF:
17192080Smckusick 			pc.cp++;
172030057Smckusick 			td = pop8();
17212950Smckusic 			push2((short)(0));
17222080Smckusick 			continue;
17232080Smckusick 		case O_ATAN:
17242080Smckusick 			pc.cp++;
1725*36537Smckusick 			td = pop8();
17265723Smckusic 			if (_runtst) {
1727*36537Smckusick 				push8(ATAN(td));
17285723Smckusic 				continue;
17295723Smckusic 			}
1730*36537Smckusick 			push8(atan(td));
17312080Smckusick 			continue;
17322080Smckusick 		case O_COS:
17332080Smckusick 			pc.cp++;
1734*36537Smckusick 			td = pop8();
17355723Smckusic 			if (_runtst) {
1736*36537Smckusick 				push8(COS(td));
17375723Smckusic 				continue;
17385723Smckusic 			}
1739*36537Smckusick 			push8(cos(td));
17402080Smckusick 			continue;
17412080Smckusick 		case O_EXP:
17422080Smckusick 			pc.cp++;
1743*36537Smckusick 			td = pop8();
17445723Smckusic 			if (_runtst) {
1745*36537Smckusick 				push8(EXP(td));
17465723Smckusic 				continue;
17475723Smckusic 			}
1748*36537Smckusick 			push8(exp(td));
17492080Smckusick 			continue;
17502080Smckusick 		case O_LN:
17512080Smckusick 			pc.cp++;
1752*36537Smckusick 			td = pop8();
17532191Smckusic 			if (_runtst) {
1754*36537Smckusick 				push8(LN(td));
17552191Smckusic 				continue;
17562191Smckusic 			}
1757*36537Smckusick 			push8(log(td));
17582080Smckusick 			continue;
17592080Smckusick 		case O_SIN:
17602080Smckusick 			pc.cp++;
1761*36537Smckusick 			td = pop8();
17625723Smckusic 			if (_runtst) {
1763*36537Smckusick 				push8(SIN(td));
17645723Smckusic 				continue;
17655723Smckusic 			}
1766*36537Smckusick 			push8(sin(td));
17672080Smckusick 			continue;
17682080Smckusick 		case O_SQRT:
17692080Smckusick 			pc.cp++;
1770*36537Smckusick 			td = pop8();
17712191Smckusic 			if (_runtst) {
1772*36537Smckusick 				push8(SQRT(td));
17732191Smckusic 				continue;
17742191Smckusic 			}
1775*36537Smckusick 			push8(sqrt(td));
17762080Smckusick 			continue;
17772080Smckusick 		case O_CHR2:
17782080Smckusick 		case O_CHR4:
17792080Smckusick 			pc.cp++;
1780*36537Smckusick 			tl = pop4();
17812191Smckusic 			if (_runtst) {
1782*36537Smckusick 				push2((short)(CHR(tl)));
17832191Smckusic 				continue;
17842191Smckusic 			}
1785*36537Smckusick 			push2((short)tl);
17862080Smckusick 			continue;
17872080Smckusick 		case O_ODD2:
17882080Smckusick 		case O_ODD4:
17892080Smckusick 			pc.cp++;
179010576Smckusick 			tl = pop4();
179110576Smckusick 			push2((short)(tl & 1));
17922080Smckusick 			continue;
17932080Smckusick 		case O_SUCC2:
17942109Smckusic 			tl = *pc.cp++;
17952109Smckusic 			if (tl == 0)
17962109Smckusic 				tl = *pc.sp++;
17972109Smckusic 			tl1 = pop4();
17982191Smckusic 			if (_runtst) {
17992950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
18002191Smckusic 				continue;
18012191Smckusic 			}
18022950Smckusic 			push2((short)(tl1 + 1));
18032191Smckusic 			pc.sp++;
18042080Smckusick 			continue;
18052080Smckusick 		case O_SUCC24:
18062109Smckusic 			tl = *pc.cp++;
18072109Smckusic 			if (tl == 0)
18082109Smckusic 				tl = *pc.sp++;
18092109Smckusic 			tl1 = pop4();
18102191Smckusic 			if (_runtst) {
18112950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
18122191Smckusic 				continue;
18132191Smckusic 			}
18142191Smckusic 			push4(tl1 + 1);
18152191Smckusic 			pc.sp++;
18162109Smckusic 			continue;
18172080Smckusick 		case O_SUCC4:
18182109Smckusic 			tl = *pc.cp++;
18192109Smckusic 			if (tl == 0)
182030057Smckusick 				PCLONGVAL(tl);
18212109Smckusic 			tl1 = pop4();
18222191Smckusic 			if (_runtst) {
182330057Smckusick 				PCLONGVAL(tl2);
182430057Smckusick 				push4(SUCC(tl1, tl, (long)(tl2)));
18252191Smckusic 				continue;
18262191Smckusic 			}
18272191Smckusic 			push4(tl1 + 1);
18282191Smckusic 			pc.lp++;
18292080Smckusick 			continue;
18302080Smckusick 		case O_PRED2:
18312109Smckusic 			tl = *pc.cp++;
18322109Smckusic 			if (tl == 0)
18332109Smckusic 				tl = *pc.sp++;
18342109Smckusic 			tl1 = pop4();
18352191Smckusic 			if (_runtst) {
18362950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
18372191Smckusic 				continue;
18382191Smckusic 			}
18392950Smckusic 			push2((short)(tl1 - 1));
18402191Smckusic 			pc.sp++;
18412080Smckusick 			continue;
18422080Smckusick 		case O_PRED24:
18432109Smckusic 			tl = *pc.cp++;
18442109Smckusic 			if (tl == 0)
18452109Smckusic 				tl = *pc.sp++;
18462109Smckusic 			tl1 = pop4();
18472191Smckusic 			if (_runtst) {
18482950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
18492191Smckusic 				continue;
18502191Smckusic 			}
18512191Smckusic 			push4(tl1 - 1);
18522191Smckusic 			pc.sp++;
18532109Smckusic 			continue;
18542080Smckusick 		case O_PRED4:
18552109Smckusic 			tl = *pc.cp++;
18562109Smckusic 			if (tl == 0)
185730057Smckusick 				PCLONGVAL(tl);
18582109Smckusic 			tl1 = pop4();
18592191Smckusic 			if (_runtst) {
186030057Smckusick 				PCLONGVAL(tl2);
186130057Smckusick 				push4(PRED(tl1, tl, (long)(tl2)));
18622191Smckusic 				continue;
18632191Smckusic 			}
18642191Smckusic 			push4(tl1 - 1);
18652191Smckusic 			pc.lp++;
18662080Smckusick 			continue;
18672080Smckusick 		case O_SEED:
18682080Smckusick 			pc.cp++;
1869*36537Smckusick 			tl = pop4();
1870*36537Smckusick 			push4(SEED(tl));
18712080Smckusick 			continue;
18722080Smckusick 		case O_RANDOM:
18732080Smckusick 			pc.cp++;
1874*36537Smckusick 			td = pop8();		/* Argument is ignored */
1875*36537Smckusick 			push8(RANDOM());
18762080Smckusick 			continue;
18772080Smckusick 		case O_EXPO:
18782080Smckusick 			pc.cp++;
1879*36537Smckusick 			td = pop8();
1880*36537Smckusick 			push4(EXPO(td));
18812080Smckusick 			continue;
18822080Smckusick 		case O_SQR2:
18832080Smckusick 		case O_SQR4:
18842080Smckusick 			pc.cp++;
18852080Smckusick 			tl = pop4();
18862080Smckusick 			push4(tl * tl);
18872080Smckusick 			continue;
18882080Smckusick 		case O_SQR8:
18892080Smckusick 			pc.cp++;
18902080Smckusick 			td = pop8();
18912080Smckusick 			push8(td * td);
18922080Smckusick 			continue;
18932080Smckusick 		case O_ROUND:
18942080Smckusick 			pc.cp++;
1895*36537Smckusick 			td = pop8();
1896*36537Smckusick 			push4(ROUND(td));
18972080Smckusick 			continue;
18982080Smckusick 		case O_TRUNC:
18992080Smckusick 			pc.cp++;
1900*36537Smckusick 			td = pop8();
1901*36537Smckusick 			push4(TRUNC(td));
19022080Smckusick 			continue;
19032950Smckusic 		default:
19045682Smckusic 			ERROR("Panic: bad op code\n");
19052950Smckusic 			continue;
19062080Smckusick 		}
19072080Smckusick 	}
19082080Smckusick }
1909