7 #include "mn10300_sim.h"
10 #include "targ-vals.h"
14 #include <sys/times.h>
17 #define REG0(X) ((X) & 0x3)
18 #define REG1(X) (((X) & 0xc) >> 2)
19 #define REG0_4(X) (((X) & 0x30) >> 4)
20 #define REG0_8(X) (((X) & 0x300) >> 8)
21 #define REG1_8(X) (((X) & 0xc00) >> 10)
22 #define REG0_16(X) (((X) & 0x30000) >> 16)
23 #define REG1_16(X) (((X) & 0xc0000) >> 18)
26 void OP_8000 (insn, extension)
27 unsigned long insn, extension;
29 State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
33 void OP_80 (insn, extension)
34 unsigned long insn, extension;
36 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
40 void OP_F1E0 (insn, extension)
41 unsigned long insn, extension;
43 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
47 void OP_F1D0 (insn, extension)
48 unsigned long insn, extension;
50 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
54 void OP_9000 (insn, extension)
55 unsigned long insn, extension;
57 State.regs[REG_A0 + REG0_8 (insn)] = insn & 0xff;
61 void OP_90 (insn, extension)
62 unsigned long insn, extension;
64 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
68 void OP_3C (insn, extension)
69 unsigned long insn, extension;
71 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_SP];
75 void OP_F2F0 (insn, extension)
76 unsigned long insn, extension;
78 State.regs[REG_SP] = State.regs[REG_A0 + REG1 (insn)];
82 void OP_F2E4 (insn, extension)
83 unsigned long insn, extension;
85 State.regs[REG_D0 + REG0 (insn)] = PSW;
89 void OP_F2F3 (insn, extension)
90 unsigned long insn, extension;
92 PSW = State.regs[REG_D0 + REG1 (insn)];
96 void OP_F2E0 (insn, extension)
97 unsigned long insn, extension;
99 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR];
103 void OP_F2F2 (insn, extension)
104 unsigned long insn, extension;
106 State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)];
110 void OP_70 (insn, extension)
111 unsigned long insn, extension;
113 State.regs[REG_D0 + REG1 (insn)]
114 = load_word (State.regs[REG_A0 + REG0 (insn)]);
117 /* mov (d8,am), dn */
118 void OP_F80000 (insn, extension)
119 unsigned long insn, extension;
121 State.regs[REG_D0 + REG1_8 (insn)]
122 = load_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)));
125 /* mov (d16,am), dn */
126 void OP_FA000000 (insn, extension)
127 unsigned long insn, extension;
129 State.regs[REG_D0 + REG1_16 (insn)]
130 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
131 + SEXT16 (insn & 0xffff)));
134 /* mov (d32,am), dn */
135 void OP_FC000000 (insn, extension)
136 unsigned long insn, extension;
138 State.regs[REG_D0 + REG1_16 (insn)]
139 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
140 + ((insn & 0xffff) << 16) + extension));
143 /* mov (d8,sp), dn */
144 void OP_5800 (insn, extension)
145 unsigned long insn, extension;
147 State.regs[REG_D0 + REG0_8 (insn)]
148 = load_word (State.regs[REG_SP] + (insn & 0xff));
151 /* mov (d16,sp), dn */
152 void OP_FAB40000 (insn, extension)
153 unsigned long insn, extension;
155 State.regs[REG_D0 + REG0_16 (insn)]
156 = load_word (State.regs[REG_SP] + (insn & 0xffff));
159 /* mov (d32,sp), dn */
160 void OP_FCB40000 (insn, extension)
161 unsigned long insn, extension;
163 State.regs[REG_D0 + REG0_16 (insn)]
164 = load_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
167 /* mov (di,am), dn */
168 void OP_F300 (insn, extension)
169 unsigned long insn, extension;
171 State.regs[REG_D0 + REG0_4 (insn)]
172 = load_word ((State.regs[REG_A0 + REG0 (insn)]
173 + State.regs[REG_D0 + REG1 (insn)]));
176 /* mov (abs16), dn */
177 void OP_300000 (insn, extension)
178 unsigned long insn, extension;
180 State.regs[REG_D0 + REG0_16 (insn)] = load_word ((insn & 0xffff));
183 /* mov (abs32), dn */
184 void OP_FCA40000 (insn, extension)
185 unsigned long insn, extension;
187 State.regs[REG_D0 + REG0_16 (insn)]
188 = load_word ((((insn & 0xffff) << 16) + extension));
192 void OP_F000 (insn, extension)
193 unsigned long insn, extension;
195 State.regs[REG_A0 + REG1 (insn)]
196 = load_word (State.regs[REG_A0 + REG0 (insn)]);
199 /* mov (d8,am), an */
200 void OP_F82000 (insn, extension)
201 unsigned long insn, extension;
203 State.regs[REG_A0 + REG1_8 (insn)]
204 = load_word ((State.regs[REG_A0 + REG0_8 (insn)]
205 + SEXT8 (insn & 0xff)));
208 /* mov (d16,am), an */
209 void OP_FA200000 (insn, extension)
210 unsigned long insn, extension;
212 State.regs[REG_A0 + REG1_16 (insn)]
213 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
214 + SEXT16 (insn & 0xffff)));
217 /* mov (d32,am), an */
218 void OP_FC200000 (insn, extension)
219 unsigned long insn, extension;
221 State.regs[REG_A0 + REG1_16 (insn)]
222 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
223 + ((insn & 0xffff) << 16) + extension));
226 /* mov (d8,sp), an */
227 void OP_5C00 (insn, extension)
228 unsigned long insn, extension;
230 State.regs[REG_A0 + REG0_8 (insn)]
231 = load_word (State.regs[REG_SP] + (insn & 0xff));
234 /* mov (d16,sp), an */
235 void OP_FAB00000 (insn, extension)
236 unsigned long insn, extension;
238 State.regs[REG_A0 + REG0_16 (insn)]
239 = load_word (State.regs[REG_SP] + (insn & 0xffff));
242 /* mov (d32,sp), an */
243 void OP_FCB00000 (insn, extension)
244 unsigned long insn, extension;
246 State.regs[REG_A0 + REG0_16 (insn)]
247 = load_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
250 /* mov (di,am), an */
251 void OP_F380 (insn, extension)
252 unsigned long insn, extension;
254 State.regs[REG_A0 + REG0_4 (insn)]
255 = load_word ((State.regs[REG_A0 + REG0 (insn)]
256 + State.regs[REG_D0 + REG1 (insn)]));
259 /* mov (abs16), an */
260 void OP_FAA00000 (insn, extension)
261 unsigned long insn, extension;
263 State.regs[REG_A0 + REG0_16 (insn)] = load_word ((insn & 0xffff));
266 /* mov (abs32), an */
267 void OP_FCA00000 (insn, extension)
268 unsigned long insn, extension;
270 State.regs[REG_A0 + REG0_16 (insn)]
271 = load_word ((((insn & 0xffff) << 16) + extension));
274 /* mov (d8,am), sp */
275 void OP_F8F000 (insn, extension)
276 unsigned long insn, extension;
279 = load_word ((State.regs[REG_A0 + REG0_8 (insn)]
280 + SEXT8 (insn & 0xff)));
284 void OP_60 (insn, extension)
285 unsigned long insn, extension;
287 store_word (State.regs[REG_A0 + REG0 (insn)],
288 State.regs[REG_D0 + REG1 (insn)]);
291 /* mov dm, (d8,an) */
292 void OP_F81000 (insn, extension)
293 unsigned long insn, extension;
295 store_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
296 State.regs[REG_D0 + REG1_8 (insn)]);
299 /* mov dm (d16,an) */
300 void OP_FA100000 (insn, extension)
301 unsigned long insn, extension;
303 store_word ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
304 State.regs[REG_D0 + REG1_16 (insn)]);
307 /* mov dm (d32,an) */
308 void OP_FC100000 (insn, extension)
309 unsigned long insn, extension;
311 store_word ((State.regs[REG_A0 + REG0_16 (insn)]
312 + ((insn & 0xffff) << 16) + extension),
313 State.regs[REG_D0 + REG1_16 (insn)]);
316 /* mov dm, (d8,sp) */
317 void OP_4200 (insn, extension)
318 unsigned long insn, extension;
320 store_word (State.regs[REG_SP] + (insn & 0xff),
321 State.regs[REG_D0 + REG1_8 (insn)]);
324 /* mov dm, (d16,sp) */
325 void OP_FA910000 (insn, extension)
326 unsigned long insn, extension;
328 store_word (State.regs[REG_SP] + (insn & 0xffff),
329 State.regs[REG_D0 + REG1_16 (insn)]);
332 /* mov dm, (d32,sp) */
333 void OP_FC910000 (insn, extension)
334 unsigned long insn, extension;
336 store_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
337 State.regs[REG_D0 + REG1_16 (insn)]);
340 /* mov dm, (di,an) */
341 void OP_F340 (insn, extension)
342 unsigned long insn, extension;
344 store_word ((State.regs[REG_A0 + REG0 (insn)]
345 + State.regs[REG_D0 + REG1 (insn)]),
346 State.regs[REG_D0 + REG0_4 (insn)]);
349 /* mov dm, (abs16) */
350 void OP_10000 (insn, extension)
351 unsigned long insn, extension;
353 store_word ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
356 /* mov dm, (abs32) */
357 void OP_FC810000 (insn, extension)
358 unsigned long insn, extension;
360 store_word ((((insn & 0xffff) << 16) + extension),
361 State.regs[REG_D0 + REG1_16 (insn)]);
365 void OP_F010 (insn, extension)
366 unsigned long insn, extension;
368 store_word (State.regs[REG_A0 + REG0 (insn)],
369 State.regs[REG_A0 + REG1 (insn)]);
372 /* mov am, (d8,an) */
373 void OP_F83000 (insn, extension)
374 unsigned long insn, extension;
376 store_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
377 State.regs[REG_A0 + REG1_8 (insn)]);
380 /* mov am, (d16,an) */
381 void OP_FA300000 (insn, extension)
382 unsigned long insn, extension;
384 store_word ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
385 State.regs[REG_A0 + REG1_16 (insn)]);
388 /* mov am, (d32,an) */
389 void OP_FC300000 (insn, extension)
390 unsigned long insn, extension;
392 store_word ((State.regs[REG_A0 + REG0_16 (insn)]
393 + ((insn & 0xffff) << 16) + extension),
394 State.regs[REG_A0 + REG1_16 (insn)]);
397 /* mov am, (d8,sp) */
398 void OP_4300 (insn, extension)
399 unsigned long insn, extension;
401 store_word (State.regs[REG_SP] + (insn & 0xff),
402 State.regs[REG_A0 + REG1_8 (insn)]);
405 /* mov am, (d16,sp) */
406 void OP_FA900000 (insn, extension)
407 unsigned long insn, extension;
409 store_word (State.regs[REG_SP] + (insn & 0xffff),
410 State.regs[REG_A0 + REG1_16 (insn)]);
413 /* mov am, (d32,sp) */
414 void OP_FC900000 (insn, extension)
415 unsigned long insn, extension;
417 store_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
418 State.regs[REG_A0 + REG1_16 (insn)]);
421 /* mov am, (di,an) */
422 void OP_F3C0 (insn, extension)
423 unsigned long insn, extension;
425 store_word ((State.regs[REG_A0 + REG0 (insn)]
426 + State.regs[REG_D0 + REG1 (insn)]),
427 State.regs[REG_A0 + REG0_4 (insn)]);
430 /* mov am, (abs16) */
431 void OP_FA800000 (insn, extension)
432 unsigned long insn, extension;
434 store_word ((insn & 0xffff), State.regs[REG_A0 + REG1_16 (insn)]);
437 /* mov am, (abs32) */
438 void OP_FC800000 (insn, extension)
439 unsigned long insn, extension;
441 store_word ((((insn & 0xffff) << 16) + extension), State.regs[REG_A0 + REG1_16 (insn)]);
444 /* mov sp, (d8,an) */
445 void OP_F8F400 (insn, extension)
446 unsigned long insn, extension;
448 store_word (State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff),
453 void OP_2C0000 (insn, extension)
454 unsigned long insn, extension;
458 value = SEXT16 (insn & 0xffff);
459 State.regs[REG_D0 + REG0_16 (insn)] = value;
463 void OP_FCCC0000 (insn, extension)
464 unsigned long insn, extension;
468 value = ((insn & 0xffff) << 16) + extension;
469 State.regs[REG_D0 + REG0_16 (insn)] = value;
473 void OP_240000 (insn, extension)
474 unsigned long insn, extension;
478 value = insn & 0xffff;
479 State.regs[REG_A0 + REG0_16 (insn)] = value;
483 void OP_FCDC0000 (insn, extension)
484 unsigned long insn, extension;
488 value = ((insn & 0xffff) << 16) + extension;
489 State.regs[REG_A0 + REG0_16 (insn)] = value;
493 void OP_F040 (insn, extension)
494 unsigned long insn, extension;
496 State.regs[REG_D0 + REG1 (insn)]
497 = load_byte (State.regs[REG_A0 + REG0 (insn)]);
500 /* movbu (d8,am), dn */
501 void OP_F84000 (insn, extension)
502 unsigned long insn, extension;
504 State.regs[REG_D0 + REG1_8 (insn)]
505 = load_byte ((State.regs[REG_A0 + REG0_8 (insn)]
506 + SEXT8 (insn & 0xff)));
509 /* movbu (d16,am), dn */
510 void OP_FA400000 (insn, extension)
511 unsigned long insn, extension;
513 State.regs[REG_D0 + REG1_16 (insn)]
514 = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
515 + SEXT16 (insn & 0xffff)));
518 /* movbu (d32,am), dn */
519 void OP_FC400000 (insn, extension)
520 unsigned long insn, extension;
522 State.regs[REG_D0 + REG1_16 (insn)]
523 = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
524 + ((insn & 0xffff) << 16) + extension));
527 /* movbu (d8,sp), dn */
528 void OP_F8B800 (insn, extension)
529 unsigned long insn, extension;
531 State.regs[REG_D0 + REG0_8 (insn)]
532 = load_byte ((State.regs[REG_SP] + (insn & 0xff)));
535 /* movbu (d16,sp), dn */
536 void OP_FAB80000 (insn, extension)
537 unsigned long insn, extension;
539 State.regs[REG_D0 + REG0_16 (insn)]
540 = load_byte ((State.regs[REG_SP] + (insn & 0xffff)));
543 /* movbu (d32,sp), dn */
544 void OP_FCB80000 (insn, extension)
545 unsigned long insn, extension;
547 State.regs[REG_D0 + REG0_16 (insn)]
548 = load_byte (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
551 /* movbu (di,am), dn */
552 void OP_F400 (insn, extension)
553 unsigned long insn, extension;
555 State.regs[REG_D0 + REG0_4 (insn)]
556 = load_byte ((State.regs[REG_A0 + REG0 (insn)]
557 + State.regs[REG_D0 + REG1 (insn)]));
560 /* movbu (abs16), dn */
561 void OP_340000 (insn, extension)
562 unsigned long insn, extension;
564 State.regs[REG_D0 + REG0_16 (insn)] = load_byte ((insn & 0xffff));
567 /* movbu (abs32), dn */
568 void OP_FCA80000 (insn, extension)
569 unsigned long insn, extension;
571 State.regs[REG_D0 + REG0_16 (insn)]
572 = load_byte ((((insn & 0xffff) << 16) + extension));
576 void OP_F050 (insn, extension)
577 unsigned long insn, extension;
579 store_byte (State.regs[REG_A0 + REG0 (insn)],
580 State.regs[REG_D0 + REG1 (insn)]);
583 /* movbu dm, (d8,an) */
584 void OP_F85000 (insn, extension)
585 unsigned long insn, extension;
587 store_byte ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
588 State.regs[REG_D0 + REG1_8 (insn)]);
591 /* movbu dm, (d16,an) */
592 void OP_FA500000 (insn, extension)
593 unsigned long insn, extension;
595 store_byte ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
596 State.regs[REG_D0 + REG1_16 (insn)]);
599 /* movbu dm, (d32,an) */
600 void OP_FC500000 (insn, extension)
601 unsigned long insn, extension;
603 store_byte ((State.regs[REG_A0 + REG0_16 (insn)]
604 + ((insn & 0xffff) << 16) + extension),
605 State.regs[REG_D0 + REG1_16 (insn)]);
608 /* movbu dm, (d8,sp) */
609 void OP_F89200 (insn, extension)
610 unsigned long insn, extension;
612 store_byte (State.regs[REG_SP] + (insn & 0xff),
613 State.regs[REG_D0 + REG1_8 (insn)]);
616 /* movbu dm, (d16,sp) */
617 void OP_FA920000 (insn, extension)
618 unsigned long insn, extension;
620 store_byte (State.regs[REG_SP] + (insn & 0xffff),
621 State.regs[REG_D0 + REG1_16 (insn)]);
624 /* movbu dm (d32,sp) */
625 void OP_FC920000 (insn, extension)
626 unsigned long insn, extension;
628 store_byte (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
629 State.regs[REG_D0 + REG1_16 (insn)]);
632 /* movbu dm, (di,an) */
633 void OP_F440 (insn, extension)
634 unsigned long insn, extension;
636 store_byte ((State.regs[REG_A0 + REG0 (insn)]
637 + State.regs[REG_D0 + REG1 (insn)]),
638 State.regs[REG_D0 + REG0_4 (insn)]);
641 /* movbu dm, (abs16) */
642 void OP_20000 (insn, extension)
643 unsigned long insn, extension;
645 store_byte ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
648 /* movbu dm, (abs32) */
649 void OP_FC820000 (insn, extension)
650 unsigned long insn, extension;
652 store_byte ((((insn & 0xffff) << 16) + extension), State.regs[REG_D0 + REG1_16 (insn)]);
656 void OP_F060 (insn, extension)
657 unsigned long insn, extension;
659 State.regs[REG_D0 + REG1 (insn)]
660 = load_half (State.regs[REG_A0 + REG0 (insn)]);
663 /* movhu (d8,am), dn */
664 void OP_F86000 (insn, extension)
665 unsigned long insn, extension;
667 State.regs[REG_D0 + REG1_8 (insn)]
668 = load_half ((State.regs[REG_A0 + REG0_8 (insn)]
669 + SEXT8 (insn & 0xff)));
672 /* movhu (d16,am), dn */
673 void OP_FA600000 (insn, extension)
674 unsigned long insn, extension;
676 State.regs[REG_D0 + REG1_16 (insn)]
677 = load_half ((State.regs[REG_A0 + REG0_16 (insn)]
678 + SEXT16 (insn & 0xffff)));
681 /* movhu (d32,am), dn */
682 void OP_FC600000 (insn, extension)
683 unsigned long insn, extension;
685 State.regs[REG_D0 + REG1_16 (insn)]
686 = load_half ((State.regs[REG_A0 + REG0_16 (insn)]
687 + ((insn & 0xffff) << 16) + extension));
690 /* movhu (d8,sp) dn */
691 void OP_F8BC00 (insn, extension)
692 unsigned long insn, extension;
694 State.regs[REG_D0 + REG0_8 (insn)]
695 = load_half ((State.regs[REG_SP] + (insn & 0xff)));
698 /* movhu (d16,sp), dn */
699 void OP_FABC0000 (insn, extension)
700 unsigned long insn, extension;
702 State.regs[REG_D0 + REG0_16 (insn)]
703 = load_half ((State.regs[REG_SP] + (insn & 0xffff)));
706 /* movhu (d32,sp), dn */
707 void OP_FCBC0000 (insn, extension)
708 unsigned long insn, extension;
710 State.regs[REG_D0 + REG0_16 (insn)]
711 = load_half (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
714 /* movhu (di,am), dn */
715 void OP_F480 (insn, extension)
716 unsigned long insn, extension;
718 State.regs[REG_D0 + REG0_4 (insn)]
719 = load_half ((State.regs[REG_A0 + REG0 (insn)]
720 + State.regs[REG_D0 + REG1 (insn)]));
723 /* movhu (abs16), dn */
724 void OP_380000 (insn, extension)
725 unsigned long insn, extension;
727 State.regs[REG_D0 + REG0_16 (insn)] = load_half ((insn & 0xffff));
730 /* movhu (abs32), dn */
731 void OP_FCAC0000 (insn, extension)
732 unsigned long insn, extension;
734 State.regs[REG_D0 + REG0_16 (insn)]
735 = load_half ((((insn & 0xffff) << 16) + extension));
739 void OP_F070 (insn, extension)
740 unsigned long insn, extension;
742 store_half (State.regs[REG_A0 + REG0 (insn)],
743 State.regs[REG_D0 + REG1 (insn)]);
746 /* movhu dm, (d8,an) */
747 void OP_F87000 (insn, extension)
748 unsigned long insn, extension;
750 store_half ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
751 State.regs[REG_D0 + REG1_8 (insn)]);
754 /* movhu dm, (d16,an) */
755 void OP_FA700000 (insn, extension)
756 unsigned long insn, extension;
758 store_half ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
759 State.regs[REG_D0 + REG1_16 (insn)]);
762 /* movhu dm, (d32,an) */
763 void OP_FC700000 (insn, extension)
764 unsigned long insn, extension;
766 store_half ((State.regs[REG_A0 + REG0_16 (insn)]
767 + ((insn & 0xffff) << 16) + extension),
768 State.regs[REG_D0 + REG1_16 (insn)]);
771 /* movhu dm,(d8,sp) */
772 void OP_F89300 (insn, extension)
773 unsigned long insn, extension;
775 store_half (State.regs[REG_SP] + (insn & 0xff),
776 State.regs[REG_D0 + REG1_8 (insn)]);
779 /* movhu dm,(d16,sp) */
780 void OP_FA930000 (insn, extension)
781 unsigned long insn, extension;
783 store_half (State.regs[REG_SP] + (insn & 0xffff),
784 State.regs[REG_D0 + REG1_16 (insn)]);
787 /* movhu dm,(d32,sp) */
788 void OP_FC930000 (insn, extension)
789 unsigned long insn, extension;
791 store_half (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
792 State.regs[REG_D0 + REG1_16 (insn)]);
795 /* movhu dm, (di,an) */
796 void OP_F4C0 (insn, extension)
797 unsigned long insn, extension;
799 store_half ((State.regs[REG_A0 + REG0 (insn)]
800 + State.regs[REG_D0 + REG1 (insn)]),
801 State.regs[REG_D0 + REG0_4 (insn)]);
804 /* movhu dm, (abs16) */
805 void OP_30000 (insn, extension)
806 unsigned long insn, extension;
808 store_half ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
811 /* movhu dm, (abs32) */
812 void OP_FC830000 (insn, extension)
813 unsigned long insn, extension;
815 store_half ((((insn & 0xffff) << 16) + extension), State.regs[REG_D0 + REG1_16 (insn)]);
819 void OP_F2D0 (insn, extension)
820 unsigned long insn, extension;
822 if (State.regs[REG_D0 + REG0 (insn)] & 0x80000000)
823 State.regs[REG_MDR] = -1;
825 State.regs[REG_MDR] = 0;
829 void OP_10 (insn, extension)
830 unsigned long insn, extension;
832 State.regs[REG_D0 + REG0 (insn)] = SEXT8 (State.regs[REG_D0 + REG0 (insn)]);
836 void OP_14 (insn, extension)
837 unsigned long insn, extension;
839 State.regs[REG_D0 + REG0 (insn)] &= 0xff;
843 void OP_18 (insn, extension)
844 unsigned long insn, extension;
846 State.regs[REG_D0 + REG0 (insn)]
847 = SEXT16 (State.regs[REG_D0 + REG0 (insn)]);
851 void OP_1C (insn, extension)
852 unsigned long insn, extension;
854 State.regs[REG_D0 + REG0 (insn)] &= 0xffff;
857 /* movm (sp), reg_list */
858 void OP_CE00 (insn, extension)
859 unsigned long insn, extension;
861 unsigned long sp = State.regs[REG_SP];
869 State.regs[REG_LAR] = load_word (sp);
871 State.regs[REG_LIR] = load_word (sp);
873 State.regs[REG_MDR] = load_word (sp);
875 State.regs[REG_A0 + 1] = load_word (sp);
877 State.regs[REG_A0] = load_word (sp);
879 State.regs[REG_D0 + 1] = load_word (sp);
881 State.regs[REG_D0] = load_word (sp);
887 State.regs[REG_A0 + 3] = load_word (sp);
893 State.regs[REG_A0 + 2] = load_word (sp);
899 State.regs[REG_D0 + 3] = load_word (sp);
905 State.regs[REG_D0 + 2] = load_word (sp);
909 /* And make sure to update the stack pointer. */
910 State.regs[REG_SP] = sp;
913 /* movm reg_list, (sp) */
914 void OP_CF00 (insn, extension)
915 unsigned long insn, extension;
917 unsigned long sp = State.regs[REG_SP];
925 store_word (sp, State.regs[REG_D0 + 2]);
931 store_word (sp, State.regs[REG_D0 + 3]);
937 store_word (sp, State.regs[REG_A0 + 2]);
943 store_word (sp, State.regs[REG_A0 + 3]);
949 store_word (sp, State.regs[REG_D0]);
951 store_word (sp, State.regs[REG_D0 + 1]);
953 store_word (sp, State.regs[REG_A0]);
955 store_word (sp, State.regs[REG_A0 + 1]);
957 store_word (sp, State.regs[REG_MDR]);
959 store_word (sp, State.regs[REG_LIR]);
961 store_word (sp, State.regs[REG_LAR]);
965 /* And make sure to update the stack pointer. */
966 State.regs[REG_SP] = sp;
970 void OP_0 (insn, extension)
971 unsigned long insn, extension;
973 State.regs[REG_D0 + REG1 (insn)] = 0;
976 PSW &= ~(PSW_V | PSW_C | PSW_N);
980 void OP_E0 (insn, extension)
981 unsigned long insn, extension;
984 unsigned long reg1, reg2, value;
986 reg1 = State.regs[REG_D0 + REG1 (insn)];
987 reg2 = State.regs[REG_D0 + REG0 (insn)];
989 State.regs[REG_D0 + REG0 (insn)] = value;
992 n = (value & 0x80000000);
993 c = (value < reg1) || (value < reg2);
994 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
995 && (reg2 & 0x80000000) != (value & 0x80000000));
997 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
998 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
999 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1003 void OP_F160 (insn, extension)
1004 unsigned long insn, extension;
1007 unsigned long reg1, reg2, value;
1009 reg1 = State.regs[REG_D0 + REG1 (insn)];
1010 reg2 = State.regs[REG_A0 + REG0 (insn)];
1011 value = reg1 + reg2;
1012 State.regs[REG_A0 + REG0 (insn)] = value;
1015 n = (value & 0x80000000);
1016 c = (value < reg1) || (value < reg2);
1017 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1018 && (reg2 & 0x80000000) != (value & 0x80000000));
1020 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1021 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1022 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1026 void OP_F150 (insn, extension)
1027 unsigned long insn, extension;
1030 unsigned long reg1, reg2, value;
1032 reg1 = State.regs[REG_A0 + REG1 (insn)];
1033 reg2 = State.regs[REG_D0 + REG0 (insn)];
1034 value = reg1 + reg2;
1035 State.regs[REG_D0 + REG0 (insn)] = value;
1038 n = (value & 0x80000000);
1039 c = (value < reg1) || (value < reg2);
1040 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1041 && (reg2 & 0x80000000) != (value & 0x80000000));
1043 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1044 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1045 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1049 void OP_F170 (insn, extension)
1050 unsigned long insn, extension;
1053 unsigned long reg1, reg2, value;
1055 reg1 = State.regs[REG_A0 + REG1 (insn)];
1056 reg2 = State.regs[REG_A0 + REG0 (insn)];
1057 value = reg1 + reg2;
1058 State.regs[REG_A0 + REG0 (insn)] = value;
1061 n = (value & 0x80000000);
1062 c = (value < reg1) || (value < reg2);
1063 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1064 && (reg2 & 0x80000000) != (value & 0x80000000));
1066 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1067 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1068 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1072 void OP_2800 (insn, extension)
1073 unsigned long insn, extension;
1076 unsigned long reg1, imm, value;
1078 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1079 imm = SEXT8 (insn & 0xff);
1081 State.regs[REG_D0 + REG0_8 (insn)] = value;
1084 n = (value & 0x80000000);
1085 c = (value < reg1) || (value < imm);
1086 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1087 && (reg1 & 0x80000000) != (value & 0x80000000));
1089 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1090 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1091 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1095 void OP_FAC00000 (insn, extension)
1096 unsigned long insn, extension;
1099 unsigned long reg1, imm, value;
1101 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1102 imm = SEXT16 (insn & 0xffff);
1104 State.regs[REG_D0 + REG0_16 (insn)] = value;
1107 n = (value & 0x80000000);
1108 c = (value < reg1) || (value < imm);
1109 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1110 && (reg1 & 0x80000000) != (value & 0x80000000));
1112 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1113 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1114 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1118 void OP_FCC00000 (insn, extension)
1119 unsigned long insn, extension;
1122 unsigned long reg1, imm, value;
1124 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1125 imm = ((insn & 0xffff) << 16) + extension;
1127 State.regs[REG_D0 + REG0_16 (insn)] = value;
1130 n = (value & 0x80000000);
1131 c = (value < reg1) || (value < imm);
1132 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1133 && (reg1 & 0x80000000) != (value & 0x80000000));
1135 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1136 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1137 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1141 void OP_2000 (insn, extension)
1142 unsigned long insn, extension;
1145 unsigned long reg1, imm, value;
1147 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1148 imm = SEXT8 (insn & 0xff);
1150 State.regs[REG_A0 + REG0_8 (insn)] = value;
1153 n = (value & 0x80000000);
1154 c = (value < reg1) || (value < imm);
1155 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1156 && (reg1 & 0x80000000) != (value & 0x80000000));
1158 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1159 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1160 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1164 void OP_FAD00000 (insn, extension)
1165 unsigned long insn, extension;
1168 unsigned long reg1, imm, value;
1170 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1171 imm = SEXT16 (insn & 0xffff);
1173 State.regs[REG_A0 + REG0_16 (insn)] = value;
1176 n = (value & 0x80000000);
1177 c = (value < reg1) || (value < imm);
1178 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1179 && (reg1 & 0x80000000) != (value & 0x80000000));
1181 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1182 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1183 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1187 void OP_FCD00000 (insn, extension)
1188 unsigned long insn, extension;
1191 unsigned long reg1, imm, value;
1193 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1194 imm = ((insn & 0xffff) << 16) + extension;
1196 State.regs[REG_A0 + REG0_16 (insn)] = value;
1199 n = (value & 0x80000000);
1200 c = (value < reg1) || (value < imm);
1201 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1202 && (reg1 & 0x80000000) != (value & 0x80000000));
1204 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1205 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1206 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1210 void OP_F8FE00 (insn, extension)
1211 unsigned long insn, extension;
1213 unsigned long reg1, imm, value;
1215 reg1 = State.regs[REG_SP];
1216 imm = SEXT8 (insn & 0xff);
1218 State.regs[REG_SP] = value;
1222 void OP_FAFE0000 (insn, extension)
1223 unsigned long insn, extension;
1225 unsigned long reg1, imm, value;
1227 reg1 = State.regs[REG_SP];
1228 imm = SEXT16 (insn & 0xffff);
1230 State.regs[REG_SP] = value;
1234 void OP_FCFE0000 (insn, extension)
1235 unsigned long insn, extension;
1237 unsigned long reg1, imm, value;
1239 reg1 = State.regs[REG_SP];
1240 imm = ((insn & 0xffff) << 16) + extension;
1242 State.regs[REG_SP] = value;
1246 void OP_F140 (insn, extension)
1247 unsigned long insn, extension;
1250 unsigned long reg1, reg2, value;
1252 reg1 = State.regs[REG_D0 + REG1 (insn)];
1253 reg2 = State.regs[REG_D0 + REG0 (insn)];
1254 value = reg1 + reg2 + ((PSW & PSW_C) != 0);
1255 State.regs[REG_D0 + REG0 (insn)] = value;
1258 n = (value & 0x80000000);
1259 c = (value < reg1) || (value < reg2);
1260 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1261 && (reg2 & 0x80000000) != (value & 0x80000000));
1263 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1264 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1265 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1269 void OP_F100 (insn, extension)
1270 unsigned long insn, extension;
1273 unsigned long reg1, reg2, value;
1275 reg1 = State.regs[REG_D0 + REG1 (insn)];
1276 reg2 = State.regs[REG_D0 + REG0 (insn)];
1277 value = reg2 - reg1;
1278 State.regs[REG_D0 + REG0 (insn)] = value;
1281 n = (value & 0x80000000);
1283 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1284 && (reg2 & 0x80000000) != (value & 0x80000000));
1286 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1287 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1288 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1292 void OP_F120 (insn, extension)
1293 unsigned long insn, extension;
1296 unsigned long reg1, reg2, value;
1298 reg1 = State.regs[REG_D0 + REG1 (insn)];
1299 reg2 = State.regs[REG_A0 + REG0 (insn)];
1300 value = reg2 - reg1;
1301 State.regs[REG_A0 + REG0 (insn)] = value;
1304 n = (value & 0x80000000);
1306 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1307 && (reg2 & 0x80000000) != (value & 0x80000000));
1309 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1310 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1311 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1315 void OP_F110 (insn, extension)
1316 unsigned long insn, extension;
1319 unsigned long reg1, reg2, value;
1321 reg1 = State.regs[REG_A0 + REG1 (insn)];
1322 reg2 = State.regs[REG_D0 + REG0 (insn)];
1323 value = reg2 - reg1;
1324 State.regs[REG_D0 + REG0 (insn)] = value;
1327 n = (value & 0x80000000);
1329 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1330 && (reg2 & 0x80000000) != (value & 0x80000000));
1332 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1333 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1334 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1338 void OP_F130 (insn, extension)
1339 unsigned long insn, extension;
1342 unsigned long reg1, reg2, value;
1344 reg1 = State.regs[REG_A0 + REG1 (insn)];
1345 reg2 = State.regs[REG_A0 + REG0 (insn)];
1346 value = reg2 - reg1;
1347 State.regs[REG_A0 + REG0 (insn)] = value;
1350 n = (value & 0x80000000);
1352 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1353 && (reg2 & 0x80000000) != (value & 0x80000000));
1355 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1356 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1357 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1361 void OP_FCC40000 (insn, extension)
1362 unsigned long insn, extension;
1365 unsigned long reg1, imm, value;
1367 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1368 imm = ((insn & 0xffff) << 16) + extension;
1370 State.regs[REG_D0 + REG0_16 (insn)] = value;
1373 n = (value & 0x80000000);
1375 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1376 && (reg1 & 0x80000000) != (value & 0x80000000));
1378 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1379 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1380 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1384 void OP_FCD40000 (insn, extension)
1385 unsigned long insn, extension;
1388 unsigned long reg1, imm, value;
1390 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1391 imm = ((insn & 0xffff) << 16) + extension;
1393 State.regs[REG_A0 + REG0_16 (insn)] = value;
1396 n = (value & 0x80000000);
1398 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1399 && (reg1 & 0x80000000) != (value & 0x80000000));
1401 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1402 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1403 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1407 void OP_F180 (insn, extension)
1408 unsigned long insn, extension;
1411 unsigned long reg1, reg2, value;
1413 reg1 = State.regs[REG_D0 + REG1 (insn)];
1414 reg2 = State.regs[REG_D0 + REG0 (insn)];
1415 value = reg2 - reg1 - ((PSW & PSW_C) != 0);
1416 State.regs[REG_D0 + REG0 (insn)] = value;
1419 n = (value & 0x80000000);
1421 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1422 && (reg2 & 0x80000000) != (value & 0x80000000));
1424 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1425 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1426 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1430 void OP_F240 (insn, extension)
1431 unsigned long insn, extension;
1433 unsigned long long temp;
1436 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)]
1437 * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]);
1438 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1439 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1440 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1441 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1442 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1443 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1447 void OP_F250 (insn, extension)
1448 unsigned long insn, extension;
1450 unsigned long long temp;
1453 temp = ((unsigned64)State.regs[REG_D0 + REG0 (insn)]
1454 * (unsigned64)State.regs[REG_D0 + REG1 (insn)]);
1455 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1456 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1457 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1458 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1459 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1460 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1464 void OP_F260 (insn, extension)
1465 unsigned long insn, extension;
1470 temp = State.regs[REG_MDR];
1472 temp |= State.regs[REG_D0 + REG0 (insn)];
1473 State.regs[REG_MDR] = temp % (long)State.regs[REG_D0 + REG1 (insn)];
1474 temp /= (long)State.regs[REG_D0 + REG1 (insn)];
1475 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1476 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1477 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1478 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1479 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1483 void OP_F270 (insn, extension)
1484 unsigned long insn, extension;
1486 unsigned long long temp;
1489 temp = State.regs[REG_MDR];
1491 temp |= State.regs[REG_D0 + REG0 (insn)];
1492 State.regs[REG_MDR] = temp % State.regs[REG_D0 + REG1 (insn)];
1493 temp /= State.regs[REG_D0 + REG1 (insn)];
1494 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1495 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1496 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1497 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1498 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1502 void OP_40 (insn, extension)
1503 unsigned long insn, extension;
1506 unsigned int value, imm, reg1;
1508 reg1 = State.regs[REG_D0 + REG1 (insn)];
1511 State.regs[REG_D0 + REG1 (insn)] = value;
1514 n = (value & 0x80000000);
1516 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1517 && (reg1 & 0x80000000) != (value & 0x80000000));
1519 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1520 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1521 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1525 void OP_41 (insn, extension)
1526 unsigned long insn, extension;
1528 State.regs[REG_A0 + REG1 (insn)] += 1;
1532 void OP_50 (insn, extension)
1533 unsigned long insn, extension;
1535 State.regs[REG_A0 + REG0 (insn)] += 4;
1539 void OP_A000 (insn, extension)
1540 unsigned long insn, extension;
1543 unsigned long reg1, imm, value;
1545 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1546 imm = SEXT8 (insn & 0xff);
1550 n = (value & 0x80000000);
1552 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1553 && (reg1 & 0x80000000) != (value & 0x80000000));
1555 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1556 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1557 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1561 void OP_A0 (insn, extension)
1562 unsigned long insn, extension;
1565 unsigned long reg1, reg2, value;
1567 reg1 = State.regs[REG_D0 + REG1 (insn)];
1568 reg2 = State.regs[REG_D0 + REG0 (insn)];
1569 value = reg2 - reg1;
1572 n = (value & 0x80000000);
1574 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1575 && (reg2 & 0x80000000) != (value & 0x80000000));
1577 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1578 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1579 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1583 void OP_F1A0 (insn, extension)
1584 unsigned long insn, extension;
1587 unsigned long reg1, reg2, value;
1589 reg1 = State.regs[REG_D0 + REG1 (insn)];
1590 reg2 = State.regs[REG_A0 + REG0 (insn)];
1591 value = reg2 - reg1;
1594 n = (value & 0x80000000);
1596 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1597 && (reg2 & 0x80000000) != (value & 0x80000000));
1599 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1600 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1601 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1605 void OP_F190 (insn, extension)
1606 unsigned long insn, extension;
1609 unsigned long reg1, reg2, value;
1611 reg1 = State.regs[REG_A0 + REG1 (insn)];
1612 reg2 = State.regs[REG_D0 + REG0 (insn)];
1613 value = reg2 - reg1;
1616 n = (value & 0x80000000);
1618 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1619 && (reg2 & 0x80000000) != (value & 0x80000000));
1621 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1622 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1623 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1627 void OP_B000 (insn, extension)
1628 unsigned long insn, extension;
1631 unsigned long reg1, imm, value;
1633 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1638 n = (value & 0x80000000);
1640 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1641 && (reg1 & 0x80000000) != (value & 0x80000000));
1643 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1644 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1645 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1649 void OP_B0 (insn, extension)
1650 unsigned long insn, extension;
1653 unsigned long reg1, reg2, value;
1655 reg1 = State.regs[REG_A0 + REG1 (insn)];
1656 reg2 = State.regs[REG_A0 + REG0 (insn)];
1657 value = reg2 - reg1;
1660 n = (value & 0x80000000);
1662 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1663 && (reg2 & 0x80000000) != (value & 0x80000000));
1665 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1666 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1667 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1671 void OP_FAC80000 (insn, extension)
1672 unsigned long insn, extension;
1675 unsigned long reg1, imm, value;
1677 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1678 imm = SEXT16 (insn & 0xffff);
1682 n = (value & 0x80000000);
1684 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1685 && (reg1 & 0x80000000) != (value & 0x80000000));
1687 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1688 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1689 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1693 void OP_FCC80000 (insn, extension)
1694 unsigned long insn, extension;
1697 unsigned long reg1, imm, value;
1699 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1700 imm = ((insn & 0xffff) << 16) + extension;
1704 n = (value & 0x80000000);
1706 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1707 && (reg1 & 0x80000000) != (value & 0x80000000));
1709 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1710 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1711 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1715 void OP_FAD80000 (insn, extension)
1716 unsigned long insn, extension;
1719 unsigned long reg1, imm, value;
1721 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1722 imm = insn & 0xffff;
1726 n = (value & 0x80000000);
1728 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1729 && (reg1 & 0x80000000) != (value & 0x80000000));
1731 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1732 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1733 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1737 void OP_FCD80000 (insn, extension)
1738 unsigned long insn, extension;
1741 unsigned long reg1, imm, value;
1743 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1744 imm = ((insn & 0xffff) << 16) + extension;
1748 n = (value & 0x80000000);
1750 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1751 && (reg1 & 0x80000000) != (value & 0x80000000));
1753 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1754 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1755 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1759 void OP_F200 (insn, extension)
1760 unsigned long insn, extension;
1764 State.regs[REG_D0 + REG0 (insn)] &= State.regs[REG_D0 + REG1 (insn)];
1765 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1766 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1767 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1768 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1772 void OP_F8E000 (insn, extension)
1773 unsigned long insn, extension;
1777 State.regs[REG_D0 + REG0_8 (insn)] &= (insn & 0xff);
1778 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
1779 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
1780 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1781 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1785 void OP_FAE00000 (insn, extension)
1786 unsigned long insn, extension;
1790 State.regs[REG_D0 + REG0_16 (insn)] &= (insn & 0xffff);
1791 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1792 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1793 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1794 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1798 void OP_FCE00000 (insn, extension)
1799 unsigned long insn, extension;
1803 State.regs[REG_D0 + REG0_16 (insn)]
1804 &= ((insn & 0xffff) << 16) + extension;
1805 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1806 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1807 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1808 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1811 /* and imm16, psw */
1812 void OP_FAFC0000 (insn, extension)
1813 unsigned long insn, extension;
1815 PSW &= (insn & 0xffff);
1819 void OP_F210 (insn, extension)
1820 unsigned long insn, extension;
1824 State.regs[REG_D0 + REG0 (insn)] |= State.regs[REG_D0 + REG1 (insn)];
1825 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1826 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1827 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1828 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1832 void OP_F8E400 (insn, extension)
1833 unsigned long insn, extension;
1837 State.regs[REG_D0 + REG0_8 (insn)] |= insn & 0xff;
1838 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
1839 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
1840 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1841 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1845 void OP_FAE40000 (insn, extension)
1846 unsigned long insn, extension;
1850 State.regs[REG_D0 + REG0_16 (insn)] |= insn & 0xffff;
1851 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1852 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1853 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1854 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1858 void OP_FCE40000 (insn, extension)
1859 unsigned long insn, extension;
1863 State.regs[REG_D0 + REG0_16 (insn)]
1864 |= ((insn & 0xffff) << 16) + extension;
1865 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1866 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1867 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1868 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1872 void OP_FAFD0000 (insn, extension)
1873 unsigned long insn, extension;
1875 PSW |= (insn & 0xffff);
1879 void OP_F220 (insn, extension)
1880 unsigned long insn, extension;
1884 State.regs[REG_D0 + REG0 (insn)] ^= State.regs[REG_D0 + REG1 (insn)];
1885 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1886 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1887 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1888 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1892 void OP_FAE80000 (insn, extension)
1893 unsigned long insn, extension;
1897 State.regs[REG_D0 + REG0_16 (insn)] ^= insn & 0xffff;
1898 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1899 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1900 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1901 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1905 void OP_FCE80000 (insn, extension)
1906 unsigned long insn, extension;
1910 State.regs[REG_D0 + REG0_16 (insn)]
1911 ^= ((insn & 0xffff) << 16) + extension;
1912 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1913 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
1914 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1915 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1919 void OP_F230 (insn, extension)
1920 unsigned long insn, extension;
1924 State.regs[REG_D0 + REG0 (insn)] = ~State.regs[REG_D0 + REG0 (insn)];
1925 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1926 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1927 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1928 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1932 void OP_F8EC00 (insn, extension)
1933 unsigned long insn, extension;
1938 temp = State.regs[REG_D0 + REG0_8 (insn)];
1939 temp &= (insn & 0xff);
1940 n = (temp & 0x80000000) != 0;
1942 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1943 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1946 /* btst imm16, dn */
1947 void OP_FAEC0000 (insn, extension)
1948 unsigned long insn, extension;
1953 temp = State.regs[REG_D0 + REG0_16 (insn)];
1954 temp &= (insn & 0xffff);
1955 n = (temp & 0x80000000) != 0;
1957 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1958 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1961 /* btst imm32, dn */
1962 void OP_FCEC0000 (insn, extension)
1963 unsigned long insn, extension;
1968 temp = State.regs[REG_D0 + REG0_16 (insn)];
1969 temp &= ((insn & 0xffff) << 16) + extension;
1970 n = (temp & 0x80000000) != 0;
1972 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1973 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1976 /* btst imm8,(abs32) */
1977 void OP_FE020000 (insn, extension)
1978 unsigned long insn, extension;
1983 temp = load_byte (((insn & 0xffff) << 16) | (extension >> 8));
1984 temp &= (extension & 0xff);
1985 n = (temp & 0x80000000) != 0;
1987 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1988 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1991 /* btst imm8,(d8,an) */
1992 void OP_FAF80000 (insn, extension)
1993 unsigned long insn, extension;
1998 temp = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
1999 + SEXT8 ((insn & 0xff00) >> 8)));
2000 temp &= (insn & 0xff);
2001 n = (temp & 0x80000000) != 0;
2003 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2004 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
2008 void OP_F080 (insn, extension)
2009 unsigned long insn, extension;
2014 temp = load_byte (State.regs[REG_A0 + REG0 (insn)]);
2015 z = (temp & State.regs[REG_D0 + REG1 (insn)]) == 0;
2016 temp |= State.regs[REG_D0 + REG1 (insn)];
2017 store_byte (State.regs[REG_A0 + REG0 (insn)], temp);
2018 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2019 PSW |= (z ? PSW_Z : 0);
2022 /* bset imm8, (abs32) */
2023 void OP_FE000000 (insn, extension)
2024 unsigned long insn, extension;
2029 temp = load_byte (((insn & 0xffff) << 16 | (extension >> 8)));
2030 z = (temp & (extension & 0xff)) == 0;
2031 temp |= (extension & 0xff);
2032 store_byte ((((insn & 0xffff) << 16) | (extension >> 8)), temp);
2033 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2034 PSW |= (z ? PSW_Z : 0);
2037 /* bset imm8,(d8,an) */
2038 void OP_FAF00000 (insn, extension)
2039 unsigned long insn, extension;
2044 temp = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
2045 + SEXT8 ((insn & 0xff00) >> 8)));
2046 z = (temp & (insn & 0xff)) == 0;
2047 temp |= (insn & 0xff);
2048 store_byte ((State.regs[REG_A0 + REG0_16 (insn)]
2049 + SEXT8 ((insn & 0xff00) >> 8)), temp);
2050 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2051 PSW |= (z ? PSW_Z : 0);
2055 void OP_F090 (insn, extension)
2056 unsigned long insn, extension;
2061 temp = load_byte (State.regs[REG_A0 + REG0 (insn)]);
2062 z = (temp & State.regs[REG_D0 + REG1 (insn)]) == 0;
2063 temp = temp & ~State.regs[REG_D0 + REG1 (insn)];
2064 store_byte (State.regs[REG_A0 + REG0 (insn)], temp);
2065 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2066 PSW |= (z ? PSW_Z : 0);
2069 /* bclr imm8, (abs32) */
2070 void OP_FE010000 (insn, extension)
2071 unsigned long insn, extension;
2076 temp = load_byte (((insn & 0xffff) << 16) | (extension >> 8));
2077 z = (temp & (extension & 0xff)) == 0;
2078 temp = temp & ~(extension & 0xff);
2079 store_byte (((insn & 0xffff) << 16) | (extension >> 8), temp);
2080 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2081 PSW |= (z ? PSW_Z : 0);
2084 /* bclr imm8,(d8,an) */
2085 void OP_FAF40000 (insn, extension)
2086 unsigned long insn, extension;
2091 temp = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
2092 + SEXT8 ((insn & 0xff00) >> 8)));
2093 z = (temp & (insn & 0xff)) == 0;
2094 temp = temp & ~(insn & 0xff);
2095 store_byte ((State.regs[REG_A0 + REG0_16 (insn)]
2096 + SEXT8 ((insn & 0xff00) >> 8)), temp);
2097 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2098 PSW |= (z ? PSW_Z : 0);
2102 void OP_F2B0 (insn, extension)
2103 unsigned long insn, extension;
2108 temp = State.regs[REG_D0 + REG0 (insn)];
2110 temp >>= State.regs[REG_D0 + REG1 (insn)];
2111 State.regs[REG_D0 + REG0 (insn)] = temp;
2112 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2113 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
2114 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2115 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2119 void OP_F8C800 (insn, extension)
2120 unsigned long insn, extension;
2125 temp = State.regs[REG_D0 + REG0_8 (insn)];
2127 temp >>= (insn & 0xff);
2128 State.regs[REG_D0 + REG0_8 (insn)] = temp;
2129 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2130 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2131 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2132 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2136 void OP_F2A0 (insn, extension)
2137 unsigned long insn, extension;
2141 c = State.regs[REG_D0 + REG0 (insn)] & 1;
2142 State.regs[REG_D0 + REG0 (insn)]
2143 >>= State.regs[REG_D0 + REG1 (insn)];
2144 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2145 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
2146 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2147 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2151 void OP_F8C400 (insn, extension)
2152 unsigned long insn, extension;
2156 c = State.regs[REG_D0 + REG0_8 (insn)] & 1;
2157 State.regs[REG_D0 + REG0_8 (insn)] >>= (insn & 0xff);
2158 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2159 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2160 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2161 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2165 void OP_F290 (insn, extension)
2166 unsigned long insn, extension;
2170 State.regs[REG_D0 + REG0 (insn)]
2171 <<= State.regs[REG_D0 + REG1 (insn)];
2172 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2173 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
2174 PSW &= ~(PSW_Z | PSW_N);
2175 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2179 void OP_F8C000 (insn, extension)
2180 unsigned long insn, extension;
2184 State.regs[REG_D0 + REG0_8 (insn)] <<= (insn & 0xff);
2185 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2186 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2187 PSW &= ~(PSW_Z | PSW_N);
2188 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2192 void OP_54 (insn, extension)
2193 unsigned long insn, extension;
2197 State.regs[REG_D0 + REG0 (insn)] <<= 2;
2198 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2199 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
2200 PSW &= ~(PSW_Z | PSW_N);
2201 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2205 void OP_F284 (insn, extension)
2206 unsigned long insn, extension;
2208 unsigned long value;
2211 value = State.regs[REG_D0 + REG0 (insn)];
2215 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
2216 State.regs[REG_D0 + REG0 (insn)] = value;
2218 n = (value & 0x80000000) != 0;
2219 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2220 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2224 void OP_F280 (insn, extension)
2225 unsigned long insn, extension;
2227 unsigned long value;
2230 value = State.regs[REG_D0 + REG0 (insn)];
2231 c = (value & 0x80000000) ? 1 : 0;
2234 value |= ((PSW & PSW_C) != 0);
2235 State.regs[REG_D0 + REG0 (insn)] = value;
2237 n = (value & 0x80000000) != 0;
2238 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2239 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2243 void OP_C800 (insn, extension)
2244 unsigned long insn, extension;
2246 /* The dispatching code will add 2 after we return, so
2247 we subtract two here to make things right. */
2249 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2253 void OP_C900 (insn, extension)
2254 unsigned long insn, extension;
2256 /* The dispatching code will add 2 after we return, so
2257 we subtract two here to make things right. */
2259 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2263 void OP_C100 (insn, extension)
2264 unsigned long insn, extension;
2266 /* The dispatching code will add 2 after we return, so
2267 we subtract two here to make things right. */
2269 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2270 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2274 void OP_C200 (insn, extension)
2275 unsigned long insn, extension;
2277 /* The dispatching code will add 2 after we return, so
2278 we subtract two here to make things right. */
2279 if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2280 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2284 void OP_C300 (insn, extension)
2285 unsigned long insn, extension;
2287 /* The dispatching code will add 2 after we return, so
2288 we subtract two here to make things right. */
2290 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2291 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2295 void OP_C000 (insn, extension)
2296 unsigned long insn, extension;
2298 /* The dispatching code will add 2 after we return, so
2299 we subtract two here to make things right. */
2300 if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
2301 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2305 void OP_C500 (insn, extension)
2306 unsigned long insn, extension;
2308 /* The dispatching code will add 2 after we return, so
2309 we subtract two here to make things right. */
2310 if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
2311 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2315 void OP_C600 (insn, extension)
2316 unsigned long insn, extension;
2318 /* The dispatching code will add 2 after we return, so
2319 we subtract two here to make things right. */
2321 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2325 void OP_C700 (insn, extension)
2326 unsigned long insn, extension;
2328 /* The dispatching code will add 2 after we return, so
2329 we subtract two here to make things right. */
2330 if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
2331 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2335 void OP_C400 (insn, extension)
2336 unsigned long insn, extension;
2338 /* The dispatching code will add 2 after we return, so
2339 we subtract two here to make things right. */
2341 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2345 void OP_F8E800 (insn, extension)
2346 unsigned long insn, extension;
2348 /* The dispatching code will add 3 after we return, so
2349 we subtract two here to make things right. */
2351 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2355 void OP_F8E900 (insn, extension)
2356 unsigned long insn, extension;
2358 /* The dispatching code will add 3 after we return, so
2359 we subtract two here to make things right. */
2361 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2365 void OP_F8EA00 (insn, extension)
2366 unsigned long insn, extension;
2368 /* The dispatching code will add 3 after we return, so
2369 we subtract two here to make things right. */
2371 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2375 void OP_F8EB00 (insn, extension)
2376 unsigned long insn, extension;
2378 /* The dispatching code will add 3 after we return, so
2379 we subtract two here to make things right. */
2381 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2385 void OP_CA00 (insn, extension)
2386 unsigned long insn, extension;
2388 /* The dispatching code will add 2 after we return, so
2389 we subtract two here to make things right. */
2390 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2394 void OP_D8 (insn, extension)
2395 unsigned long insn, extension;
2397 /* The dispatching code will add 1 after we return, so
2398 we subtract one here to make things right. */
2400 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2404 void OP_D9 (insn, extension)
2405 unsigned long insn, extension;
2407 /* The dispatching code will add 1 after we return, so
2408 we subtract one here to make things right. */
2410 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2414 void OP_D1 (insn, extension)
2415 unsigned long insn, extension;
2417 /* The dispatching code will add 1 after we return, so
2418 we subtract one here to make things right. */
2420 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2421 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2425 void OP_D2 (insn, extension)
2426 unsigned long insn, extension;
2428 /* The dispatching code will add 1 after we return, so
2429 we subtract one here to make things right. */
2430 if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2431 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2435 void OP_D3 (insn, extension)
2436 unsigned long insn, extension;
2438 /* The dispatching code will add 1 after we return, so
2439 we subtract one here to make things right. */
2441 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2442 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2446 void OP_D0 (insn, extension)
2447 unsigned long insn, extension;
2449 /* The dispatching code will add 1 after we return, so
2450 we subtract one here to make things right. */
2451 if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
2452 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2456 void OP_D5 (insn, extension)
2457 unsigned long insn, extension;
2459 /* The dispatching code will add 1 after we return, so
2460 we subtract one here to make things right. */
2461 if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
2462 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2466 void OP_D6 (insn, extension)
2467 unsigned long insn, extension;
2469 /* The dispatching code will add 1 after we return, so
2470 we subtract one here to make things right. */
2472 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2476 void OP_D7 (insn, extension)
2477 unsigned long insn, extension;
2479 /* The dispatching code will add 1 after we return, so
2480 we subtract one here to make things right. */
2481 if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
2482 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2486 void OP_D4 (insn, extension)
2487 unsigned long insn, extension;
2489 /* The dispatching code will add 1 after we return, so
2490 we subtract one here to make things right. */
2492 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2496 void OP_DA (insn, extension)
2497 unsigned long insn, extension;
2499 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2503 void OP_DB (insn, extension)
2504 unsigned long insn, extension;
2506 State.regs[REG_LIR] = load_mem_big (State.regs[REG_PC] + 1, 4);
2507 State.regs[REG_LAR] = State.regs[REG_PC] + 5;
2511 void OP_F0F4 (insn, extension)
2512 unsigned long insn, extension;
2514 State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
2518 void OP_CC0000 (insn, extension)
2519 unsigned long insn, extension;
2521 State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 3;
2525 void OP_DC000000 (insn, extension)
2526 unsigned long insn, extension;
2528 State.regs[REG_PC] += (((insn & 0xffffff) << 8) + extension) - 5;
2531 /* call label:16,reg_list,imm8 */
2532 void OP_CD000000 (insn, extension)
2533 unsigned long insn, extension;
2535 unsigned int next_pc, sp;
2538 sp = State.regs[REG_SP];
2539 next_pc = State.regs[REG_PC] + 5;
2540 State.mem[sp] = next_pc & 0xff;
2541 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2542 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2543 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2550 store_word (sp, State.regs[REG_D0 + 2]);
2556 store_word (sp, State.regs[REG_D0 + 3]);
2562 store_word (sp, State.regs[REG_A0 + 2]);
2568 store_word (sp, State.regs[REG_A0 + 3]);
2574 store_word (sp, State.regs[REG_D0]);
2576 store_word (sp, State.regs[REG_D0 + 1]);
2578 store_word (sp, State.regs[REG_A0]);
2580 store_word (sp, State.regs[REG_A0 + 1]);
2582 store_word (sp, State.regs[REG_MDR]);
2584 store_word (sp, State.regs[REG_LIR]);
2586 store_word (sp, State.regs[REG_LAR]);
2590 /* Update the stack pointer, note that the register saves to do not
2591 modify SP. The SP adjustment is derived totally from the imm8
2593 State.regs[REG_SP] -= extension;
2594 State.regs[REG_MDR] = next_pc;
2595 State.regs[REG_PC] += SEXT16 ((insn & 0xffff00) >> 8) - 5;
2598 /* call label:32,reg_list,imm8*/
2599 void OP_DD000000 (insn, extension)
2600 unsigned long insn, extension;
2602 unsigned int next_pc, sp, adjust;
2605 sp = State.regs[REG_SP];
2606 next_pc = State.regs[REG_PC] + 7;
2607 State.mem[sp] = next_pc & 0xff;
2608 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2609 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2610 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2612 mask = (extension & 0xff00) >> 8;
2617 store_word (sp, State.regs[REG_D0 + 2]);
2623 store_word (sp, State.regs[REG_D0 + 3]);
2629 store_word (sp, State.regs[REG_A0 + 2]);
2635 store_word (sp, State.regs[REG_A0 + 3]);
2641 store_word (sp, State.regs[REG_D0]);
2643 store_word (sp, State.regs[REG_D0 + 1]);
2645 store_word (sp, State.regs[REG_A0]);
2647 store_word (sp, State.regs[REG_A0 + 1]);
2649 store_word (sp, State.regs[REG_MDR]);
2651 store_word (sp, State.regs[REG_LIR]);
2653 store_word (sp, State.regs[REG_LAR]);
2657 /* Update the stack pointer, note that the register saves to do not
2658 modify SP. The SP adjustment is derived totally from the imm8
2660 State.regs[REG_SP] -= (extension & 0xff);
2661 State.regs[REG_MDR] = next_pc;
2662 State.regs[REG_PC] += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
2666 void OP_F0F0 (insn, extension)
2667 unsigned long insn, extension;
2669 unsigned int next_pc, sp;
2671 sp = State.regs[REG_SP];
2672 next_pc = State.regs[REG_PC] + 2;
2673 State.mem[sp] = next_pc & 0xff;
2674 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2675 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2676 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2677 State.regs[REG_MDR] = next_pc;
2678 State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
2681 /* calls label:16 */
2682 void OP_FAFF0000 (insn, extension)
2683 unsigned long insn, extension;
2685 unsigned int next_pc, sp;
2687 sp = State.regs[REG_SP];
2688 next_pc = State.regs[REG_PC] + 4;
2689 State.mem[sp] = next_pc & 0xff;
2690 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2691 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2692 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2693 State.regs[REG_MDR] = next_pc;
2694 State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 4;
2697 /* calls label:32 */
2698 void OP_FCFF0000 (insn, extension)
2699 unsigned long insn, extension;
2701 unsigned int next_pc, sp;
2703 sp = State.regs[REG_SP];
2704 next_pc = State.regs[REG_PC] + 6;
2705 State.mem[sp] = next_pc & 0xff;
2706 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2707 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2708 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2709 State.regs[REG_MDR] = next_pc;
2710 State.regs[REG_PC] += (((insn & 0xffff) << 16) + extension) - 6;
2713 /* ret reg_list, imm8 */
2714 void OP_DF0000 (insn, extension)
2715 unsigned long insn, extension;
2717 unsigned int sp, offset;
2720 State.regs[REG_SP] += insn & 0xff;
2721 sp = State.regs[REG_SP];
2724 mask = (insn & 0xff00) >> 8;
2728 State.regs[REG_D0 + 2] = load_word (sp + offset);
2734 State.regs[REG_D0 + 3] = load_word (sp + offset);
2740 State.regs[REG_A0 + 2] = load_word (sp + offset);
2746 State.regs[REG_A0 + 3] = load_word (sp + offset);
2752 State.regs[REG_D0] = load_word (sp + offset);
2754 State.regs[REG_D0 + 1] = load_word (sp + offset);
2756 State.regs[REG_A0] = load_word (sp + offset);
2758 State.regs[REG_A0 + 1] = load_word (sp + offset);
2760 State.regs[REG_MDR] = load_word (sp + offset);
2762 State.regs[REG_LIR] = load_word (sp + offset);
2764 State.regs[REG_LAR] = load_word (sp + offset);
2768 /* Restore the PC value. */
2769 State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
2770 | (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
2771 State.regs[REG_PC] -= 3;
2774 /* retf reg_list,imm8 */
2775 void OP_DE0000 (insn, extension)
2776 unsigned long insn, extension;
2778 unsigned int sp, offset;
2781 State.regs[REG_SP] += (insn & 0xff);
2782 sp = State.regs[REG_SP];
2783 State.regs[REG_PC] = State.regs[REG_MDR] - 3;
2786 mask = (insn & 0xff00) >> 8;
2790 State.regs[REG_D0 + 2] = load_word (sp + offset);
2796 State.regs[REG_D0 + 3] = load_word (sp + offset);
2802 State.regs[REG_A0 + 2] = load_word (sp + offset);
2808 State.regs[REG_A0 + 3] = load_word (sp + offset);
2814 State.regs[REG_D0] = load_word (sp + offset);
2816 State.regs[REG_D0 + 1] = load_word (sp + offset);
2818 State.regs[REG_A0] = load_word (sp + offset);
2820 State.regs[REG_A0 + 1] = load_word (sp + offset);
2822 State.regs[REG_MDR] = load_word (sp + offset);
2824 State.regs[REG_LIR] = load_word (sp + offset);
2826 State.regs[REG_LAR] = load_word (sp + offset);
2832 void OP_F0FC (insn, extension)
2833 unsigned long insn, extension;
2837 sp = State.regs[REG_SP];
2838 State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
2839 | (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
2840 State.regs[REG_PC] -= 2;
2844 void OP_F0FD (insn, extension)
2845 unsigned long insn, extension;
2847 unsigned int sp, next_pc;
2849 PSW = State.mem[sp] | (State.mem[sp + 1] << 8);
2850 State.regs[REG_PC] = (State.mem[sp+4] | (State.mem[sp+5] << 8)
2851 | (State.mem[sp+6] << 16) | (State.mem[sp+7] << 24));
2852 State.regs[REG_SP] += 8;
2856 void OP_F0FE (insn, extension)
2857 unsigned long insn, extension;
2859 unsigned int sp, next_pc;
2861 sp = State.regs[REG_SP];
2862 next_pc = State.regs[REG_PC] + 2;
2863 State.mem[sp] = next_pc & 0xff;
2864 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2865 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2866 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2867 State.regs[REG_PC] = 0x40000010 - 2;
2871 void OP_F020 (insn, extension)
2872 unsigned long insn, extension;
2874 /* We use this for simulated system calls; we may need to change
2875 it to a reserved instruction if we conflict with uses at
2877 int save_errno = errno;
2880 /* Registers passed to trap 0 */
2882 /* Function number. */
2883 #define FUNC (State.regs[0])
2886 #define PARM1 (State.regs[1])
2887 #define PARM2 (load_word (State.regs[REG_SP] + 12))
2888 #define PARM3 (load_word (State.regs[REG_SP] + 16))
2890 /* Registers set by trap 0 */
2892 #define RETVAL State.regs[0] /* return value */
2893 #define RETERR State.regs[1] /* return error code */
2895 /* Turn a pointer in a register into a pointer into real memory. */
2897 #define MEMPTR(x) (State.mem + x)
2901 #if !defined(__GO32__) && !defined(_WIN32)
2902 #ifdef TARGET_SYS_fork
2903 case TARGET_SYS_fork:
2907 #ifdef TARGET_SYS_execve
2908 case TARGET_SYS_execve:
2909 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
2910 (char **)MEMPTR (PARM3));
2913 #ifdef TARGET_SYS_execv
2914 case TARGET_SYS_execv:
2915 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
2918 #endif /* ! GO32 and ! WIN32 */
2920 case TARGET_SYS_read:
2921 RETVAL = mn10300_callback->read (mn10300_callback, PARM1,
2922 MEMPTR (PARM2), PARM3);
2924 case TARGET_SYS_write:
2925 RETVAL = (int)mn10300_callback->write (mn10300_callback, PARM1,
2926 MEMPTR (PARM2), PARM3);
2928 case TARGET_SYS_lseek:
2929 RETVAL = mn10300_callback->lseek (mn10300_callback, PARM1, PARM2, PARM3);
2931 case TARGET_SYS_close:
2932 RETVAL = mn10300_callback->close (mn10300_callback, PARM1);
2934 case TARGET_SYS_open:
2935 RETVAL = mn10300_callback->open (mn10300_callback, MEMPTR (PARM1), PARM2);
2937 case TARGET_SYS_exit:
2938 /* EXIT - caller can look in PARM1 to work out the
2940 if (PARM1 == 0xdead)
2941 State.exception = SIGABRT;
2943 State.exception = SIGQUIT;
2947 case TARGET_SYS_stat: /* added at hmsi */
2948 /* stat system call */
2950 struct stat host_stat;
2953 RETVAL = stat (MEMPTR (PARM1), &host_stat);
2957 /* Just wild-assed guesses. */
2958 store_half (buf, host_stat.st_dev);
2959 store_half (buf + 2, host_stat.st_ino);
2960 store_word (buf + 4, host_stat.st_mode);
2961 store_half (buf + 8, host_stat.st_nlink);
2962 store_half (buf + 10, host_stat.st_uid);
2963 store_half (buf + 12, host_stat.st_gid);
2964 store_half (buf + 14, host_stat.st_rdev);
2965 store_word (buf + 16, host_stat.st_size);
2966 store_word (buf + 20, host_stat.st_atime);
2967 store_word (buf + 28, host_stat.st_mtime);
2968 store_word (buf + 36, host_stat.st_ctime);
2972 #ifdef TARGET_SYS_chown
2973 case TARGET_SYS_chown:
2974 RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3);
2977 case TARGET_SYS_chmod:
2978 RETVAL = chmod (MEMPTR (PARM1), PARM2);
2980 #ifdef TARGET_SYS_time
2981 case TARGET_SYS_time:
2982 RETVAL = time ((void*) MEMPTR (PARM1));
2985 #ifdef TARGET_SYS_times
2986 case TARGET_SYS_times:
2989 RETVAL = times (&tms);
2990 store_word (PARM1, tms.tms_utime);
2991 store_word (PARM1 + 4, tms.tms_stime);
2992 store_word (PARM1 + 8, tms.tms_cutime);
2993 store_word (PARM1 + 12, tms.tms_cstime);
2997 #ifdef TARGET_SYS_gettimeofday
2998 case TARGET_SYS_gettimeofday:
3002 RETVAL = gettimeofday (&t, &tz);
3003 store_word (PARM1, t.tv_sec);
3004 store_word (PARM1 + 4, t.tv_usec);
3005 store_word (PARM2, tz.tz_minuteswest);
3006 store_word (PARM2 + 4, tz.tz_dsttime);
3010 #ifdef TARGET_SYS_utime
3011 case TARGET_SYS_utime:
3012 /* Cast the second argument to void *, to avoid type mismatch
3013 if a prototype is present. */
3014 RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
3025 void OP_F0FF (insn, extension)
3026 unsigned long insn, extension;
3032 void OP_CB (insn, extension)
3033 unsigned long insn, extension;
3038 void OP_F500 (insn, extension)
3039 unsigned long insn, extension;
3041 State.regs[REG_MDRQ] = State.regs[REG_D0 + REG0 (insn)];
3045 void OP_F6F0 (insn, extension)
3046 unsigned long insn, extension;
3049 z = (State.regs[REG_MDRQ] == 0);
3050 n = ((State.regs[REG_MDRQ] & 0x80000000) != 0);
3051 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDRQ];
3053 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3054 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
3058 void OP_F600 (insn, extension)
3059 unsigned long insn, extension;
3061 unsigned long long temp;
3064 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)]
3065 * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]);
3066 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
3067 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3068 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
3069 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
3070 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3071 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3075 void OP_F90000 (insn, extension)
3076 unsigned long insn, extension;
3078 unsigned long long temp;
3081 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_8 (insn)]
3082 * (signed64)(signed32)SEXT8 (insn & 0xff));
3083 State.regs[REG_D0 + REG0_8 (insn)] = temp & 0xffffffff;
3084 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3085 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
3086 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
3087 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3088 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3092 void OP_FB000000 (insn, extension)
3093 unsigned long insn, extension;
3095 unsigned long long temp;
3098 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
3099 * (signed64)(signed32)SEXT16 (insn & 0xffff));
3100 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3101 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3102 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3103 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3104 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3105 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3109 void OP_FD000000 (insn, extension)
3110 unsigned long insn, extension;
3112 unsigned long long temp;
3115 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
3116 * (signed64)(signed32)(((insn & 0xffff) << 16) + extension));
3117 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3118 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3119 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3120 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3121 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3122 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3126 void OP_F610 (insn, extension)
3127 unsigned long insn, extension;
3129 unsigned long long temp;
3132 temp = ((unsigned64) State.regs[REG_D0 + REG0 (insn)]
3133 * (unsigned64) State.regs[REG_D0 + REG1 (insn)]);
3134 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
3135 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3136 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
3137 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
3138 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3139 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3143 void OP_F91400 (insn, extension)
3144 unsigned long insn, extension;
3146 unsigned long long temp;
3149 temp = ((unsigned64)State.regs[REG_D0 + REG0_8 (insn)]
3150 * (unsigned64)SEXT8 (insn & 0xff));
3151 State.regs[REG_D0 + REG0_8 (insn)] = temp & 0xffffffff;
3152 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3153 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
3154 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
3155 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3156 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3159 /* mulqu imm16,dn */
3160 void OP_FB140000 (insn, extension)
3161 unsigned long insn, extension;
3163 unsigned long long temp;
3166 temp = ((unsigned64)State.regs[REG_D0 + REG0_16 (insn)]
3167 * (unsigned64) SEXT16 (insn & 0xffff));
3168 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3169 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3170 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3171 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3172 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3173 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3176 /* mulqu imm32,dn */
3177 void OP_FD140000 (insn, extension)
3178 unsigned long insn, extension;
3180 unsigned long long temp;
3183 temp = ((unsigned64)State.regs[REG_D0 + REG0_16 (insn)]
3184 * (unsigned64)(((insn & 0xffff) << 16) + extension));
3185 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3186 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3187 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3188 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3189 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3190 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3194 void OP_F640 (insn, extension)
3195 unsigned long insn, extension;
3199 temp = State.regs[REG_D0 + REG1 (insn)];
3200 temp = (temp > 0x7fff ? 0x7fff : temp);
3201 temp = (temp < -0x8000 ? -0x8000 : temp);
3202 State.regs[REG_D0 + REG0 (insn)] = temp;
3206 void OP_F650 (insn, extension)
3207 unsigned long insn, extension;
3211 temp = State.regs[REG_D0 + REG1 (insn)];
3212 temp = (temp > 0x7fffff ? 0x7fffff : temp);
3213 temp = (temp < -0x800000 ? -0x800000 : temp);
3214 State.regs[REG_D0 + REG0 (insn)] = temp;
3218 void OP_F670 (insn, extension)
3219 unsigned long insn, extension;
3223 temp = State.regs[REG_D0 + REG1 (insn)];
3224 temp <<= (State.regs[REG_D0 + REG0 (insn)] & 0x1f);
3225 c = (temp != 0 ? 1 : 0);
3227 PSW |= (c ? PSW_C : 0);
3232 OP_FF (insn, extension)
3233 unsigned long insn, extension;
3235 State.exception = SIGTRAP;