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