]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/d10v/simops.c
Fri Aug 2 17:44:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
[thirdparty/binutils-gdb.git] / sim / d10v / simops.c
1 #include "d10v_sim.h"
2 #include "simops.h"
3
4 /* #define DEBUG 1 */
5
6 /* abs */
7 void
8 OP_4607 ()
9 {
10 #ifdef DEBUG
11 printf(" abs\tr%d\n",OP[0]);
12 #endif
13 State.F1 = State.F0;
14 if ((int16)(State.regs[OP[0]]) < 0)
15 {
16 State.regs[OP[0]] = -(int16)(State.regs[OP[0]]);
17 State.F0 = 1;
18 }
19 else
20 State.F0 = 0;
21 }
22
23 /* abs */
24 void
25 OP_5607 ()
26 {
27 int64 tmp;
28
29 #ifdef DEBUG
30 printf(" abs\ta%d\n",OP[0]);
31 #endif
32 State.F1 = State.F0;
33 if (State.a[OP[0]] < 0 )
34 {
35 tmp = -State.a[OP[0]];
36 if (State.ST)
37 {
38 if (tmp > MAX32)
39 State.a[OP[0]] = MAX32;
40 else if (tmp < MIN32)
41 State.a[OP[0]] = MIN32;
42 else
43 State.a[OP[0]] = tmp;
44 }
45 else
46 State.a[OP[0]] = tmp;
47 State.F0 = 1;
48 }
49 else
50 State.F0 = 0;
51 }
52
53 /* add */
54 void
55 OP_200 ()
56 {
57 uint16 tmp = State.regs[OP[0]];
58 #ifdef DEBUG
59 printf(" add\tr%d,r%d\n",OP[0],OP[1]);
60 #endif
61 State.regs[OP[0]] += State.regs[OP[1]];
62 if ( tmp > State.regs[OP[0]])
63 State.C = 1;
64 else
65 State.C = 0;
66 }
67
68 /* add */
69 void
70 OP_1201 ()
71 {
72 int64 tmp;
73 #ifdef DEBUG
74 printf(" add\ta%d,r%d\n",OP[0],OP[1]);
75 #endif
76 tmp = State.a[OP[0]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
77 if (State.ST)
78 {
79 if ( tmp > MAX32)
80 State.a[OP[0]] = MAX32;
81 else if ( tmp < MIN32)
82 State.a[OP[0]] = MIN32;
83 else
84 State.a[OP[0]] = tmp;
85 }
86 else
87 State.a[OP[0]] = tmp;
88 }
89
90 /* add */
91 void
92 OP_1203 ()
93 {
94 int64 tmp;
95 #ifdef DEBUG
96 printf(" add\ta%d,a%d\n",OP[0],OP[1]);
97 #endif
98 tmp = State.a[OP[0]] + State.a[OP[1]];
99 if (State.ST)
100 {
101 if (tmp > MAX32)
102 State.a[OP[0]] = MAX32;
103 else if ( tmp < MIN32)
104 State.a[OP[0]] = MIN32;
105 else
106 State.a[OP[0]] = tmp;
107 }
108 else
109 State.a[OP[0]] = tmp;
110 }
111
112 /* add2w */
113 void
114 OP_1200 ()
115 {
116 uint32 tmp;
117 uint32 tmp1 = (State.regs[OP[0]]) << 16 | State.regs[OP[0]+1];
118 uint32 tmp2 = (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1];
119 #ifdef DEBUG
120 printf(" add2w\tr%d,r%d\n",OP[0],OP[1]);
121 #endif
122 tmp = tmp1 + tmp2;
123 if ( (tmp < tmp1) || (tmp < tmp2) )
124 State.C = 1;
125 else
126 State.C = 0;
127 State.regs[OP[0]] = tmp >> 16;
128 State.regs[OP[0]+1] = tmp & 0xFFFF;
129 }
130
131 /* add3 */
132 void
133 OP_1000000 ()
134 {
135 uint16 tmp = State.regs[OP[0]];
136 #ifdef DEBUG
137 printf(" add3\tr%d,r%d,0x%x\n",OP[0],OP[1],OP[2]);
138 #endif
139 State.regs[OP[0]] = State.regs[OP[1]] + OP[2];
140 if ( tmp > State.regs[OP[0]])
141 State.C = 1;
142 else
143 State.C = 0;
144 }
145
146 /* addac3 */
147 void
148 OP_17000200 ()
149 {
150 int64 tmp;
151 #ifdef DEBUG
152 printf(" addac3\tr%d,r%d,a%d\n",OP[0],OP[1],OP[2]);
153 #endif
154 tmp = State.a[OP[2]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
155 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
156 State.regs[OP[0]+1] = tmp & 0xffff;
157 }
158
159 /* addac3 */
160 void
161 OP_17000202 ()
162 {
163 int64 tmp;
164 #ifdef DEBUG
165 printf(" addac3\tr%d,a%d,a%d\n",OP[0],OP[1],OP[2]);
166 #endif
167 tmp = State.a[OP[1]] + State.a[OP[2]];
168 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
169 State.regs[OP[0]+1] = tmp & 0xffff;
170 }
171
172 /* addac3s */
173 void
174 OP_17001200 ()
175 {
176 int64 tmp;
177 #ifdef DEBUG
178 printf(" addac3s\tr%d,r%d,a%d\n",OP[0],OP[1],OP[2]);
179 #endif
180 State.F1 = State.F0;
181 tmp = State.a[OP[2]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
182 if ( tmp > MAX32)
183 {
184 State.regs[OP[0]] = 0x7fff;
185 State.regs[OP[0]+1] = 0xffff;
186 State.F0 = 1;
187 }
188 else if (tmp < MIN32)
189 {
190 State.regs[OP[0]] = 0x8000;
191 State.regs[OP[0]+1] = 0;
192 State.F0 = 1;
193 }
194 else
195 {
196 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
197 State.regs[OP[0]+1] = tmp & 0xffff;
198 State.F0 = 0;
199 }
200 }
201
202 /* addac3s */
203 void
204 OP_17001202 ()
205 {
206 int64 tmp;
207 #ifdef DEBUG
208 printf(" addac3s\tr%d,a%d,a%d\n",OP[0],OP[1],OP[2]);
209 #endif
210 State.F1 = State.F0;
211 tmp = State.a[OP[1]] + State.a[OP[2]];
212 if ( tmp > MAX32)
213 {
214 State.regs[OP[0]] = 0x7fff;
215 State.regs[OP[0]+1] = 0xffff;
216 State.F0 = 1;
217 }
218 else if (tmp < MIN32)
219 {
220 State.regs[OP[0]] = 0x8000;
221 State.regs[OP[0]+1] = 0;
222 State.F0 = 1;
223 }
224 else
225 {
226 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
227 State.regs[OP[0]+1] = tmp & 0xffff;
228 State.F0 = 0;
229 }
230 }
231
232 /* addi */
233 void
234 OP_201 ()
235 {
236 #ifdef DEBUG
237 printf(" addi\tr%d,0x%x\n",OP[0],OP[1]);
238 #endif
239 State.regs[OP[0]] += OP[1];
240 }
241
242 /* and */
243 void
244 OP_C00 ()
245 {
246 #ifdef DEBUG
247 printf(" and\tr%d,r%d\n",OP[0],OP[1]);
248 #endif
249 State.regs[OP[0]] &= State.regs[OP[1]];
250 }
251
252 /* and3 */
253 void
254 OP_6000000 ()
255 {
256 #ifdef DEBUG
257 printf(" and3\tr%d,r%d,0x%x\n",OP[0],OP[1],OP[2]);
258 #endif
259 State.regs[OP[0]] = State.regs[OP[1]] & OP[2];
260 }
261
262 /* bclri */
263 void
264 OP_C01 ()
265 {
266 #ifdef DEBUG
267 printf(" bclri\tr%d,%d\n",OP[0],OP[1]);
268 #endif
269 State.regs[OP[0]] &= ~(0x8000 >> OP[1]);
270 }
271
272 /* bl.s */
273 void
274 OP_4900 ()
275 {
276 #ifdef DEBUG
277 printf(" bl.s\t0x%x\n",OP[0]);
278 #endif
279 State.regs[13] = PC+1;
280 PC += SEXT8 (OP[0]);
281 }
282
283 /* bl.l */
284 void
285 OP_24800000 ()
286 {
287 #ifdef DEBUG
288 printf(" bl.l\t0x%x\n",OP[0]);
289 #endif
290 State.regs[13] = PC+1;
291 PC += OP[0];
292 }
293
294 /* bnoti */
295 void
296 OP_A01 ()
297 {
298 #ifdef DEBUG
299 printf(" bnoti\tr%d,%d\n",OP[0],OP[1]);
300 #endif
301 State.regs[OP[0]] ^= 0x8000 >> OP[1];
302 }
303
304 /* bra.s */
305 void
306 OP_4800 ()
307 {
308 #ifdef DEBUG
309 printf(" bra.s\t0x%x\n",OP[0]);
310 #endif
311 PC += SEXT8 (OP[0]);
312 }
313
314 /* bra.l */
315 void
316 OP_24000000 ()
317 {
318 #ifdef DEBUG
319 printf(" bra.l\t0x%x\n",OP[0]);
320 #endif
321 PC += OP[0];
322 }
323
324 /* brf0f.s */
325 void
326 OP_4A00 ()
327 {
328 #ifdef DEBUG
329 printf(" brf0f.s\t0x%x\n",OP[0]);
330 #endif
331 if (State.F0 == 0)
332 PC += SEXT8 (OP[0]);
333 }
334
335 /* brf0f.l */
336 void
337 OP_25000000 ()
338 {
339 #ifdef DEBUG
340 printf(" brf0f.l\t0x%x\n",OP[0]);
341 #endif
342 if (State.F0 == 0)
343 PC += OP[0];
344 }
345
346 /* brf0t.s */
347 void
348 OP_4B00 ()
349 {
350 #ifdef DEBUG
351 printf(" brf0t.s\t0x%x\n",OP[0]);
352 #endif
353 if (State.F0)
354 PC += SEXT8 (OP[0]);
355 }
356
357 /* brf0t.l */
358 void
359 OP_25800000 ()
360 {
361 #ifdef DEBUG
362 printf(" brf0t.l\t0x%x\n",OP[0]);
363 #endif
364 if (State.F0)
365 PC += OP[0];
366 }
367
368 /* bseti */
369 void
370 OP_801 ()
371 {
372 #ifdef DEBUG
373 printf(" bseti\tr%d,%d\n",OP[0],OP[1]);
374 #endif
375 State.regs[OP[0]] |= 0x8000 >> OP[1];
376 }
377
378 /* btsti */
379 void
380 OP_E01 ()
381 {
382 #ifdef DEBUG
383 printf(" btsti\tr%d,%d\n",OP[0],OP[1]);
384 #endif
385 State.F1 = State.F0;
386 State.F0 = (State.regs[OP[0]] & (0x8000 >> OP[1])) ? 1 : 0;
387 }
388
389 /* clrac */
390 void
391 OP_5601 ()
392 {
393 #ifdef DEBUG
394 printf(" clrac\ta%d\n",OP[0]);
395 #endif
396 State.a[OP[0]] = 0;
397 }
398
399 /* cmp */
400 void
401 OP_600 ()
402 {
403 #ifdef DEBUG
404 printf(" cmp\tr%d,r%d\n",OP[0],OP[1]);
405 #endif
406 State.F1 = State.F0;
407 State.F0 = ((int16)(State.regs[OP[0]]) < (int16)(State.regs[OP[1]])) ? 1 : 0;
408 }
409
410 /* cmp */
411 void
412 OP_1603 ()
413 {
414 #ifdef DEBUG
415 printf(" cmp\ta%d,a%d\n",OP[0],OP[1]);
416 #endif
417 State.F1 = State.F0;
418 State.F0 = (State.a[OP[0]] < State.a[OP[1]]) ? 1 : 0;
419 }
420
421 /* cmpeq */
422 void
423 OP_400 ()
424 {
425 #ifdef DEBUG
426 printf(" cmpeq\tr%d,r%d\n",OP[0],OP[1]);
427 #endif
428 State.F1 = State.F0;
429 State.F0 = (State.regs[OP[0]] == State.regs[OP[1]]) ? 1 : 0;
430 }
431
432 /* cmpeq */
433 void
434 OP_1403 ()
435 {
436 #ifdef DEBUG
437 printf(" cmpeq\ta%d,a%d\n",OP[0],OP[1]);
438 #endif
439 State.F1 = State.F0;
440 State.F0 = (State.a[OP[0]] == State.a[OP[1]]) ? 1 : 0;
441 }
442
443 /* cmpeqi.s */
444 void
445 OP_401 ()
446 {
447 #ifdef DEBUG
448 printf(" cmpeqi.s\tr%d,0x%x\n",OP[0],OP[1]);
449 #endif
450 State.F1 = State.F0;
451 State.F0 = (State.regs[OP[0]] == SEXT4(OP[1])) ? 1 : 0;
452 }
453
454 /* cmpeqi.l */
455 void
456 OP_2000000 ()
457 {
458 #ifdef DEBUG
459 printf(" cmpeqi.l\tr%d,0x%x\n",OP[0],OP[1]);
460 #endif
461 State.F1 = State.F0;
462 State.F0 = (State.regs[OP[0]] == OP[1]) ? 1 : 0;
463 }
464
465 /* cmpi.s */
466 void
467 OP_601 ()
468 {
469 #ifdef DEBUG
470 printf(" cmpi.s\tr%d,0x%x\n",OP[0],OP[1]);
471 #endif
472 State.F1 = State.F0;
473 State.F0 = ((int16)(State.regs[OP[0]]) < SEXT4(OP[1])) ? 1 : 0;
474 }
475
476 /* cmpi.l */
477 void
478 OP_3000000 ()
479 {
480 #ifdef DEBUG
481 printf(" cmpi.l\tr%d,0x%x\n",OP[0],OP[1]);
482 #endif
483 State.F1 = State.F0;
484 State.F0 = ((int16)(State.regs[OP[0]]) < (int16)(OP[1])) ? 1 : 0;
485 }
486
487 /* cmpu */
488 void
489 OP_4600 ()
490 {
491 #ifdef DEBUG
492 printf(" cmpu\tr%d,r%d\n",OP[0],OP[1]);
493 #endif
494 State.F1 = State.F0;
495 State.F0 = (State.regs[OP[0]] < State.regs[OP[1]]) ? 1 : 0;
496 }
497
498 /* cmpui */
499 void
500 OP_23000000 ()
501 {
502 #ifdef DEBUG
503 printf(" cmpui\tr%d,0x%x\n",OP[0],OP[1]);
504 #endif
505 State.F1 = State.F0;
506 State.F0 = (State.regs[OP[0]] < OP[1]) ? 1 : 0;
507 }
508
509 /* cpfg */
510 void
511 OP_4E09 ()
512 {
513 uint8 *src, *dst;
514 #ifdef DEBUG
515 printf(" cpfg\t%x,%x\n",OP[0],OP[1]);
516 #endif
517
518 if (OP[0] == 0)
519 dst = &State.F0;
520 else
521 dst = &State.F1;
522
523 if (OP[1] == 0)
524 src = &State.F0;
525 else if (OP[1] == 1)
526 src = &State.F1;
527 else
528 src = &State.C;
529
530 *dst = *src;
531 }
532
533 /* dbt */
534 void
535 OP_5F20 ()
536 {
537 printf(" dbt - NOT IMPLEMENTED\n");
538 }
539
540 /* divs */
541 void
542 OP_14002800 ()
543 {
544 uint16 foo, tmp, tmpf;
545 #ifdef DEBUG
546 printf(" divs\tr%d,r%d\n",OP[0],OP[1]);
547 #endif
548 foo = (State.regs[OP[0]] << 1) | (State.regs[OP[0]+1] >> 15);
549 tmp = (int16)foo - (int16)(State.regs[OP[1]]);
550 tmpf = (foo >= State.regs[OP[1]]) ? 1 : 0;
551 State.regs[OP[0]] = (tmpf == 1) ? tmp : foo;
552 State.regs[OP[0]+1] = (State.regs[OP[0]+1] << 1) | tmpf;
553 }
554
555 /* exef0f */
556 void
557 OP_4E04 ()
558 {
559 #ifdef DEBUG
560 printf(" exef0f\n");
561 #endif
562 State.exe = (State.F0) ? 0 : 1;
563 }
564
565 /* exef0t */
566 void
567 OP_4E24 ()
568 {
569 #ifdef DEBUG
570 printf(" exef0t\n");
571 #endif
572 State.exe = State.F0;
573 }
574
575 /* exef1f */
576 void
577 OP_4E40 ()
578 {
579 #ifdef DEBUG
580 printf(" exef1f\n");
581 #endif
582 State.exe = (State.F1) ? 0 : 1;
583 }
584
585 /* exef1t */
586 void
587 OP_4E42 ()
588 {
589 #ifdef DEBUG
590 printf(" exef1t\n");
591 #endif
592 State.exe = State.F1;
593 }
594
595 /* exefaf */
596 void
597 OP_4E00 ()
598 {
599 #ifdef DEBUG
600 printf(" exefaf\n");
601 #endif
602 State.exe = (State.F0 | State.F1) ? 0 : 1;
603 }
604
605 /* exefat */
606 void
607 OP_4E02 ()
608 {
609 #ifdef DEBUG
610 printf(" exefat\n");
611 #endif
612 State.exe = (State.F0) ? 0 : (State.F1);
613 }
614
615 /* exetaf */
616 void
617 OP_4E20 ()
618 {
619 #ifdef DEBUG
620 printf(" exetaf\n");
621 #endif
622 State.exe = (State.F1) ? 0 : (State.F0);
623 }
624
625 /* exetat */
626 void
627 OP_4E22 ()
628 {
629 #ifdef DEBUG
630 printf(" exetat\n");
631 #endif
632 State.exe = (State.F0) ? (State.F1) : 0;
633 }
634
635 /* exp */
636 void
637 OP_15002A00 ()
638 {
639 uint32 tmp, foo;
640 int i;
641
642 #ifdef DEBUG
643 printf(" exp\tr%d,r%d\n",OP[0],OP[1]);
644 #endif
645 if (((int16)State.regs[OP[1]]) >= 0)
646 tmp = (State.regs[OP[1]] << 16) | State.regs[OP[1]+1];
647 else
648 tmp = ~((State.regs[OP[1]] << 16) | State.regs[OP[1]+1]);
649
650 foo = 0x40000000;
651 for (i=1;i<17;i++)
652 {
653 if (tmp & foo)
654 {
655 State.regs[OP[0]] = i-1;
656 return;
657 }
658 foo >>= 1;
659 }
660 State.regs[OP[0]] = 16;
661 }
662
663 /* exp */
664 void
665 OP_15002A02 ()
666 {
667 int64 tmp, foo;
668 int i;
669 #ifdef DEBUG
670 printf(" exp\tr%d,a%d\n",OP[0],OP[1]);
671 #endif
672 if (State.a[OP[1]] >= 0)
673 tmp = State.a[OP[1]];
674 else
675 tmp = ~(State.a[OP[1]]);
676
677 foo = 0x4000000000LL;
678 for (i=1;i<25;i++)
679 {
680 if (tmp & foo)
681 {
682 State.regs[OP[0]] = i-9;
683 return;
684 }
685 foo >>= 1;
686 }
687 State.regs[OP[0]] = 16;
688 }
689
690 /* jl */
691 void
692 OP_4D00 ()
693 {
694 #ifdef DEBUG
695 printf(" jl\t%x\n",OP[0]);
696 #endif
697 State.regs[13] = PC+1;
698 PC = State.regs[OP[0]];
699 }
700
701 /* jmp */
702 void
703 OP_4C00 ()
704 {
705 #ifdef DEBUG
706 printf(" jmp\tr%d\n",OP[0]);
707 #endif
708 PC = State.regs[OP[0]];
709 }
710
711 /* ld */
712 void
713 OP_30000000 ()
714 {
715 #ifdef DEBUG
716 printf(" ld\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
717 #endif
718 State.regs[OP[0]] = RW (OP[1] + State.regs[OP[2]]);
719 }
720
721 /* ld */
722 void
723 OP_6401 ()
724 {
725 #ifdef DEBUG
726 printf(" ld\tr%d,@r%d-\n",OP[0],OP[1]);
727 #endif
728 State.regs[OP[0]] = RW (State.regs[OP[1]]);
729 State.regs[OP[1]] -= 2;
730 }
731
732 /* ld */
733 void
734 OP_6001 ()
735 {
736 #ifdef DEBUG
737 printf(" ld\tr%d,@r%d+\n",OP[0],OP[1]);
738 #endif
739 State.regs[OP[0]] = RW (State.regs[OP[1]]);
740 State.regs[OP[1]] += 2;
741 }
742
743 /* ld */
744 void
745 OP_6000 ()
746 {
747 #ifdef DEBUG
748 printf(" ld\tr%d,@r%d\n",OP[0],OP[1]);
749 #endif
750 State.regs[OP[0]] = RW (State.regs[OP[1]]);
751 }
752
753 /* ld2w */
754 void
755 OP_31000000 ()
756 {
757 #ifdef DEBUG
758 printf(" ld2w\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
759 #endif
760 State.regs[OP[0]] = RW (OP[1] + State.regs[OP[2]]);
761 State.regs[OP[0]+1] = RW (OP[1] + State.regs[OP[2]] + 2);
762 }
763
764 /* ld2w */
765 void
766 OP_6601 ()
767 {
768 #ifdef DEBUG
769 printf(" ld2w\tr%d,@r%d-\n",OP[0],OP[1]);
770 #endif
771 State.regs[OP[0]] = RW (State.regs[OP[1]]);
772 State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
773 State.regs[OP[1]] -= 4;
774 }
775
776 /* ld2w */
777 void
778 OP_6201 ()
779 {
780 #ifdef DEBUG
781 printf(" ld2w\tr%d,@r%d+\n",OP[0],OP[1]);
782 #endif
783 State.regs[OP[0]] = RW (State.regs[OP[1]]);
784 State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
785 State.regs[OP[1]] += 4;
786 }
787
788 /* ld2w */
789 void
790 OP_6200 ()
791 {
792 #ifdef DEBUG
793 printf(" ld2w\tr%d,@r%d\n",OP[0],OP[1]);
794 #endif
795 State.regs[OP[0]] = RW (State.regs[OP[1]]);
796 State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
797 }
798
799 /* ldb */
800 void
801 OP_38000000 ()
802 {
803 #ifdef DEBUG
804 printf(" ldb\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
805 #endif
806 State.regs[OP[0]] = RB (OP[1] + State.regs[OP[2]]);
807 SEXT8 (State.regs[OP[0]]);
808 }
809
810 /* ldb */
811 void
812 OP_7000 ()
813 {
814 #ifdef DEBUG
815 printf(" ldb\tr%d,@r%d\n",OP[0],OP[1]);
816 #endif
817 State.regs[OP[0]] = RB (State.regs[OP[1]]);
818 SEXT8 (State.regs[OP[0]]);
819 }
820
821 /* ldi.s */
822 void
823 OP_4001 ()
824 {
825 #ifdef DEBUG
826 printf(" ldi.s\tr%d,%x\n",OP[0],SEXT4(OP[1]));
827 #endif
828 State.regs[OP[0]] = SEXT4(OP[1]);
829 }
830
831 /* ldi.l */
832 void
833 OP_20000000 ()
834 {
835 #ifdef DEBUG
836 printf(" ldi.l\tr%d,%d\t;0x%x\n",OP[0],OP[1],OP[1]);
837 #endif
838 State.regs[OP[0]] = OP[1];
839 }
840
841 /* ldub */
842 void
843 OP_39000000 ()
844 {
845 #ifdef DEBUG
846 printf(" ldub\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
847 #endif
848 State.regs[OP[0]] = RB (OP[1] + State.regs[OP[2]]);
849 }
850
851 /* ldub */
852 void
853 OP_7200 ()
854 {
855 #ifdef DEBUG
856 printf(" ldub\tr%d,@r%d\n",OP[0],OP[1]);
857 #endif
858 State.regs[OP[0]] = RB (State.regs[OP[1]]);
859 }
860
861 /* mac */
862 void
863 OP_2A00 ()
864 {
865 int64 tmp;
866 #ifdef DEBUG
867 printf(" mac\ta%d,r%d,r%d\n",OP[0],OP[1],OP[2]);
868 #endif
869 tmp = (int16)(State.regs[OP[1]]) * (int16)(State.regs[OP[2]]);
870
871 if (State.FX)
872 tmp <<= 1;
873
874 if (State.ST && tmp > MAX32)
875 tmp = MAX32;
876
877 tmp += State.a[OP[0]];
878 if (State.ST)
879 {
880 if (tmp > MAX32)
881 State.a[OP[0]] = MAX32;
882 else if (tmp < MIN32)
883 State.a[OP[0]] = MIN32;
884 else
885 State.a[OP[0]] = tmp;
886 }
887 else
888 State.a[OP[0]] = tmp;
889 }
890
891 /* macsu */
892 void
893 OP_1A00 ()
894 {
895 #ifdef DEBUG
896 printf(" macsu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
897 #endif
898 }
899
900 /* macu */
901 void
902 OP_3A00 ()
903 {
904 #ifdef DEBUG
905 printf(" macu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
906 #endif
907 }
908
909 /* max */
910 void
911 OP_2600 ()
912 {
913 #ifdef DEBUG
914 printf(" max\tr%d,r%d\n",OP[0],OP[1]);
915 #endif
916 State.F1 = State.F0;
917 if (State.regs[OP[1]] > State.regs[OP[0]])
918 {
919 State.regs[OP[0]] = State.regs[OP[1]];
920 State.F0 = 1;
921 }
922 else
923 State.F0 = 0;
924 }
925
926 /* max */
927 void
928 OP_3600 ()
929 {
930 #ifdef DEBUG
931 printf(" max\t%x,%x\n",OP[0],OP[1]);
932 #endif
933 }
934
935 /* max */
936 void
937 OP_3602 ()
938 {
939 #ifdef DEBUG
940 printf(" max\t%x,%x\n",OP[0],OP[1]);
941 #endif
942 }
943
944 /* min */
945 void
946 OP_2601 ()
947 {
948 #ifdef DEBUG
949 printf(" min\tr%d,r%d\n",OP[0],OP[1]);
950 #endif
951 State.F1 = State.F0;
952 if (State.regs[OP[1]] < State.regs[OP[0]])
953 {
954 State.regs[OP[0]] = State.regs[OP[1]];
955 State.F0 = 1;
956 }
957 else
958 State.F0 = 0;
959 }
960
961 /* min */
962 void
963 OP_3601 ()
964 {
965 #ifdef DEBUG
966 printf(" min\t%x,%x\n",OP[0],OP[1]);
967 #endif
968 }
969
970 /* min */
971 void
972 OP_3603 ()
973 {
974 #ifdef DEBUG
975 printf(" min\t%x,%x\n",OP[0],OP[1]);
976 #endif
977 }
978
979 /* msb */
980 void
981 OP_2800 ()
982 {
983 #ifdef DEBUG
984 printf(" msb\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
985 #endif
986 }
987
988 /* msbsu */
989 void
990 OP_1800 ()
991 {
992 #ifdef DEBUG
993 printf(" msbsu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
994 #endif
995 }
996
997 /* msbu */
998 void
999 OP_3800 ()
1000 {
1001 #ifdef DEBUG
1002 printf(" msbu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1003 #endif
1004 }
1005
1006 /* mul */
1007 void
1008 OP_2E00 ()
1009 {
1010 #ifdef DEBUG
1011 printf(" mul\tr%d,r%d\n",OP[0],OP[1]);
1012 #endif
1013 State.regs[OP[0]] *= State.regs[OP[1]];
1014 }
1015
1016 /* mulx */
1017 void
1018 OP_2C00 ()
1019 {
1020 #ifdef DEBUG
1021 printf(" mulx\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1022 #endif
1023 }
1024
1025 /* mulxsu */
1026 void
1027 OP_1C00 ()
1028 {
1029 #ifdef DEBUG
1030 printf(" mulxsu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1031 #endif
1032 }
1033
1034 /* mulxu */
1035 void
1036 OP_3C00 ()
1037 {
1038 #ifdef DEBUG
1039 printf(" mulxu\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1040 #endif
1041 }
1042
1043 /* mv */
1044 void
1045 OP_4000 ()
1046 {
1047 #ifdef DEBUG
1048 printf(" mv\tr%d,r%d\n",OP[0],OP[1]);
1049 #endif
1050 State.regs[OP[0]] = State.regs[OP[1]];
1051 }
1052
1053 /* mv2w */
1054 void
1055 OP_5000 ()
1056 {
1057 #ifdef DEBUG
1058 printf(" mv2w\tr%d,r%d\n",OP[0],OP[1]);
1059 #endif
1060 State.regs[OP[0]] = State.regs[OP[1]];
1061 State.regs[OP[0]+1] = State.regs[OP[1]+1];
1062 }
1063
1064 /* mv2wfac */
1065 void
1066 OP_3E00 ()
1067 {
1068 #ifdef DEBUG
1069 printf(" mv2wfac\tr%d,a%d\n",OP[0],OP[1]);
1070 #endif
1071 State.regs[OP[0]] = (State.a[OP[1]] >> 16) & 0xffff;
1072 State.regs[OP[0]+1] = State.a[OP[1]] & 0xffff;
1073 }
1074
1075 /* mv2wtac */
1076 void
1077 OP_3E01 ()
1078 {
1079 #ifdef DEBUG
1080 printf(" mv2wtac\tr%d,a%d\n",OP[0],OP[1]);
1081 #endif
1082 State.a[OP[1]] = SEXT16 (State.regs[OP[0]]) << 16 | State.regs[OP[0]+1];
1083 }
1084
1085 /* mvac */
1086 void
1087 OP_3E03 ()
1088 {
1089 #ifdef DEBUG
1090 printf(" mvac\ta%d,a%d\n",OP[0],OP[1]);
1091 #endif
1092 State.a[OP[0]] = State.a[OP[1]];
1093 }
1094
1095 /* mvb */
1096 void
1097 OP_5400 ()
1098 {
1099 #ifdef DEBUG
1100 printf(" mvb\tr%d,r%d\n",OP[0],OP[1]);
1101 #endif
1102 State.regs[OP[0]] = SEXT8 (State.regs[OP[1]] & 0xff);
1103 }
1104
1105 /* mvf0f */
1106 void
1107 OP_4400 ()
1108 {
1109 #ifdef DEBUG
1110 printf(" mvf0f\tr%d,r%d\n",OP[0],OP[1]);
1111 #endif
1112 if (State.F0 == 0)
1113 State.regs[OP[0]] = State.regs[OP[1]];
1114 }
1115
1116 /* mvf0t */
1117 void
1118 OP_4401 ()
1119 {
1120 #ifdef DEBUG
1121 printf(" mvf0t\tr%d,r%d\n",OP[0],OP[1]);
1122 #endif
1123 if (State.F0)
1124 State.regs[OP[0]] = State.regs[OP[1]];
1125 }
1126
1127 /* mvfacg */
1128 void
1129 OP_1E04 ()
1130 {
1131 #ifdef DEBUG
1132 printf(" mvfacg\tr%d,a%d\n",OP[0],OP[1]);
1133 #endif
1134 State.regs[OP[0]] = (State.a[OP[1]] >> 32) & 0xff;
1135 }
1136
1137 /* mvfachi */
1138 void
1139 OP_1E00 ()
1140 {
1141 #ifdef DEBUG
1142 printf(" mvfachi\tr%d,a%d\n",OP[0],OP[1]);
1143 #endif
1144 State.regs[OP[0]] = (State.a[OP[1]] >> 16) & 0xffff;
1145 }
1146
1147 /* mvfaclo */
1148 void
1149 OP_1E02 ()
1150 {
1151 #ifdef DEBUG
1152 printf(" mvfaclo\tr%d,a%d\n",OP[0],OP[1]);
1153 #endif
1154 State.regs[OP[0]] = State.a[OP[1]] & 0xffff;
1155 }
1156
1157 /* mvfc */
1158 void
1159 OP_5200 ()
1160 {
1161 #ifdef DEBUG
1162 printf(" mvfc\tr%d,cr%d\n",OP[0],OP[1]);
1163 #endif
1164 if (OP[1] == 0)
1165 {
1166 /* PSW is treated specially */
1167 PSW = 0;
1168 if (State.SM) PSW |= 0x8000;
1169 if (State.EA) PSW |= 0x2000;
1170 if (State.DB) PSW |= 0x1000;
1171 if (State.IE) PSW |= 0x400;
1172 if (State.RP) PSW |= 0x200;
1173 if (State.MD) PSW |= 0x100;
1174 if (State.FX) PSW |= 0x80;
1175 if (State.ST) PSW |= 0x40;
1176 if (State.F0) PSW |= 8;
1177 if (State.F1) PSW |= 4;
1178 if (State.C) PSW |= 1;
1179 }
1180 State.regs[OP[0]] = State.cregs[OP[1]];
1181 }
1182
1183 /* mvtacg */
1184 void
1185 OP_1E41 ()
1186 {
1187 #ifdef DEBUG
1188 printf(" mvtacg\tr%d,a%d\n",OP[0],OP[1]);
1189 #endif
1190 State.a[OP[1]] &= MASK32;
1191 State.a[OP[1]] |= (int64)(State.regs[OP[0]] & 0xff) << 32;
1192 }
1193
1194 /* mvtachi */
1195 void
1196 OP_1E01 ()
1197 {
1198 uint16 tmp;
1199 #ifdef DEBUG
1200 printf(" mvtachi\tr%d,a%d\n",OP[0],OP[1]);
1201 #endif
1202 tmp = State.a[OP[1]] & 0xffff;
1203 State.a[OP[1]] = SEXT16 (State.regs[OP[0]]) << 16 | tmp;
1204 printf("put 0x%llx\n",State.a[OP[1]]);
1205 }
1206
1207 /* mvtaclo */
1208 void
1209 OP_1E21 ()
1210 {
1211 #ifdef DEBUG
1212 printf(" mvtaclo\tr%d,a%d\n",OP[0],OP[1]);
1213 #endif
1214 State.a[OP[1]] = SEXT16 (State.regs[OP[0]]);
1215 }
1216
1217 /* mvtc */
1218 void
1219 OP_5600 ()
1220 {
1221 #ifdef DEBUG
1222 printf(" mvtc\tr%d,cr%d\n",OP[0],OP[1]);
1223 #endif
1224 State.cregs[OP[1]] = State.regs[OP[0]];
1225 if (OP[1] == 0)
1226 {
1227 /* PSW is treated specially */
1228 State.SM = (PSW & 0x8000) ? 1 : 0;
1229 State.EA = (PSW & 0x2000) ? 1 : 0;
1230 State.DB = (PSW & 0x1000) ? 1 : 0;
1231 State.IE = (PSW & 0x400) ? 1 : 0;
1232 State.RP = (PSW & 0x200) ? 1 : 0;
1233 State.MD = (PSW & 0x100) ? 1 : 0;
1234 State.FX = (PSW & 0x80) ? 1 : 0;
1235 State.ST = (PSW & 0x40) ? 1 : 0;
1236 State.F0 = (PSW & 8) ? 1 : 0;
1237 State.F1 = (PSW & 4) ? 1 : 0;
1238 State.C = PSW & 1;
1239 if (State.ST && !State.FX)
1240 {
1241 fprintf (stderr,"ERROR at PC 0x%x: ST can only be set when FX is set.\n",PC<<2);
1242 exit (1);
1243 }
1244 }
1245 }
1246
1247 /* mvub */
1248 void
1249 OP_5401 ()
1250 {
1251 #ifdef DEBUG
1252 printf(" mvub\tr%d,r%d\n",OP[0],OP[1]);
1253 #endif
1254 State.regs[OP[0]] = State.regs[OP[1]] & 0xff;
1255 }
1256
1257 /* neg */
1258 void
1259 OP_4605 ()
1260 {
1261 #ifdef DEBUG
1262 printf(" neg\tr%d\n",OP[0]);
1263 #endif
1264 State.regs[OP[0]] = 0 - State.regs[OP[0]];
1265 }
1266
1267 /* neg */
1268 void
1269 OP_5605 ()
1270 {
1271 int64 tmp;
1272 #ifdef DEBUG
1273 printf(" neg\ta%d\n",OP[0]);
1274 #endif
1275 tmp = -State.a[OP[0]];
1276 if (State.ST)
1277 {
1278 if ( tmp > MAX32)
1279 State.a[OP[0]] = MAX32;
1280 else if (tmp < MIN32)
1281 State.a[OP[0]] = MIN32;
1282 else
1283 State.a[OP[0]] = tmp;
1284 }
1285 else
1286 State.a[OP[0]] = tmp;
1287 }
1288
1289
1290 /* nop */
1291 void
1292 OP_5E00 ()
1293 {
1294 }
1295
1296 /* not */
1297 void
1298 OP_4603 ()
1299 {
1300 #ifdef DEBUG
1301 printf(" not\tr%d\n",OP[0]);
1302 #endif
1303 State.regs[OP[0]] = ~(State.regs[OP[0]]);
1304 }
1305
1306 /* or */
1307 void
1308 OP_800 ()
1309 {
1310 #ifdef DEBUG
1311 printf(" or\tr%d,r%d\n",OP[0],OP[1]);
1312 #endif
1313 State.regs[OP[0]] |= State.regs[OP[1]];
1314 }
1315
1316 /* or3 */
1317 void
1318 OP_4000000 ()
1319 {
1320 #ifdef DEBUG
1321 printf(" or3\tr%d,r%d,0x%x\n",OP[0],OP[1],OP[2]);
1322 #endif
1323 State.regs[OP[0]] = State.regs[OP[1]] | OP[2];
1324 }
1325
1326 /* rac */
1327 void
1328 OP_5201 ()
1329 {
1330 int64 tmp;
1331 int shift = SEXT3 (OP[2]);
1332 #ifdef DEBUG
1333 printf(" rac\tr%d,a%d,%d\n",OP[0],OP[1],shift);
1334 #endif
1335 State.F1 = State.F0;
1336 if (shift >=0)
1337 tmp = ((State.a[0] << 16) | (State.a[1] & 0xffff)) << shift;
1338 else
1339 tmp = ((State.a[0] << 16) | (State.a[1] & 0xffff)) >> -shift;
1340 tmp = (tmp + 0x8000) >> 16;
1341
1342 if (tmp > MAX32)
1343 {
1344 State.regs[OP[0]] = 0x7fff;
1345 State.regs[OP[0]+1] = 0xffff;
1346 State.F0 = 1;
1347 }
1348 else if (tmp < MIN32)
1349 {
1350 State.regs[OP[0]] = 0x8000;
1351 State.regs[OP[0]+1] = 0;
1352 State.F0 = 1;
1353 }
1354 else
1355 {
1356 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
1357 State.regs[OP[0]+1] = tmp & 0xffff;
1358 State.F0 = 0;
1359 }
1360 }
1361
1362 /* rachi */
1363 void
1364 OP_4201 ()
1365 {
1366 int64 tmp;
1367 int shift = SEXT3 (OP[2]);
1368 #ifdef DEBUG
1369 printf(" rachi\tr%d,a%d,%d\n",OP[0],OP[1],shift);
1370 #endif
1371 State.F1 = State.F0;
1372 if (shift >=0)
1373 tmp = SEXT40 (State.a[1]) << shift;
1374 else
1375 tmp = SEXT40 (State.a[1]) >> -shift;
1376 tmp += 0x8000;
1377 if (tmp > MAX32)
1378 {
1379 State.regs[OP[0]] = 0x7fff;
1380 State.F0 = 1;
1381 }
1382 else if (tmp < 0xfff80000000LL)
1383 {
1384 State.regs[OP[0]] = 0x8000;
1385 State.F0 = 1;
1386 }
1387 else
1388 {
1389 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
1390 State.F0 = 0;
1391 }
1392 }
1393
1394 /* rep */
1395 void
1396 OP_27000000 ()
1397 {
1398 #ifdef DEBUG
1399 printf(" rep\tr%d,0x%x\n",OP[0],OP[1]);
1400 #endif
1401 RPT_S = PC + 1;
1402 RPT_E = PC + OP[1];
1403 RPT_C = State.regs[OP[0]];
1404 State.RP = 1;
1405 if (RPT_C == 0)
1406 {
1407 fprintf (stderr, "ERROR: rep with count=0 is illegal.\n");
1408 exit(1);
1409 }
1410 if (OP[1] < 4)
1411 {
1412 fprintf (stderr, "ERROR: rep must include at least 4 instructions.\n");
1413 exit(1);
1414 }
1415 }
1416
1417 /* repi */
1418 void
1419 OP_2F000000 ()
1420 {
1421 #ifdef DEBUG
1422 printf(" repi\t%d,0x%x\n",OP[0],OP[1]);
1423 #endif
1424 RPT_S = PC + 1;
1425 RPT_E = PC + OP[1];
1426 RPT_C = OP[0];
1427 State.RP = 1;
1428 if (RPT_C == 0)
1429 {
1430 fprintf (stderr, "ERROR: repi with count=0 is illegal.\n");
1431 exit(1);
1432 }
1433 if (OP[1] < 4)
1434 {
1435 fprintf (stderr, "ERROR: repi must include at least 4 instructions.\n");
1436 exit(1);
1437 }
1438 }
1439
1440 /* rtd */
1441 void
1442 OP_5F60 ()
1443 {
1444 printf(" rtd - NOT IMPLEMENTED\n");
1445 }
1446
1447 /* rte */
1448 void
1449 OP_5F40 ()
1450 {
1451 #ifdef DEBUG
1452 printf(" rte\n");
1453 #endif
1454 PC = BPC;
1455 PSW = BPSW;
1456 }
1457
1458 /* sadd */
1459 void
1460 OP_1223 ()
1461 {
1462 int64 tmp;
1463 #ifdef DEBUG
1464 printf(" sadd\ta%d,a%d\n",OP[0],OP[1]);
1465 #endif
1466 tmp = State.a[OP[0]] + (State.a[OP[1]] >> 16);
1467 if (State.ST)
1468 {
1469 if (tmp > MAX32)
1470 State.a[OP[0]] = MAX32;
1471 else if (tmp < MIN32)
1472 State.a[OP[0]] = MIN32;
1473 else
1474 State.a[OP[0]] = tmp;
1475 }
1476 else
1477 State.a[OP[0]] = tmp;
1478 }
1479
1480 /* setf0f */
1481 void
1482 OP_4611 ()
1483 {
1484 #ifdef DEBUG
1485 printf(" setf0f\tr%d\n",OP[0]);
1486 #endif
1487 State.regs[OP[0]] = (State.F0 == 0) ? 1 : 0;
1488 }
1489
1490 /* setf0t */
1491 void
1492 OP_4613 ()
1493 {
1494 #ifdef DEBUG
1495 printf(" setf0t\tr%d\n",OP[0]);
1496 #endif
1497 State.regs[OP[0]] = (State.F0 == 1) ? 1 : 0;
1498 }
1499
1500 /* sleep */
1501 void
1502 OP_5FC0 ()
1503 {
1504 #ifdef DEBUG
1505 printf(" sleep\n");
1506 #endif
1507 State.IE = 1;
1508 }
1509
1510 /* sll */
1511 void
1512 OP_2200 ()
1513 {
1514 #ifdef DEBUG
1515 printf(" sll\tr%d,r%d\n",OP[0],OP[1]);
1516 #endif
1517 State.regs[OP[0]] <<= (State.regs[OP[1]] & 0xf);
1518 }
1519
1520 /* sll */
1521 void
1522 OP_3200 ()
1523 {
1524 int64 tmp;
1525 #ifdef DEBUG
1526 printf(" sll\ta%d,r%d\n",OP[0],OP[1]);
1527 #endif
1528 if (State.regs[OP[1]] & 31 <= 16)
1529 tmp = SEXT40 (State.a[OP[0]]) << (State.regs[OP[1]] & 31);
1530
1531 if (State.ST)
1532 {
1533 if (tmp > MAX32)
1534 State.a[OP[0]] = MAX32;
1535 else if (tmp < 0xffffff80000000LL)
1536 State.a[OP[0]] = MIN32;
1537 else
1538 State.a[OP[0]] = tmp & MASK40;
1539 }
1540 else
1541 State.a[OP[0]] = tmp & MASK40;
1542 }
1543
1544 /* slli */
1545 void
1546 OP_2201 ()
1547 {
1548 #ifdef DEBUG
1549 printf(" slli\tr%d,%d\n",OP[0],OP[1]);
1550 #endif
1551 State.regs[OP[0]] <<= OP[1];
1552 }
1553
1554 /* slli */
1555 void
1556 OP_3201 ()
1557 {
1558 int64 tmp;
1559 #ifdef DEBUG
1560 printf(" slli\ta%d,%d\n",OP[0],OP[1]);
1561 #endif
1562 if (OP[1] == 0)
1563 tmp = SEXT40(State.a[OP[0]]) << 16;
1564 else
1565 tmp = SEXT40(State.a[OP[0]]) << OP[2];
1566
1567 if (State.ST)
1568 {
1569 if (tmp > MAX32)
1570 State.a[OP[0]] = MAX32;
1571 else if (tmp < 0xffffff80000000LL)
1572 State.a[OP[0]] = MIN32;
1573 else
1574 State.a[OP[0]] = tmp & MASK40;
1575 }
1576 else
1577 State.a[OP[0]] = tmp & MASK40;
1578 }
1579
1580 /* slx */
1581 void
1582 OP_460B ()
1583 {
1584 uint16 tmp;
1585 #ifdef DEBUG
1586 printf(" slx\tr%d\n",OP[0]);
1587 #endif
1588 State.regs[OP[0]] = (State.regs[OP[0]] << 1) | State.F0;
1589 }
1590
1591 /* sra */
1592 void
1593 OP_2400 ()
1594 {
1595 #ifdef DEBUG
1596 printf(" sra\tr%d,r%d\n",OP[0],OP[1]);
1597 #endif
1598 State.regs[OP[0]] = ((int16)(State.regs[OP[0]])) >> (State.regs[OP[1]] & 0xf);
1599 }
1600
1601 /* sra */
1602 void
1603 OP_3400 ()
1604 {
1605 #ifdef DEBUG
1606 printf(" sra\ta%d,r%d\n",OP[0],OP[1]);
1607 #endif
1608 if (State.regs[OP[1]] & 31 <= 16)
1609 State.a[OP[0]] >>= (State.regs[OP[1]] & 31);
1610 }
1611
1612 /* srai */
1613 void
1614 OP_2401 ()
1615 {
1616 #ifdef DEBUG
1617 printf(" srai\tr%d,%d\n",OP[0],OP[1]);
1618 #endif
1619 State.regs[OP[0]] = ((int16)(State.regs[OP[0]])) >> OP[1];
1620 }
1621
1622 /* srai */
1623 void
1624 OP_3401 ()
1625 {
1626 #ifdef DEBUG
1627 printf(" srai\ta%d,%d\n",OP[0],OP[1]);
1628 #endif
1629 if (OP[1] == 0)
1630 State.a[OP[0]] >>= 16;
1631 else
1632 State.a[OP[0]] >>= OP[1];
1633 }
1634
1635 /* srl */
1636 void
1637 OP_2000 ()
1638 {
1639 #ifdef DEBUG
1640 printf(" srl\tr%d,r%d\n",OP[0],OP[1]);
1641 #endif
1642 State.regs[OP[0]] >>= (State.regs[OP[1]] & 0xf);
1643 }
1644
1645 /* srl */
1646 void
1647 OP_3000 ()
1648 {
1649 #ifdef DEBUG
1650 printf(" srl\ta%d,r%d\n",OP[0],OP[1]);
1651 #endif
1652 if (State.regs[OP[1]] & 31 <= 16)
1653 State.a[OP[0]] >>= (State.regs[OP[1]] & 31);
1654 }
1655
1656 /* srli */
1657 void
1658 OP_2001 ()
1659 {
1660 #ifdef DEBUG
1661 printf(" srli\tr%d,%d\n",OP[0],OP[1]);
1662 #endif
1663 State.regs[OP[0]] >>= OP[1];
1664 }
1665
1666 /* srli */
1667 void
1668 OP_3001 ()
1669 {
1670 #ifdef DEBUG
1671 printf(" srli\ta%d,%d\n",OP[0],OP[1]);
1672 #endif
1673 if (OP[1] == 0)
1674 State.a[OP[0]] >>= 16;
1675 else
1676 State.a[OP[0]] >>= OP[1];
1677 }
1678
1679 /* srx */
1680 void
1681 OP_4609 ()
1682 {
1683 uint16 tmp;
1684 #ifdef DEBUG
1685 printf(" srx\tr%d\n",OP[0]);
1686 #endif
1687 tmp = State.F0 << 15;
1688 State.regs[OP[0]] = (State.regs[OP[0]] >> 1) | tmp;
1689 }
1690
1691 /* st */
1692 void
1693 OP_34000000 ()
1694 {
1695 #ifdef DEBUG
1696 printf(" st\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
1697 #endif
1698 SW (OP[1] + State.regs[OP[2]], State.regs[OP[0]]);
1699 }
1700
1701 /* st */
1702 void
1703 OP_6800 ()
1704 {
1705 #ifdef DEBUG
1706 printf(" st\tr%d,@r%d\n",OP[0],OP[1]);
1707 #endif
1708 SW (State.regs[OP[1]], State.regs[OP[0]]);
1709 }
1710
1711 /* st */
1712 void
1713 OP_6C1F ()
1714 {
1715 #ifdef DEBUG
1716 printf(" st\tr%d,@-r%d\n",OP[0],OP[1]);
1717 #endif
1718 if ( OP[1] != 15 )
1719 {
1720 fprintf (stderr,"ERROR: cannot pre-decrement any registers but r15 (SP).\n");
1721 exit(1);
1722 }
1723 State.regs[OP[1]] -= 2;
1724 SW (State.regs[OP[1]], State.regs[OP[0]]);
1725 }
1726
1727 /* st */
1728 void
1729 OP_6801 ()
1730 {
1731 #ifdef DEBUG
1732 printf(" st\tr%d,@r%d+\n",OP[0],OP[1]);
1733 #endif
1734 SW (State.regs[OP[1]], State.regs[OP[0]]);
1735 State.regs[OP[1]] += 2;
1736 }
1737
1738 /* st */
1739 void
1740 OP_6C01 ()
1741 {
1742 #ifdef DEBUG
1743 printf(" st\tr%d,@r%d-\n",OP[0],OP[1]);
1744 #endif
1745 SW (State.regs[OP[1]], State.regs[OP[0]]);
1746 State.regs[OP[1]] -= 2;
1747 }
1748
1749 /* st2w */
1750 void
1751 OP_35000000 ()
1752 {
1753 #ifdef DEBUG
1754 printf(" st2w\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
1755 #endif
1756 SW (State.regs[OP[1]]+OP[2], State.regs[OP[0]]);
1757 SW (State.regs[OP[1]]+OP[2]+2, State.regs[OP[0]+1]);
1758 }
1759
1760 /* st2w */
1761 void
1762 OP_6A00 ()
1763 {
1764 #ifdef DEBUG
1765 printf(" st2w\tr%d,@r%d\n",OP[0],OP[1]);
1766 #endif
1767 SW (State.regs[OP[1]], State.regs[OP[0]]);
1768 SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
1769 }
1770
1771 /* st2w */
1772 void
1773 OP_6E1F ()
1774 {
1775 #ifdef DEBUG
1776 printf(" st2w\tr%d,@-r%d\n",OP[0],OP[1]);
1777 #endif
1778 if ( OP[1] != 15 )
1779 {
1780 fprintf (stderr,"ERROR: cannot pre-decrement any registers but r15 (SP).\n");
1781 exit(1);
1782 }
1783 State.regs[OP[1]] -= 4;
1784 SW (State.regs[OP[1]], State.regs[OP[0]]);
1785 SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
1786 }
1787
1788 /* st2w */
1789 void
1790 OP_6A01 ()
1791 {
1792 #ifdef DEBUG
1793 printf(" st2w\tr%d,r%d+\n",OP[0],OP[1]);
1794 #endif
1795 SW (State.regs[OP[1]], State.regs[OP[0]]);
1796 SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
1797 State.regs[OP[1]] += 4;
1798 }
1799
1800 /* st2w */
1801 void
1802 OP_6E01 ()
1803 {
1804 #ifdef DEBUG
1805 printf(" st2w\tr%d,r%d-\n",OP[0],OP[1]);
1806 #endif
1807 SW (State.regs[OP[1]], State.regs[OP[0]]);
1808 SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
1809 State.regs[OP[1]] -= 4;
1810 }
1811
1812 /* stb */
1813 void
1814 OP_3C000000 ()
1815 {
1816 #ifdef DEBUG
1817 printf(" stb\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
1818 #endif
1819 SB (State.regs[OP[1]]+OP[2], State.regs[OP[0]]);
1820 }
1821
1822 /* stb */
1823 void
1824 OP_7800 ()
1825 {
1826 #ifdef DEBUG
1827 printf(" stb\tr%d,@r%d\n",OP[0],OP[1]);
1828 #endif
1829 SB (State.regs[OP[1]], State.regs[OP[0]]);
1830 }
1831
1832 /* stop */
1833 void
1834 OP_5FE0 ()
1835 {
1836 #ifdef DEBUG
1837 printf(" stop\n");
1838 #endif
1839 exit(1);
1840 }
1841
1842 /* sub */
1843 void
1844 OP_0 ()
1845 {
1846 int32 tmp;
1847 #ifdef DEBUG
1848 printf(" sub\tr%d,r%d\n",OP[0],OP[1]);
1849 #endif
1850 tmp = (int16)State.regs[OP[0]]- (int16)State.regs[OP[1]];
1851 State.C = (tmp & 0xffff0000) ? 1 : 0;
1852 State.regs[OP[0]] = tmp & 0xffff;
1853 }
1854
1855 /* sub */
1856 void
1857 OP_1001 ()
1858 {
1859 #ifdef DEBUG
1860 printf(" sub\ta%d,r%d\n",OP[0],OP[1]);
1861 #endif
1862 }
1863
1864 /* sub */
1865
1866 void
1867 OP_1003 ()
1868 {
1869 #ifdef DEBUG
1870 printf(" sub\ta%d,a%d\n",OP[0],OP[1]);
1871 #endif
1872
1873 }
1874
1875 /* sub2w */
1876 void
1877 OP_1000 ()
1878 {
1879 int64 tmp;
1880 int32 a,b;
1881 #ifdef DEBUG
1882 printf(" sub2w\tr%d,r%d\n",OP[0],OP[1]);
1883 #endif
1884
1885 a = (int32)((State.regs[OP[0]] << 16) | State.regs[OP[0]+1]);
1886 b = (int32)((State.regs[OP[1]] << 16) | State.regs[OP[1]+1]);
1887 tmp = a-b;
1888 State.C = (tmp & 0xffffffff00000000LL) ? 1 : 0;
1889 State.regs[OP[0]] = (tmp >> 16) & 0xffff;
1890 State.regs[OP[0]+1] = tmp & 0xffff;
1891 }
1892
1893 /* subac3 */
1894 void
1895 OP_17000000 ()
1896 {
1897 #ifdef DEBUG
1898 printf(" subac3\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1899 #endif
1900 }
1901
1902 /* subac3 */
1903 void
1904 OP_17000002 ()
1905 {
1906 #ifdef DEBUG
1907 printf(" subac3\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1908 #endif
1909 }
1910
1911 /* subac3s */
1912 void
1913 OP_17001000 ()
1914 {
1915 #ifdef DEBUG
1916 printf(" subac3s\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1917 #endif
1918 }
1919
1920 /* subac3s */
1921 void
1922 OP_17001002 ()
1923 {
1924 #ifdef DEBUG
1925 printf(" subac3s\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
1926 #endif
1927 }
1928
1929 /* subi */
1930 void
1931 OP_1 ()
1932 {
1933 int32 tmp;
1934 #ifdef DEBUG
1935 printf(" subi\tr%d,%d\n",OP[0],OP[1]);
1936 #endif
1937 if (OP[1] == 0)
1938 OP[1] = 16;
1939 tmp = (int16)State.regs[OP[0]] - OP[1];
1940 State.C = (tmp & 0xffff0000) ? 1 : 0;
1941 State.regs[OP[0]] = tmp & 0xffff;
1942 }
1943
1944 /* trap */
1945 void
1946 OP_5F00 ()
1947 {
1948 #ifdef DEBUG
1949 printf(" trap\t%d\n",OP[0]);
1950 #endif
1951
1952 /* for now, trap 0 is used for simulating IO */
1953
1954 if (OP[0] == 0)
1955 {
1956 char *fstr = State.regs[2] + State.imem;
1957 printf (fstr,State.regs[3],State.regs[4],State.regs[5]);
1958 }
1959 else if (OP[0] == 1 )
1960 {
1961 char *fstr = State.regs[2] + State.imem;
1962 puts (fstr);
1963 }
1964 }
1965
1966 /* tst0i */
1967 void
1968 OP_7000000 ()
1969 {
1970 #ifdef DEBUG
1971 printf(" tst0i\tr%d,0x%x\n",OP[0],OP[1]);
1972 #endif
1973 State.F1 = State.F0;
1974 State.F0 = (State.regs[OP[0]] & OP[2]) ? 1 : 0;
1975 }
1976
1977 /* tst1i */
1978 void
1979 OP_F000000 ()
1980 {
1981 #ifdef DEBUG
1982 printf(" tst1i\tr%d,0x%x\n",OP[0],OP[1]);
1983 #endif
1984 State.F1 = State.F0;
1985 State.F0 = (~(State.regs[OP[0]]) & OP[2]) ? 1 : 0;
1986 }
1987
1988 /* wait */
1989 void
1990 OP_5F80 ()
1991 {
1992 #ifdef DEBUG
1993 printf(" wait\n");
1994 #endif
1995 State.IE = 1;
1996 }
1997
1998 /* xor */
1999 void
2000 OP_A00 ()
2001 {
2002 #ifdef DEBUG
2003 printf(" xor\tr%d,r%d\n",OP[0],OP[1]);
2004 #endif
2005 State.regs[OP[0]] ^= State.regs[OP[1]];
2006 }
2007
2008 /* xor3 */
2009 void
2010 OP_5000000 ()
2011 {
2012 #ifdef DEBUG
2013 printf(" xor3\tr%d,r%d,0x%x\n",OP[0],OP[1],OP[2]);
2014 #endif
2015 State.regs[OP[0]] = State.regs[OP[1]] ^ OP[2];
2016 }
2017