148108Sbostic /*-
2*62181Sbostic * Copyright (c) 1991, 1993
3*62181Sbostic * The Regents of the University of California. All rights reserved.
448108Sbostic *
548108Sbostic * %sccs.include.redist.c%
622152Sdist */
72080Smckusick
822152Sdist #ifndef lint
9*62181Sbostic static char sccsid[] = "@(#)interp.c 8.1 (Berkeley) 06/06/93";
1048108Sbostic #endif /* not lint */
112080Smckusick
122080Smckusick #include <math.h>
1310576Smckusick #include <signal.h>
142950Smckusic #include "whoami.h"
1510576Smckusick #include "vars.h"
162950Smckusic #include "objfmt.h"
172080Smckusick #include "h02opcs.h"
182080Smckusick #include "machdep.h"
192080Smckusick #include "libpc.h"
202080Smckusick
212080Smckusick /*
222080Smckusick * program variables
232080Smckusick */
2410576Smckusick union display _display;
2510576Smckusick struct dispsave *_dp;
262080Smckusick long _lino = 0;
272080Smckusick int _argc;
282080Smckusick char **_argv;
292080Smckusick long _mode;
3010576Smckusick long _runtst = (long)TRUE;
312950Smckusic bool _nodump = FALSE;
322080Smckusick long _stlim = 500000;
332080Smckusick long _stcnt = 0;
342191Smckusic long _seed = 1;
3510576Smckusick #ifdef ADDR32
362080Smckusick char *_minptr = (char *)0x7fffffff;
3710576Smckusick #endif ADDR32
3810576Smckusick #ifdef ADDR16
392950Smckusic char *_minptr = (char *)0xffff;
4010576Smckusick #endif ADDR16
412080Smckusick char *_maxptr = (char *)0;
422080Smckusick long *_pcpcount = (long *)0;
432080Smckusick long _cntrs = 0;
442080Smckusick long _rtns = 0;
452080Smckusick
462080Smckusick /*
472080Smckusick * standard files
482080Smckusick */
492080Smckusick char _inwin, _outwin, _errwin;
502950Smckusic struct iorechd _err = {
512950Smckusic &_errwin, /* fileptr */
522080Smckusick 0, /* lcount */
532080Smckusick 0x7fffffff, /* llimit */
5446289Storek stderr, /* fbuf */
552950Smckusic FILNIL, /* fchain */
562080Smckusick STDLVL, /* flev */
572950Smckusic "Message file", /* pfname */
582950Smckusic FTEXT | FWRITE | EOFF, /* funit */
592950Smckusic 2, /* fblk */
602080Smckusick 1 /* fsize */
612080Smckusick };
622080Smckusick struct iorechd output = {
632080Smckusick &_outwin, /* fileptr */
642080Smckusick 0, /* lcount */
652080Smckusick 0x7fffffff, /* llimit */
6646289Storek stdout, /* fbuf */
672080Smckusick ERR, /* fchain */
682080Smckusick STDLVL, /* flev */
692080Smckusick "standard output", /* pfname */
702080Smckusick FTEXT | FWRITE | EOFF, /* funit */
712080Smckusick 1, /* fblk */
722080Smckusick 1 /* fsize */
732080Smckusick };
742950Smckusic struct iorechd input = {
752950Smckusic &_inwin, /* fileptr */
762080Smckusick 0, /* lcount */
772080Smckusick 0x7fffffff, /* llimit */
7846289Storek stdin, /* fbuf */
792950Smckusic OUTPUT, /* fchain */
802080Smckusick STDLVL, /* flev */
812950Smckusic "standard input", /* pfname */
827569Smckusick FTEXT|FREAD|SYNC|EOLN, /* funit */
832950Smckusic 0, /* fblk */
842080Smckusick 1 /* fsize */
852080Smckusick };
862080Smckusick
872109Smckusic /*
882950Smckusic * file record variables
892950Smckusic */
902950Smckusic long _filefre = PREDEF;
912950Smckusic struct iorechd _fchain = {
922950Smckusic 0, 0, 0, 0, /* only use fchain field */
932950Smckusic INPUT /* fchain */
942950Smckusic };
952950Smckusic struct iorec *_actfile[MAXFILES] = {
962950Smckusic INPUT,
972950Smckusic OUTPUT,
982950Smckusic ERR
992950Smckusic };
1002950Smckusic
1012950Smckusic /*
10236537Smckusick * stuff for pdx to watch what the interpreter is doing.
10336537Smckusick * The .globl is #ifndef DBX since it breaks DBX to have a global
10436537Smckusick * asm label in the middle of a function (see _loopaddr: below).
1055658Slinton */
1065658Slinton
10736537Smckusick union progcntr pdx_pc;
10836537Smckusick #ifndef DBX
1095658Slinton asm(".globl _loopaddr");
11036537Smckusick #endif DBX
1115658Slinton
1125658Slinton /*
1132109Smckusic * Px profile array
1142109Smckusic */
1152109Smckusic #ifdef PROFILE
1162109Smckusic long _profcnts[NUMOPS];
1172109Smckusic #endif PROFILE
1182109Smckusic
1192109Smckusic /*
1202109Smckusic * debugging variables
1212109Smckusic */
12230058Smckusick #ifdef PXDEBUG
1232109Smckusic char opc[10];
1242109Smckusic long opcptr = 9;
12530058Smckusick #endif PXDEBUG
1262109Smckusic
12736537Smckusick void
interpreter(base)1282080Smckusick interpreter(base)
1292080Smckusick char *base;
1302080Smckusick {
13136537Smckusick /* register */ union progcntr pc; /* interpreted program cntr */
1322080Smckusick struct iorec *curfile; /* active file */
13310576Smckusick register struct blockmark *stp; /* active stack frame ptr */
1342080Smckusick /*
1352080Smckusick * the following variables are used as scratch
1362080Smckusick */
1372239Smckusic register char *tcp;
13810576Smckusick register short *tsp;
13930057Smckusick register long tl, tl1, tl2, tl3;
14036537Smckusick char *tcp2;
14136537Smckusick long tl4;
1422080Smckusick double td, td1;
1432239Smckusic struct sze8 t8;
14410576Smckusick register short *tsp1;
14530057Smckusick long *tlp;
14610576Smckusick char *tcp1;
1472950Smckusic bool tb;
14810576Smckusick struct blockmark *tstp;
14910576Smckusick register struct formalrtn *tfp;
1502080Smckusick struct iorec **ip;
15110792Smckusick int mypid;
15236537Smckusick int ti, ti2;
15336537Smckusick short ts;
15436537Smckusick FILE *tf;
15536537Smckusick /* register */ union progcntr stack; /* Interpreted stack */
1562080Smckusick
15710792Smckusick mypid = getpid();
1585658Slinton
1592080Smckusick /*
1602239Smckusic * Setup sets up any hardware specific parameters before
16136537Smckusick * starting the interpreter. Typically this is macro- or inline-
16236537Smckusick * replaced by "machdep.h" or interp.sed.
1632239Smckusic */
16436537Smckusick setup();
1652239Smckusic /*
1662080Smckusick * necessary only on systems which do not initialize
1672080Smckusick * memory to zero
1682080Smckusick */
1692080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1702080Smckusick /* void */;
1712080Smckusick /*
1722080Smckusick * set up global environment, then ``call'' the main program
1732080Smckusick */
17430057Smckusick STACKALIGN(tl, 2 * sizeof(struct iorec *));
17530057Smckusick _display.frame[0].locvars = pushsp(tl);
1762950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *);
1772950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1782950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
17930057Smckusick STACKALIGN(tl, sizeof(struct blockmark));
18030057Smckusick stp = (struct blockmark *)pushsp(tl);
1812109Smckusic _dp = &_display.frame[0];
1822080Smckusick pc.cp = base;
1835658Slinton
1842080Smckusick for(;;) {
18530058Smckusick # ifdef PXDEBUG
1862080Smckusick if (++opcptr == 10)
1872080Smckusick opcptr = 0;
1882080Smckusick opc[opcptr] = *pc.ucp;
18930058Smckusick # endif PXDEBUG
1902109Smckusic # ifdef PROFILE
1912109Smckusic _profcnts[*pc.ucp]++;
1922109Smckusic # endif PROFILE
19336537Smckusick
19436537Smckusick /*
19536537Smckusick * Save away the program counter to a fixed location for pdx.
19636537Smckusick */
19736537Smckusick pdx_pc = pc;
19836537Smckusick
19936537Smckusick /*
20036537Smckusick * Having the label below makes dbx not work
20136537Smckusick * to debug this interpreter,
20236537Smckusick * since it thinks a new function called loopaddr()
20336537Smckusick * has started here, and it won't display the local
20436537Smckusick * variables of interpreter(). You have to compile
20536537Smckusick * -DDBX to avoid this problem...
20636537Smckusick */
20736537Smckusick # ifndef DBX
20836537Smckusick ;asm("_loopaddr:");
20936537Smckusick # endif DBX
21036537Smckusick
2112080Smckusick switch (*pc.ucp++) {
2125658Slinton case O_BPT: /* breakpoint trap */
2135873Slinton PFLUSH();
21410792Smckusick kill(mypid, SIGILL);
2155658Slinton pc.ucp--;
2165658Slinton continue;
2172080Smckusick case O_NODUMP:
2182191Smckusic _nodump = TRUE;
2192080Smckusick /* and fall through */
2202080Smckusick case O_BEG:
2212080Smckusick _dp += 1; /* enter local scope */
2222080Smckusick stp->odisp = *_dp; /* save old display value */
2232080Smckusick tl = *pc.ucp++; /* tl = name size */
2242080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */
2252191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
2262191Smckusic _lino = pc.hdrp->offset;
2272191Smckusic _runtst = pc.hdrp->tests;
2282191Smckusic disableovrflo();
2292191Smckusic if (_runtst)
2302191Smckusic enableovrflo();
2312950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */
2322080Smckusick stp->file = curfile; /* save active file */
23330057Smckusick STACKALIGN(tl2, tl1);
23430057Smckusick tcp = pushsp(tl2); /* tcp = new top of stack */
2352950Smckusic if (_runtst) /* zero stack frame */
2369231Smckusick blkclr(tcp, tl1);
2372950Smckusic tcp += (int)tl1; /* offsets of locals are neg */
2382109Smckusic _dp->locvars = tcp; /* set new display pointer */
2392109Smckusic _dp->stp = stp;
2402950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */
2412080Smckusick continue;
2422080Smckusick case O_END:
2432080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */
2442080Smckusick stp = _dp->stp;
2452080Smckusick curfile = stp->file; /* restore old active file */
2462080Smckusick *_dp = stp->odisp; /* restore old display entry */
2472109Smckusic if (_dp == &_display.frame[1])
2482080Smckusick return; /* exiting main proc ??? */
2492080Smckusick _lino = stp->lino; /* restore lino, pc, dp */
25010576Smckusick pc.cp = stp->pc;
2512080Smckusick _dp = stp->dp;
2522191Smckusic _runtst = stp->entry->tests;
2532191Smckusic disableovrflo();
2542191Smckusic if (_runtst)
2552191Smckusic enableovrflo();
25630057Smckusick STACKALIGN(tl, stp->entry->framesze);
25730057Smckusick STACKALIGN(tl1, sizeof(struct blockmark));
25830057Smckusick popsp(tl + /* pop local vars */
25930057Smckusick tl1 + /* pop stack frame */
26030057Smckusick stp->entry->nargs);/* pop parms */
2612080Smckusick continue;
2622080Smckusick case O_CALL:
2632080Smckusick tl = *pc.cp++;
26430057Smckusick PCLONGVAL(tl1);
26530057Smckusick tcp = base + tl1 + sizeof(short);/* new entry point */
26630057Smckusick GETLONGVAL(tl1, tcp);
26730057Smckusick tcp = base + tl1;
26830057Smckusick STACKALIGN(tl1, sizeof(struct blockmark));
26930057Smckusick stp = (struct blockmark *)pushsp(tl1);
2702080Smckusick stp->lino = _lino; /* save lino, pc, dp */
27110576Smckusick stp->pc = pc.cp;
2722080Smckusick stp->dp = _dp;
2732109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */
2742080Smckusick pc.cp = tcp;
2752080Smckusick continue;
2762080Smckusick case O_FCALL:
2773294Smckusic pc.cp++;
2784016Smckusic tcp = popaddr(); /* ptr to display save area */
2792080Smckusick tfp = (struct formalrtn *)popaddr();
28030057Smckusick STACKALIGN(tl, sizeof(struct blockmark));
28130057Smckusick stp = (struct blockmark *)pushsp(tl);
2822080Smckusick stp->lino = _lino; /* save lino, pc, dp */
28310576Smckusick stp->pc = pc.cp;
2842080Smckusick stp->dp = _dp;
28510576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */
2863436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */
2879231Smckusick blkcpy(&_display.frame[1], tcp,
28810576Smckusick tfp->fbn * sizeof(struct dispsave));
2899231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1],
29010576Smckusick tfp->fbn * sizeof(struct dispsave));
2912080Smckusick continue;
2922080Smckusick case O_FRTN:
2932080Smckusick tl = *pc.cp++; /* tl = size of return obj */
2942080Smckusick if (tl == 0)
2952080Smckusick tl = *pc.usp++;
2962950Smckusic tcp = pushsp((long)(0));
2972080Smckusick tfp = *(struct formalrtn **)(tcp + tl);
2984016Smckusic tcp1 = *(char **)
2994016Smckusic (tcp + tl + sizeof(struct formalrtn *));
3003861Smckusic if (tl != 0) {
3019231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *)
3029231Smckusick + sizeof(char *), tl);
3033861Smckusic }
30430057Smckusick STACKALIGN(tl,
30530057Smckusick sizeof(struct formalrtn *) + sizeof (char *));
30630057Smckusick popsp(tl);
3079231Smckusick blkcpy(tcp1, &_display.frame[1],
30810576Smckusick tfp->fbn * sizeof(struct dispsave));
3092080Smckusick continue;
3102080Smckusick case O_FSAV:
3112080Smckusick tfp = (struct formalrtn *)popaddr();
3123436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */
31330057Smckusick PCLONGVAL(tl);
31430057Smckusick tcp = base + tl + sizeof(short);/* new entry point */
31530057Smckusick GETLONGVAL(tl, tcp);
31630057Smckusick tfp->fentryaddr = (long (*)())(base + tl);
3179231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0],
31810576Smckusick tfp->fbn * sizeof(struct dispsave));
3192080Smckusick pushaddr(tfp);
3202080Smckusick continue;
3212080Smckusick case O_SDUP2:
3222080Smckusick pc.cp++;
3232080Smckusick tl = pop2();
3242950Smckusic push2((short)(tl));
3252950Smckusic push2((short)(tl));
3262080Smckusick continue;
3272080Smckusick case O_SDUP4:
3282080Smckusick pc.cp++;
3292080Smckusick tl = pop4();
3302080Smckusick push4(tl);
3312080Smckusick push4(tl);
3322080Smckusick continue;
3332080Smckusick case O_TRA:
3342080Smckusick pc.cp++;
3352080Smckusick pc.cp += *pc.sp;
3362080Smckusick continue;
3372080Smckusick case O_TRA4:
3382080Smckusick pc.cp++;
33930057Smckusick PCLONGVAL(tl);
34030057Smckusick pc.cp = base + tl;
3412080Smckusick continue;
3422080Smckusick case O_GOTO:
3432109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to
3442109Smckusic exit frame */
34530057Smckusick PCLONGVAL(tl);
34630057Smckusick pc.cp = base + tl;
3472080Smckusick stp = _dp->stp;
3482080Smckusick while (tstp != stp) {
3492109Smckusic if (_dp == &_display.frame[1])
3503872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3512080Smckusick PCLOSE(_dp->locvars); /* close local files */
3522080Smckusick curfile = stp->file; /* restore active file */
3532080Smckusick *_dp = stp->odisp; /* old display entry */
3542080Smckusick _dp = stp->dp; /* restore dp */
3552080Smckusick stp = _dp->stp;
3562080Smckusick }
3572080Smckusick /* pop locals, stack frame, parms, and return values */
3582950Smckusic popsp((long)(stp->tos - pushsp((long)(0))));
3592080Smckusick continue;
3602080Smckusick case O_LINO:
3612950Smckusic if (_dp->stp->tos != pushsp((long)(0)))
3625682Smckusic ERROR("Panic: stack not empty between statements\n");
3632080Smckusick _lino = *pc.cp++; /* set line number */
3642080Smckusick if (_lino == 0)
3652080Smckusick _lino = *pc.sp++;
3662950Smckusic if (_runtst) {
3672950Smckusic LINO(); /* inc statement count */
3682950Smckusic continue;
3692950Smckusic }
3702950Smckusic _stcnt++;
3712080Smckusick continue;
3722080Smckusick case O_PUSH:
3732080Smckusick tl = *pc.cp++;
3742080Smckusick if (tl == 0)
37530057Smckusick PCLONGVAL(tl);
37630057Smckusick STACKALIGN(tl1, -tl);
37730057Smckusick tcp = pushsp(tl1);
3782950Smckusic if (_runtst)
37930057Smckusick blkclr(tcp, tl1);
3802080Smckusick continue;
3812080Smckusick case O_IF:
3822080Smckusick pc.cp++;
3832191Smckusic if (pop2()) {
3842080Smckusick pc.sp++;
3852191Smckusic continue;
3862191Smckusic }
3872191Smckusic pc.cp += *pc.sp;
3882080Smckusick continue;
3892080Smckusick case O_REL2:
3902080Smckusick tl = pop2();
3912080Smckusick tl1 = pop2();
3922080Smckusick goto cmplong;
3932080Smckusick case O_REL24:
3942080Smckusick tl = pop2();
3952080Smckusick tl1 = pop4();
3962080Smckusick goto cmplong;
3972080Smckusick case O_REL42:
3982080Smckusick tl = pop4();
3992080Smckusick tl1 = pop2();
4002080Smckusick goto cmplong;
4012080Smckusick case O_REL4:
4022080Smckusick tl = pop4();
4032080Smckusick tl1 = pop4();
4042080Smckusick cmplong:
4055682Smckusic switch (*pc.cp++) {
4062080Smckusick case releq:
4072080Smckusick push2(tl1 == tl);
4082080Smckusick continue;
4092080Smckusick case relne:
4102080Smckusick push2(tl1 != tl);
4112080Smckusick continue;
4122080Smckusick case rellt:
4132080Smckusick push2(tl1 < tl);
4142080Smckusick continue;
4152080Smckusick case relgt:
4162080Smckusick push2(tl1 > tl);
4172080Smckusick continue;
4182080Smckusick case relle:
4192080Smckusick push2(tl1 <= tl);
4202080Smckusick continue;
4212080Smckusick case relge:
4222080Smckusick push2(tl1 >= tl);
4232080Smckusick continue;
4242080Smckusick default:
4255682Smckusic ERROR("Panic: bad relation %d to REL4*\n",
4265682Smckusic *(pc.cp - 1));
4272080Smckusick continue;
4282080Smckusick }
4292080Smckusick case O_RELG:
4302080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */
4312080Smckusick tl = *pc.usp++; /* tl has comparison length */
43230057Smckusick STACKALIGN(tl1, tl); /* tl1 has arg stack length */
4332950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */
4342080Smckusick switch (tl2) {
4352080Smckusick case releq:
4362950Smckusic tb = RELEQ(tl, tcp + tl1, tcp);
4372080Smckusick break;
4382080Smckusick case relne:
4392950Smckusic tb = RELNE(tl, tcp + tl1, tcp);
4402080Smckusick break;
4412080Smckusick case rellt:
4422950Smckusic tb = RELSLT(tl, tcp + tl1, tcp);
4432080Smckusick break;
4442080Smckusick case relgt:
4452950Smckusic tb = RELSGT(tl, tcp + tl1, tcp);
4462080Smckusick break;
4472080Smckusick case relle:
4482950Smckusic tb = RELSLE(tl, tcp + tl1, tcp);
4492080Smckusick break;
4502080Smckusick case relge:
4512950Smckusic tb = RELSGE(tl, tcp + tl1, tcp);
4522080Smckusick break;
4532080Smckusick default:
4545682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2);
4552080Smckusick break;
4562080Smckusick }
4572080Smckusick popsp(tl1 << 1);
4582950Smckusic push2((short)(tb));
4592080Smckusick continue;
4602080Smckusick case O_RELT:
4612080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */
4622080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */
4632950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */
4642080Smckusick switch (tl2) {
4652080Smckusick case releq:
4662950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp);
4672080Smckusick break;
4682080Smckusick case relne:
4692950Smckusic tb = RELNE(tl1, tcp + tl1, tcp);
4702080Smckusick break;
4712080Smckusick case rellt:
4722950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp);
4732080Smckusick break;
4742080Smckusick case relgt:
4752950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp);
4762080Smckusick break;
4772080Smckusick case relle:
4782950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp);
4792080Smckusick break;
4802080Smckusick case relge:
4812950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp);
4822080Smckusick break;
4832080Smckusick default:
4845682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2);
4852080Smckusick break;
4862080Smckusick }
48730057Smckusick STACKALIGN(tl, tl1);
48830057Smckusick popsp(tl << 1);
4892950Smckusic push2((short)(tb));
4902080Smckusick continue;
4912080Smckusick case O_REL28:
4922080Smckusick td = pop2();
4932080Smckusick td1 = pop8();
4942080Smckusick goto cmpdbl;
4952080Smckusick case O_REL48:
4962080Smckusick td = pop4();
4972080Smckusick td1 = pop8();
4982080Smckusick goto cmpdbl;
4992080Smckusick case O_REL82:
5002080Smckusick td = pop8();
5012080Smckusick td1 = pop2();
5022080Smckusick goto cmpdbl;
5032080Smckusick case O_REL84:
5042080Smckusick td = pop8();
5052080Smckusick td1 = pop4();
5062080Smckusick goto cmpdbl;
5072080Smckusick case O_REL8:
5082080Smckusick td = pop8();
5092080Smckusick td1 = pop8();
5102080Smckusick cmpdbl:
5112080Smckusick switch (*pc.cp++) {
5122080Smckusick case releq:
5132080Smckusick push2(td1 == td);
5142080Smckusick continue;
5152080Smckusick case relne:
5162080Smckusick push2(td1 != td);
5172080Smckusick continue;
5182080Smckusick case rellt:
5192080Smckusick push2(td1 < td);
5202080Smckusick continue;
5212080Smckusick case relgt:
5222080Smckusick push2(td1 > td);
5232080Smckusick continue;
5242080Smckusick case relle:
5252080Smckusick push2(td1 <= td);
5262080Smckusick continue;
5272080Smckusick case relge:
5282080Smckusick push2(td1 >= td);
5292080Smckusick continue;
5302080Smckusick default:
5315682Smckusic ERROR("Panic: bad relation %d to REL8*\n",
5325682Smckusic *(pc.cp - 1));
5332080Smckusick continue;
5342080Smckusick }
5352080Smckusick case O_AND:
5362080Smckusick pc.cp++;
53710576Smckusick tl = pop2();
53810576Smckusick tl1 = pop2();
53910787Smckusick push2(tl1 & tl);
5402080Smckusick continue;
5412080Smckusick case O_OR:
5422080Smckusick pc.cp++;
54310576Smckusick tl = pop2();
54410576Smckusick tl1 = pop2();
54510787Smckusick push2(tl1 | tl);
5462080Smckusick continue;
5472080Smckusick case O_NOT:
5482080Smckusick pc.cp++;
54910576Smckusick tl = pop2();
55010576Smckusick push2(tl ^ 1);
5512080Smckusick continue;
5522080Smckusick case O_AS2:
5532080Smckusick pc.cp++;
5542080Smckusick tl = pop2();
5552080Smckusick *(short *)popaddr() = tl;
5562080Smckusick continue;
5572080Smckusick case O_AS4:
5582080Smckusick pc.cp++;
5592080Smckusick tl = pop4();
5602080Smckusick *(long *)popaddr() = tl;
5612080Smckusick continue;
5622080Smckusick case O_AS24:
5632080Smckusick pc.cp++;
5642080Smckusick tl = pop2();
5652080Smckusick *(long *)popaddr() = tl;
5662080Smckusick continue;
5672080Smckusick case O_AS42:
5682080Smckusick pc.cp++;
5692080Smckusick tl = pop4();
5702080Smckusick *(short *)popaddr() = tl;
5712080Smckusick continue;
5722080Smckusick case O_AS21:
5732080Smckusick pc.cp++;
5742080Smckusick tl = pop2();
5752080Smckusick *popaddr() = tl;
5762080Smckusick continue;
5772080Smckusick case O_AS41:
5782080Smckusick pc.cp++;
5792080Smckusick tl = pop4();
5802080Smckusick *popaddr() = tl;
5812080Smckusick continue;
5822080Smckusick case O_AS28:
5832080Smckusick pc.cp++;
5842080Smckusick tl = pop2();
5852080Smckusick *(double *)popaddr() = tl;
5862080Smckusick continue;
5872080Smckusick case O_AS48:
5882080Smckusick pc.cp++;
5892080Smckusick tl = pop4();
5902080Smckusick *(double *)popaddr() = tl;
5912080Smckusick continue;
5922080Smckusick case O_AS8:
5932080Smckusick pc.cp++;
5942239Smckusic t8 = popsze8();
5952239Smckusic *(struct sze8 *)popaddr() = t8;
5962080Smckusick continue;
5972080Smckusick case O_AS:
5982080Smckusick tl = *pc.cp++;
5992080Smckusick if (tl == 0)
6002080Smckusick tl = *pc.usp++;
60130057Smckusick STACKALIGN(tl1, tl);
6022950Smckusic tcp = pushsp((long)(0));
6039231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl);
6042080Smckusick popsp(tl1 + sizeof(char *));
6052080Smckusick continue;
60615976Smckusick case O_VAS:
60715976Smckusick pc.cp++;
60815976Smckusick tl = pop4();
60915976Smckusick tcp1 = popaddr();
61015976Smckusick tcp = popaddr();
61115976Smckusick blkcpy(tcp1, tcp, tl);
61215976Smckusick continue;
6132080Smckusick case O_INX2P2:
6142080Smckusick tl = *pc.cp++; /* tl has shift amount */
61510576Smckusick tl1 = pop2();
61610576Smckusick tl1 = (tl1 - *pc.sp++) << tl;
61710576Smckusick tcp = popaddr();
61810576Smckusick pushaddr(tcp + tl1);
6192080Smckusick continue;
6202080Smckusick case O_INX4P2:
6212080Smckusick tl = *pc.cp++; /* tl has shift amount */
62210576Smckusick tl1 = pop4();
62310576Smckusick tl1 = (tl1 - *pc.sp++) << tl;
62410576Smckusick tcp = popaddr();
62510576Smckusick pushaddr(tcp + tl1);
6262080Smckusick continue;
6272080Smckusick case O_INX2:
6282080Smckusick tl = *pc.cp++; /* tl has element size */
6292080Smckusick if (tl == 0)
6302080Smckusick tl = *pc.usp++;
6312080Smckusick tl1 = pop2(); /* index */
6322080Smckusick tl2 = *pc.sp++;
63310576Smckusick tcp = popaddr();
63410576Smckusick pushaddr(tcp + (tl1 - tl2) * tl);
6352191Smckusic tl = *pc.usp++;
6362191Smckusic if (_runtst)
6372191Smckusic SUBSC(tl1, tl2, tl); /* range check */
6382080Smckusick continue;
6392080Smckusick case O_INX4:
6402080Smckusick tl = *pc.cp++; /* tl has element size */
6412080Smckusick if (tl == 0)
6422080Smckusick tl = *pc.usp++;
6432080Smckusick tl1 = pop4(); /* index */
6442080Smckusick tl2 = *pc.sp++;
64510576Smckusick tcp = popaddr();
64610576Smckusick pushaddr(tcp + (tl1 - tl2) * tl);
6472191Smckusic tl = *pc.usp++;
6482191Smckusic if (_runtst)
6492191Smckusic SUBSC(tl1, tl2, tl); /* range check */
6502080Smckusick continue;
65115976Smckusick case O_VINX2:
65215976Smckusick pc.cp++;
65315976Smckusick tl = pop2(); /* tl has element size */
65415976Smckusick tl1 = pop2(); /* upper bound */
65515976Smckusick tl2 = pop2(); /* lower bound */
65615976Smckusick tl3 = pop2(); /* index */
65715976Smckusick tcp = popaddr();
65815976Smckusick pushaddr(tcp + (tl3 - tl2) * tl);
65915976Smckusick if (_runtst)
66015976Smckusick SUBSC(tl3, tl2, tl1); /* range check */
66115976Smckusick continue;
66215976Smckusick case O_VINX24:
66315976Smckusick pc.cp++;
66415976Smckusick tl = pop2(); /* tl has element size */
66515976Smckusick tl1 = pop2(); /* upper bound */
66615976Smckusick tl2 = pop2(); /* lower bound */
66715976Smckusick tl3 = pop4(); /* index */
66815976Smckusick tcp = popaddr();
66915976Smckusick pushaddr(tcp + (tl3 - tl2) * tl);
67015976Smckusick if (_runtst)
67115976Smckusick SUBSC(tl3, tl2, tl1); /* range check */
67215976Smckusick continue;
67315976Smckusick case O_VINX42:
67415976Smckusick pc.cp++;
67515976Smckusick tl = pop4(); /* tl has element size */
67615976Smckusick tl1 = pop4(); /* upper bound */
67715976Smckusick tl2 = pop4(); /* lower bound */
67815976Smckusick tl3 = pop2(); /* index */
67915976Smckusick tcp = popaddr();
68015976Smckusick pushaddr(tcp + (tl3 - tl2) * tl);
68115976Smckusick if (_runtst)
68215976Smckusick SUBSC(tl3, tl2, tl1); /* range check */
68315976Smckusick continue;
68415976Smckusick case O_VINX4:
68515976Smckusick pc.cp++;
68615976Smckusick tl = pop4(); /* tl has element size */
68715976Smckusick tl1 = pop4(); /* upper bound */
68815976Smckusick tl2 = pop4(); /* lower bound */
68915976Smckusick tl3 = pop4(); /* index */
69015976Smckusick tcp = popaddr();
69115976Smckusick pushaddr(tcp + (tl3 - tl2) * tl);
69215976Smckusick if (_runtst)
69315976Smckusick SUBSC(tl3, tl2, tl1); /* range check */
69415976Smckusick continue;
6952080Smckusick case O_OFF:
6962080Smckusick tl = *pc.cp++;
6972080Smckusick if (tl == 0)
6982080Smckusick tl = *pc.usp++;
69910576Smckusick tcp = popaddr();
70010576Smckusick pushaddr(tcp + tl);
7012080Smckusick continue;
7022080Smckusick case O_NIL:
7032080Smckusick pc.cp++;
70424938Smckusick tcp = popaddr();
70524938Smckusick NIL(tcp);
70624938Smckusick pushaddr(tcp);
7072080Smckusick continue;
7082080Smckusick case O_ADD2:
7092080Smckusick pc.cp++;
71010576Smckusick tl = pop2();
71110576Smckusick tl1 = pop2();
71210576Smckusick push4(tl1 + tl);
7132080Smckusick continue;
7142080Smckusick case O_ADD4:
7152080Smckusick pc.cp++;
71610576Smckusick tl = pop4();
71710576Smckusick tl1 = pop4();
71810576Smckusick push4(tl1 + tl);
7192080Smckusick continue;
7202080Smckusick case O_ADD24:
7212080Smckusick pc.cp++;
7222080Smckusick tl = pop2();
72310576Smckusick tl1 = pop4();
72410576Smckusick push4(tl1 + tl);
7252080Smckusick continue;
7262080Smckusick case O_ADD42:
7272080Smckusick pc.cp++;
7282080Smckusick tl = pop4();
72910576Smckusick tl1 = pop2();
73010576Smckusick push4(tl1 + tl);
7312080Smckusick continue;
7322080Smckusick case O_ADD28:
7332080Smckusick pc.cp++;
7342080Smckusick tl = pop2();
73510576Smckusick td = pop8();
73610576Smckusick push8(td + tl);
7372080Smckusick continue;
7382080Smckusick case O_ADD48:
7392080Smckusick pc.cp++;
7402080Smckusick tl = pop4();
74110576Smckusick td = pop8();
74210576Smckusick push8(td + tl);
7432080Smckusick continue;
7442080Smckusick case O_ADD82:
7452080Smckusick pc.cp++;
7462080Smckusick td = pop8();
74710576Smckusick td1 = pop2();
74810576Smckusick push8(td1 + td);
7492080Smckusick continue;
7502080Smckusick case O_ADD84:
7512080Smckusick pc.cp++;
7522080Smckusick td = pop8();
75310576Smckusick td1 = pop4();
75410576Smckusick push8(td1 + td);
7552080Smckusick continue;
7562080Smckusick case O_SUB2:
7572080Smckusick pc.cp++;
7582080Smckusick tl = pop2();
75910576Smckusick tl1 = pop2();
76010576Smckusick push4(tl1 - tl);
7612080Smckusick continue;
7622080Smckusick case O_SUB4:
7632080Smckusick pc.cp++;
7642080Smckusick tl = pop4();
76510576Smckusick tl1 = pop4();
76610576Smckusick push4(tl1 - tl);
7672080Smckusick continue;
7682080Smckusick case O_SUB24:
7692080Smckusick pc.cp++;
7702080Smckusick tl = pop2();
77110576Smckusick tl1 = pop4();
77210576Smckusick push4(tl1 - tl);
7732080Smckusick continue;
7742080Smckusick case O_SUB42:
7752080Smckusick pc.cp++;
7762080Smckusick tl = pop4();
77710576Smckusick tl1 = pop2();
77810576Smckusick push4(tl1 - tl);
7792080Smckusick continue;
7802080Smckusick case O_SUB28:
7812080Smckusick pc.cp++;
7822080Smckusick tl = pop2();
78310576Smckusick td = pop8();
78410576Smckusick push8(td - tl);
7852080Smckusick continue;
7862080Smckusick case O_SUB48:
7872080Smckusick pc.cp++;
7882080Smckusick tl = pop4();
78910576Smckusick td = pop8();
79010576Smckusick push8(td - tl);
7912080Smckusick continue;
7922080Smckusick case O_SUB82:
7932080Smckusick pc.cp++;
7942080Smckusick td = pop8();
79510576Smckusick td1 = pop2();
79610576Smckusick push8(td1 - td);
7972080Smckusick continue;
7982080Smckusick case O_SUB84:
7992080Smckusick pc.cp++;
8002080Smckusick td = pop8();
80110576Smckusick td1 = pop4();
80210576Smckusick push8(td1 - td);
8032080Smckusick continue;
8042080Smckusick case O_MUL2:
8052080Smckusick pc.cp++;
80610576Smckusick tl = pop2();
80710576Smckusick tl1 = pop2();
80810576Smckusick push4(tl1 * tl);
8092080Smckusick continue;
8102080Smckusick case O_MUL4:
8112080Smckusick pc.cp++;
81210576Smckusick tl = pop4();
81310576Smckusick tl1 = pop4();
81410576Smckusick push4(tl1 * tl);
8152080Smckusick continue;
8162080Smckusick case O_MUL24:
8172080Smckusick pc.cp++;
8182080Smckusick tl = pop2();
81910576Smckusick tl1 = pop4();
82010576Smckusick push4(tl1 * tl);
8212080Smckusick continue;
8222080Smckusick case O_MUL42:
8232080Smckusick pc.cp++;
8242080Smckusick tl = pop4();
82510576Smckusick tl1 = pop2();
82610576Smckusick push4(tl1 * tl);
8272080Smckusick continue;
8282080Smckusick case O_MUL28:
8292080Smckusick pc.cp++;
8302080Smckusick tl = pop2();
83110576Smckusick td = pop8();
83210576Smckusick push8(td * tl);
8332080Smckusick continue;
8342080Smckusick case O_MUL48:
8352080Smckusick pc.cp++;
8362080Smckusick tl = pop4();
83710576Smckusick td = pop8();
83810576Smckusick push8(td * tl);
8392080Smckusick continue;
8402080Smckusick case O_MUL82:
8412080Smckusick pc.cp++;
8422080Smckusick td = pop8();
84310576Smckusick td1 = pop2();
84410576Smckusick push8(td1 * td);
8452080Smckusick continue;
8462080Smckusick case O_MUL84:
8472080Smckusick pc.cp++;
8482080Smckusick td = pop8();
84910576Smckusick td1 = pop4();
85010576Smckusick push8(td1 * td);
8512080Smckusick continue;
8522080Smckusick case O_ABS2:
8532080Smckusick case O_ABS4:
8542080Smckusick pc.cp++;
8552080Smckusick tl = pop4();
8562080Smckusick push4(tl >= 0 ? tl : -tl);
8572080Smckusick continue;
8582080Smckusick case O_ABS8:
8592080Smckusick pc.cp++;
8602080Smckusick td = pop8();
8612080Smckusick push8(td >= 0.0 ? td : -td);
8622080Smckusick continue;
8632080Smckusick case O_NEG2:
8642080Smckusick pc.cp++;
86536537Smckusick ts = -pop2();
86636537Smckusick push4((long)ts);
8672080Smckusick continue;
8682080Smckusick case O_NEG4:
8692080Smckusick pc.cp++;
87036537Smckusick tl = -pop4();
87136537Smckusick push4(tl);
8722080Smckusick continue;
8732080Smckusick case O_NEG8:
8742080Smckusick pc.cp++;
87536537Smckusick td = -pop8();
87636537Smckusick push8(td);
8772080Smckusick continue;
8782080Smckusick case O_DIV2:
8792080Smckusick pc.cp++;
8802080Smckusick tl = pop2();
88110576Smckusick tl1 = pop2();
88210576Smckusick push4(tl1 / tl);
8832080Smckusick continue;
8842080Smckusick case O_DIV4:
8852080Smckusick pc.cp++;
8862080Smckusick tl = pop4();
88710576Smckusick tl1 = pop4();
88810576Smckusick push4(tl1 / tl);
8892080Smckusick continue;
8902080Smckusick case O_DIV24:
8912080Smckusick pc.cp++;
8922080Smckusick tl = pop2();
89310576Smckusick tl1 = pop4();
89410576Smckusick push4(tl1 / tl);
8952080Smckusick continue;
8962080Smckusick case O_DIV42:
8972080Smckusick pc.cp++;
8982080Smckusick tl = pop4();
89910576Smckusick tl1 = pop2();
90010576Smckusick push4(tl1 / tl);
9012080Smckusick continue;
9022080Smckusick case O_MOD2:
9032080Smckusick pc.cp++;
9042080Smckusick tl = pop2();
90510576Smckusick tl1 = pop2();
90610576Smckusick push4(tl1 % tl);
9072080Smckusick continue;
9082080Smckusick case O_MOD4:
9092080Smckusick pc.cp++;
9102080Smckusick tl = pop4();
91110576Smckusick tl1 = pop4();
91210576Smckusick push4(tl1 % tl);
9132080Smckusick continue;
9142080Smckusick case O_MOD24:
9152080Smckusick pc.cp++;
9162080Smckusick tl = pop2();
91710576Smckusick tl1 = pop4();
91810576Smckusick push4(tl1 % tl);
9192080Smckusick continue;
9202080Smckusick case O_MOD42:
9212080Smckusick pc.cp++;
9222080Smckusick tl = pop4();
92310576Smckusick tl1 = pop2();
92410576Smckusick push4(tl1 % tl);
9252080Smckusick continue;
9262080Smckusick case O_ADD8:
9272080Smckusick pc.cp++;
92810576Smckusick td = pop8();
92910576Smckusick td1 = pop8();
93010787Smckusick push8(td1 + td);
9312080Smckusick continue;
9322080Smckusick case O_SUB8:
9332080Smckusick pc.cp++;
9342080Smckusick td = pop8();
93510576Smckusick td1 = pop8();
93610787Smckusick push8(td1 - td);
9372080Smckusick continue;
9382080Smckusick case O_MUL8:
9392080Smckusick pc.cp++;
94010576Smckusick td = pop8();
94110576Smckusick td1 = pop8();
94210787Smckusick push8(td1 * td);
9432080Smckusick continue;
9442080Smckusick case O_DVD8:
9452080Smckusick pc.cp++;
9462080Smckusick td = pop8();
94710576Smckusick td1 = pop8();
94810787Smckusick push8(td1 / td);
9492080Smckusick continue;
9502080Smckusick case O_STOI:
9512080Smckusick pc.cp++;
95236537Smckusick ts = pop2();
95336537Smckusick push4((long)ts);
9542080Smckusick continue;
9552080Smckusick case O_STOD:
9562080Smckusick pc.cp++;
9572080Smckusick td = pop2();
9582080Smckusick push8(td);
9592080Smckusick continue;
9602080Smckusick case O_ITOD:
9612080Smckusick pc.cp++;
9622080Smckusick td = pop4();
9632080Smckusick push8(td);
9642080Smckusick continue;
9652080Smckusick case O_ITOS:
9662080Smckusick pc.cp++;
96736537Smckusick tl = pop4();
96836537Smckusick push2((short)tl);
9692080Smckusick continue;
9702080Smckusick case O_DVD2:
9712080Smckusick pc.cp++;
9722080Smckusick td = pop2();
97310576Smckusick td1 = pop2();
97410576Smckusick push8(td1 / td);
9752080Smckusick continue;
9762080Smckusick case O_DVD4:
9772080Smckusick pc.cp++;
9782080Smckusick td = pop4();
97910576Smckusick td1 = pop4();
98010576Smckusick push8(td1 / td);
9812080Smckusick continue;
9822080Smckusick case O_DVD24:
9832080Smckusick pc.cp++;
9842080Smckusick td = pop2();
98510576Smckusick td1 = pop4();
98610576Smckusick push8(td1 / td);
9872080Smckusick continue;
9882080Smckusick case O_DVD42:
9892080Smckusick pc.cp++;
9902080Smckusick td = pop4();
99110576Smckusick td1 = pop2();
99210576Smckusick push8(td1 / td);
9932080Smckusick continue;
9942080Smckusick case O_DVD28:
9952080Smckusick pc.cp++;
9962080Smckusick td = pop2();
99710576Smckusick td1 = pop8();
99810576Smckusick push8(td1 / td);
9992080Smckusick continue;
10002080Smckusick case O_DVD48:
10012080Smckusick pc.cp++;
100210787Smckusick td = pop4();
100310787Smckusick td1 = pop8();
100410787Smckusick push8(td1 / td);
10052080Smckusick continue;
10062080Smckusick case O_DVD82:
10072080Smckusick pc.cp++;
10082080Smckusick td = pop8();
100910576Smckusick td1 = pop2();
101010576Smckusick push8(td1 / td);
10112080Smckusick continue;
10122080Smckusick case O_DVD84:
10132080Smckusick pc.cp++;
10142080Smckusick td = pop8();
101510576Smckusick td1 = pop4();
101610576Smckusick push8(td1 / td);
10172080Smckusick continue;
10182080Smckusick case O_RV1:
10192109Smckusic tcp = _display.raw[*pc.ucp++];
10202950Smckusic push2((short)(*(tcp + *pc.sp++)));
10212080Smckusick continue;
10222080Smckusick case O_RV14:
10232109Smckusic tcp = _display.raw[*pc.ucp++];
10242950Smckusic push4((long)(*(tcp + *pc.sp++)));
10252080Smckusick continue;
10262080Smckusick case O_RV2:
10272109Smckusic tcp = _display.raw[*pc.ucp++];
10282080Smckusick push2(*(short *)(tcp + *pc.sp++));
10292080Smckusick continue;
10302080Smckusick case O_RV24:
10312109Smckusic tcp = _display.raw[*pc.ucp++];
10322950Smckusic push4((long)(*(short *)(tcp + *pc.sp++)));
10332080Smckusick continue;
10342080Smckusick case O_RV4:
10352109Smckusic tcp = _display.raw[*pc.ucp++];
10362080Smckusick push4(*(long *)(tcp + *pc.sp++));
10372080Smckusick continue;
10382080Smckusick case O_RV8:
10392109Smckusic tcp = _display.raw[*pc.ucp++];
10402239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
10412080Smckusick continue;
10422080Smckusick case O_RV:
10432109Smckusic tcp = _display.raw[*pc.ucp++];
10442080Smckusick tcp += *pc.sp++;
10452080Smckusick tl = *pc.usp++;
104630057Smckusick STACKALIGN(tl1, tl);
104730057Smckusick tcp1 = pushsp(tl1);
10489231Smckusick blkcpy(tcp, tcp1, tl);
10492080Smckusick continue;
10502080Smckusick case O_LV:
10512109Smckusic tcp = _display.raw[*pc.ucp++];
10522080Smckusick pushaddr(tcp + *pc.sp++);
10532080Smckusick continue;
10542080Smckusick case O_LRV1:
10552109Smckusic tcp = _display.raw[*pc.ucp++];
105630057Smckusick PCLONGVAL(tl);
105730057Smckusick push2((short)(*(tcp + tl)));
10582080Smckusick continue;
10592080Smckusick case O_LRV14:
10602109Smckusic tcp = _display.raw[*pc.ucp++];
106130057Smckusick PCLONGVAL(tl);
106230057Smckusick push4((long)(*(tcp + tl)));
10632080Smckusick continue;
10642080Smckusick case O_LRV2:
10652109Smckusic tcp = _display.raw[*pc.ucp++];
106630057Smckusick PCLONGVAL(tl);
106730057Smckusick push2(*(short *)(tcp + tl));
10682080Smckusick continue;
10692080Smckusick case O_LRV24:
10702109Smckusic tcp = _display.raw[*pc.ucp++];
107130057Smckusick PCLONGVAL(tl);
107230057Smckusick push4((long)(*(short *)(tcp + tl)));
10732080Smckusick continue;
10742080Smckusick case O_LRV4:
10752109Smckusic tcp = _display.raw[*pc.ucp++];
107630057Smckusick PCLONGVAL(tl);
107730057Smckusick push4(*(long *)(tcp + tl));
10782080Smckusick continue;
10792080Smckusick case O_LRV8:
10802109Smckusic tcp = _display.raw[*pc.ucp++];
108130057Smckusick PCLONGVAL(tl);
108230057Smckusick pushsze8(*(struct sze8 *)(tcp + tl));
10832080Smckusick continue;
10842080Smckusick case O_LRV:
10852109Smckusic tcp = _display.raw[*pc.ucp++];
108630057Smckusick PCLONGVAL(tl);
108730057Smckusick tcp += tl;
10882080Smckusick tl = *pc.usp++;
108930057Smckusick STACKALIGN(tl1, tl);
109030057Smckusick tcp1 = pushsp(tl1);
10919231Smckusick blkcpy(tcp, tcp1, tl);
10922080Smckusick continue;
10932080Smckusick case O_LLV:
10942109Smckusic tcp = _display.raw[*pc.ucp++];
109530057Smckusick PCLONGVAL(tl);
109630057Smckusick pushaddr(tcp + tl);
10972080Smckusick continue;
10982080Smckusick case O_IND1:
10992080Smckusick pc.cp++;
110036537Smckusick ts = *popaddr();
110136537Smckusick push2(ts);
11022080Smckusick continue;
11032080Smckusick case O_IND14:
11042080Smckusick pc.cp++;
110536537Smckusick ti = *popaddr();
110636537Smckusick push4((long)ti);
11072080Smckusick continue;
11082080Smckusick case O_IND2:
11092080Smckusick pc.cp++;
111036537Smckusick ts = *(short *)(popaddr());
111136537Smckusick push2(ts);
11122080Smckusick continue;
11132080Smckusick case O_IND24:
11142080Smckusick pc.cp++;
111536537Smckusick ts = *(short *)(popaddr());
111636537Smckusick push4((long)ts);
11172080Smckusick continue;
11182080Smckusick case O_IND4:
11192080Smckusick pc.cp++;
112036537Smckusick tl = *(long *)(popaddr());
112136537Smckusick push4(tl);
11222080Smckusick continue;
11232080Smckusick case O_IND8:
11242080Smckusick pc.cp++;
112536537Smckusick t8 = *(struct sze8 *)(popaddr());
112636537Smckusick pushsze8(t8);
11272080Smckusick continue;
11282080Smckusick case O_IND:
11292080Smckusick tl = *pc.cp++;
11302080Smckusick if (tl == 0)
11312080Smckusick tl = *pc.usp++;
11322080Smckusick tcp = popaddr();
113330057Smckusick STACKALIGN(tl1, tl);
113430057Smckusick tcp1 = pushsp(tl1);
11359231Smckusick blkcpy(tcp, tcp1, tl);
11362080Smckusick continue;
11372080Smckusick case O_CON1:
11382950Smckusic push2((short)(*pc.cp++));
11392080Smckusick continue;
11402080Smckusick case O_CON14:
11412950Smckusic push4((long)(*pc.cp++));
11422080Smckusick continue;
11432080Smckusick case O_CON2:
11442080Smckusick pc.cp++;
11452080Smckusick push2(*pc.sp++);
11462080Smckusick continue;
11472080Smckusick case O_CON24:
11482080Smckusick pc.cp++;
11492950Smckusic push4((long)(*pc.sp++));
11502080Smckusick continue;
11512080Smckusick case O_CON4:
11522080Smckusick pc.cp++;
115330057Smckusick PCLONGVAL(tl);
115430057Smckusick push4(tl);
11552080Smckusick continue;
11562080Smckusick case O_CON8:
11572080Smckusick pc.cp++;
115830057Smckusick tcp = pushsp(sizeof(double));
115930057Smckusick blkcpy(pc.cp, tcp, sizeof(double));
116030057Smckusick pc.dbp++;
11612080Smckusick continue;
11622080Smckusick case O_CON:
11632080Smckusick tl = *pc.cp++;
11642080Smckusick if (tl == 0)
11652080Smckusick tl = *pc.usp++;
116630057Smckusick STACKALIGN(tl1, tl);
116730057Smckusick tcp = pushsp(tl1);
11689231Smckusick blkcpy(pc.cp, tcp, tl);
11692950Smckusic pc.cp += (int)tl;
11702080Smckusick continue;
11712950Smckusic case O_CONG:
11722950Smckusic tl = *pc.cp++;
11732950Smckusic if (tl == 0)
11742950Smckusic tl = *pc.usp++;
117530057Smckusick STACKALIGN(tl1, tl);
11762950Smckusic tcp = pushsp(tl1);
11779231Smckusick blkcpy(pc.cp, tcp, tl1);
11782950Smckusic pc.cp += (int)((tl + 2) & ~1);
11792950Smckusic continue;
11802080Smckusick case O_LVCON:
11812080Smckusick tl = *pc.cp++;
11822080Smckusick if (tl == 0)
11832080Smckusick tl = *pc.usp++;
118430057Smckusick pushaddr(pc.cp);
11852080Smckusick tl = (tl + 1) & ~1;
11862950Smckusic pc.cp += (int)tl;
11872080Smckusick continue;
11882080Smckusick case O_RANG2:
11892080Smckusick tl = *pc.cp++;
11902080Smckusick if (tl == 0)
11912080Smckusick tl = *pc.sp++;
11922080Smckusick tl1 = pop2();
11934026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
11942080Smckusick continue;
11952080Smckusick case O_RANG42:
11962080Smckusick tl = *pc.cp++;
11972080Smckusick if (tl == 0)
11982080Smckusick tl = *pc.sp++;
11992080Smckusick tl1 = pop4();
12004026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++)));
12012080Smckusick continue;
12022080Smckusick case O_RSNG2:
12032080Smckusick tl = *pc.cp++;
12042080Smckusick if (tl == 0)
12052080Smckusick tl = *pc.sp++;
12062080Smckusick tl1 = pop2();
12072950Smckusic push2((short)(RSNG4(tl1, tl)));
12082080Smckusick continue;
12092080Smckusick case O_RSNG42:
12102080Smckusick tl = *pc.cp++;
12112080Smckusick if (tl == 0)
12122080Smckusick tl = *pc.sp++;
12132080Smckusick tl1 = pop4();
12142080Smckusick push4(RSNG4(tl1, tl));
12152080Smckusick continue;
12162080Smckusick case O_RANG4:
12174026Smckusic tl = *pc.cp++;
12184026Smckusic if (tl == 0)
121930057Smckusick PCLONGVAL(tl);
12202080Smckusick tl1 = pop4();
122130057Smckusick PCLONGVAL(tl2);
122230057Smckusick push4(RANG4(tl1, tl, tl2));
12232080Smckusick continue;
12242080Smckusick case O_RANG24:
12254026Smckusic tl = *pc.cp++;
12264026Smckusic if (tl == 0)
122730057Smckusick PCLONGVAL(tl);
12282080Smckusick tl1 = pop2();
122930057Smckusick PCLONGVAL(tl2);
123030057Smckusick push2((short)(RANG4(tl1, tl, tl2)));
12312080Smckusick continue;
12322080Smckusick case O_RSNG4:
12334026Smckusic tl = *pc.cp++;
12344026Smckusic if (tl == 0)
123530057Smckusick PCLONGVAL(tl);
12364026Smckusic tl1 = pop4();
12374026Smckusic push4(RSNG4(tl1, tl));
12382080Smckusick continue;
12392080Smckusick case O_RSNG24:
12404026Smckusic tl = *pc.cp++;
12414026Smckusic if (tl == 0)
124230057Smckusick PCLONGVAL(tl);
12434026Smckusic tl1 = pop2();
12444026Smckusic push2((short)(RSNG4(tl1, tl)));
12452080Smckusick continue;
12462080Smckusick case O_STLIM:
12472080Smckusick pc.cp++;
124836537Smckusick tl = pop4();
124936537Smckusick STLIM(tl);
12502080Smckusick continue;
12512080Smckusick case O_LLIMIT:
12522080Smckusick pc.cp++;
125336537Smckusick tcp = popaddr();
125436537Smckusick tl = pop4();
125536537Smckusick LLIMIT(tcp, tl);
12562080Smckusick continue;
12572080Smckusick case O_BUFF:
12582950Smckusic BUFF((long)(*pc.cp++));
12592080Smckusick continue;
12602080Smckusick case O_HALT:
12612080Smckusick pc.cp++;
12625682Smckusic if (_nodump == TRUE)
12635682Smckusic psexit(0);
12645682Smckusic fputs("\nCall to procedure halt\n", stderr);
12655682Smckusic backtrace("Halted");
12665682Smckusic psexit(0);
12672080Smckusick continue;
12682080Smckusick case O_PXPBUF:
12692080Smckusick pc.cp++;
127030057Smckusick PCLONGVAL(tl);
127130057Smckusick _cntrs = tl;
127230057Smckusick PCLONGVAL(tl);
127330057Smckusick _rtns = tl;
12749231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long));
12759231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long));
12762080Smckusick continue;
12772080Smckusick case O_COUNT:
12782080Smckusick pc.cp++;
12792080Smckusick _pcpcount[*pc.usp++]++;
12802080Smckusick continue;
12812080Smckusick case O_CASE1OP:
12822080Smckusick tl = *pc.cp++; /* tl = number of cases */
12832080Smckusick if (tl == 0)
12842080Smckusick tl = *pc.usp++;
12852080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */
12862080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */
12872080Smckusick tl1 = pop2(); /* tl1 = element to find */
12882080Smckusick for(; tl > 0; tl--) /* look for element */
12892080Smckusick if (tl1 == *tcp++)
12902080Smckusick break;
12912080Smckusick if (tl == 0) /* default case => error */
12925666Smckusic CASERNG(tl1);
12932080Smckusick pc.cp += *(tsp - tl);
12942080Smckusick continue;
12952080Smckusick case O_CASE2OP:
12962080Smckusick tl = *pc.cp++; /* tl = number of cases */
12972080Smckusick if (tl == 0)
12982080Smckusick tl = *pc.usp++;
12992080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */
13002080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */
13012080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */
13022080Smckusick for(; tl > 0; tl--) /* look for element */
130330057Smckusick if (tl1 == *tsp++)
13042080Smckusick break;
13052080Smckusick if (tl == 0) /* default case => error */
13065666Smckusic CASERNG(tl1);
130730057Smckusick pc.cp += *(tsp1 - tl);
13082080Smckusick continue;
13092080Smckusick case O_CASE4OP:
13102080Smckusick tl = *pc.cp++; /* tl = number of cases */
13112080Smckusick if (tl == 0)
13122080Smckusick tl = *pc.usp++;
131330057Smckusick tsp1 = pc.sp + tl; /* ptr to end of jump table */
131430057Smckusick tlp = (long *)tsp1; /* tlp = ptr to case values */
13152080Smckusick tl1 = pop4(); /* tl1 = element to find */
131630057Smckusick for(; tl > 0; tl--) { /* look for element */
131730057Smckusick GETLONGVAL(tl2, tlp++);
131830057Smckusick if (tl1 == tl2)
13192080Smckusick break;
132030057Smckusick }
13212080Smckusick if (tl == 0) /* default case => error */
13225666Smckusic CASERNG(tl1);
132330057Smckusick pc.cp += *(tsp1 - tl);
13242080Smckusick continue;
13252080Smckusick case O_ADDT:
13262080Smckusick tl = *pc.cp++; /* tl has comparison length */
13272080Smckusick if (tl == 0)
13282080Smckusick tl = *pc.usp++;
13292950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */
13302080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
13312080Smckusick popsp(tl);
13322080Smckusick continue;
13332080Smckusick case O_SUBT:
13342080Smckusick tl = *pc.cp++; /* tl has comparison length */
13352080Smckusick if (tl == 0)
13362080Smckusick tl = *pc.usp++;
13372950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */
13382080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
13392080Smckusick popsp(tl);
13402080Smckusick continue;
13412080Smckusick case O_MULT:
13422080Smckusick tl = *pc.cp++; /* tl has comparison length */
13432080Smckusick if (tl == 0)
13442080Smckusick tl = *pc.usp++;
13452950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */
13462080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
13472080Smckusick popsp(tl);
13482080Smckusick continue;
13492080Smckusick case O_INCT:
13502080Smckusick tl = *pc.cp++; /* tl has number of args */
13512080Smckusick if (tl == 0)
13522080Smckusick tl = *pc.usp++;
13532950Smckusic tb = INCT();
13542950Smckusic popsp(tl*sizeof(long));
13552950Smckusic push2((short)(tb));
13562080Smckusick continue;
13572080Smckusick case O_CTTOT:
13582080Smckusick tl = *pc.cp++; /* tl has number of args */
13592080Smckusick if (tl == 0)
13602080Smckusick tl = *pc.usp++;
136136537Smckusick tl1 = tl * sizeof(long); /* Size of all args */
13622950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
136336537Smckusick tl1 = pop4(); /* Pop the 4 fixed args */
136436537Smckusick tl2 = pop4();
136536537Smckusick tl3 = pop4();
136636537Smckusick tl4 = pop4();
136736537Smckusick tcp2 = pushsp((long)0); /* tcp2 -> data values */
136836537Smckusick CTTOTA(tcp, tl1, tl2, tl3, tl4, tcp2);
136936537Smckusick popsp(tl*sizeof(long) - 4*sizeof(long)); /* Pop data */
13702080Smckusick continue;
13712080Smckusick case O_CARD:
13722080Smckusick tl = *pc.cp++; /* tl has comparison length */
13732080Smckusick if (tl == 0)
13742080Smckusick tl = *pc.usp++;
13752950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */
13762080Smckusick tl1 = CARD(tcp, tl);
13772080Smckusick popsp(tl);
13782950Smckusic push2((short)(tl1));
13792080Smckusick continue;
13802080Smckusick case O_IN:
13812080Smckusick tl = *pc.cp++; /* tl has comparison length */
13822080Smckusick if (tl == 0)
13832080Smckusick tl = *pc.usp++;
13842080Smckusick tl1 = pop4(); /* tl1 is the element */
13852950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */
13864026Smckusic tl2 = *pc.sp++; /* lower bound */
13872950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
13882080Smckusick popsp(tl);
13892950Smckusic push2((short)(tb));
13902080Smckusick continue;
13912080Smckusick case O_ASRT:
13922080Smckusick pc.cp++;
139324938Smckusick tl = pop4();
139424938Smckusick tcp = popaddr();
139524938Smckusick ASRTS(tl, tcp);
13962080Smckusick continue;
13972080Smckusick case O_FOR1U:
139810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
139910576Smckusick if (tl1 == 0)
140010576Smckusick tl1 = *pc.sp++;
140110576Smckusick tcp = popaddr(); /* tcp = ptr to index var */
140210792Smckusick tl = pop4(); /* tl upper bound */
140310792Smckusick if (*tcp == tl) /* loop is done, fall through */
140410576Smckusick continue;
140510792Smckusick *tcp += 1; /* inc index var */
140610792Smckusick pc.cp += tl1; /* return to top of loop */
140710576Smckusick continue;
14082080Smckusick case O_FOR2U:
140910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
14104026Smckusic if (tl1 == 0)
14114026Smckusic tl1 = *pc.sp++;
141210576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */
141310792Smckusick tl = pop4(); /* tl upper bound */
141410792Smckusick if (*tsp == tl) /* loop is done, fall through */
14152080Smckusick continue;
141610792Smckusick *tsp += 1; /* inc index var */
141710792Smckusick pc.cp += tl1; /* return to top of loop */
14182080Smckusick continue;
14192080Smckusick case O_FOR4U:
142010792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
14214026Smckusic if (tl1 == 0)
142210792Smckusick tl1 = *pc.sp++;
14232950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */
142410792Smckusick tl = pop4(); /* tl upper bound */
142510792Smckusick if (*tlp == tl) /* loop is done, fall through */
14262080Smckusick continue;
142710792Smckusick *tlp += 1; /* inc index var */
142810792Smckusick pc.cp += tl1; /* return to top of loop */
14292080Smckusick continue;
14302080Smckusick case O_FOR1D:
143110792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
143210576Smckusick if (tl1 == 0)
143310576Smckusick tl1 = *pc.sp++;
143410576Smckusick tcp = popaddr(); /* tcp = ptr to index var */
143510792Smckusick tl = pop4(); /* tl upper bound */
143610792Smckusick if (*tcp == tl) /* loop is done, fall through */
143710576Smckusick continue;
143810792Smckusick *tcp -= 1; /* dec index var */
143910792Smckusick pc.cp += tl1; /* return to top of loop */
144010576Smckusick continue;
14412080Smckusick case O_FOR2D:
144210792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
14434026Smckusic if (tl1 == 0)
14444026Smckusic tl1 = *pc.sp++;
144510576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */
144610792Smckusick tl = pop4(); /* tl upper bound */
144710792Smckusick if (*tsp == tl) /* loop is done, fall through */
14482080Smckusick continue;
144910792Smckusick *tsp -= 1; /* dec index var */
145010792Smckusick pc.cp += tl1; /* return to top of loop */
14512080Smckusick continue;
14522080Smckusick case O_FOR4D:
145310792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */
14544026Smckusic if (tl1 == 0)
145510792Smckusick tl1 = *pc.sp++;
14562950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */
145710792Smckusick tl = pop4(); /* tl upper bound */
145810792Smckusick if (*tlp == tl) /* loop is done, fall through */
14592080Smckusick continue;
146010792Smckusick *tlp -= 1; /* dec index var */
146110792Smckusick pc.cp += tl1; /* return to top of loop */
14622080Smckusick continue;
14632080Smckusick case O_READE:
14642080Smckusick pc.cp++;
146530057Smckusick PCLONGVAL(tl);
146630057Smckusick push2((short)(READE(curfile, base + tl)));
14672080Smckusick continue;
14682080Smckusick case O_READ4:
14692080Smckusick pc.cp++;
14702080Smckusick push4(READ4(curfile));
14712080Smckusick continue;
14722080Smckusick case O_READC:
14732080Smckusick pc.cp++;
14742950Smckusic push2((short)(READC(curfile)));
14752080Smckusick continue;
14762080Smckusick case O_READ8:
14772080Smckusick pc.cp++;
14782080Smckusick push8(READ8(curfile));
14792080Smckusick continue;
14802080Smckusick case O_READLN:
14812080Smckusick pc.cp++;
14822080Smckusick READLN(curfile);
14832080Smckusick continue;
14842080Smckusick case O_EOF:
14852080Smckusick pc.cp++;
148636537Smckusick tcp = popaddr();
148736537Smckusick push2((short)(TEOF(tcp)));
14882080Smckusick continue;
14892080Smckusick case O_EOLN:
14902080Smckusick pc.cp++;
149136537Smckusick tcp = popaddr();
149236537Smckusick push2((short)(TEOLN(tcp)));
14932080Smckusick continue;
14942080Smckusick case O_WRITEC:
149536537Smckusick pc.cp++;
149636537Smckusick ti = popint();
149736537Smckusick tf = popfile();
14982191Smckusic if (_runtst) {
149936537Smckusick WRITEC(curfile, ti, tf);
15002191Smckusic continue;
15012191Smckusic }
150236537Smckusick fputc(ti, tf);
15032080Smckusick continue;
15042080Smckusick case O_WRITES:
150536537Smckusick pc.cp++; /* Skip arg size */
150636537Smckusick tf = popfile();
150736537Smckusick ti = popint();
150836537Smckusick ti2 = popint();
150936537Smckusick tcp2 = popaddr();
15102191Smckusic if (_runtst) {
151136537Smckusick WRITES(curfile, tf, ti, ti2, tcp2);
15122191Smckusic continue;
15132191Smckusic }
151436537Smckusick fwrite(tf, ti, ti2, tcp2);
15152080Smckusick continue;
15162080Smckusick case O_WRITEF:
151736537Smckusick tf = popfile();
151836537Smckusick tcp = popaddr();
151936537Smckusick tcp2 = pushsp((long)0); /* Addr of printf's args */
15202191Smckusic if (_runtst) {
152136537Smckusick VWRITEF(curfile, tf, tcp, tcp2);
152236537Smckusick } else {
152336537Smckusick vfprintf(tf, tcp, tcp2);
15242191Smckusic }
152536537Smckusick popsp((long)
152636537Smckusick (*pc.cp++) - (sizeof (FILE *)) - sizeof (char *));
15272080Smckusick continue;
15282080Smckusick case O_WRITLN:
15292080Smckusick pc.cp++;
15302191Smckusic if (_runtst) {
15312191Smckusic WRITLN(curfile);
15322191Smckusic continue;
15332191Smckusic }
15342191Smckusic fputc('\n', ACTFILE(curfile));
15352080Smckusick continue;
15362080Smckusick case O_PAGE:
15372080Smckusick pc.cp++;
15382191Smckusic if (_runtst) {
15392191Smckusic PAGE(curfile);
15402191Smckusic continue;
15412191Smckusic }
15422950Smckusic fputc('', ACTFILE(curfile));
15432080Smckusick continue;
15442080Smckusick case O_NAM:
15452080Smckusick pc.cp++;
15462080Smckusick tl = pop4();
154730057Smckusick PCLONGVAL(tl1);
154830057Smckusick pushaddr(NAM(tl, base + tl1));
15492080Smckusick continue;
15502080Smckusick case O_MAX:
15512080Smckusick tl = *pc.cp++;
15522080Smckusick if (tl == 0)
15532080Smckusick tl = *pc.usp++;
15542080Smckusick tl1 = pop4();
15552191Smckusic if (_runtst) {
15562950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++)));
15572191Smckusic continue;
15582191Smckusic }
15592191Smckusic tl1 -= tl;
15602191Smckusic tl = *pc.usp++;
15612191Smckusic push4(tl1 > tl ? tl1 : tl);
15622080Smckusick continue;
15632080Smckusick case O_MIN:
15642080Smckusick tl = *pc.cp++;
15652080Smckusick if (tl == 0)
15662080Smckusick tl = *pc.usp++;
15672080Smckusick tl1 = pop4();
15682080Smckusick push4(tl1 < tl ? tl1 : tl);
15692080Smckusick continue;
15702080Smckusick case O_UNIT:
15712080Smckusick pc.cp++;
15722080Smckusick curfile = UNIT(popaddr());
15732080Smckusick continue;
15742080Smckusick case O_UNITINP:
15752080Smckusick pc.cp++;
15762080Smckusick curfile = INPUT;
15772080Smckusick continue;
15782080Smckusick case O_UNITOUT:
15792080Smckusick pc.cp++;
15802080Smckusick curfile = OUTPUT;
15812080Smckusick continue;
15822080Smckusick case O_MESSAGE:
15832080Smckusick pc.cp++;
15842080Smckusick PFLUSH();
15852080Smckusick curfile = ERR;
15862080Smckusick continue;
15872109Smckusic case O_PUT:
15882109Smckusic pc.cp++;
15892109Smckusic PUT(curfile);
15902109Smckusic continue;
15912080Smckusick case O_GET:
15922080Smckusick pc.cp++;
15932080Smckusick GET(curfile);
15942080Smckusick continue;
15952080Smckusick case O_FNIL:
15962080Smckusick pc.cp++;
159736537Smckusick tcp = popaddr();
159836537Smckusick pushaddr(FNIL(tcp));
15992080Smckusick continue;
16002080Smckusick case O_DEFNAME:
16012080Smckusick pc.cp++;
160236537Smckusick tcp2 = popaddr();
160336537Smckusick tcp = popaddr();
160436537Smckusick tl = pop4();
160536537Smckusick tl2 = pop4();
160636537Smckusick DEFNAME((struct iorec *)tcp2, tcp, tl, tl2);
16072080Smckusick continue;
16082080Smckusick case O_RESET:
16092080Smckusick pc.cp++;
161036537Smckusick tcp2 = popaddr();
161136537Smckusick tcp = popaddr();
161236537Smckusick tl = pop4();
161336537Smckusick tl2 = pop4();
161436537Smckusick RESET((struct iorec *)tcp2, tcp, tl, tl2);
16152080Smckusick continue;
16162080Smckusick case O_REWRITE:
16172080Smckusick pc.cp++;
161836537Smckusick tcp2 = popaddr();
161936537Smckusick tcp = popaddr();
162036537Smckusick tl = pop4();
162136537Smckusick tl2 = pop4();
162236537Smckusick REWRITE((struct iorec *)tcp2, tcp, tl, tl2);
16232080Smckusick continue;
16242080Smckusick case O_FILE:
16252080Smckusick pc.cp++;
16262080Smckusick pushaddr(ACTFILE(curfile));
16272080Smckusick continue;
16282080Smckusick case O_REMOVE:
16292080Smckusick pc.cp++;
163036537Smckusick tcp = popaddr();
163136537Smckusick tl = pop4();
163236537Smckusick REMOVE(tcp, tl);
16332080Smckusick continue;
16342080Smckusick case O_FLUSH:
16352080Smckusick pc.cp++;
163636537Smckusick tcp = popaddr();
163736537Smckusick FLUSH((struct iorec *)tcp);
16382080Smckusick continue;
16392080Smckusick case O_PACK:
16402080Smckusick pc.cp++;
164136537Smckusick tl = pop4();
164236537Smckusick tcp = popaddr();
164336537Smckusick tcp2 = popaddr();
164436537Smckusick tl1 = pop4();
164536537Smckusick tl2 = pop4();
164636537Smckusick tl3 = pop4();
164736537Smckusick tl4 = pop4();
164836537Smckusick PACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4);
16492080Smckusick continue;
16502080Smckusick case O_UNPACK:
16512080Smckusick pc.cp++;
165236537Smckusick tl = pop4();
165336537Smckusick tcp = popaddr();
165436537Smckusick tcp2 = popaddr();
165536537Smckusick tl1 = pop4();
165636537Smckusick tl2 = pop4();
165736537Smckusick tl3 = pop4();
165836537Smckusick tl4 = pop4();
165936537Smckusick UNPACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4);
16602080Smckusick continue;
16612080Smckusick case O_ARGC:
16622080Smckusick pc.cp++;
16632950Smckusic push4((long)_argc);
16642080Smckusick continue;
16652080Smckusick case O_ARGV:
16662080Smckusick tl = *pc.cp++; /* tl = size of char array */
16672080Smckusick if (tl == 0)
16682080Smckusick tl = *pc.usp++;
16692080Smckusick tcp = popaddr(); /* tcp = addr of char array */
16702080Smckusick tl1 = pop4(); /* tl1 = argv subscript */
16712080Smckusick ARGV(tl1, tcp, tl);
16722080Smckusick continue;
16732080Smckusick case O_CLCK:
16742080Smckusick pc.cp++;
16752080Smckusick push4(CLCK());
16762080Smckusick continue;
16772080Smckusick case O_WCLCK:
16782080Smckusick pc.cp++;
16792080Smckusick push4(time(0));
16802080Smckusick continue;
16812080Smckusick case O_SCLCK:
16822080Smckusick pc.cp++;
16832080Smckusick push4(SCLCK());
16842080Smckusick continue;
16852080Smckusick case O_NEW:
16862080Smckusick tl = *pc.cp++; /* tl = size being new'ed */
16872080Smckusick if (tl == 0)
16882080Smckusick tl = *pc.usp++;
16892080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */
16909231Smckusick NEW(tcp, tl);
16912191Smckusic if (_runtst) {
16929263Smckusick blkclr(*((char **)(tcp)), tl);
16932191Smckusic }
16942080Smckusick continue;
16957961Smckusick case O_DISPOSE:
16967961Smckusick tl = *pc.cp++; /* tl = size being disposed */
16977961Smckusick if (tl == 0)
16987961Smckusick tl = *pc.usp++;
16997961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */
17007961Smckusick DISPOSE(tcp, tl);
17017961Smckusick *(char **)tcp = (char *)0;
17027961Smckusick continue;
17037961Smckusick case O_DFDISP:
17047961Smckusick tl = *pc.cp++; /* tl = size being disposed */
17057961Smckusick if (tl == 0)
17067961Smckusick tl = *pc.usp++;
17077961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */
17087961Smckusick DFDISPOSE(tcp, tl);
17097961Smckusick *(char **)tcp = (char *)0;
17107961Smckusick continue;
17112080Smckusick case O_DATE:
17122080Smckusick pc.cp++;
17132080Smckusick DATE(popaddr());
17142080Smckusick continue;
17152080Smckusick case O_TIME:
17162080Smckusick pc.cp++;
17172080Smckusick TIME(popaddr());
17182080Smckusick continue;
17192080Smckusick case O_UNDEF:
17202080Smckusick pc.cp++;
172130057Smckusick td = pop8();
17222950Smckusic push2((short)(0));
17232080Smckusick continue;
17242080Smckusick case O_ATAN:
17252080Smckusick pc.cp++;
172636537Smckusick td = pop8();
17275723Smckusic if (_runtst) {
172836537Smckusick push8(ATAN(td));
17295723Smckusic continue;
17305723Smckusic }
173136537Smckusick push8(atan(td));
17322080Smckusick continue;
17332080Smckusick case O_COS:
17342080Smckusick pc.cp++;
173536537Smckusick td = pop8();
17365723Smckusic if (_runtst) {
173736537Smckusick push8(COS(td));
17385723Smckusic continue;
17395723Smckusic }
174036537Smckusick push8(cos(td));
17412080Smckusick continue;
17422080Smckusick case O_EXP:
17432080Smckusick pc.cp++;
174436537Smckusick td = pop8();
17455723Smckusic if (_runtst) {
174636537Smckusick push8(EXP(td));
17475723Smckusic continue;
17485723Smckusic }
174936537Smckusick push8(exp(td));
17502080Smckusick continue;
17512080Smckusick case O_LN:
17522080Smckusick pc.cp++;
175336537Smckusick td = pop8();
17542191Smckusic if (_runtst) {
175536537Smckusick push8(LN(td));
17562191Smckusic continue;
17572191Smckusic }
175836537Smckusick push8(log(td));
17592080Smckusick continue;
17602080Smckusick case O_SIN:
17612080Smckusick pc.cp++;
176236537Smckusick td = pop8();
17635723Smckusic if (_runtst) {
176436537Smckusick push8(SIN(td));
17655723Smckusic continue;
17665723Smckusic }
176736537Smckusick push8(sin(td));
17682080Smckusick continue;
17692080Smckusick case O_SQRT:
17702080Smckusick pc.cp++;
177136537Smckusick td = pop8();
17722191Smckusic if (_runtst) {
177336537Smckusick push8(SQRT(td));
17742191Smckusic continue;
17752191Smckusic }
177636537Smckusick push8(sqrt(td));
17772080Smckusick continue;
17782080Smckusick case O_CHR2:
17792080Smckusick case O_CHR4:
17802080Smckusick pc.cp++;
178136537Smckusick tl = pop4();
17822191Smckusic if (_runtst) {
178336537Smckusick push2((short)(CHR(tl)));
17842191Smckusic continue;
17852191Smckusic }
178636537Smckusick push2((short)tl);
17872080Smckusick continue;
17882080Smckusick case O_ODD2:
17892080Smckusick case O_ODD4:
17902080Smckusick pc.cp++;
179110576Smckusick tl = pop4();
179210576Smckusick push2((short)(tl & 1));
17932080Smckusick continue;
17942080Smckusick case O_SUCC2:
17952109Smckusic tl = *pc.cp++;
17962109Smckusic if (tl == 0)
17972109Smckusic tl = *pc.sp++;
17982109Smckusic tl1 = pop4();
17992191Smckusic if (_runtst) {
18002950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
18012191Smckusic continue;
18022191Smckusic }
18032950Smckusic push2((short)(tl1 + 1));
18042191Smckusic pc.sp++;
18052080Smckusick continue;
18062080Smckusick case O_SUCC24:
18072109Smckusic tl = *pc.cp++;
18082109Smckusic if (tl == 0)
18092109Smckusic tl = *pc.sp++;
18102109Smckusic tl1 = pop4();
18112191Smckusic if (_runtst) {
18122950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++)));
18132191Smckusic continue;
18142191Smckusic }
18152191Smckusic push4(tl1 + 1);
18162191Smckusic pc.sp++;
18172109Smckusic continue;
18182080Smckusick case O_SUCC4:
18192109Smckusic tl = *pc.cp++;
18202109Smckusic if (tl == 0)
182130057Smckusick PCLONGVAL(tl);
18222109Smckusic tl1 = pop4();
18232191Smckusic if (_runtst) {
182430057Smckusick PCLONGVAL(tl2);
182530057Smckusick push4(SUCC(tl1, tl, (long)(tl2)));
18262191Smckusic continue;
18272191Smckusic }
18282191Smckusic push4(tl1 + 1);
18292191Smckusic pc.lp++;
18302080Smckusick continue;
18312080Smckusick case O_PRED2:
18322109Smckusic tl = *pc.cp++;
18332109Smckusic if (tl == 0)
18342109Smckusic tl = *pc.sp++;
18352109Smckusic tl1 = pop4();
18362191Smckusic if (_runtst) {
18372950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
18382191Smckusic continue;
18392191Smckusic }
18402950Smckusic push2((short)(tl1 - 1));
18412191Smckusic pc.sp++;
18422080Smckusick continue;
18432080Smckusick case O_PRED24:
18442109Smckusic tl = *pc.cp++;
18452109Smckusic if (tl == 0)
18462109Smckusic tl = *pc.sp++;
18472109Smckusic tl1 = pop4();
18482191Smckusic if (_runtst) {
18492950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++)));
18502191Smckusic continue;
18512191Smckusic }
18522191Smckusic push4(tl1 - 1);
18532191Smckusic pc.sp++;
18542109Smckusic continue;
18552080Smckusick case O_PRED4:
18562109Smckusic tl = *pc.cp++;
18572109Smckusic if (tl == 0)
185830057Smckusick PCLONGVAL(tl);
18592109Smckusic tl1 = pop4();
18602191Smckusic if (_runtst) {
186130057Smckusick PCLONGVAL(tl2);
186230057Smckusick push4(PRED(tl1, tl, (long)(tl2)));
18632191Smckusic continue;
18642191Smckusic }
18652191Smckusic push4(tl1 - 1);
18662191Smckusic pc.lp++;
18672080Smckusick continue;
18682080Smckusick case O_SEED:
18692080Smckusick pc.cp++;
187036537Smckusick tl = pop4();
187136537Smckusick push4(SEED(tl));
18722080Smckusick continue;
18732080Smckusick case O_RANDOM:
18742080Smckusick pc.cp++;
187536537Smckusick td = pop8(); /* Argument is ignored */
187636537Smckusick push8(RANDOM());
18772080Smckusick continue;
18782080Smckusick case O_EXPO:
18792080Smckusick pc.cp++;
188036537Smckusick td = pop8();
188136537Smckusick push4(EXPO(td));
18822080Smckusick continue;
18832080Smckusick case O_SQR2:
18842080Smckusick case O_SQR4:
18852080Smckusick pc.cp++;
18862080Smckusick tl = pop4();
18872080Smckusick push4(tl * tl);
18882080Smckusick continue;
18892080Smckusick case O_SQR8:
18902080Smckusick pc.cp++;
18912080Smckusick td = pop8();
18922080Smckusick push8(td * td);
18932080Smckusick continue;
18942080Smckusick case O_ROUND:
18952080Smckusick pc.cp++;
189636537Smckusick td = pop8();
189736537Smckusick push4(ROUND(td));
18982080Smckusick continue;
18992080Smckusick case O_TRUNC:
19002080Smckusick pc.cp++;
190136537Smckusick td = pop8();
190236537Smckusick push4(TRUNC(td));
19032080Smckusick continue;
19042950Smckusic default:
19055682Smckusic ERROR("Panic: bad op code\n");
19062950Smckusic continue;
19072080Smckusick }
19082080Smckusick }
19092080Smckusick }
1910