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