xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 2080)
1*2080Smckusick /* Copyright (c) 1979 Regents of the University of California */
2*2080Smckusick 
3*2080Smckusick static char sccsid[] = "@(#)interp.c 1.1 01/07/81";
4*2080Smckusick 
5*2080Smckusick #include <math.h>
6*2080Smckusick #include "vars.h"
7*2080Smckusick #include "panics.h"
8*2080Smckusick #include "h02opcs.h"
9*2080Smckusick #include "machdep.h"
10*2080Smckusick #include "h01errs.h"
11*2080Smckusick #include "libpc.h"
12*2080Smckusick 
13*2080Smckusick /* debugging variables */
14*2080Smckusick char opc[10];
15*2080Smckusick long opcptr = 9;
16*2080Smckusick 
17*2080Smckusick /*
18*2080Smckusick  * program variables
19*2080Smckusick  */
20*2080Smckusick struct disp	_display[MAXLVL];
21*2080Smckusick struct disp	*_dp;
22*2080Smckusick long	_lino = 0;
23*2080Smckusick int	_argc;
24*2080Smckusick char	**_argv;
25*2080Smckusick long	_mode;
26*2080Smckusick long	_nodump;
27*2080Smckusick long	_stlim = 500000;
28*2080Smckusick long	_stcnt = 0;
29*2080Smckusick char	*_minptr = (char *)0x7fffffff;
30*2080Smckusick char	*_maxptr = (char *)0;
31*2080Smckusick long	*_pcpcount = (long *)0;
32*2080Smckusick long	_cntrs = 0;
33*2080Smckusick long	_rtns = 0;
34*2080Smckusick 
35*2080Smckusick /*
36*2080Smckusick  * file record variables
37*2080Smckusick  */
38*2080Smckusick long		_filefre = PREDEF;
39*2080Smckusick struct iorechd	_fchain = {
40*2080Smckusick 	0, 0, 0, 0,		/* only use fchain field */
41*2080Smckusick 	INPUT			/* fchain  */
42*2080Smckusick };
43*2080Smckusick struct iorec	*_actfile[MAXFILES] = {
44*2080Smckusick 	INPUT,
45*2080Smckusick 	OUTPUT,
46*2080Smckusick 	ERR
47*2080Smckusick };
48*2080Smckusick 
49*2080Smckusick /*
50*2080Smckusick  * standard files
51*2080Smckusick  */
52*2080Smckusick char		_inwin, _outwin, _errwin;
53*2080Smckusick struct iorechd	input = {
54*2080Smckusick 	&_inwin,		/* fileptr */
55*2080Smckusick 	0,			/* lcount  */
56*2080Smckusick 	0x7fffffff,		/* llimit  */
57*2080Smckusick 	&_iob[0],		/* fbuf    */
58*2080Smckusick 	OUTPUT,			/* fchain  */
59*2080Smckusick 	STDLVL,			/* flev    */
60*2080Smckusick 	"standard input",	/* pfname  */
61*2080Smckusick 	FTEXT | FREAD | SYNC,	/* funit   */
62*2080Smckusick 	0,			/* fblk    */
63*2080Smckusick 	1			/* fsize   */
64*2080Smckusick };
65*2080Smckusick struct iorechd	output = {
66*2080Smckusick 	&_outwin,		/* fileptr */
67*2080Smckusick 	0,			/* lcount  */
68*2080Smckusick 	0x7fffffff,		/* llimit  */
69*2080Smckusick 	&_iob[1],		/* fbuf    */
70*2080Smckusick 	ERR,			/* fchain  */
71*2080Smckusick 	STDLVL,			/* flev    */
72*2080Smckusick 	"standard output",	/* pfname  */
73*2080Smckusick 	FTEXT | FWRITE | EOFF,	/* funit   */
74*2080Smckusick 	1,			/* fblk    */
75*2080Smckusick 	1			/* fsize   */
76*2080Smckusick };
77*2080Smckusick struct iorechd	_err = {
78*2080Smckusick 	&_errwin,		/* fileptr */
79*2080Smckusick 	0,			/* lcount  */
80*2080Smckusick 	0x7fffffff,		/* llimit  */
81*2080Smckusick 	&_iob[2],		/* fbuf    */
82*2080Smckusick 	FILNIL,			/* fchain  */
83*2080Smckusick 	STDLVL,			/* flev    */
84*2080Smckusick 	"Message file",		/* pfname  */
85*2080Smckusick 	FTEXT | FWRITE | EOFF,	/* funit   */
86*2080Smckusick 	2,			/* fblk    */
87*2080Smckusick 	1			/* fsize   */
88*2080Smckusick };
89*2080Smckusick 
90*2080Smckusick interpreter(base)
91*2080Smckusick 	char *base;
92*2080Smckusick {
93*2080Smckusick 	union progcntr pc;		/* interpreted program cntr */
94*2080Smckusick 	register char *vpc;		/* register used for "pc" */
95*2080Smckusick 	struct iorec *curfile;		/* active file */
96*2080Smckusick 	register struct stack *stp;	/* active stack frame ptr */
97*2080Smckusick 	/*
98*2080Smckusick 	 * the following variables are used as scratch
99*2080Smckusick 	 */
100*2080Smckusick 	double td, td1;
101*2080Smckusick 	register long tl, tl1, tl2;
102*2080Smckusick 	long *tlp;
103*2080Smckusick 	short *tsp, *tsp1;
104*2080Smckusick 	register char *tcp;
105*2080Smckusick 	char *tcp1;
106*2080Smckusick 	struct stack *tstp;
107*2080Smckusick 	struct formalrtn *tfp;
108*2080Smckusick 	union progcntr tpc;
109*2080Smckusick 	struct iorec **ip;
110*2080Smckusick 
111*2080Smckusick 	/*
112*2080Smckusick 	 * necessary only on systems which do not initialize
113*2080Smckusick 	 * memory to zero
114*2080Smckusick 	 */
115*2080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
116*2080Smckusick 		/* void */;
117*2080Smckusick 	/*
118*2080Smckusick 	 * set up global environment, then ``call'' the main program
119*2080Smckusick 	 */
120*2080Smckusick 	_display[0].locvars = pushsp(2 * sizeof(struct iorec *));
121*2080Smckusick 	*(struct iorec **)(_display[0].locvars + 4) = OUTPUT;
122*2080Smckusick 	*(struct iorec **)(_display[0].locvars) = INPUT;
123*2080Smckusick 	_display[0].locvars += 8;	/* >>> kludge <<< */
124*2080Smckusick 	asm("	bispsw	$0xe0");	/* enable overflow traps */
125*2080Smckusick 	stp = (struct stack *)pushsp(sizeof(struct stack));
126*2080Smckusick 	_dp = &_display[0];
127*2080Smckusick 	pc.cp = base;
128*2080Smckusick 	for(;;) {
129*2080Smckusick 		if (++opcptr == 10)
130*2080Smckusick 			opcptr = 0;
131*2080Smckusick 		opc[opcptr] = *pc.ucp;
132*2080Smckusick 		switch (*pc.ucp++) {
133*2080Smckusick 		default:
134*2080Smckusick 			panic(PBADOP);
135*2080Smckusick 			continue;
136*2080Smckusick 		case O_NODUMP:
137*2080Smckusick 			_nodump++;
138*2080Smckusick 			asm("	bicpsw	$0xe0");/* disable overflow checks */
139*2080Smckusick 			/* and fall through */
140*2080Smckusick 		case O_BEG:
141*2080Smckusick 			_dp += 1;		/* enter local scope */
142*2080Smckusick 			stp->odisp = *_dp;	/* save old display value */
143*2080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
144*2080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
145*2080Smckusick 			tl1 = -*pc.lp++;	/* tl1 = local variable size */
146*2080Smckusick 			pc.lp++;		/* skip over number of args */
147*2080Smckusick 			_lino = *pc.usp++;	/* set new lino */
148*2080Smckusick 			pc.cp += tl;		/* skip over name text */
149*2080Smckusick 			stp->file = curfile;	/* save active file */
150*2080Smckusick 			tcp = pushsp(tl1);	/* tcp = new top of stack */
151*2080Smckusick 			blkclr(tl1, tcp);	/* zero stack frame */
152*2080Smckusick 			stp->tos = pushsp(0);	/* set top of stack pointer */
153*2080Smckusick 			_dp->stp = stp;		/* set new display pointer */
154*2080Smckusick 			/* _dp->locvars = tcp; */
155*2080Smckusick 			_dp->locvars = (char *)stp; /* kludge, use prev line */
156*2080Smckusick 			continue;
157*2080Smckusick 		case O_END:
158*2080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
159*2080Smckusick 			stp = _dp->stp;
160*2080Smckusick 			curfile = stp->file;	/* restore old active file */
161*2080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
162*2080Smckusick 			if (_dp == &_display[1])
163*2080Smckusick 				return;		/* exiting main proc ??? */
164*2080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
165*2080Smckusick 			pc.cp = stp->pc.cp;
166*2080Smckusick 			_dp = stp->dp;
167*2080Smckusick 			popsp(-stp->entry->framesze +	/* pop local vars */
168*2080Smckusick 			      sizeof(struct stack) +	/* pop stack frame */
169*2080Smckusick 			      stp->entry->nargs);	/* pop parms */
170*2080Smckusick 			continue;
171*2080Smckusick 		case O_CALL:
172*2080Smckusick 			tl = *pc.cp++;
173*2080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
174*2080Smckusick 			tcp += sizeof(short);
175*2080Smckusick 			tcp = base + *(long *)tcp;
176*2080Smckusick 			stp = (struct stack *)pushsp(sizeof(struct stack));
177*2080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
178*2080Smckusick 			stp->pc.cp = pc.cp;
179*2080Smckusick 			stp->dp = _dp;
180*2080Smckusick 			_dp = &_display[tl];	/* set up new display ptr */
181*2080Smckusick 			pc.cp = tcp;
182*2080Smckusick 			continue;
183*2080Smckusick 		case O_FCALL:
184*2080Smckusick 			tl = *pc.cp++;		/* tl = number of args */
185*2080Smckusick 			if (tl == 0)
186*2080Smckusick 				tl = *pc.lp++;
187*2080Smckusick 			tfp = (struct formalrtn *)popaddr();
188*2080Smckusick 			stp = (struct stack *)pushsp(sizeof(struct stack));
189*2080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
190*2080Smckusick 			stp->pc.cp = pc.cp;
191*2080Smckusick 			stp->dp = _dp;
192*2080Smckusick 			pc.cp = tfp->entryaddr;	/* calc new entry point */
193*2080Smckusick 			tpc.sp = pc.sp + 1;
194*2080Smckusick 			tl -= tpc.hdrp->nargs;
195*2080Smckusick 			if (tl != 0) {
196*2080Smckusick 				if (tl > 0)
197*2080Smckusick 					tl += sizeof(int) - 1;
198*2080Smckusick 				else
199*2080Smckusick 					tl -= sizeof(int) - 1;
200*2080Smckusick 				ERROR(ENARGS, tl / sizeof(int));
201*2080Smckusick 			}
202*2080Smckusick 			_dp = &_display[tfp->cbn];/* set up new display ptr */
203*2080Smckusick 			blkcpy(sizeof(struct disp) * tfp->cbn,
204*2080Smckusick 				&_display[1], &tfp->disp[tfp->cbn]);
205*2080Smckusick 			blkcpy(sizeof(struct disp) * tfp->cbn,
206*2080Smckusick 				&tfp->disp[0], &_display[1]);
207*2080Smckusick 			continue;
208*2080Smckusick 		case O_FRTN:
209*2080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
210*2080Smckusick 			if (tl == 0)
211*2080Smckusick 				tl = *pc.usp++;
212*2080Smckusick 			tcp = pushsp(0);
213*2080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
214*2080Smckusick 			blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *));
215*2080Smckusick 			popsp(sizeof(struct formalrtn *));
216*2080Smckusick 			blkcpy(sizeof(struct disp) * tfp->cbn,
217*2080Smckusick 				&tfp->disp[tfp->cbn], &_display[1]);
218*2080Smckusick 			continue;
219*2080Smckusick 		case O_FSAV:
220*2080Smckusick 			tfp = (struct formalrtn *)popaddr();
221*2080Smckusick 			tfp->cbn = *pc.cp++;	/* blk number of routine */
222*2080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
223*2080Smckusick 			tcp += sizeof(short);
224*2080Smckusick 			tfp->entryaddr = base + *(long *)tcp;
225*2080Smckusick 			blkcpy(sizeof(struct disp) * tfp->cbn,
226*2080Smckusick 				&_display[1], &tfp->disp[0]);
227*2080Smckusick 			pushaddr(tfp);
228*2080Smckusick 			continue;
229*2080Smckusick 		case O_SDUP2:
230*2080Smckusick 			pc.cp++;
231*2080Smckusick 			tl = pop2();
232*2080Smckusick 			push2(tl);
233*2080Smckusick 			push2(tl);
234*2080Smckusick 			continue;
235*2080Smckusick 		case O_SDUP4:
236*2080Smckusick 			pc.cp++;
237*2080Smckusick 			tl = pop4();
238*2080Smckusick 			push4(tl);
239*2080Smckusick 			push4(tl);
240*2080Smckusick 			continue;
241*2080Smckusick 		case O_TRA:
242*2080Smckusick 			pc.cp++;
243*2080Smckusick 			pc.cp += *pc.sp;
244*2080Smckusick 			continue;
245*2080Smckusick 		case O_TRA4:
246*2080Smckusick 			pc.cp++;
247*2080Smckusick 			pc.cp = base + *pc.lp;
248*2080Smckusick 			continue;
249*2080Smckusick 		case O_GOTO:
250*2080Smckusick 			tstp = _display[*pc.cp++].stp; /* ptr to exit frame */
251*2080Smckusick 			pc.cp = base + *pc.lp;
252*2080Smckusick 			stp = _dp->stp;
253*2080Smckusick 			while (tstp != stp) {
254*2080Smckusick 				if (_dp == &_display[1])
255*2080Smckusick 					ERROR(EGOTO); /* exiting prog ??? */
256*2080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
257*2080Smckusick 				curfile = stp->file;  /* restore active file */
258*2080Smckusick 				*_dp = stp->odisp;    /* old display entry */
259*2080Smckusick 				_dp = stp->dp;	      /* restore dp */
260*2080Smckusick 				stp = _dp->stp;
261*2080Smckusick 			}
262*2080Smckusick 			/* pop locals, stack frame, parms, and return values */
263*2080Smckusick 			popsp(stp->tos - pushsp(0));
264*2080Smckusick 			continue;
265*2080Smckusick 		case O_LINO:
266*2080Smckusick 			if (_dp->stp->tos != pushsp(0))
267*2080Smckusick 				panic(PSTKNEMP);
268*2080Smckusick 			_lino = *pc.cp++;	/* set line number */
269*2080Smckusick 			if (_lino == 0)
270*2080Smckusick 				_lino = *pc.sp++;
271*2080Smckusick 			LINO();			/* inc statement count */
272*2080Smckusick 			continue;
273*2080Smckusick 		case O_PUSH:
274*2080Smckusick 			tl = *pc.cp++;
275*2080Smckusick 			if (tl == 0)
276*2080Smckusick 				tl = *pc.usp++;
277*2080Smckusick 			tl = (-tl + 1) & ~1;
278*2080Smckusick 			tcp = pushsp(tl);
279*2080Smckusick 			blkclr(tl, tcp);
280*2080Smckusick 			continue;
281*2080Smckusick 		case O_IF:
282*2080Smckusick 			pc.cp++;
283*2080Smckusick 			if (pop2())
284*2080Smckusick 				pc.sp++;
285*2080Smckusick 			else
286*2080Smckusick 				pc.cp += *pc.sp;
287*2080Smckusick 			continue;
288*2080Smckusick 		case O_REL2:
289*2080Smckusick 			tl = pop2();
290*2080Smckusick 			tl1 = pop2();
291*2080Smckusick 			goto cmplong;
292*2080Smckusick 		case O_REL24:
293*2080Smckusick 			tl = pop2();
294*2080Smckusick 			tl1 = pop4();
295*2080Smckusick 			goto cmplong;
296*2080Smckusick 		case O_REL42:
297*2080Smckusick 			tl = pop4();
298*2080Smckusick 			tl1 = pop2();
299*2080Smckusick 			goto cmplong;
300*2080Smckusick 		case O_REL4:
301*2080Smckusick 			tl = pop4();
302*2080Smckusick 			tl1 = pop4();
303*2080Smckusick 		cmplong:
304*2080Smckusick 			tl2 = *pc.cp++;
305*2080Smckusick 			switch (tl2) {
306*2080Smckusick 			case releq:
307*2080Smckusick 				push2(tl1 == tl);
308*2080Smckusick 				continue;
309*2080Smckusick 			case relne:
310*2080Smckusick 				push2(tl1 != tl);
311*2080Smckusick 				continue;
312*2080Smckusick 			case rellt:
313*2080Smckusick 				push2(tl1 < tl);
314*2080Smckusick 				continue;
315*2080Smckusick 			case relgt:
316*2080Smckusick 				push2(tl1 > tl);
317*2080Smckusick 				continue;
318*2080Smckusick 			case relle:
319*2080Smckusick 				push2(tl1 <= tl);
320*2080Smckusick 				continue;
321*2080Smckusick 			case relge:
322*2080Smckusick 				push2(tl1 >= tl);
323*2080Smckusick 				continue;
324*2080Smckusick 			default:
325*2080Smckusick 				panic(PSYSTEM);
326*2080Smckusick 				continue;
327*2080Smckusick 			}
328*2080Smckusick 		case O_RELG:
329*2080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
330*2080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
331*2080Smckusick 			tl1 = (tl + 1) & ~1;	/* tl1 has arg stack length */
332*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to first arg */
333*2080Smckusick 			switch (tl2) {
334*2080Smckusick 			case releq:
335*2080Smckusick 				tl = RELEQ(tl, tcp + tl1, tcp);
336*2080Smckusick 				break;
337*2080Smckusick 			case relne:
338*2080Smckusick 				tl = RELNE(tl, tcp + tl1, tcp);
339*2080Smckusick 				break;
340*2080Smckusick 			case rellt:
341*2080Smckusick 				tl = RELSLT(tl, tcp + tl1, tcp);
342*2080Smckusick 				break;
343*2080Smckusick 			case relgt:
344*2080Smckusick 				tl = RELSGT(tl, tcp + tl1, tcp);
345*2080Smckusick 				break;
346*2080Smckusick 			case relle:
347*2080Smckusick 				tl = RELSLE(tl, tcp + tl1, tcp);
348*2080Smckusick 				break;
349*2080Smckusick 			case relge:
350*2080Smckusick 				tl = RELSGE(tl, tcp + tl1, tcp);
351*2080Smckusick 				break;
352*2080Smckusick 			default:
353*2080Smckusick 				panic(PSYSTEM);
354*2080Smckusick 				break;
355*2080Smckusick 			}
356*2080Smckusick 			popsp(tl1 << 1);
357*2080Smckusick 			push2(tl);
358*2080Smckusick 			continue;
359*2080Smckusick 		case O_RELT:
360*2080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
361*2080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
362*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to first arg */
363*2080Smckusick 			switch (tl2) {
364*2080Smckusick 			case releq:
365*2080Smckusick 				tl = RELEQ(tl1, tcp + tl1, tcp);
366*2080Smckusick 				break;
367*2080Smckusick 			case relne:
368*2080Smckusick 				tl = RELNE(tl1, tcp + tl1, tcp);
369*2080Smckusick 				break;
370*2080Smckusick 			case rellt:
371*2080Smckusick 				tl = RELTLT(tl1, tcp + tl1, tcp);
372*2080Smckusick 				break;
373*2080Smckusick 			case relgt:
374*2080Smckusick 				tl = RELTGT(tl1, tcp + tl1, tcp);
375*2080Smckusick 				break;
376*2080Smckusick 			case relle:
377*2080Smckusick 				tl = RELTLE(tl1, tcp + tl1, tcp);
378*2080Smckusick 				break;
379*2080Smckusick 			case relge:
380*2080Smckusick 				tl = RELTGE(tl1, tcp + tl1, tcp);
381*2080Smckusick 				break;
382*2080Smckusick 			default:
383*2080Smckusick 				panic(PSYSTEM);
384*2080Smckusick 				break;
385*2080Smckusick 			}
386*2080Smckusick 			popsp(tl1 << 1);
387*2080Smckusick 			push2(tl);
388*2080Smckusick 			continue;
389*2080Smckusick 		case O_REL28:
390*2080Smckusick 			td = pop2();
391*2080Smckusick 			td1 = pop8();
392*2080Smckusick 			goto cmpdbl;
393*2080Smckusick 		case O_REL48:
394*2080Smckusick 			td = pop4();
395*2080Smckusick 			td1 = pop8();
396*2080Smckusick 			goto cmpdbl;
397*2080Smckusick 		case O_REL82:
398*2080Smckusick 			td = pop8();
399*2080Smckusick 			td1 = pop2();
400*2080Smckusick 			goto cmpdbl;
401*2080Smckusick 		case O_REL84:
402*2080Smckusick 			td = pop8();
403*2080Smckusick 			td1 = pop4();
404*2080Smckusick 			goto cmpdbl;
405*2080Smckusick 		case O_REL8:
406*2080Smckusick 			td = pop8();
407*2080Smckusick 			td1 = pop8();
408*2080Smckusick 		cmpdbl:
409*2080Smckusick 			switch (*pc.cp++) {
410*2080Smckusick 			case releq:
411*2080Smckusick 				push2(td1 == td);
412*2080Smckusick 				continue;
413*2080Smckusick 			case relne:
414*2080Smckusick 				push2(td1 != td);
415*2080Smckusick 				continue;
416*2080Smckusick 			case rellt:
417*2080Smckusick 				push2(td1 < td);
418*2080Smckusick 				continue;
419*2080Smckusick 			case relgt:
420*2080Smckusick 				push2(td1 > td);
421*2080Smckusick 				continue;
422*2080Smckusick 			case relle:
423*2080Smckusick 				push2(td1 <= td);
424*2080Smckusick 				continue;
425*2080Smckusick 			case relge:
426*2080Smckusick 				push2(td1 >= td);
427*2080Smckusick 				continue;
428*2080Smckusick 			default:
429*2080Smckusick 				panic(PSYSTEM);
430*2080Smckusick 				continue;
431*2080Smckusick 			}
432*2080Smckusick 		case O_AND:
433*2080Smckusick 			pc.cp++;
434*2080Smckusick 			push2(pop2() & pop2());
435*2080Smckusick 			continue;
436*2080Smckusick 		case O_OR:
437*2080Smckusick 			pc.cp++;
438*2080Smckusick 			push2(pop2() | pop2());
439*2080Smckusick 			continue;
440*2080Smckusick 		case O_NOT:
441*2080Smckusick 			pc.cp++;
442*2080Smckusick 			push2(pop2() ^ 1);
443*2080Smckusick 			continue;
444*2080Smckusick 		case O_AS2:
445*2080Smckusick 			pc.cp++;
446*2080Smckusick 			tl = pop2();
447*2080Smckusick 			*(short *)popaddr() = tl;
448*2080Smckusick 			continue;
449*2080Smckusick 		case O_AS4:
450*2080Smckusick 			pc.cp++;
451*2080Smckusick 			tl = pop4();
452*2080Smckusick 			*(long *)popaddr() = tl;
453*2080Smckusick 			continue;
454*2080Smckusick 		case O_AS24:
455*2080Smckusick 			pc.cp++;
456*2080Smckusick 			tl = pop2();
457*2080Smckusick 			*(long *)popaddr() = tl;
458*2080Smckusick 			continue;
459*2080Smckusick 		case O_AS42:
460*2080Smckusick 			pc.cp++;
461*2080Smckusick 			tl = pop4();
462*2080Smckusick 			*(short *)popaddr() = tl;
463*2080Smckusick 			continue;
464*2080Smckusick 		case O_AS21:
465*2080Smckusick 			pc.cp++;
466*2080Smckusick 			tl = pop2();
467*2080Smckusick 			*popaddr() = tl;
468*2080Smckusick 			continue;
469*2080Smckusick 		case O_AS41:
470*2080Smckusick 			pc.cp++;
471*2080Smckusick 			tl = pop4();
472*2080Smckusick 			*popaddr() = tl;
473*2080Smckusick 			continue;
474*2080Smckusick 		case O_AS28:
475*2080Smckusick 			pc.cp++;
476*2080Smckusick 			tl = pop2();
477*2080Smckusick 			*(double *)popaddr() = tl;
478*2080Smckusick 			continue;
479*2080Smckusick 		case O_AS48:
480*2080Smckusick 			pc.cp++;
481*2080Smckusick 			tl = pop4();
482*2080Smckusick 			*(double *)popaddr() = tl;
483*2080Smckusick 			continue;
484*2080Smckusick 		case O_AS8:
485*2080Smckusick 			pc.cp++;
486*2080Smckusick 			td = pop8();
487*2080Smckusick 			*(double *)popaddr() = td;
488*2080Smckusick 			continue;
489*2080Smckusick 		case O_AS:
490*2080Smckusick 			tl = *pc.cp++;
491*2080Smckusick 			if (tl == 0)
492*2080Smckusick 				tl = *pc.usp++;
493*2080Smckusick 			tl1 = (tl + 1) & ~1;
494*2080Smckusick 			tcp = pushsp(0);
495*2080Smckusick 			blkcpy(tl, tcp, *(char **)(tcp + tl1));
496*2080Smckusick 			popsp(tl1 + sizeof(char *));
497*2080Smckusick 			continue;
498*2080Smckusick 		case O_INX2P2:
499*2080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
500*2080Smckusick 			tl1 = (pop2() - *pc.sp++) << tl;
501*2080Smckusick 			pushaddr(popaddr() + tl1);
502*2080Smckusick 			continue;
503*2080Smckusick 		case O_INX4P2:
504*2080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
505*2080Smckusick 			tl1 = (pop4() - *pc.sp++) << tl;
506*2080Smckusick 			pushaddr(popaddr() + tl1);
507*2080Smckusick 			continue;
508*2080Smckusick 		case O_INX2:
509*2080Smckusick 			tl = *pc.cp++;		/* tl has element size */
510*2080Smckusick 			if (tl == 0)
511*2080Smckusick 				tl = *pc.usp++;
512*2080Smckusick 			tl1 = pop2();		/* index */
513*2080Smckusick 			tl2 = *pc.sp++;
514*2080Smckusick 			SUBSC(tl1, tl2, tl2 + *pc.usp++); /* range check */
515*2080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
516*2080Smckusick 			continue;
517*2080Smckusick 		case O_INX4:
518*2080Smckusick 			tl = *pc.cp++;		/* tl has element size */
519*2080Smckusick 			if (tl == 0)
520*2080Smckusick 				tl = *pc.usp++;
521*2080Smckusick 			tl1 = pop4();		/* index */
522*2080Smckusick 			tl2 = *pc.sp++;
523*2080Smckusick 			SUBSC(tl1, tl2, tl2 + *pc.usp++); /* range check */
524*2080Smckusick 			pushaddr(popaddr() + (tl1 - tl2) * tl);
525*2080Smckusick 			continue;
526*2080Smckusick 		case O_OFF:
527*2080Smckusick 			tl = *pc.cp++;
528*2080Smckusick 			if (tl == 0)
529*2080Smckusick 				tl = *pc.usp++;
530*2080Smckusick 			push4(pop4() + tl);
531*2080Smckusick 			continue;
532*2080Smckusick 		case O_NIL:
533*2080Smckusick 			pc.cp++;
534*2080Smckusick 			NIL();
535*2080Smckusick 			continue;
536*2080Smckusick 		case O_ADD2:
537*2080Smckusick 			pc.cp++;
538*2080Smckusick 			push4(pop2() + pop2());
539*2080Smckusick 			continue;
540*2080Smckusick 		case O_ADD4:
541*2080Smckusick 			pc.cp++;
542*2080Smckusick 			push4(pop4() + pop4());
543*2080Smckusick 			continue;
544*2080Smckusick 		case O_ADD24:
545*2080Smckusick 			pc.cp++;
546*2080Smckusick 			tl = pop2();
547*2080Smckusick 			push4(pop4() + tl);
548*2080Smckusick 			continue;
549*2080Smckusick 		case O_ADD42:
550*2080Smckusick 			pc.cp++;
551*2080Smckusick 			tl = pop4();
552*2080Smckusick 			push4(pop2() + tl);
553*2080Smckusick 			continue;
554*2080Smckusick 		case O_ADD28:
555*2080Smckusick 			pc.cp++;
556*2080Smckusick 			tl = pop2();
557*2080Smckusick 			push8(pop8() + tl);
558*2080Smckusick 			continue;
559*2080Smckusick 		case O_ADD48:
560*2080Smckusick 			pc.cp++;
561*2080Smckusick 			tl = pop4();
562*2080Smckusick 			push8(pop8() + tl);
563*2080Smckusick 			continue;
564*2080Smckusick 		case O_ADD82:
565*2080Smckusick 			pc.cp++;
566*2080Smckusick 			td = pop8();
567*2080Smckusick 			push8(pop2() + td);
568*2080Smckusick 			continue;
569*2080Smckusick 		case O_ADD84:
570*2080Smckusick 			pc.cp++;
571*2080Smckusick 			td = pop8();
572*2080Smckusick 			push8(pop4() + td);
573*2080Smckusick 			continue;
574*2080Smckusick 		case O_SUB2:
575*2080Smckusick 			pc.cp++;
576*2080Smckusick 			tl = pop2();
577*2080Smckusick 			push4(pop2() - tl);
578*2080Smckusick 			continue;
579*2080Smckusick 		case O_SUB4:
580*2080Smckusick 			pc.cp++;
581*2080Smckusick 			tl = pop4();
582*2080Smckusick 			push4(pop4() - tl);
583*2080Smckusick 			continue;
584*2080Smckusick 		case O_SUB24:
585*2080Smckusick 			pc.cp++;
586*2080Smckusick 			tl = pop2();
587*2080Smckusick 			push4(pop4() - tl);
588*2080Smckusick 			continue;
589*2080Smckusick 		case O_SUB42:
590*2080Smckusick 			pc.cp++;
591*2080Smckusick 			tl = pop4();
592*2080Smckusick 			push4(pop2() - tl);
593*2080Smckusick 			continue;
594*2080Smckusick 		case O_SUB28:
595*2080Smckusick 			pc.cp++;
596*2080Smckusick 			tl = pop2();
597*2080Smckusick 			push8(pop8() - tl);
598*2080Smckusick 			continue;
599*2080Smckusick 		case O_SUB48:
600*2080Smckusick 			pc.cp++;
601*2080Smckusick 			tl = pop4();
602*2080Smckusick 			push8(pop8() - tl);
603*2080Smckusick 			continue;
604*2080Smckusick 		case O_SUB82:
605*2080Smckusick 			pc.cp++;
606*2080Smckusick 			td = pop8();
607*2080Smckusick 			push8(pop2() - td);
608*2080Smckusick 			continue;
609*2080Smckusick 		case O_SUB84:
610*2080Smckusick 			pc.cp++;
611*2080Smckusick 			td = pop8();
612*2080Smckusick 			push8(pop4() - td);
613*2080Smckusick 			continue;
614*2080Smckusick 		case O_MUL2:
615*2080Smckusick 			pc.cp++;
616*2080Smckusick 			push4(pop2() * pop2());
617*2080Smckusick 			continue;
618*2080Smckusick 		case O_MUL4:
619*2080Smckusick 			pc.cp++;
620*2080Smckusick 			push4(pop4() * pop4());
621*2080Smckusick 			continue;
622*2080Smckusick 		case O_MUL24:
623*2080Smckusick 			pc.cp++;
624*2080Smckusick 			tl = pop2();
625*2080Smckusick 			push4(pop4() * tl);
626*2080Smckusick 			continue;
627*2080Smckusick 		case O_MUL42:
628*2080Smckusick 			pc.cp++;
629*2080Smckusick 			tl = pop4();
630*2080Smckusick 			push4(pop2() * tl);
631*2080Smckusick 			continue;
632*2080Smckusick 		case O_MUL28:
633*2080Smckusick 			pc.cp++;
634*2080Smckusick 			tl = pop2();
635*2080Smckusick 			push8(pop8() * tl);
636*2080Smckusick 			continue;
637*2080Smckusick 		case O_MUL48:
638*2080Smckusick 			pc.cp++;
639*2080Smckusick 			tl = pop4();
640*2080Smckusick 			push8(pop8() * tl);
641*2080Smckusick 			continue;
642*2080Smckusick 		case O_MUL82:
643*2080Smckusick 			pc.cp++;
644*2080Smckusick 			td = pop8();
645*2080Smckusick 			push8(pop2() * td);
646*2080Smckusick 			continue;
647*2080Smckusick 		case O_MUL84:
648*2080Smckusick 			pc.cp++;
649*2080Smckusick 			td = pop8();
650*2080Smckusick 			push8(pop4() * td);
651*2080Smckusick 			continue;
652*2080Smckusick 		case O_ABS2:
653*2080Smckusick 		case O_ABS4:
654*2080Smckusick 			pc.cp++;
655*2080Smckusick 			tl = pop4();
656*2080Smckusick 			push4(tl >= 0 ? tl : -tl);
657*2080Smckusick 			continue;
658*2080Smckusick 		case O_ABS8:
659*2080Smckusick 			pc.cp++;
660*2080Smckusick 			td = pop8();
661*2080Smckusick 			push8(td >= 0.0 ? td : -td);
662*2080Smckusick 			continue;
663*2080Smckusick 		case O_NEG2:
664*2080Smckusick 			pc.cp++;
665*2080Smckusick 			push4(-pop2());
666*2080Smckusick 			continue;
667*2080Smckusick 		case O_NEG4:
668*2080Smckusick 			pc.cp++;
669*2080Smckusick 			push4(-pop4());
670*2080Smckusick 			continue;
671*2080Smckusick 		case O_NEG8:
672*2080Smckusick 			pc.cp++;
673*2080Smckusick 			push8(-pop8());
674*2080Smckusick 			continue;
675*2080Smckusick 		case O_DIV2:
676*2080Smckusick 			pc.cp++;
677*2080Smckusick 			tl = pop2();
678*2080Smckusick 			push4(pop2() / tl);
679*2080Smckusick 			continue;
680*2080Smckusick 		case O_DIV4:
681*2080Smckusick 			pc.cp++;
682*2080Smckusick 			tl = pop4();
683*2080Smckusick 			push4(pop4() / tl);
684*2080Smckusick 			continue;
685*2080Smckusick 		case O_DIV24:
686*2080Smckusick 			pc.cp++;
687*2080Smckusick 			tl = pop2();
688*2080Smckusick 			push4(pop4() / tl);
689*2080Smckusick 			continue;
690*2080Smckusick 		case O_DIV42:
691*2080Smckusick 			pc.cp++;
692*2080Smckusick 			tl = pop4();
693*2080Smckusick 			push4(pop2() / tl);
694*2080Smckusick 			continue;
695*2080Smckusick 		case O_MOD2:
696*2080Smckusick 			pc.cp++;
697*2080Smckusick 			tl = pop2();
698*2080Smckusick 			push4(pop2() % tl);
699*2080Smckusick 			continue;
700*2080Smckusick 		case O_MOD4:
701*2080Smckusick 			pc.cp++;
702*2080Smckusick 			tl = pop4();
703*2080Smckusick 			push4(pop4() % tl);
704*2080Smckusick 			continue;
705*2080Smckusick 		case O_MOD24:
706*2080Smckusick 			pc.cp++;
707*2080Smckusick 			tl = pop2();
708*2080Smckusick 			push4(pop4() % tl);
709*2080Smckusick 			continue;
710*2080Smckusick 		case O_MOD42:
711*2080Smckusick 			pc.cp++;
712*2080Smckusick 			tl = pop4();
713*2080Smckusick 			push4(pop2() % tl);
714*2080Smckusick 			continue;
715*2080Smckusick 		case O_ADD8:
716*2080Smckusick 			pc.cp++;
717*2080Smckusick 			push8(pop8() + pop8());
718*2080Smckusick 			continue;
719*2080Smckusick 		case O_SUB8:
720*2080Smckusick 			pc.cp++;
721*2080Smckusick 			td = pop8();
722*2080Smckusick 			push8(pop8() - td);
723*2080Smckusick 			continue;
724*2080Smckusick 		case O_MUL8:
725*2080Smckusick 			pc.cp++;
726*2080Smckusick 			push8(pop8() * pop8());
727*2080Smckusick 			continue;
728*2080Smckusick 		case O_DVD8:
729*2080Smckusick 			pc.cp++;
730*2080Smckusick 			td = pop8();
731*2080Smckusick 			push8(pop8() / td);
732*2080Smckusick 			continue;
733*2080Smckusick 		case O_STOI:
734*2080Smckusick 			pc.cp++;
735*2080Smckusick 			push4(pop2());
736*2080Smckusick 			continue;
737*2080Smckusick 		case O_STOD:
738*2080Smckusick 			pc.cp++;
739*2080Smckusick 			td = pop2();
740*2080Smckusick 			push8(td);
741*2080Smckusick 			continue;
742*2080Smckusick 		case O_ITOD:
743*2080Smckusick 			pc.cp++;
744*2080Smckusick 			td = pop4();
745*2080Smckusick 			push8(td);
746*2080Smckusick 			continue;
747*2080Smckusick 		case O_ITOS:
748*2080Smckusick 			pc.cp++;
749*2080Smckusick 			push2(pop4());
750*2080Smckusick 			continue;
751*2080Smckusick 		case O_DVD2:
752*2080Smckusick 			pc.cp++;
753*2080Smckusick 			td = pop2();
754*2080Smckusick 			push8(pop2() / td);
755*2080Smckusick 			continue;
756*2080Smckusick 		case O_DVD4:
757*2080Smckusick 			pc.cp++;
758*2080Smckusick 			td = pop4();
759*2080Smckusick 			push8(pop4() / td);
760*2080Smckusick 			continue;
761*2080Smckusick 		case O_DVD24:
762*2080Smckusick 			pc.cp++;
763*2080Smckusick 			td = pop2();
764*2080Smckusick 			push8(pop4() / td);
765*2080Smckusick 			continue;
766*2080Smckusick 		case O_DVD42:
767*2080Smckusick 			pc.cp++;
768*2080Smckusick 			td = pop4();
769*2080Smckusick 			push8(pop2() / td);
770*2080Smckusick 			continue;
771*2080Smckusick 		case O_DVD28:
772*2080Smckusick 			pc.cp++;
773*2080Smckusick 			td = pop2();
774*2080Smckusick 			push8(pop8() / td);
775*2080Smckusick 			continue;
776*2080Smckusick 		case O_DVD48:
777*2080Smckusick 			pc.cp++;
778*2080Smckusick 			td = pop4();
779*2080Smckusick 			push8(pop8() / td);
780*2080Smckusick 			continue;
781*2080Smckusick 		case O_DVD82:
782*2080Smckusick 			pc.cp++;
783*2080Smckusick 			td = pop8();
784*2080Smckusick 			push8(pop2() / td);
785*2080Smckusick 			continue;
786*2080Smckusick 		case O_DVD84:
787*2080Smckusick 			pc.cp++;
788*2080Smckusick 			td = pop8();
789*2080Smckusick 			push8(pop4() / td);
790*2080Smckusick 			continue;
791*2080Smckusick 		case O_RV1:
792*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
793*2080Smckusick 			push2(*(tcp + *pc.sp++));
794*2080Smckusick 			continue;
795*2080Smckusick 		case O_RV14:
796*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
797*2080Smckusick 			push4(*(tcp + *pc.sp++));
798*2080Smckusick 			continue;
799*2080Smckusick 		case O_RV2:
800*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
801*2080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
802*2080Smckusick 			continue;
803*2080Smckusick 		case O_RV24:
804*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
805*2080Smckusick 			push4(*(short *)(tcp + *pc.sp++));
806*2080Smckusick 			continue;
807*2080Smckusick 		case O_RV4:
808*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
809*2080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
810*2080Smckusick 			continue;
811*2080Smckusick 		case O_RV8:
812*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
813*2080Smckusick 			push8(*(double *)(tcp + *pc.sp++));
814*2080Smckusick 			continue;
815*2080Smckusick 		case O_RV:
816*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
817*2080Smckusick 			tcp += *pc.sp++;
818*2080Smckusick 			tl = *pc.usp++;
819*2080Smckusick 			tcp1 = pushsp(tl);
820*2080Smckusick 			blkcpy(tl, tcp, tcp1);
821*2080Smckusick 			continue;
822*2080Smckusick 		case O_LV:
823*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
824*2080Smckusick 			pushaddr(tcp + *pc.sp++);
825*2080Smckusick 			continue;
826*2080Smckusick 		case O_LRV1:
827*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
828*2080Smckusick 			push2(*(tcp + *pc.lp++));
829*2080Smckusick 			continue;
830*2080Smckusick 		case O_LRV14:
831*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
832*2080Smckusick 			push4(*(tcp + *pc.lp++));
833*2080Smckusick 			continue;
834*2080Smckusick 		case O_LRV2:
835*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
836*2080Smckusick 			push2(*(short *)(tcp + *pc.lp++));
837*2080Smckusick 			continue;
838*2080Smckusick 		case O_LRV24:
839*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
840*2080Smckusick 			push4(*(short *)(tcp + *pc.lp++));
841*2080Smckusick 			continue;
842*2080Smckusick 		case O_LRV4:
843*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
844*2080Smckusick 			push4(*(long *)(tcp + *pc.lp++));
845*2080Smckusick 			continue;
846*2080Smckusick 		case O_LRV8:
847*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
848*2080Smckusick 			push8(*(double *)(tcp + *pc.lp++));
849*2080Smckusick 			continue;
850*2080Smckusick 		case O_LRV:
851*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
852*2080Smckusick 			tcp += *pc.lp++;
853*2080Smckusick 			tl = *pc.usp++;
854*2080Smckusick 			tcp1 = pushsp(tl);
855*2080Smckusick 			blkcpy(tl, tcp, tcp1);
856*2080Smckusick 			continue;
857*2080Smckusick 		case O_LLV:
858*2080Smckusick 			tcp = _display[*pc.ucp++].locvars;
859*2080Smckusick 			pushaddr(tcp + *pc.lp++);
860*2080Smckusick 			continue;
861*2080Smckusick 		case O_IND1:
862*2080Smckusick 			pc.cp++;
863*2080Smckusick 			push2(*popaddr());
864*2080Smckusick 			continue;
865*2080Smckusick 		case O_IND14:
866*2080Smckusick 			pc.cp++;
867*2080Smckusick 			push4(*popaddr());
868*2080Smckusick 			continue;
869*2080Smckusick 		case O_IND2:
870*2080Smckusick 			pc.cp++;
871*2080Smckusick 			push2(*(short *)(popaddr()));
872*2080Smckusick 			continue;
873*2080Smckusick 		case O_IND24:
874*2080Smckusick 			pc.cp++;
875*2080Smckusick 			push4(*(short *)(popaddr()));
876*2080Smckusick 			continue;
877*2080Smckusick 		case O_IND4:
878*2080Smckusick 			pc.cp++;
879*2080Smckusick 			push4(*(long *)(popaddr()));
880*2080Smckusick 			continue;
881*2080Smckusick 		case O_IND8:
882*2080Smckusick 			pc.cp++;
883*2080Smckusick 			push8(*(double *)(popaddr()));
884*2080Smckusick 			continue;
885*2080Smckusick 		case O_IND:
886*2080Smckusick 			tl = *pc.cp++;
887*2080Smckusick 			if (tl == 0)
888*2080Smckusick 				tl = *pc.usp++;
889*2080Smckusick 			tcp = popaddr();
890*2080Smckusick 			tcp1 = pushsp((tl + 1) & ~1);
891*2080Smckusick 			blkcpy(tl, tcp, tcp1);
892*2080Smckusick 			continue;
893*2080Smckusick 		case O_CON1:
894*2080Smckusick 			push2(*pc.cp++);
895*2080Smckusick 			continue;
896*2080Smckusick 		case O_CON14:
897*2080Smckusick 			push4(*pc.cp++);
898*2080Smckusick 			continue;
899*2080Smckusick 		case O_CON2:
900*2080Smckusick 			pc.cp++;
901*2080Smckusick 			push2(*pc.sp++);
902*2080Smckusick 			continue;
903*2080Smckusick 		case O_CON24:
904*2080Smckusick 			pc.cp++;
905*2080Smckusick 			push4(*pc.sp++);
906*2080Smckusick 			continue;
907*2080Smckusick 		case O_CON4:
908*2080Smckusick 			pc.cp++;
909*2080Smckusick 			push4(*pc.lp++);
910*2080Smckusick 			continue;
911*2080Smckusick 		case O_CON8:
912*2080Smckusick 			pc.cp++;
913*2080Smckusick 			push8(*pc.dp++);
914*2080Smckusick 			continue;
915*2080Smckusick 		case O_CON:
916*2080Smckusick 			tl = *pc.cp++;
917*2080Smckusick 			if (tl == 0)
918*2080Smckusick 				tl = *pc.usp++;
919*2080Smckusick 			tl = (tl + 1) & ~1;
920*2080Smckusick 			tcp = pushsp(tl);
921*2080Smckusick 			blkcpy(tl, pc.cp, tcp);
922*2080Smckusick 			pc.cp += tl;
923*2080Smckusick 			continue;
924*2080Smckusick 		case O_LVCON:
925*2080Smckusick 			tl = *pc.cp++;
926*2080Smckusick 			if (tl == 0)
927*2080Smckusick 				tl = *pc.usp++;
928*2080Smckusick 			tl = (tl + 1) & ~1;
929*2080Smckusick 			pushaddr(pc.cp);
930*2080Smckusick 			pc.cp += tl;
931*2080Smckusick 			continue;
932*2080Smckusick 		case O_RANG2:
933*2080Smckusick 			tl = *pc.cp++;
934*2080Smckusick 			if (tl == 0)
935*2080Smckusick 				tl = *pc.sp++;
936*2080Smckusick 			tl1 = pop2();
937*2080Smckusick 			push2(RANG4(tl1, tl, *pc.sp++));
938*2080Smckusick 			continue;
939*2080Smckusick 		case O_RANG42:
940*2080Smckusick 			tl = *pc.cp++;
941*2080Smckusick 			if (tl == 0)
942*2080Smckusick 				tl = *pc.sp++;
943*2080Smckusick 			tl1 = pop4();
944*2080Smckusick 			push4(RANG4(tl1, tl, *pc.sp++));
945*2080Smckusick 			continue;
946*2080Smckusick 		case O_RSNG2:
947*2080Smckusick 			tl = *pc.cp++;
948*2080Smckusick 			if (tl == 0)
949*2080Smckusick 				tl = *pc.sp++;
950*2080Smckusick 			tl1 = pop2();
951*2080Smckusick 			push2(RSNG4(tl1, tl));
952*2080Smckusick 			continue;
953*2080Smckusick 		case O_RSNG42:
954*2080Smckusick 			tl = *pc.cp++;
955*2080Smckusick 			if (tl == 0)
956*2080Smckusick 				tl = *pc.sp++;
957*2080Smckusick 			tl1 = pop4();
958*2080Smckusick 			push4(RSNG4(tl1, tl));
959*2080Smckusick 			continue;
960*2080Smckusick 		case O_RANG4:
961*2080Smckusick 			pc.cp++;
962*2080Smckusick 			tl = *pc.lp++;
963*2080Smckusick 			tl1 = pop4();
964*2080Smckusick 			push4(RANG4(tl1, tl, *pc.lp++));
965*2080Smckusick 			continue;
966*2080Smckusick 		case O_RANG24:
967*2080Smckusick 			pc.cp++;
968*2080Smckusick 			tl = *pc.lp++;
969*2080Smckusick 			tl1 = pop2();
970*2080Smckusick 			push2(RANG4(tl1, tl, *pc.lp++));
971*2080Smckusick 			continue;
972*2080Smckusick 		case O_RSNG4:
973*2080Smckusick 			pc.cp++;
974*2080Smckusick 			tl = pop4();
975*2080Smckusick 			push4(RSNG4(tl, *pc.lp++));
976*2080Smckusick 			continue;
977*2080Smckusick 		case O_RSNG24:
978*2080Smckusick 			pc.cp++;
979*2080Smckusick 			tl = pop2();
980*2080Smckusick 			push2(RSNG4(tl, *pc.lp++));
981*2080Smckusick 			continue;
982*2080Smckusick 		case O_STLIM:
983*2080Smckusick 			pc.cp++;
984*2080Smckusick 			_stlim = pop4();
985*2080Smckusick 			_stcnt--;
986*2080Smckusick 			LINO();
987*2080Smckusick 			continue;
988*2080Smckusick 		case O_LLIMIT:
989*2080Smckusick 			pc.cp++;
990*2080Smckusick 			LLIMIT();
991*2080Smckusick 			popargs(2);
992*2080Smckusick 			continue;
993*2080Smckusick 		case O_BUFF:
994*2080Smckusick 			BUFF(*pc.cp++);
995*2080Smckusick 			continue;
996*2080Smckusick 		case O_HALT:
997*2080Smckusick 			pc.cp++;
998*2080Smckusick 			panic(PHALT);
999*2080Smckusick 			continue;
1000*2080Smckusick 		case O_PXPBUF:
1001*2080Smckusick 			pc.cp++;
1002*2080Smckusick 			_cntrs = *pc.lp++;
1003*2080Smckusick 			_rtns = *pc.lp++;
1004*2080Smckusick 			_pcpcount = (long *)calloc(_cntrs + 1, sizeof(long));
1005*2080Smckusick 			continue;
1006*2080Smckusick 		case O_COUNT:
1007*2080Smckusick 			pc.cp++;
1008*2080Smckusick 			_pcpcount[*pc.usp++]++;
1009*2080Smckusick 			continue;
1010*2080Smckusick 		case O_CASE1OP:
1011*2080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
1012*2080Smckusick 			if (tl == 0)
1013*2080Smckusick 				tl = *pc.usp++;
1014*2080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
1015*2080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
1016*2080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
1017*2080Smckusick 			for(; tl > 0; tl--)	/* look for element */
1018*2080Smckusick 				if (tl1 == *tcp++)
1019*2080Smckusick 					break;
1020*2080Smckusick 			if (tl == 0)		/* default case => error */
1021*2080Smckusick 				ERROR(ECASE, tl2);
1022*2080Smckusick 			pc.cp += *(tsp - tl);
1023*2080Smckusick 			continue;
1024*2080Smckusick 		case O_CASE2OP:
1025*2080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
1026*2080Smckusick 			if (tl == 0)
1027*2080Smckusick 				tl = *pc.usp++;
1028*2080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
1029*2080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
1030*2080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
1031*2080Smckusick 			for(; tl > 0; tl--)	/* look for element */
1032*2080Smckusick 				if (tl1 == *tsp1++)
1033*2080Smckusick 					break;
1034*2080Smckusick 			if (tl == 0)		/* default case => error */
1035*2080Smckusick 				ERROR(ECASE, tl2);
1036*2080Smckusick 			pc.cp += *(tsp - tl);
1037*2080Smckusick 			continue;
1038*2080Smckusick 		case O_CASE4OP:
1039*2080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
1040*2080Smckusick 			if (tl == 0)
1041*2080Smckusick 				tl = *pc.usp++;
1042*2080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
1043*2080Smckusick 			tlp = (long *)tsp;	/* tlp = ptr to case values */
1044*2080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
1045*2080Smckusick 			for(; tl > 0; tl--)	/* look for element */
1046*2080Smckusick 				if (tl1 == *tlp++)
1047*2080Smckusick 					break;
1048*2080Smckusick 			if (tl == 0)		/* default case => error */
1049*2080Smckusick 				ERROR(ECASE, tl2);
1050*2080Smckusick 			pc.cp += *(tsp - tl);
1051*2080Smckusick 			continue;
1052*2080Smckusick 		case O_ADDT:
1053*2080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
1054*2080Smckusick 			if (tl == 0)
1055*2080Smckusick 				tl = *pc.usp++;
1056*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to first arg */
1057*2080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
1058*2080Smckusick 			popsp(tl);
1059*2080Smckusick 			continue;
1060*2080Smckusick 		case O_SUBT:
1061*2080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
1062*2080Smckusick 			if (tl == 0)
1063*2080Smckusick 				tl = *pc.usp++;
1064*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to first arg */
1065*2080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
1066*2080Smckusick 			popsp(tl);
1067*2080Smckusick 			continue;
1068*2080Smckusick 		case O_MULT:
1069*2080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
1070*2080Smckusick 			if (tl == 0)
1071*2080Smckusick 				tl = *pc.usp++;
1072*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to first arg */
1073*2080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
1074*2080Smckusick 			popsp(tl);
1075*2080Smckusick 			continue;
1076*2080Smckusick 		case O_INCT:
1077*2080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
1078*2080Smckusick 			if (tl == 0)
1079*2080Smckusick 				tl = *pc.usp++;
1080*2080Smckusick 			tl1 = INCT();
1081*2080Smckusick 			popargs(tl);
1082*2080Smckusick 			push2(tl1);
1083*2080Smckusick 			continue;
1084*2080Smckusick 		case O_CTTOT:
1085*2080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
1086*2080Smckusick 			if (tl == 0)
1087*2080Smckusick 				tl = *pc.usp++;
1088*2080Smckusick 			tl1 = tl * sizeof(long);
1089*2080Smckusick 			tcp = pushsp(0) + tl1;	/* tcp pts to result space */
1090*2080Smckusick 			CTTOT(tcp);
1091*2080Smckusick 			popargs(tl);
1092*2080Smckusick 			continue;
1093*2080Smckusick 		case O_CARD:
1094*2080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
1095*2080Smckusick 			if (tl == 0)
1096*2080Smckusick 				tl = *pc.usp++;
1097*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to set */
1098*2080Smckusick 			tl1 = CARD(tcp, tl);
1099*2080Smckusick 			popsp(tl);
1100*2080Smckusick 			push2(tl1);
1101*2080Smckusick 			continue;
1102*2080Smckusick 		case O_IN:
1103*2080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
1104*2080Smckusick 			if (tl == 0)
1105*2080Smckusick 				tl = *pc.usp++;
1106*2080Smckusick 			tl1 = pop4();		/* tl1 is the element */
1107*2080Smckusick 			tcp = pushsp(0);	/* tcp pts to set */
1108*2080Smckusick 			tl2 = *pc.usp++;	/* lower bound */
1109*2080Smckusick 			tl1 = IN(tl1, tl2, *pc.usp++, tcp);
1110*2080Smckusick 			popsp(tl);
1111*2080Smckusick 			push2(tl1);
1112*2080Smckusick 			continue;
1113*2080Smckusick 		case O_ASRT:
1114*2080Smckusick 			pc.cp++;
1115*2080Smckusick 			ASRT(pop2());
1116*2080Smckusick 			continue;
1117*2080Smckusick 		case O_FOR1U:
1118*2080Smckusick 			pc.cp++;
1119*2080Smckusick 			tcp = (char *)pop4();	/* tcp = ptr to index var */
1120*2080Smckusick 			if (*tcp < pop4()) {	/* still going up */
1121*2080Smckusick 				*tcp += 1;	/* inc index var */
1122*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1123*2080Smckusick 				continue;
1124*2080Smckusick 			}
1125*2080Smckusick 			pc.sp++;		/* else fall through */
1126*2080Smckusick 			continue;
1127*2080Smckusick 		case O_FOR2U:
1128*2080Smckusick 			pc.cp++;
1129*2080Smckusick 			tsp = (short *)pop4();	/* tsp = ptr to index var */
1130*2080Smckusick 			if (*tsp < pop4()) {	/* still going up */
1131*2080Smckusick 				*tsp += 1;	/* inc index var */
1132*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1133*2080Smckusick 				continue;
1134*2080Smckusick 			}
1135*2080Smckusick 			pc.sp++;		/* else fall through */
1136*2080Smckusick 			continue;
1137*2080Smckusick 		case O_FOR4U:
1138*2080Smckusick 			pc.cp++;
1139*2080Smckusick 			tlp = (long *)pop4();	/* tlp = ptr to index var */
1140*2080Smckusick 			if (*tlp < pop4()) {	/* still going up */
1141*2080Smckusick 				*tlp += 1;	/* inc index var */
1142*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1143*2080Smckusick 				continue;
1144*2080Smckusick 			}
1145*2080Smckusick 			pc.sp++;		/* else fall through */
1146*2080Smckusick 			continue;
1147*2080Smckusick 		case O_FOR1D:
1148*2080Smckusick 			pc.cp++;
1149*2080Smckusick 			tcp = (char *)pop4();	/* tcp = ptr to index var */
1150*2080Smckusick 			if (*tcp > pop4()) {	/* still going down */
1151*2080Smckusick 				*tcp -= 1;	/* dec index var */
1152*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1153*2080Smckusick 				continue;
1154*2080Smckusick 			}
1155*2080Smckusick 			pc.sp++;		/* else fall through */
1156*2080Smckusick 			continue;
1157*2080Smckusick 		case O_FOR2D:
1158*2080Smckusick 			pc.cp++;
1159*2080Smckusick 			tsp = (short *)pop4();	/* tsp = ptr to index var */
1160*2080Smckusick 			if (*tsp > pop4()) {	/* still going down */
1161*2080Smckusick 				*tsp -= 1;	/* dec index var */
1162*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1163*2080Smckusick 				continue;
1164*2080Smckusick 			}
1165*2080Smckusick 			pc.sp++;		/* else fall through */
1166*2080Smckusick 			continue;
1167*2080Smckusick 		case O_FOR4D:
1168*2080Smckusick 			pc.cp++;
1169*2080Smckusick 			tlp = (long *)pop4();	/* tlp = ptr to index var */
1170*2080Smckusick 			if (*tlp > pop4()) {	/* still going down */
1171*2080Smckusick 				*tlp -= 1;	/* dec index var */
1172*2080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1173*2080Smckusick 				continue;
1174*2080Smckusick 			}
1175*2080Smckusick 			pc.sp++;		/* else fall through */
1176*2080Smckusick 			continue;
1177*2080Smckusick 		case O_READE:
1178*2080Smckusick 			pc.cp++;
1179*2080Smckusick 			push2(READE(curfile, base + *pc.lp++));
1180*2080Smckusick 			continue;
1181*2080Smckusick 		case O_READ4:
1182*2080Smckusick 			pc.cp++;
1183*2080Smckusick 			push4(READ4(curfile));
1184*2080Smckusick 			continue;
1185*2080Smckusick 		case O_READC:
1186*2080Smckusick 			pc.cp++;
1187*2080Smckusick 			push2(READC(curfile));
1188*2080Smckusick 			continue;
1189*2080Smckusick 		case O_READ8:
1190*2080Smckusick 			pc.cp++;
1191*2080Smckusick 			push8(READ8(curfile));
1192*2080Smckusick 			continue;
1193*2080Smckusick 		case O_READLN:
1194*2080Smckusick 			pc.cp++;
1195*2080Smckusick 			READLN(curfile);
1196*2080Smckusick 			continue;
1197*2080Smckusick 		case O_EOF:
1198*2080Smckusick 			pc.cp++;
1199*2080Smckusick 			push2(TEOF(popaddr()));
1200*2080Smckusick 			continue;
1201*2080Smckusick 		case O_EOLN:
1202*2080Smckusick 			pc.cp++;
1203*2080Smckusick 			push2(TEOLN(popaddr()));
1204*2080Smckusick 			continue;
1205*2080Smckusick 		case O_WRITEC:
1206*2080Smckusick 			pc.cp++;
1207*2080Smckusick 			WRITEC(curfile);
1208*2080Smckusick 			popargs(2);
1209*2080Smckusick 			continue;
1210*2080Smckusick 		case O_WRITES:
1211*2080Smckusick 			pc.cp++;
1212*2080Smckusick 			WRITES(curfile);
1213*2080Smckusick 			popargs(4);
1214*2080Smckusick 			continue;
1215*2080Smckusick 		case O_WRITEF:
1216*2080Smckusick 			WRITEF(curfile);
1217*2080Smckusick 			popargs(*pc.cp++);
1218*2080Smckusick 			continue;
1219*2080Smckusick 		case O_WRITLN:
1220*2080Smckusick 			pc.cp++;
1221*2080Smckusick 			WRITLN(curfile);
1222*2080Smckusick 			continue;
1223*2080Smckusick 		case O_PAGE:
1224*2080Smckusick 			pc.cp++;
1225*2080Smckusick 			PAGE(curfile);
1226*2080Smckusick 			continue;
1227*2080Smckusick 		case O_NAM:
1228*2080Smckusick 			pc.cp++;
1229*2080Smckusick 			tl = pop4();
1230*2080Smckusick 			pushaddr(NAM(tl, base + *pc.lp++));
1231*2080Smckusick 			continue;
1232*2080Smckusick 		case O_MAX:
1233*2080Smckusick 			tl = *pc.cp++;
1234*2080Smckusick 			if (tl == 0)
1235*2080Smckusick 				tl = *pc.usp++;
1236*2080Smckusick 			tl1 = pop4();
1237*2080Smckusick 			push4(MAX(tl1, tl, *pc.usp++));
1238*2080Smckusick 			continue;
1239*2080Smckusick 		case O_MIN:
1240*2080Smckusick 			tl = *pc.cp++;
1241*2080Smckusick 			if (tl == 0)
1242*2080Smckusick 				tl = *pc.usp++;
1243*2080Smckusick 			tl1 = pop4();
1244*2080Smckusick 			push4(tl1 < tl ? tl1 : tl);
1245*2080Smckusick 			continue;
1246*2080Smckusick 		case O_UNIT:
1247*2080Smckusick 			pc.cp++;
1248*2080Smckusick 			curfile = UNIT(popaddr());
1249*2080Smckusick 			continue;
1250*2080Smckusick 		case O_UNITINP:
1251*2080Smckusick 			pc.cp++;
1252*2080Smckusick 			curfile = INPUT;
1253*2080Smckusick 			continue;
1254*2080Smckusick 		case O_UNITOUT:
1255*2080Smckusick 			pc.cp++;
1256*2080Smckusick 			curfile = OUTPUT;
1257*2080Smckusick 			continue;
1258*2080Smckusick 		case O_MESSAGE:
1259*2080Smckusick 			pc.cp++;
1260*2080Smckusick 			PFLUSH();
1261*2080Smckusick 			curfile = ERR;
1262*2080Smckusick 			continue;
1263*2080Smckusick 		case O_GET:
1264*2080Smckusick 			pc.cp++;
1265*2080Smckusick 			GET(curfile);
1266*2080Smckusick 			continue;
1267*2080Smckusick 		case O_FNIL:
1268*2080Smckusick 			pc.cp++;
1269*2080Smckusick 			pushaddr(FNIL(popaddr()));
1270*2080Smckusick 			continue;
1271*2080Smckusick 		case O_DEFNAME:
1272*2080Smckusick 			pc.cp++;
1273*2080Smckusick 			DEFNAME();
1274*2080Smckusick 			popargs(4);
1275*2080Smckusick 			continue;
1276*2080Smckusick 		case O_RESET:
1277*2080Smckusick 			pc.cp++;
1278*2080Smckusick 			RESET();
1279*2080Smckusick 			popargs(4);
1280*2080Smckusick 			continue;
1281*2080Smckusick 		case O_REWRITE:
1282*2080Smckusick 			pc.cp++;
1283*2080Smckusick 			REWRITE();
1284*2080Smckusick 			popargs(4);
1285*2080Smckusick 			continue;
1286*2080Smckusick 		case O_FILE:
1287*2080Smckusick 			pc.cp++;
1288*2080Smckusick 			pushaddr(ACTFILE(curfile));
1289*2080Smckusick 			continue;
1290*2080Smckusick 		case O_REMOVE:
1291*2080Smckusick 			pc.cp++;
1292*2080Smckusick 			REMOVE();
1293*2080Smckusick 			popargs(2);
1294*2080Smckusick 			continue;
1295*2080Smckusick 		case O_FLUSH:
1296*2080Smckusick 			pc.cp++;
1297*2080Smckusick 			FLUSH();
1298*2080Smckusick 			popargs(1);
1299*2080Smckusick 			continue;
1300*2080Smckusick 		case O_PACK:
1301*2080Smckusick 			pc.cp++;
1302*2080Smckusick 			PACK();
1303*2080Smckusick 			popargs(7);
1304*2080Smckusick 			continue;
1305*2080Smckusick 		case O_UNPACK:
1306*2080Smckusick 			pc.cp++;
1307*2080Smckusick 			UNPACK();
1308*2080Smckusick 			popargs(7);
1309*2080Smckusick 			continue;
1310*2080Smckusick 		case O_ARGC:
1311*2080Smckusick 			pc.cp++;
1312*2080Smckusick 			push4(_argc);
1313*2080Smckusick 			continue;
1314*2080Smckusick 		case O_ARGV:
1315*2080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
1316*2080Smckusick 			if (tl == 0)
1317*2080Smckusick 				tl = *pc.usp++;
1318*2080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
1319*2080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
1320*2080Smckusick 			ARGV(tl1, tcp, tl);
1321*2080Smckusick 			continue;
1322*2080Smckusick 		case O_CLCK:
1323*2080Smckusick 			pc.cp++;
1324*2080Smckusick 			push4(CLCK());
1325*2080Smckusick 			continue;
1326*2080Smckusick 		case O_WCLCK:
1327*2080Smckusick 			pc.cp++;
1328*2080Smckusick 			push4(time(0));
1329*2080Smckusick 			continue;
1330*2080Smckusick 		case O_SCLCK:
1331*2080Smckusick 			pc.cp++;
1332*2080Smckusick 			push4(SCLCK());
1333*2080Smckusick 			continue;
1334*2080Smckusick 		case O_DISPOSE:
1335*2080Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
1336*2080Smckusick 			if (tl == 0)
1337*2080Smckusick 				tl = *pc.usp++;
1338*2080Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
1339*2080Smckusick 			DISPOSE(tcp, tl);
1340*2080Smckusick 			*(char **)tcp = (char *)0;
1341*2080Smckusick 			continue;
1342*2080Smckusick 		case O_NEW:
1343*2080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
1344*2080Smckusick 			if (tl == 0)
1345*2080Smckusick 				tl = *pc.usp++;
1346*2080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
1347*2080Smckusick 			NEWZ(tcp, tl);
1348*2080Smckusick 			continue;
1349*2080Smckusick 		case O_DATE:
1350*2080Smckusick 			pc.cp++;
1351*2080Smckusick 			DATE(popaddr());
1352*2080Smckusick 			continue;
1353*2080Smckusick 		case O_TIME:
1354*2080Smckusick 			pc.cp++;
1355*2080Smckusick 			TIME(popaddr());
1356*2080Smckusick 			continue;
1357*2080Smckusick 		case O_UNDEF:
1358*2080Smckusick 			pc.cp++;
1359*2080Smckusick 			pop8();
1360*2080Smckusick 			push2(0);
1361*2080Smckusick 			continue;
1362*2080Smckusick 		case O_ATAN:
1363*2080Smckusick 			pc.cp++;
1364*2080Smckusick 			push8(atan(pop8()));
1365*2080Smckusick 			continue;
1366*2080Smckusick 		case O_COS:
1367*2080Smckusick 			pc.cp++;
1368*2080Smckusick 			push8(cos(pop8()));
1369*2080Smckusick 			continue;
1370*2080Smckusick 		case O_EXP:
1371*2080Smckusick 			pc.cp++;
1372*2080Smckusick 			push8(exp(pop8()));
1373*2080Smckusick 			continue;
1374*2080Smckusick 		case O_LN:
1375*2080Smckusick 			pc.cp++;
1376*2080Smckusick 			push8(LN(pop8()));
1377*2080Smckusick 			continue;
1378*2080Smckusick 		case O_SIN:
1379*2080Smckusick 			pc.cp++;
1380*2080Smckusick 			push8(sin(pop8()));
1381*2080Smckusick 			continue;
1382*2080Smckusick 		case O_SQRT:
1383*2080Smckusick 			pc.cp++;
1384*2080Smckusick 			push8(SQRT(pop8()));
1385*2080Smckusick 			continue;
1386*2080Smckusick 		case O_CHR2:
1387*2080Smckusick 		case O_CHR4:
1388*2080Smckusick 			pc.cp++;
1389*2080Smckusick 			push2(CHR(pop4()));
1390*2080Smckusick 			continue;
1391*2080Smckusick 		case O_ODD2:
1392*2080Smckusick 		case O_ODD4:
1393*2080Smckusick 			pc.cp++;
1394*2080Smckusick 			push2(pop4() & 1);
1395*2080Smckusick 			continue;
1396*2080Smckusick 		case O_SUCC2:
1397*2080Smckusick 			/* Pi should be fixed to gen code for:
1398*2080Smckusick 			 *	tl = *pc.cp++;
1399*2080Smckusick 			 *	if (tl == 0)
1400*2080Smckusick 			 *		tl = *pc.sp++;
1401*2080Smckusick 			 *	tl1 = pop4();
1402*2080Smckusick 			 *	push2(SUCC(tl1, tl, *pc.sp++));
1403*2080Smckusick 			 */
1404*2080Smckusick 			pc.cp++;
1405*2080Smckusick 			push2(pop4() + 1);
1406*2080Smckusick 			continue;
1407*2080Smckusick 		case O_SUCC24:
1408*2080Smckusick 			/* Pi should be fixed to gen code for:
1409*2080Smckusick 			 *	tl = *pc.cp++;
1410*2080Smckusick 			 *	if (tl == 0)
1411*2080Smckusick 			 *		tl = *pc.sp++;
1412*2080Smckusick 			 *	tl1 = pop4();
1413*2080Smckusick 			 *	push4(SUCC(tl1, tl, *pc.sp++));
1414*2080Smckusick 			 */
1415*2080Smckusick 		case O_SUCC4:
1416*2080Smckusick 			/* Pi should be fixed to gen code for:
1417*2080Smckusick 			 *	tl = *pc.cp++;
1418*2080Smckusick 			 *	if (tl == 0)
1419*2080Smckusick 			 *		tl = *pc.lp++;
1420*2080Smckusick 			 *	tl1 = pop4();
1421*2080Smckusick 			 *	push4(SUCC(tl1, tl, *pc.lp++));
1422*2080Smckusick 			 */
1423*2080Smckusick 			pc.cp++;
1424*2080Smckusick 			push4(pop4() + 1);
1425*2080Smckusick 			continue;
1426*2080Smckusick 		case O_PRED2:
1427*2080Smckusick 			/* Pi should be fixed to gen code for:
1428*2080Smckusick 			 *	tl = *pc.cp++;
1429*2080Smckusick 			 *	if (tl == 0)
1430*2080Smckusick 			 *		tl = *pc.sp++;
1431*2080Smckusick 			 *	tl1 = pop4();
1432*2080Smckusick 			 *	push2(PRED(tl1, tl, *pc.sp++));
1433*2080Smckusick 			 */
1434*2080Smckusick 			pc.cp++;
1435*2080Smckusick 			push2(pop4() - 1);
1436*2080Smckusick 			continue;
1437*2080Smckusick 		case O_PRED24:
1438*2080Smckusick 			/* Pi should be fixed to gen code for:
1439*2080Smckusick 			 *	tl = *pc.cp++;
1440*2080Smckusick 			 *	if (tl == 0)
1441*2080Smckusick 			 *		tl = *pc.sp++;
1442*2080Smckusick 			 *	tl1 = pop4();
1443*2080Smckusick 			 *	push4(PRED(tl1, tl, *pc.sp++));
1444*2080Smckusick 			 */
1445*2080Smckusick 		case O_PRED4:
1446*2080Smckusick 			/* Pi should be fixed to gen code for:
1447*2080Smckusick 			 *	tl = *pc.cp++;
1448*2080Smckusick 			 *	if (tl == 0)
1449*2080Smckusick 			 *		tl = *pc.lp++;
1450*2080Smckusick 			 *	tl1 = pop4();
1451*2080Smckusick 			 *	push4(PRED(tl1, tl, *pc.lp++));
1452*2080Smckusick 			 */
1453*2080Smckusick 			pc.cp++;
1454*2080Smckusick 			push4(pop4() - 1);
1455*2080Smckusick 			continue;
1456*2080Smckusick 		case O_SEED:
1457*2080Smckusick 			pc.cp++;
1458*2080Smckusick 			push4(SEED(pop4()));
1459*2080Smckusick 			continue;
1460*2080Smckusick 		case O_RANDOM:
1461*2080Smckusick 			pc.cp++;
1462*2080Smckusick 			push8(RANDOM(pop8()));
1463*2080Smckusick 			continue;
1464*2080Smckusick 		case O_EXPO:
1465*2080Smckusick 			pc.cp++;
1466*2080Smckusick 			push4(EXPO(pop8()));
1467*2080Smckusick 			continue;
1468*2080Smckusick 		case O_SQR2:
1469*2080Smckusick 		case O_SQR4:
1470*2080Smckusick 			pc.cp++;
1471*2080Smckusick 			tl = pop4();
1472*2080Smckusick 			push4(tl * tl);
1473*2080Smckusick 			continue;
1474*2080Smckusick 		case O_SQR8:
1475*2080Smckusick 			pc.cp++;
1476*2080Smckusick 			td = pop8();
1477*2080Smckusick 			push8(td * td);
1478*2080Smckusick 			continue;
1479*2080Smckusick 		case O_ROUND:
1480*2080Smckusick 			pc.cp++;
1481*2080Smckusick 			push4(ROUND(pop8()));
1482*2080Smckusick 			continue;
1483*2080Smckusick 		case O_TRUNC:
1484*2080Smckusick 			pc.cp++;
1485*2080Smckusick 			push4(TRUNC(pop8()));
1486*2080Smckusick 			continue;
1487*2080Smckusick 		}
1488*2080Smckusick 	}
1489*2080Smckusick }
1490