* "objcopy -O binary" warning tweak, suggested by dmoseley
[binutils-gdb.git] / sim / mn10300 / simops.c
blob7a190566bcb68b167e027053eb8946351e4286f3
1 #include "config.h"
3 #include <signal.h>
4 #ifdef HAVE_UNISTD_H
5 #include <unistd.h>
6 #endif
7 #include "mn10300_sim.h"
8 #include "simops.h"
9 #include "sim-types.h"
10 #include "targ-vals.h"
11 #include "bfd.h"
12 #include <errno.h>
13 #include <sys/stat.h>
14 #include <sys/times.h>
15 #include <sys/time.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)
25 /* mov imm8, dn */
26 void OP_8000 (insn, extension)
27 unsigned long insn, extension;
29 State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
32 /* mov dm, dn */
33 void OP_80 (insn, extension)
34 unsigned long insn, extension;
36 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
39 /* mov dm, an */
40 void OP_F1E0 (insn, extension)
41 unsigned long insn, extension;
43 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
46 /* mov am, dn */
47 void OP_F1D0 (insn, extension)
48 unsigned long insn, extension;
50 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
53 /* mov imm8, an */
54 void OP_9000 (insn, extension)
55 unsigned long insn, extension;
57 State.regs[REG_A0 + REG0_8 (insn)] = insn & 0xff;
60 /* mov am, an */
61 void OP_90 (insn, extension)
62 unsigned long insn, extension;
64 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
67 /* mov sp, an */
68 void OP_3C (insn, extension)
69 unsigned long insn, extension;
71 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_SP];
74 /* mov am, sp */
75 void OP_F2F0 (insn, extension)
76 unsigned long insn, extension;
78 State.regs[REG_SP] = State.regs[REG_A0 + REG1 (insn)];
81 /* mov psw, dn */
82 void OP_F2E4 (insn, extension)
83 unsigned long insn, extension;
85 State.regs[REG_D0 + REG0 (insn)] = PSW;
88 /* mov dm, psw */
89 void OP_F2F3 (insn, extension)
90 unsigned long insn, extension;
92 PSW = State.regs[REG_D0 + REG1 (insn)];
95 /* mov mdr, dn */
96 void OP_F2E0 (insn, extension)
97 unsigned long insn, extension;
99 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR];
102 /* mov dm, mdr */
103 void OP_F2F2 (insn, extension)
104 unsigned long insn, extension;
106 State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)];
109 /* mov (am), dn */
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));
191 /* mov (am), an */
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;
278 State.regs[REG_SP]
279 = load_word ((State.regs[REG_A0 + REG0_8 (insn)]
280 + SEXT8 (insn & 0xff)));
283 /* mov dm, (an) */
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)]);
364 /* mov am, (an) */
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),
449 State.regs[REG_SP]);
452 /* mov imm16, dn */
453 void OP_2C0000 (insn, extension)
454 unsigned long insn, extension;
456 unsigned long value;
458 value = SEXT16 (insn & 0xffff);
459 State.regs[REG_D0 + REG0_16 (insn)] = value;
462 /* mov imm32,dn */
463 void OP_FCCC0000 (insn, extension)
464 unsigned long insn, extension;
466 unsigned long value;
468 value = ((insn & 0xffff) << 16) + extension;
469 State.regs[REG_D0 + REG0_16 (insn)] = value;
472 /* mov imm16, an */
473 void OP_240000 (insn, extension)
474 unsigned long insn, extension;
476 unsigned long value;
478 value = insn & 0xffff;
479 State.regs[REG_A0 + REG0_16 (insn)] = value;
482 /* mov imm32, an */
483 void OP_FCDC0000 (insn, extension)
484 unsigned long insn, extension;
486 unsigned long value;
488 value = ((insn & 0xffff) << 16) + extension;
489 State.regs[REG_A0 + REG0_16 (insn)] = value;
492 /* movbu (am), dn */
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));
575 /* movbu dm, (an) */
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)]);
655 /* movhu (am), dn */
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));
738 /* movhu dm, (an) */
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)]);
818 /* ext dn */
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;
824 else
825 State.regs[REG_MDR] = 0;
828 /* extb dn */
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)]);
835 /* extbu dn */
836 void OP_14 (insn, extension)
837 unsigned long insn, extension;
839 State.regs[REG_D0 + REG0 (insn)] &= 0xff;
842 /* exth dn */
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)]);
850 /* exthu dn */
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];
862 unsigned long mask;
864 mask = insn & 0xff;
866 if (mask & 0x8)
868 sp += 4;
869 State.regs[REG_LAR] = load_word (sp);
870 sp += 4;
871 State.regs[REG_LIR] = load_word (sp);
872 sp += 4;
873 State.regs[REG_MDR] = load_word (sp);
874 sp += 4;
875 State.regs[REG_A0 + 1] = load_word (sp);
876 sp += 4;
877 State.regs[REG_A0] = load_word (sp);
878 sp += 4;
879 State.regs[REG_D0 + 1] = load_word (sp);
880 sp += 4;
881 State.regs[REG_D0] = load_word (sp);
882 sp += 4;
885 if (mask & 0x10)
887 State.regs[REG_A0 + 3] = load_word (sp);
888 sp += 4;
891 if (mask & 0x20)
893 State.regs[REG_A0 + 2] = load_word (sp);
894 sp += 4;
897 if (mask & 0x40)
899 State.regs[REG_D0 + 3] = load_word (sp);
900 sp += 4;
903 if (mask & 0x80)
905 State.regs[REG_D0 + 2] = load_word (sp);
906 sp += 4;
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];
918 unsigned long mask;
920 mask = insn & 0xff;
922 if (mask & 0x80)
924 sp -= 4;
925 store_word (sp, State.regs[REG_D0 + 2]);
928 if (mask & 0x40)
930 sp -= 4;
931 store_word (sp, State.regs[REG_D0 + 3]);
934 if (mask & 0x20)
936 sp -= 4;
937 store_word (sp, State.regs[REG_A0 + 2]);
940 if (mask & 0x10)
942 sp -= 4;
943 store_word (sp, State.regs[REG_A0 + 3]);
946 if (mask & 0x8)
948 sp -= 4;
949 store_word (sp, State.regs[REG_D0]);
950 sp -= 4;
951 store_word (sp, State.regs[REG_D0 + 1]);
952 sp -= 4;
953 store_word (sp, State.regs[REG_A0]);
954 sp -= 4;
955 store_word (sp, State.regs[REG_A0 + 1]);
956 sp -= 4;
957 store_word (sp, State.regs[REG_MDR]);
958 sp -= 4;
959 store_word (sp, State.regs[REG_LIR]);
960 sp -= 4;
961 store_word (sp, State.regs[REG_LAR]);
962 sp -= 4;
965 /* And make sure to update the stack pointer. */
966 State.regs[REG_SP] = sp;
969 /* clr dn */
970 void OP_0 (insn, extension)
971 unsigned long insn, extension;
973 State.regs[REG_D0 + REG1 (insn)] = 0;
975 PSW |= PSW_Z;
976 PSW &= ~(PSW_V | PSW_C | PSW_N);
979 /* add dm,dn */
980 void OP_E0 (insn, extension)
981 unsigned long insn, extension;
983 int z, c, n, v;
984 unsigned long reg1, reg2, value;
986 reg1 = State.regs[REG_D0 + REG1 (insn)];
987 reg2 = State.regs[REG_D0 + REG0 (insn)];
988 value = reg1 + reg2;
989 State.regs[REG_D0 + REG0 (insn)] = value;
991 z = (value == 0);
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));
1002 /* add dm, an */
1003 void OP_F160 (insn, extension)
1004 unsigned long insn, extension;
1006 int z, c, n, v;
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;
1014 z = (value == 0);
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));
1025 /* add am, dn */
1026 void OP_F150 (insn, extension)
1027 unsigned long insn, extension;
1029 int z, c, n, v;
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;
1037 z = (value == 0);
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));
1048 /* add am,an */
1049 void OP_F170 (insn, extension)
1050 unsigned long insn, extension;
1052 int z, c, n, v;
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;
1060 z = (value == 0);
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));
1071 /* add imm8, dn */
1072 void OP_2800 (insn, extension)
1073 unsigned long insn, extension;
1075 int z, c, n, v;
1076 unsigned long reg1, imm, value;
1078 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1079 imm = SEXT8 (insn & 0xff);
1080 value = reg1 + imm;
1081 State.regs[REG_D0 + REG0_8 (insn)] = value;
1083 z = (value == 0);
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));
1094 /* add imm16, dn */
1095 void OP_FAC00000 (insn, extension)
1096 unsigned long insn, extension;
1098 int z, c, n, v;
1099 unsigned long reg1, imm, value;
1101 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1102 imm = SEXT16 (insn & 0xffff);
1103 value = reg1 + imm;
1104 State.regs[REG_D0 + REG0_16 (insn)] = value;
1106 z = (value == 0);
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));
1117 /* add imm32,dn */
1118 void OP_FCC00000 (insn, extension)
1119 unsigned long insn, extension;
1121 int z, c, n, v;
1122 unsigned long reg1, imm, value;
1124 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1125 imm = ((insn & 0xffff) << 16) + extension;
1126 value = reg1 + imm;
1127 State.regs[REG_D0 + REG0_16 (insn)] = value;
1129 z = (value == 0);
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));
1140 /* add imm8, an */
1141 void OP_2000 (insn, extension)
1142 unsigned long insn, extension;
1144 int z, c, n, v;
1145 unsigned long reg1, imm, value;
1147 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1148 imm = SEXT8 (insn & 0xff);
1149 value = reg1 + imm;
1150 State.regs[REG_A0 + REG0_8 (insn)] = value;
1152 z = (value == 0);
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));
1163 /* add imm16, an */
1164 void OP_FAD00000 (insn, extension)
1165 unsigned long insn, extension;
1167 int z, c, n, v;
1168 unsigned long reg1, imm, value;
1170 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1171 imm = SEXT16 (insn & 0xffff);
1172 value = reg1 + imm;
1173 State.regs[REG_A0 + REG0_16 (insn)] = value;
1175 z = (value == 0);
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));
1186 /* add imm32, an */
1187 void OP_FCD00000 (insn, extension)
1188 unsigned long insn, extension;
1190 int z, c, n, v;
1191 unsigned long reg1, imm, value;
1193 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1194 imm = ((insn & 0xffff) << 16) + extension;
1195 value = reg1 + imm;
1196 State.regs[REG_A0 + REG0_16 (insn)] = value;
1198 z = (value == 0);
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));
1209 /* add imm8, sp */
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);
1217 value = reg1 + imm;
1218 State.regs[REG_SP] = value;
1221 /* add imm16,sp */
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);
1229 value = reg1 + imm;
1230 State.regs[REG_SP] = value;
1233 /* add imm32, sp */
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;
1241 value = reg1 + imm;
1242 State.regs[REG_SP] = value;
1245 /* addc dm,dn */
1246 void OP_F140 (insn, extension)
1247 unsigned long insn, extension;
1249 int z, c, n, v;
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;
1257 z = (value == 0);
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));
1268 /* sub dm, dn */
1269 void OP_F100 (insn, extension)
1270 unsigned long insn, extension;
1272 int z, c, n, v;
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;
1280 z = (value == 0);
1281 n = (value & 0x80000000);
1282 c = (reg1 > reg2);
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));
1291 /* sub dm, an */
1292 void OP_F120 (insn, extension)
1293 unsigned long insn, extension;
1295 int z, c, n, v;
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;
1303 z = (value == 0);
1304 n = (value & 0x80000000);
1305 c = (reg1 > reg2);
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));
1314 /* sub am, dn */
1315 void OP_F110 (insn, extension)
1316 unsigned long insn, extension;
1318 int z, c, n, v;
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;
1326 z = (value == 0);
1327 n = (value & 0x80000000);
1328 c = (reg1 > reg2);
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));
1337 /* sub am, an */
1338 void OP_F130 (insn, extension)
1339 unsigned long insn, extension;
1341 int z, c, n, v;
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;
1349 z = (value == 0);
1350 n = (value & 0x80000000);
1351 c = (reg1 > reg2);
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));
1360 /* sub imm32, dn */
1361 void OP_FCC40000 (insn, extension)
1362 unsigned long insn, extension;
1364 int z, c, n, v;
1365 unsigned long reg1, imm, value;
1367 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1368 imm = ((insn & 0xffff) << 16) + extension;
1369 value = reg1 - imm;
1370 State.regs[REG_D0 + REG0_16 (insn)] = value;
1372 z = (value == 0);
1373 n = (value & 0x80000000);
1374 c = (reg1 < imm);
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));
1383 /* sub imm32, an */
1384 void OP_FCD40000 (insn, extension)
1385 unsigned long insn, extension;
1387 int z, c, n, v;
1388 unsigned long reg1, imm, value;
1390 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1391 imm = ((insn & 0xffff) << 16) + extension;
1392 value = reg1 - imm;
1393 State.regs[REG_A0 + REG0_16 (insn)] = value;
1395 z = (value == 0);
1396 n = (value & 0x80000000);
1397 c = (reg1 < imm);
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));
1406 /* subc dm, dn */
1407 void OP_F180 (insn, extension)
1408 unsigned long insn, extension;
1410 int z, c, n, v;
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;
1418 z = (value == 0);
1419 n = (value & 0x80000000);
1420 c = (reg1 > reg2);
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));
1429 /* mul dm, dn */
1430 void OP_F240 (insn, extension)
1431 unsigned long insn, extension;
1433 unsigned long long temp;
1434 int n, z;
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));
1446 /* mulu dm, dn */
1447 void OP_F250 (insn, extension)
1448 unsigned long insn, extension;
1450 unsigned long long temp;
1451 int n, z;
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));
1463 /* div dm, dn */
1464 void OP_F260 (insn, extension)
1465 unsigned long insn, extension;
1467 long long temp;
1468 int n, z;
1470 temp = State.regs[REG_MDR];
1471 temp <<= 32;
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));
1482 /* divu dm, dn */
1483 void OP_F270 (insn, extension)
1484 unsigned long insn, extension;
1486 unsigned long long temp;
1487 int n, z;
1489 temp = State.regs[REG_MDR];
1490 temp <<= 32;
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));
1501 /* inc dn */
1502 void OP_40 (insn, extension)
1503 unsigned long insn, extension;
1505 int z,n,c,v;
1506 unsigned int value, imm, reg1;
1508 reg1 = State.regs[REG_D0 + REG1 (insn)];
1509 imm = 1;
1510 value = reg1 + imm;
1511 State.regs[REG_D0 + REG1 (insn)] = value;
1513 z = (value == 0);
1514 n = (value & 0x80000000);
1515 c = (value < imm);
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));
1524 /* inc an */
1525 void OP_41 (insn, extension)
1526 unsigned long insn, extension;
1528 State.regs[REG_A0 + REG1 (insn)] += 1;
1531 /* inc4 an */
1532 void OP_50 (insn, extension)
1533 unsigned long insn, extension;
1535 State.regs[REG_A0 + REG0 (insn)] += 4;
1538 /* cmp imm8, dn */
1539 void OP_A000 (insn, extension)
1540 unsigned long insn, extension;
1542 int z, c, n, v;
1543 unsigned long reg1, imm, value;
1545 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1546 imm = SEXT8 (insn & 0xff);
1547 value = reg1 - imm;
1549 z = (value == 0);
1550 n = (value & 0x80000000);
1551 c = (reg1 < imm);
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));
1560 /* cmp dm, dn */
1561 void OP_A0 (insn, extension)
1562 unsigned long insn, extension;
1564 int z, c, n, v;
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;
1571 z = (value == 0);
1572 n = (value & 0x80000000);
1573 c = (reg1 > reg2);
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));
1582 /* cmp dm, an */
1583 void OP_F1A0 (insn, extension)
1584 unsigned long insn, extension;
1586 int z, c, n, v;
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;
1593 z = (value == 0);
1594 n = (value & 0x80000000);
1595 c = (reg1 > reg2);
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));
1604 /* cmp am, dn */
1605 void OP_F190 (insn, extension)
1606 unsigned long insn, extension;
1608 int z, c, n, v;
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;
1615 z = (value == 0);
1616 n = (value & 0x80000000);
1617 c = (reg1 > reg2);
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));
1626 /* cmp imm8, an */
1627 void OP_B000 (insn, extension)
1628 unsigned long insn, extension;
1630 int z, c, n, v;
1631 unsigned long reg1, imm, value;
1633 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1634 imm = insn & 0xff;
1635 value = reg1 - imm;
1637 z = (value == 0);
1638 n = (value & 0x80000000);
1639 c = (reg1 < imm);
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));
1648 /* cmp am, an */
1649 void OP_B0 (insn, extension)
1650 unsigned long insn, extension;
1652 int z, c, n, v;
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;
1659 z = (value == 0);
1660 n = (value & 0x80000000);
1661 c = (reg1 > reg2);
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));
1670 /* cmp imm16, dn */
1671 void OP_FAC80000 (insn, extension)
1672 unsigned long insn, extension;
1674 int z, c, n, v;
1675 unsigned long reg1, imm, value;
1677 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1678 imm = SEXT16 (insn & 0xffff);
1679 value = reg1 - imm;
1681 z = (value == 0);
1682 n = (value & 0x80000000);
1683 c = (reg1 < imm);
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));
1692 /* cmp imm32, dn */
1693 void OP_FCC80000 (insn, extension)
1694 unsigned long insn, extension;
1696 int z, c, n, v;
1697 unsigned long reg1, imm, value;
1699 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1700 imm = ((insn & 0xffff) << 16) + extension;
1701 value = reg1 - imm;
1703 z = (value == 0);
1704 n = (value & 0x80000000);
1705 c = (reg1 < imm);
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));
1714 /* cmp imm16, an */
1715 void OP_FAD80000 (insn, extension)
1716 unsigned long insn, extension;
1718 int z, c, n, v;
1719 unsigned long reg1, imm, value;
1721 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1722 imm = insn & 0xffff;
1723 value = reg1 - imm;
1725 z = (value == 0);
1726 n = (value & 0x80000000);
1727 c = (reg1 < imm);
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));
1736 /* cmp imm32, an */
1737 void OP_FCD80000 (insn, extension)
1738 unsigned long insn, extension;
1740 int z, c, n, v;
1741 unsigned long reg1, imm, value;
1743 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1744 imm = ((insn & 0xffff) << 16) + extension;
1745 value = reg1 - imm;
1747 z = (value == 0);
1748 n = (value & 0x80000000);
1749 c = (reg1 < imm);
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));
1758 /* and dm, dn */
1759 void OP_F200 (insn, extension)
1760 unsigned long insn, extension;
1762 int n, z;
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));
1771 /* and imm8, dn */
1772 void OP_F8E000 (insn, extension)
1773 unsigned long insn, extension;
1775 int n, z;
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));
1784 /* and imm16, dn */
1785 void OP_FAE00000 (insn, extension)
1786 unsigned long insn, extension;
1788 int n, z;
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));
1797 /* and imm32, dn */
1798 void OP_FCE00000 (insn, extension)
1799 unsigned long insn, extension;
1801 int n, z;
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);
1818 /* or dm, dn*/
1819 void OP_F210 (insn, extension)
1820 unsigned long insn, extension;
1822 int n, z;
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));
1831 /* or imm8, dn */
1832 void OP_F8E400 (insn, extension)
1833 unsigned long insn, extension;
1835 int n, z;
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));
1844 /* or imm16, dn*/
1845 void OP_FAE40000 (insn, extension)
1846 unsigned long insn, extension;
1848 int n, z;
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));
1857 /* or imm32, dn */
1858 void OP_FCE40000 (insn, extension)
1859 unsigned long insn, extension;
1861 int n, z;
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));
1871 /* or imm16,psw */
1872 void OP_FAFD0000 (insn, extension)
1873 unsigned long insn, extension;
1875 PSW |= (insn & 0xffff);
1878 /* xor dm, dn */
1879 void OP_F220 (insn, extension)
1880 unsigned long insn, extension;
1882 int n, z;
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));
1891 /* xor imm16, dn */
1892 void OP_FAE80000 (insn, extension)
1893 unsigned long insn, extension;
1895 int n, z;
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));
1904 /* xor imm32, dn */
1905 void OP_FCE80000 (insn, extension)
1906 unsigned long insn, extension;
1908 int n, z;
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));
1918 /* not dn */
1919 void OP_F230 (insn, extension)
1920 unsigned long insn, extension;
1922 int n, z;
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));
1931 /* btst imm8, dn */
1932 void OP_F8EC00 (insn, extension)
1933 unsigned long insn, extension;
1935 unsigned long temp;
1936 int z, n;
1938 temp = State.regs[REG_D0 + REG0_8 (insn)];
1939 temp &= (insn & 0xff);
1940 n = (temp & 0x80000000) != 0;
1941 z = (temp == 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;
1950 unsigned long temp;
1951 int z, n;
1953 temp = State.regs[REG_D0 + REG0_16 (insn)];
1954 temp &= (insn & 0xffff);
1955 n = (temp & 0x80000000) != 0;
1956 z = (temp == 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;
1965 unsigned long temp;
1966 int z, n;
1968 temp = State.regs[REG_D0 + REG0_16 (insn)];
1969 temp &= ((insn & 0xffff) << 16) + extension;
1970 n = (temp & 0x80000000) != 0;
1971 z = (temp == 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;
1980 unsigned long temp;
1981 int n, z;
1983 temp = load_byte (((insn & 0xffff) << 16) | (extension >> 8));
1984 temp &= (extension & 0xff);
1985 n = (temp & 0x80000000) != 0;
1986 z = (temp == 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;
1995 unsigned long temp;
1996 int n, z;
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;
2002 z = (temp == 0);
2003 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2004 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
2007 /* bset dm, (an) */
2008 void OP_F080 (insn, extension)
2009 unsigned long insn, extension;
2011 unsigned long temp;
2012 int z;
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;
2026 unsigned long temp;
2027 int z;
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;
2041 unsigned long temp;
2042 int z;
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);
2054 /* bclr dm, (an) */
2055 void OP_F090 (insn, extension)
2056 unsigned long insn, extension;
2058 unsigned long temp;
2059 int z;
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;
2073 unsigned long temp;
2074 int z;
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;
2088 unsigned long temp;
2089 int z;
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);
2101 /* asr dm, dn */
2102 void OP_F2B0 (insn, extension)
2103 unsigned long insn, extension;
2105 long temp;
2106 int z, n, c;
2108 temp = State.regs[REG_D0 + REG0 (insn)];
2109 c = temp & 1;
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));
2118 /* asr imm8, dn */
2119 void OP_F8C800 (insn, extension)
2120 unsigned long insn, extension;
2122 long temp;
2123 int z, n, c;
2125 temp = State.regs[REG_D0 + REG0_8 (insn)];
2126 c = temp & 1;
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));
2135 /* lsr dm, dn */
2136 void OP_F2A0 (insn, extension)
2137 unsigned long insn, extension;
2139 int z, n, c;
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));
2150 /* lsr imm8, dn */
2151 void OP_F8C400 (insn, extension)
2152 unsigned long insn, extension;
2154 int z, n, c;
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));
2164 /* asl dm, dn */
2165 void OP_F290 (insn, extension)
2166 unsigned long insn, extension;
2168 int n, z;
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));
2178 /* asl imm8, dn */
2179 void OP_F8C000 (insn, extension)
2180 unsigned long insn, extension;
2182 int n, z;
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));
2191 /* asl2 dn */
2192 void OP_54 (insn, extension)
2193 unsigned long insn, extension;
2195 int n, z;
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));
2204 /* ror dn */
2205 void OP_F284 (insn, extension)
2206 unsigned long insn, extension;
2208 unsigned long value;
2209 int c,n,z;
2211 value = State.regs[REG_D0 + REG0 (insn)];
2212 c = (value & 0x1);
2214 value >>= 1;
2215 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
2216 State.regs[REG_D0 + REG0 (insn)] = value;
2217 z = (value == 0);
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));
2223 /* rol dn */
2224 void OP_F280 (insn, extension)
2225 unsigned long insn, extension;
2227 unsigned long value;
2228 int c,n,z;
2230 value = State.regs[REG_D0 + REG0 (insn)];
2231 c = (value & 0x80000000) ? 1 : 0;
2233 value <<= 1;
2234 value |= ((PSW & PSW_C) != 0);
2235 State.regs[REG_D0 + REG0 (insn)] = value;
2236 z = (value == 0);
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));
2242 /* beq label:8 */
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. */
2248 if (PSW & PSW_Z)
2249 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2252 /* bne label:8 */
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. */
2258 if (!(PSW & PSW_Z))
2259 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2262 /* bgt label:8 */
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. */
2268 if (!((PSW & PSW_Z)
2269 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2270 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2273 /* bge label:8 */
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;
2283 /* ble label:8 */
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. */
2289 if ((PSW & PSW_Z)
2290 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2291 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2294 /* blt label:8 */
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;
2304 /* bhi label:8 */
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;
2314 /* bcc label:8 */
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. */
2320 if (!(PSW & PSW_C))
2321 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2324 /* bls label:8 */
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;
2334 /* bcs label:8 */
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. */
2340 if (PSW & PSW_C)
2341 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2344 /* bvc label:8 */
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. */
2350 if (!(PSW & PSW_V))
2351 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2354 /* bvs label:8 */
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. */
2360 if (PSW & PSW_V)
2361 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2364 /* bnc label:8 */
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. */
2370 if (!(PSW & PSW_N))
2371 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2374 /* bns label:8 */
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. */
2380 if (PSW & PSW_N)
2381 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2384 /* bra label:8 */
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;
2393 /* leq */
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. */
2399 if (PSW & PSW_Z)
2400 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2403 /* lne */
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. */
2409 if (!(PSW & PSW_Z))
2410 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2413 /* lgt */
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. */
2419 if (!((PSW & PSW_Z)
2420 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2421 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2424 /* lge */
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;
2434 /* lle */
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. */
2440 if ((PSW & PSW_Z)
2441 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2442 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2445 /* llt */
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;
2455 /* lhi */
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;
2465 /* lcc */
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. */
2471 if (!(PSW & PSW_C))
2472 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2475 /* lls */
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;
2485 /* lcs */
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. */
2491 if (PSW & PSW_C)
2492 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2495 /* lra */
2496 void OP_DA (insn, extension)
2497 unsigned long insn, extension;
2499 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2502 /* setlb */
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;
2510 /* jmp (an) */
2511 void OP_F0F4 (insn, extension)
2512 unsigned long insn, extension;
2514 State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
2517 /* jmp label:16 */
2518 void OP_CC0000 (insn, extension)
2519 unsigned long insn, extension;
2521 State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 3;
2524 /* jmp label:32 */
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;
2536 unsigned long mask;
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;
2545 mask = insn & 0xff;
2547 if (mask & 0x80)
2549 sp -= 4;
2550 store_word (sp, State.regs[REG_D0 + 2]);
2553 if (mask & 0x40)
2555 sp -= 4;
2556 store_word (sp, State.regs[REG_D0 + 3]);
2559 if (mask & 0x20)
2561 sp -= 4;
2562 store_word (sp, State.regs[REG_A0 + 2]);
2565 if (mask & 0x10)
2567 sp -= 4;
2568 store_word (sp, State.regs[REG_A0 + 3]);
2571 if (mask & 0x8)
2573 sp -= 4;
2574 store_word (sp, State.regs[REG_D0]);
2575 sp -= 4;
2576 store_word (sp, State.regs[REG_D0 + 1]);
2577 sp -= 4;
2578 store_word (sp, State.regs[REG_A0]);
2579 sp -= 4;
2580 store_word (sp, State.regs[REG_A0 + 1]);
2581 sp -= 4;
2582 store_word (sp, State.regs[REG_MDR]);
2583 sp -= 4;
2584 store_word (sp, State.regs[REG_LIR]);
2585 sp -= 4;
2586 store_word (sp, State.regs[REG_LAR]);
2587 sp -= 4;
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
2592 field. */
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;
2603 unsigned long mask;
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;
2614 if (mask & 0x80)
2616 sp -= 4;
2617 store_word (sp, State.regs[REG_D0 + 2]);
2620 if (mask & 0x40)
2622 sp -= 4;
2623 store_word (sp, State.regs[REG_D0 + 3]);
2626 if (mask & 0x20)
2628 sp -= 4;
2629 store_word (sp, State.regs[REG_A0 + 2]);
2632 if (mask & 0x10)
2634 sp -= 4;
2635 store_word (sp, State.regs[REG_A0 + 3]);
2638 if (mask & 0x8)
2640 sp -= 4;
2641 store_word (sp, State.regs[REG_D0]);
2642 sp -= 4;
2643 store_word (sp, State.regs[REG_D0 + 1]);
2644 sp -= 4;
2645 store_word (sp, State.regs[REG_A0]);
2646 sp -= 4;
2647 store_word (sp, State.regs[REG_A0 + 1]);
2648 sp -= 4;
2649 store_word (sp, State.regs[REG_MDR]);
2650 sp -= 4;
2651 store_word (sp, State.regs[REG_LIR]);
2652 sp -= 4;
2653 store_word (sp, State.regs[REG_LAR]);
2654 sp -= 4;
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
2659 field. */
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;
2665 /* calls (an) */
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;
2718 unsigned long mask;
2720 State.regs[REG_SP] += insn & 0xff;
2721 sp = State.regs[REG_SP];
2723 offset = -4;
2724 mask = (insn & 0xff00) >> 8;
2726 if (mask & 0x80)
2728 State.regs[REG_D0 + 2] = load_word (sp + offset);
2729 offset -= 4;
2732 if (mask & 0x40)
2734 State.regs[REG_D0 + 3] = load_word (sp + offset);
2735 offset -= 4;
2738 if (mask & 0x20)
2740 State.regs[REG_A0 + 2] = load_word (sp + offset);
2741 offset -= 4;
2744 if (mask & 0x10)
2746 State.regs[REG_A0 + 3] = load_word (sp + offset);
2747 offset -= 4;
2750 if (mask & 0x8)
2752 State.regs[REG_D0] = load_word (sp + offset);
2753 offset -= 4;
2754 State.regs[REG_D0 + 1] = load_word (sp + offset);
2755 offset -= 4;
2756 State.regs[REG_A0] = load_word (sp + offset);
2757 offset -= 4;
2758 State.regs[REG_A0 + 1] = load_word (sp + offset);
2759 offset -= 4;
2760 State.regs[REG_MDR] = load_word (sp + offset);
2761 offset -= 4;
2762 State.regs[REG_LIR] = load_word (sp + offset);
2763 offset -= 4;
2764 State.regs[REG_LAR] = load_word (sp + offset);
2765 offset -= 4;
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;
2779 unsigned long mask;
2781 State.regs[REG_SP] += (insn & 0xff);
2782 sp = State.regs[REG_SP];
2783 State.regs[REG_PC] = State.regs[REG_MDR] - 3;
2785 offset = -4;
2786 mask = (insn & 0xff00) >> 8;
2788 if (mask & 0x80)
2790 State.regs[REG_D0 + 2] = load_word (sp + offset);
2791 offset -= 4;
2794 if (mask & 0x40)
2796 State.regs[REG_D0 + 3] = load_word (sp + offset);
2797 offset -= 4;
2800 if (mask & 0x20)
2802 State.regs[REG_A0 + 2] = load_word (sp + offset);
2803 offset -= 4;
2806 if (mask & 0x10)
2808 State.regs[REG_A0 + 3] = load_word (sp + offset);
2809 offset -= 4;
2812 if (mask & 0x8)
2814 State.regs[REG_D0] = load_word (sp + offset);
2815 offset -= 4;
2816 State.regs[REG_D0 + 1] = load_word (sp + offset);
2817 offset -= 4;
2818 State.regs[REG_A0] = load_word (sp + offset);
2819 offset -= 4;
2820 State.regs[REG_A0 + 1] = load_word (sp + offset);
2821 offset -= 4;
2822 State.regs[REG_MDR] = load_word (sp + offset);
2823 offset -= 4;
2824 State.regs[REG_LIR] = load_word (sp + offset);
2825 offset -= 4;
2826 State.regs[REG_LAR] = load_word (sp + offset);
2827 offset -= 4;
2831 /* rets */
2832 void OP_F0FC (insn, extension)
2833 unsigned long insn, extension;
2835 unsigned int sp;
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;
2843 /* rti */
2844 void OP_F0FD (insn, extension)
2845 unsigned long insn, extension;
2847 unsigned int sp, next_pc;
2849 sp = State.regs[REG_SP];
2850 PSW = State.mem[sp] | (State.mem[sp + 1] << 8);
2851 State.regs[REG_PC] = (State.mem[sp+4] | (State.mem[sp+5] << 8)
2852 | (State.mem[sp+6] << 16) | (State.mem[sp+7] << 24));
2853 State.regs[REG_SP] += 8;
2856 /* trap */
2857 void OP_F0FE (insn, extension)
2858 unsigned long insn, extension;
2860 unsigned int sp, next_pc;
2862 sp = State.regs[REG_SP];
2863 next_pc = State.regs[REG_PC] + 2;
2864 State.mem[sp] = next_pc & 0xff;
2865 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2866 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2867 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
2868 State.regs[REG_PC] = 0x40000010 - 2;
2871 /* syscall */
2872 void OP_F0C0 (insn, extension)
2873 unsigned long insn, extension;
2875 /* We use this for simulated system calls; we may need to change
2876 it to a reserved instruction if we conflict with uses at
2877 Matsushita. */
2878 int save_errno = errno;
2879 errno = 0;
2881 /* Registers passed to trap 0 */
2883 /* Function number. */
2884 #define FUNC (State.regs[0])
2886 /* Parameters. */
2887 #define PARM1 (State.regs[1])
2888 #define PARM2 (load_word (State.regs[REG_SP] + 12))
2889 #define PARM3 (load_word (State.regs[REG_SP] + 16))
2891 /* Registers set by trap 0 */
2893 #define RETVAL State.regs[0] /* return value */
2894 #define RETERR State.regs[1] /* return error code */
2896 /* Turn a pointer in a register into a pointer into real memory. */
2898 #define MEMPTR(x) (State.mem + x)
2900 switch (FUNC)
2902 #if !defined(__GO32__) && !defined(_WIN32)
2903 #ifdef TARGET_SYS_fork
2904 case TARGET_SYS_fork:
2905 RETVAL = fork ();
2906 break;
2907 #endif
2908 #ifdef TARGET_SYS_execve
2909 case TARGET_SYS_execve:
2910 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
2911 (char **)MEMPTR (PARM3));
2912 break;
2913 #endif
2914 #ifdef TARGET_SYS_execv
2915 case TARGET_SYS_execv:
2916 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
2917 break;
2918 #endif
2919 #endif /* ! GO32 and ! WIN32 */
2921 case TARGET_SYS_read:
2922 RETVAL = mn10300_callback->read (mn10300_callback, PARM1,
2923 MEMPTR (PARM2), PARM3);
2924 break;
2925 case TARGET_SYS_write:
2926 RETVAL = (int)mn10300_callback->write (mn10300_callback, PARM1,
2927 MEMPTR (PARM2), PARM3);
2928 break;
2929 case TARGET_SYS_lseek:
2930 RETVAL = mn10300_callback->lseek (mn10300_callback, PARM1, PARM2, PARM3);
2931 break;
2932 case TARGET_SYS_close:
2933 RETVAL = mn10300_callback->close (mn10300_callback, PARM1);
2934 break;
2935 case TARGET_SYS_open:
2936 RETVAL = mn10300_callback->open (mn10300_callback, MEMPTR (PARM1), PARM2);
2937 break;
2938 case TARGET_SYS_exit:
2939 /* EXIT - caller can look in PARM1 to work out the
2940 reason */
2941 if (PARM1 == 0xdead)
2942 State.exception = SIGABRT;
2943 else
2944 State.exception = SIGQUIT;
2945 State.exited = 1;
2946 break;
2948 case TARGET_SYS_stat: /* added at hmsi */
2949 /* stat system call */
2951 struct stat host_stat;
2952 reg_t buf;
2954 RETVAL = stat (MEMPTR (PARM1), &host_stat);
2956 buf = PARM2;
2958 /* Just wild-assed guesses. */
2959 store_half (buf, host_stat.st_dev);
2960 store_half (buf + 2, host_stat.st_ino);
2961 store_word (buf + 4, host_stat.st_mode);
2962 store_half (buf + 8, host_stat.st_nlink);
2963 store_half (buf + 10, host_stat.st_uid);
2964 store_half (buf + 12, host_stat.st_gid);
2965 store_half (buf + 14, host_stat.st_rdev);
2966 store_word (buf + 16, host_stat.st_size);
2967 store_word (buf + 20, host_stat.st_atime);
2968 store_word (buf + 28, host_stat.st_mtime);
2969 store_word (buf + 36, host_stat.st_ctime);
2971 break;
2973 #ifdef TARGET_SYS_chown
2974 case TARGET_SYS_chown:
2975 RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3);
2976 break;
2977 #endif
2978 case TARGET_SYS_chmod:
2979 RETVAL = chmod (MEMPTR (PARM1), PARM2);
2980 break;
2981 #ifdef TARGET_SYS_time
2982 case TARGET_SYS_time:
2983 RETVAL = time ((void*) MEMPTR (PARM1));
2984 break;
2985 #endif
2986 #ifdef TARGET_SYS_times
2987 case TARGET_SYS_times:
2989 struct tms tms;
2990 RETVAL = times (&tms);
2991 store_word (PARM1, tms.tms_utime);
2992 store_word (PARM1 + 4, tms.tms_stime);
2993 store_word (PARM1 + 8, tms.tms_cutime);
2994 store_word (PARM1 + 12, tms.tms_cstime);
2995 break;
2997 #endif
2998 #ifdef TARGET_SYS_gettimeofday
2999 case TARGET_SYS_gettimeofday:
3001 struct timeval t;
3002 struct timezone tz;
3003 RETVAL = gettimeofday (&t, &tz);
3004 store_word (PARM1, t.tv_sec);
3005 store_word (PARM1 + 4, t.tv_usec);
3006 store_word (PARM2, tz.tz_minuteswest);
3007 store_word (PARM2 + 4, tz.tz_dsttime);
3008 break;
3010 #endif
3011 #ifdef TARGET_SYS_utime
3012 case TARGET_SYS_utime:
3013 /* Cast the second argument to void *, to avoid type mismatch
3014 if a prototype is present. */
3015 RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
3016 break;
3017 #endif
3018 default:
3019 abort ();
3021 RETERR = errno;
3022 errno = save_errno;
3025 /* rtm */
3026 void OP_F0FF (insn, extension)
3027 unsigned long insn, extension;
3029 abort ();
3032 /* nop */
3033 void OP_CB (insn, extension)
3034 unsigned long insn, extension;
3038 /* putx dm,dm */
3039 void OP_F500 (insn, extension)
3040 unsigned long insn, extension;
3042 State.regs[REG_MDRQ] = State.regs[REG_D0 + REG0 (insn)];
3045 /* getx dm,dm */
3046 void OP_F6F0 (insn, extension)
3047 unsigned long insn, extension;
3049 int z, n;
3050 z = (State.regs[REG_MDRQ] == 0);
3051 n = ((State.regs[REG_MDRQ] & 0x80000000) != 0);
3052 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDRQ];
3054 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3055 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
3058 /* mulq dm,dn */
3059 void OP_F600 (insn, extension)
3060 unsigned long insn, extension;
3062 unsigned long long temp;
3063 int n, z;
3065 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)]
3066 * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]);
3067 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
3068 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3069 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
3070 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
3071 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3072 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3075 /* mulq imm8,dn */
3076 void OP_F90000 (insn, extension)
3077 unsigned long insn, extension;
3079 unsigned long long temp;
3080 int n, z;
3082 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_8 (insn)]
3083 * (signed64)(signed32)SEXT8 (insn & 0xff));
3084 State.regs[REG_D0 + REG0_8 (insn)] = temp & 0xffffffff;
3085 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3086 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
3087 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
3088 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3089 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3092 /* mulq imm16,dn */
3093 void OP_FB000000 (insn, extension)
3094 unsigned long insn, extension;
3096 unsigned long long temp;
3097 int n, z;
3099 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
3100 * (signed64)(signed32)SEXT16 (insn & 0xffff));
3101 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3102 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3103 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3104 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3105 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3106 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3109 /* mulq imm32,dn */
3110 void OP_FD000000 (insn, extension)
3111 unsigned long insn, extension;
3113 unsigned long long temp;
3114 int n, z;
3116 temp = ((signed64)(signed32)State.regs[REG_D0 + REG0_16 (insn)]
3117 * (signed64)(signed32)(((insn & 0xffff) << 16) + extension));
3118 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3119 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3120 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3121 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3122 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3123 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3126 /* mulqu dm,dn */
3127 void OP_F610 (insn, extension)
3128 unsigned long insn, extension;
3130 unsigned long long temp;
3131 int n, z;
3133 temp = ((unsigned64) State.regs[REG_D0 + REG0 (insn)]
3134 * (unsigned64) State.regs[REG_D0 + REG1 (insn)]);
3135 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
3136 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3137 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
3138 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
3139 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3140 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3143 /* mulqu imm8,dn */
3144 void OP_F91400 (insn, extension)
3145 unsigned long insn, extension;
3147 unsigned long long temp;
3148 int n, z;
3150 temp = ((unsigned64)State.regs[REG_D0 + REG0_8 (insn)]
3151 * (unsigned64)SEXT8 (insn & 0xff));
3152 State.regs[REG_D0 + REG0_8 (insn)] = temp & 0xffffffff;
3153 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3154 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
3155 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
3156 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3157 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3160 /* mulqu imm16,dn */
3161 void OP_FB140000 (insn, extension)
3162 unsigned long insn, extension;
3164 unsigned long long temp;
3165 int n, z;
3167 temp = ((unsigned64)State.regs[REG_D0 + REG0_16 (insn)]
3168 * (unsigned64) SEXT16 (insn & 0xffff));
3169 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3170 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3171 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3172 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3173 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3174 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3177 /* mulqu imm32,dn */
3178 void OP_FD140000 (insn, extension)
3179 unsigned long insn, extension;
3181 unsigned long long temp;
3182 int n, z;
3184 temp = ((unsigned64)State.regs[REG_D0 + REG0_16 (insn)]
3185 * (unsigned64)(((insn & 0xffff) << 16) + extension));
3186 State.regs[REG_D0 + REG0_16 (insn)] = temp & 0xffffffff;
3187 State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3188 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
3189 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
3190 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3191 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3194 /* sat16 dm,dn */
3195 void OP_F640 (insn, extension)
3196 unsigned long insn, extension;
3198 int temp;
3200 temp = State.regs[REG_D0 + REG1 (insn)];
3201 temp = (temp > 0x7fff ? 0x7fff : temp);
3202 temp = (temp < -0x8000 ? -0x8000 : temp);
3203 State.regs[REG_D0 + REG0 (insn)] = temp;
3206 /* sat24 dm,dn */
3207 void OP_F650 (insn, extension)
3208 unsigned long insn, extension;
3210 int temp;
3212 temp = State.regs[REG_D0 + REG1 (insn)];
3213 temp = (temp > 0x7fffff ? 0x7fffff : temp);
3214 temp = (temp < -0x800000 ? -0x800000 : temp);
3215 State.regs[REG_D0 + REG0 (insn)] = temp;
3218 /* bsch dm,dn */
3219 void OP_F670 (insn, extension)
3220 unsigned long insn, extension;
3222 int temp, c;
3224 temp = State.regs[REG_D0 + REG1 (insn)];
3225 temp <<= (State.regs[REG_D0 + REG0 (insn)] & 0x1f);
3226 c = (temp != 0 ? 1 : 0);
3227 PSW &= ~(PSW_C);
3228 PSW |= (c ? PSW_C : 0);
3231 /* breakpoint */
3232 void
3233 OP_FF (insn, extension)
3234 unsigned long insn, extension;
3236 State.exception = SIGTRAP;
3237 PC -= 1;