7 #include "mn10300_sim.h"
9 #include "sys/syscall.h"
13 #include <sys/times.h>
21 static void trace_input
PARAMS ((char *name
, enum op_types type
, int size
));
22 static void trace_output
PARAMS ((enum op_types result
));
23 static int init_text_p
= 0;
24 static asection
*text
;
25 static bfd_vma text_start
;
26 static bfd_vma text_end
;
29 #ifndef SIZE_INSTRUCTION
30 #define SIZE_INSTRUCTION 6
34 #define SIZE_OPERANDS 16
38 #define SIZE_VALUES 11
42 #define SIZE_LOCATION 40
46 trace_input (name
, type
, size
)
60 #define trace_input(NAME, IN1, IN2)
61 #define trace_output(RESULT)
68 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = SEXT8 (insn
& 0xff);
74 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
80 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
86 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
92 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] = insn
& 0xff;
98 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
104 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_SP
];
110 State
.regs
[REG_SP
] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
116 State
.regs
[REG_D0
+ (insn
& 0x3)] = PSW
;
122 PSW
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
128 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_MDR
];
134 State
.regs
[REG_MDR
] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
140 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
141 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4);
144 /* mov (d8,am), dn */
147 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
148 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
149 + SEXT8 (insn
& 0xff)), 4);
152 /* mov (d16,am), dn */
155 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
156 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
157 + SEXT16 (insn
& 0xffff)), 4);
160 /* mov (d32,am), dn */
163 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
164 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
165 + ((insn
& 0xffff) << 16) | extension
), 4);
168 /* mov (d8,sp), dn */
171 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
172 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4);
175 /* mov (d16,sp), dn */
178 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
179 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4);
182 /* mov (d32,sp), dn */
185 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
186 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4);
189 /* mov (di,am), dn */
192 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
193 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
194 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4);
197 /* mov (abs16), dn */
200 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 4);
203 /* mov (abs32), dn */
206 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
207 = load_mem ((((insn
& 0xffff) << 16) + extension
), 4);
213 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)]
214 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4);
217 /* mov (d8,am), an */
220 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]
221 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
222 + SEXT8 (insn
& 0xff)), 4);
225 /* mov (d16,am), an */
228 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]
229 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
230 + SEXT16 (insn
& 0xffff)), 4);
233 /* mov (d32,am), an */
236 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]
237 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
238 + ((insn
& 0xffff) << 16) + extension
), 4);
241 /* mov (d8,sp), an */
244 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
245 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4);
248 /* mov (d16,sp), an */
251 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
252 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4);
255 /* mov (d32,sp), an */
258 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
259 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4);
262 /* mov (di,am), an */
265 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
266 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
267 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4);
270 /* mov (abs16), an */
273 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 4);
276 /* mov (abs32), an */
279 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
280 = load_mem ((((insn
& 0xffff) << 16) + extension
), 4);
283 /* mov (d8,am), sp */
287 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
288 + SEXT8 (insn
& 0xff)), 4);
294 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4,
295 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
298 /* mov dm, (d8,an) */
301 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
302 + SEXT8 (insn
& 0xff)), 4,
303 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
306 /* mov dm (d16,an) */
309 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
310 + SEXT16 (insn
& 0xffff)), 4,
311 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
314 /* mov dm (d32,an) */
317 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
318 + ((insn
& 0xffff) << 16) + extension
), 4,
319 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
322 /* mov dm, (d8,sp) */
325 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4,
326 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
329 /* mov dm, (d16,sp) */
332 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4,
333 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
336 /* mov dm, (d32,sp) */
339 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4,
340 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
343 /* mov dm, (di,an) */
346 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
347 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4,
348 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
351 /* mov dm, (abs16) */
354 store_mem ((insn
& 0xffff), 4, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
357 /* mov dm, (abs32) */
360 store_mem ((((insn
& 0xffff) << 16) + extension
), 4, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
366 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4,
367 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)]);
370 /* mov am, (d8,an) */
373 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
374 + SEXT8 (insn
& 0xff)), 4,
375 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]);
378 /* mov am, (d16,an) */
381 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 17)]
382 + SEXT16 (insn
& 0xffff)), 4,
383 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
386 /* mov am, (d32,an) */
389 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 17)]
390 + ((insn
& 0xffff) << 16) + extension
), 4,
391 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
394 /* mov am, (d8,sp) */
397 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4,
398 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]);
401 /* mov am, (d16,sp) */
404 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4,
405 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
408 /* mov am, (d32,sp) */
411 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4,
412 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
415 /* mov am, (di,an) */
418 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
419 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4,
420 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]);
423 /* mov am, (abs16) */
426 store_mem ((insn
& 0xffff), 4, State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
429 /* mov am, (abs32) */
432 store_mem ((((insn
& 0xffff) << 16) + extension
), 4, State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
435 /* mov sp, (d8,an) */
438 store_mem (State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] + SEXT8 (insn
& 0xff),
439 4, State
.regs
[REG_SP
]);
447 value
= SEXT16 (insn
& 0xffff);
448 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
456 value
= (insn
& 0xffff) << 16 | extension
;
457 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
465 value
= insn
& 0xffff;
466 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
474 value
= (insn
& 0xffff) << 16 | extension
;
475 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
481 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
482 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 1);
485 /* movbu (d8,am), dn */
488 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
489 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
490 + SEXT8 (insn
& 0xff)), 1);
493 /* movbu (d16,am), dn */
496 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
497 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
498 + SEXT16 (insn
& 0xffff)), 1);
501 /* movbu (d32,am), dn */
504 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
505 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
506 + ((insn
& 0xffff) << 16) + extension
), 1);
509 /* movbu (d8,sp), dn */
512 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
513 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xff)), 1);
516 /* movbu (d16,sp), dn */
519 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
520 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xffff)), 1);
523 /* movbu (d32,sp), dn */
526 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
527 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 1);
530 /* movbu (di,am), dn */
533 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
534 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
535 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 1);
538 /* movbu (abs16), dn */
541 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 1);
544 /* movbu (abs32), dn */
547 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
548 = load_mem ((((insn
& 0xffff) << 16) + extension
), 1);
554 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 1,
555 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
558 /* movbu dm, (d8,an) */
561 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
562 + SEXT8 (insn
& 0xff)), 1,
563 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
566 /* movbu dm, (d16,an) */
569 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
570 + SEXT16 (insn
& 0xffff)), 1,
571 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
574 /* movbu dm, (d32,an) */
577 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
578 + ((insn
& 0xffff) << 16) + extension
), 1,
579 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
582 /* movbu dm, (d8,sp) */
585 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 1,
586 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
589 /* movbu dm, (d16,sp) */
592 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 2,
593 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
596 /* movbu dm (d32,sp) */
599 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2,
600 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
603 /* movbu dm, (di,an) */
606 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
607 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 1,
608 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
611 /* movbu dm, (abs16) */
614 store_mem ((insn
& 0xffff), 1, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
617 /* movbu dm, (abs32) */
620 store_mem ((((insn
& 0xffff) << 16) + extension
), 1, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
626 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
627 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 2);
630 /* movhu (d8,am), dn */
633 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
634 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
635 + SEXT8 (insn
& 0xff)), 2);
638 /* movhu (d16,am), dn */
641 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
642 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
643 + SEXT16 (insn
& 0xffff)), 2);
646 /* movhu (d32,am), dn */
649 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
650 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
651 + ((insn
& 0xffff) << 16) + extension
), 2);
654 /* movhu (d8,sp) dn */
657 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
658 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xff)), 2);
661 /* movhu (d16,sp), dn */
664 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
665 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xffff)), 2);
668 /* movhu (d32,sp), dn */
671 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
672 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2);
675 /* movhu (di,am), dn */
678 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
679 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
680 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 2);
683 /* movhu (abs16), dn */
686 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 2);
689 /* movhu (abs32), dn */
692 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
693 = load_mem ((((insn
& 0xffff) << 16) + extension
), 2);
699 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 2,
700 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
703 /* movhu dm, (d8,an) */
706 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
707 + SEXT8 (insn
& 0xff)), 2,
708 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
711 /* movhu dm, (d16,an) */
714 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
715 + SEXT16 (insn
& 0xffff)), 2,
716 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
719 /* movhu dm, (d32,an) */
722 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
723 + ((insn
& 0xffff) << 16) + extension
), 2,
724 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
727 /* movhu dm,(d8,sp) */
730 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 2,
731 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
734 /* movhu dm,(d16,sp) */
737 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 2,
738 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
741 /* movhu dm,(d32,sp) */
744 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2,
745 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
748 /* movhu dm, (di,an) */
751 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
752 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 2,
753 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
756 /* movhu dm, (abs16) */
759 store_mem ((insn
& 0xffff), 2, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
762 /* movhu dm, (abs32) */
765 store_mem ((((insn
& 0xffff) << 16) + extension
), 2, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
771 if (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000)
772 State
.regs
[REG_MDR
] = -1;
774 State
.regs
[REG_MDR
] = 0;
780 State
.regs
[REG_D0
+ (insn
& 0x3)] = SEXT8 (State
.regs
[REG_D0
+ (insn
& 0x3)]);
786 State
.regs
[REG_D0
+ (insn
& 0x3)] &= 0xff;
792 State
.regs
[REG_D0
+ (insn
& 0x3)]
793 = SEXT16 (State
.regs
[REG_D0
+ (insn
& 0x3)]);
799 State
.regs
[REG_D0
+ (insn
& 0x3)] &= 0xffff;
802 /* movm (sp), reg_list */
805 unsigned long sp
= State
.regs
[REG_SP
];
813 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
815 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
817 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
819 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
821 State
.regs
[REG_A0
] = load_mem (sp
, 4);
823 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
825 State
.regs
[REG_D0
] = load_mem (sp
, 4);
831 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
837 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
843 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
849 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
853 /* And make sure to update the stack pointer. */
854 State
.regs
[REG_SP
] = sp
;
857 /* movm reg_list, (sp) */
860 unsigned long sp
= State
.regs
[REG_SP
];
868 store_mem (sp
, 4, State
.regs
[REG_D0
+ 2]);
874 store_mem (sp
, 4, State
.regs
[REG_D0
+ 3]);
880 store_mem (sp
, 4, State
.regs
[REG_A0
+ 2]);
886 store_mem (sp
, 4, State
.regs
[REG_A0
+ 3]);
892 store_mem (sp
, 4, State
.regs
[REG_D0
]);
894 store_mem (sp
, 4, State
.regs
[REG_D0
+ 1]);
896 store_mem (sp
, 4, State
.regs
[REG_A0
]);
898 store_mem (sp
, 4, State
.regs
[REG_A0
+ 1]);
900 store_mem (sp
, 4, State
.regs
[REG_MDR
]);
902 store_mem (sp
, 4, State
.regs
[REG_LIR
]);
904 store_mem (sp
, 4, State
.regs
[REG_LAR
]);
908 /* And make sure to update the stack pointer. */
909 State
.regs
[REG_SP
] = sp
;
915 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = 0;
918 PSW
&= ~(PSW_V
| PSW_C
| PSW_N
);
925 unsigned long reg1
, reg2
, value
;
927 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
928 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
930 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
933 n
= (value
& 0x80000000);
935 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
936 && (reg2
& 0x80000000) != (value
& 0x80000000));
938 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
939 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
940 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
947 unsigned long reg1
, reg2
, value
;
949 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
950 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
952 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
955 n
= (value
& 0x80000000);
957 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
958 && (reg2
& 0x80000000) != (value
& 0x80000000));
960 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
961 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
962 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
969 unsigned long reg1
, reg2
, value
;
971 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
972 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
974 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
977 n
= (value
& 0x80000000);
979 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
980 && (reg2
& 0x80000000) != (value
& 0x80000000));
982 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
983 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
984 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
991 unsigned long reg1
, reg2
, value
;
993 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
994 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
996 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
999 n
= (value
& 0x80000000);
1001 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1002 && (reg2
& 0x80000000) != (value
& 0x80000000));
1004 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1005 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1006 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1013 unsigned long reg1
, imm
, value
;
1015 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1016 imm
= SEXT8 (insn
& 0xff);
1018 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = value
;
1021 n
= (value
& 0x80000000);
1023 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1024 && (reg1
& 0x80000000) != (value
& 0x80000000));
1026 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1027 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1028 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1035 unsigned long reg1
, imm
, value
;
1037 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1038 imm
= SEXT16 (insn
& 0xffff);
1040 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1043 n
= (value
& 0x80000000);
1045 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1046 && (reg1
& 0x80000000) != (value
& 0x80000000));
1048 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1049 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1050 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1057 unsigned long reg1
, imm
, value
;
1059 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1060 imm
= ((insn
& 0xffff) << 16) | extension
;
1062 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1065 n
= (value
& 0x80000000);
1067 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1068 && (reg1
& 0x80000000) != (value
& 0x80000000));
1070 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1071 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1072 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1079 unsigned long reg1
, imm
, value
;
1081 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)];
1082 imm
= SEXT8 (insn
& 0xff);
1084 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] = value
;
1087 n
= (value
& 0x80000000);
1089 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1090 && (reg1
& 0x80000000) != (value
& 0x80000000));
1092 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1093 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1094 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1101 unsigned long reg1
, imm
, value
;
1103 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1104 imm
= SEXT16 (insn
& 0xffff);
1106 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1109 n
= (value
& 0x80000000);
1111 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1112 && (reg1
& 0x80000000) != (value
& 0x80000000));
1114 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1115 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1116 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1123 unsigned long reg1
, imm
, value
;
1125 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1126 imm
= ((insn
& 0xffff) << 16) | extension
;
1128 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1131 n
= (value
& 0x80000000);
1133 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1134 && (reg1
& 0x80000000) != (value
& 0x80000000));
1136 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1137 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1138 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1145 unsigned long reg1
, imm
, value
;
1147 reg1
= State
.regs
[REG_SP
];
1148 imm
= SEXT8 (insn
& 0xff);
1150 State
.regs
[REG_SP
] = value
;
1157 unsigned long reg1
, imm
, value
;
1159 reg1
= State
.regs
[REG_SP
];
1160 imm
= SEXT16 (insn
& 0xffff);
1162 State
.regs
[REG_SP
] = value
;
1169 unsigned long reg1
, imm
, value
;
1171 reg1
= State
.regs
[REG_SP
];
1172 imm
= ((insn
& 0xffff) << 16) | extension
;
1174 State
.regs
[REG_SP
] = value
;
1181 unsigned long reg1
, reg2
, value
;
1183 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1184 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1185 value
= reg1
+ reg2
+ ((PSW
& PSW_C
) != 0);
1186 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1189 n
= (value
& 0x80000000);
1191 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1192 && (reg2
& 0x80000000) != (value
& 0x80000000));
1194 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1195 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1196 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1203 unsigned long reg1
, reg2
, value
;
1205 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1206 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1207 value
= reg2
- reg1
;
1210 n
= (value
& 0x80000000);
1212 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1213 && (reg2
& 0x80000000) != (value
& 0x80000000));
1215 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1216 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1217 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1218 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1225 unsigned long reg1
, reg2
, value
;
1227 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1228 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1229 value
= reg2
- reg1
;
1232 n
= (value
& 0x80000000);
1234 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1235 && (reg2
& 0x80000000) != (value
& 0x80000000));
1237 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1238 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1239 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1240 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1247 unsigned long reg1
, reg2
, value
;
1249 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1250 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1251 value
= reg2
- reg1
;
1254 n
= (value
& 0x80000000);
1256 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1257 && (reg2
& 0x80000000) != (value
& 0x80000000));
1259 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1260 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1261 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1262 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1269 unsigned long reg1
, reg2
, value
;
1271 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1272 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1273 value
= reg2
- reg1
;
1276 n
= (value
& 0x80000000);
1278 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1279 && (reg2
& 0x80000000) != (value
& 0x80000000));
1281 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1282 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1283 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1284 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1291 unsigned long reg1
, imm
, value
;
1293 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1294 imm
= ((insn
& 0xffff) << 16) | extension
;
1298 n
= (value
& 0x80000000);
1300 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1301 && (reg1
& 0x80000000) != (value
& 0x80000000));
1303 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1304 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1305 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1306 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1313 unsigned long reg1
, imm
, value
;
1315 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1316 imm
= ((insn
& 0xffff) << 16) | extension
;
1320 n
= (value
& 0x80000000);
1322 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1323 && (reg1
& 0x80000000) != (value
& 0x80000000));
1325 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1326 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1327 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1328 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1335 unsigned long reg1
, reg2
, value
;
1337 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1338 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1339 value
= reg2
- reg1
- ((PSW
& PSW_C
) != 0);
1342 n
= (value
& 0x80000000);
1344 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1345 && (reg2
& 0x80000000) != (value
& 0x80000000));
1347 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1348 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1349 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1350 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1356 unsigned long long temp
;
1359 temp
= (State
.regs
[REG_D0
+ (insn
& 0x3)]
1360 * State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
1361 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1362 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1363 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1364 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1365 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1366 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1372 unsigned long long temp
;
1375 temp
= (State
.regs
[REG_D0
+ (insn
& 0x3)]
1376 * State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
1377 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1378 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1379 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1380 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1381 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1382 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1391 temp
= State
.regs
[REG_MDR
];
1393 temp
|= State
.regs
[REG_D0
+ (insn
& 0x3)];
1394 State
.regs
[REG_MDR
] = temp
% (long)State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1395 temp
/= (long)State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1396 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1397 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1398 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1399 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1400 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1401 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1407 unsigned long long temp
;
1410 temp
= State
.regs
[REG_MDR
];
1412 temp
|= State
.regs
[REG_D0
+ (insn
& 0x3)];
1413 State
.regs
[REG_MDR
] = temp
% State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1414 temp
/= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1415 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1416 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1417 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1418 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1419 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1420 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1429 value
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] + 1;
1430 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = value
;
1433 n
= (value
& 0x80000000);
1435 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1436 && (reg2
& 0x80000000) != (value
& 0x80000000));
1438 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1439 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1440 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1446 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)] += 1;
1452 State
.regs
[REG_A0
+ (insn
& 0x3)] += 4;
1459 unsigned long reg1
, imm
, value
;
1461 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1462 imm
= SEXT8 (insn
& 0xff);
1466 n
= (value
& 0x80000000);
1468 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1469 && (reg1
& 0x80000000) != (value
& 0x80000000));
1471 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1472 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1473 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1480 unsigned long reg1
, reg2
, value
;
1482 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1483 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1484 value
= reg2
- reg1
;
1487 n
= (value
& 0x80000000);
1489 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1490 && (reg2
& 0x80000000) != (value
& 0x80000000));
1492 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1493 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1494 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1501 unsigned long reg1
, reg2
, value
;
1503 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1504 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1505 value
= reg2
- reg1
;
1508 n
= (value
& 0x80000000);
1510 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1511 && (reg2
& 0x80000000) != (value
& 0x80000000));
1513 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1514 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1515 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1522 unsigned long reg1
, reg2
, value
;
1524 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1525 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1526 value
= reg2
- reg1
;
1529 n
= (value
& 0x80000000);
1531 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1532 && (reg2
& 0x80000000) != (value
& 0x80000000));
1534 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1535 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1536 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1543 unsigned long reg1
, imm
, value
;
1545 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)];
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));
1564 unsigned long reg1
, reg2
, value
;
1566 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1567 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1568 value
= reg2
- reg1
;
1571 n
= (value
& 0x80000000);
1573 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1574 && (reg2
& 0x80000000) != (value
& 0x80000000));
1576 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1577 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1578 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1585 unsigned long reg1
, imm
, value
;
1587 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1588 imm
= SEXT16 (insn
& 0xffff);
1592 n
= (value
& 0x80000000);
1594 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1595 && (reg1
& 0x80000000) != (value
& 0x80000000));
1597 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1598 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1599 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1606 unsigned long reg1
, imm
, value
;
1608 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1609 imm
= ((insn
& 0xffff) << 16) | extension
;
1613 n
= (value
& 0x80000000);
1615 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1616 && (reg1
& 0x80000000) != (value
& 0x80000000));
1618 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1619 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1620 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1627 unsigned long reg1
, imm
, value
;
1629 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1630 imm
= insn
& 0xffff;
1634 n
= (value
& 0x80000000);
1636 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1637 && (reg1
& 0x80000000) != (value
& 0x80000000));
1639 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1640 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1641 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1648 unsigned long reg1
, imm
, value
;
1650 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1651 imm
= ((insn
& 0xffff) << 16) | extension
;
1655 n
= (value
& 0x80000000);
1657 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1658 && (reg1
& 0x80000000) != (value
& 0x80000000));
1660 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1661 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1662 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1670 State
.regs
[REG_D0
+ (insn
& 0x3)] &= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1671 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1672 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1673 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1674 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1682 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] &= (insn
& 0xff);
1683 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
1684 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
1685 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1686 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1694 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] &= (insn
& 0xffff);
1695 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1696 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1697 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1698 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1706 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1707 &= ((insn
& 0xffff) << 16 | extension
);
1708 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1709 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1710 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1711 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1714 /* and imm16, psw */
1717 PSW
&= (insn
& 0xffff);
1725 State
.regs
[REG_D0
+ (insn
& 0x3)] |= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1726 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1727 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1728 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1729 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1737 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] |= insn
& 0xff;
1738 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
1739 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
1740 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1741 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1749 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] |= insn
& 0xffff;
1750 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1751 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1752 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1753 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1761 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1762 |= ((insn
& 0xffff) << 16 | extension
);
1763 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1764 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1765 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1766 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1772 PSW
|= (insn
& 0xffff);
1780 State
.regs
[REG_D0
+ (insn
& 0x3)] ^= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1781 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1782 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1783 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1784 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1792 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] ^= insn
& 0xffff;
1793 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1794 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1795 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1796 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1804 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1805 ^= ((insn
& 0xffff) << 16 | extension
);
1806 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1807 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1808 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1809 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1817 State
.regs
[REG_D0
+ (insn
& 0x3)] = ~State
.regs
[REG_D0
+ (insn
& 0x3)];
1818 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1819 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1820 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1821 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1830 temp
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1831 temp
&= (insn
& 0xff);
1832 n
= (temp
& 0x80000000) != 0;
1834 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1835 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1838 /* btst imm16, dn */
1844 temp
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1845 temp
&= (insn
& 0xffff);
1846 n
= (temp
& 0x80000000) != 0;
1848 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1849 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1852 /* btst imm32, dn */
1858 temp
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1859 temp
&= ((insn
& 0xffff) << 16 | extension
);
1860 n
= (temp
& 0x80000000) != 0;
1862 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1863 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1866 /* btst imm8,(abs32) */
1872 temp
= load_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1);
1873 temp
&= (extension
& 0xff);
1874 n
= (temp
& 0x80000000) != 0;
1876 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1877 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1880 /* btst imm8,(d8,an) */
1886 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
1887 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
1888 temp
&= (insn
& 0xff);
1889 n
= (temp
& 0x80000000) != 0;
1891 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1892 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1901 temp
= load_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1);
1902 z
= (temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]) == 0;
1903 temp
|= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1904 store_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1, temp
);
1905 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1906 PSW
|= (z
? PSW_Z
: 0);
1909 /* bset imm8, (abs32) */
1915 temp
= load_mem (((insn
& 0xffff) << 16 | (extension
>> 8)), 1);
1916 z
= (temp
& (extension
& 0xff)) == 0;
1917 temp
|= (extension
& 0xff);
1918 store_mem ((((insn
& 0xffff) << 16) | (extension
>> 8)), 1, temp
);
1919 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1920 PSW
|= (z
? PSW_Z
: 0);
1923 /* bset imm8,(d8,an) */
1929 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
1930 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
1931 z
= (temp
& (insn
& 0xff)) == 0;
1932 temp
|= (insn
& 0xff);
1933 store_mem (State
.regs
[REG_A0
+ ((insn
& 30000)>> 16)], 1, temp
);
1934 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1935 PSW
|= (z
? PSW_Z
: 0);
1944 temp
= load_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1);
1945 z
= (temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]) == 0;
1946 temp
= ~temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1947 store_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1, temp
);
1948 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1949 PSW
|= (z
? PSW_Z
: 0);
1952 /* bclr imm8, (abs32) */
1958 temp
= load_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1);
1959 z
= (temp
& (extension
& 0xff)) == 0;
1960 temp
= ~temp
& (extension
& 0xff);
1961 store_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1, temp
);
1962 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1963 PSW
|= (z
? PSW_Z
: 0);
1966 /* bclr imm8,(d8,an) */
1972 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
1973 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
1974 z
= (temp
& (insn
& 0xff)) == 0;
1975 temp
= ~temp
& (insn
& 0xff);
1976 store_mem (State
.regs
[REG_A0
+ ((insn
& 30000)>> 16)], 1, temp
);
1977 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1978 PSW
|= (z
? PSW_Z
: 0);
1987 temp
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1989 temp
>>= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1990 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
;
1991 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1992 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1993 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
1994 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2003 temp
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
2005 temp
>>= (insn
& 0xff);
2006 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = temp
;
2007 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
2008 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
2009 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2010 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2018 c
= State
.regs
[REG_D0
+ (insn
& 0x3)] & 1;
2019 State
.regs
[REG_D0
+ (insn
& 0x3)]
2020 >>= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2021 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2022 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2023 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2024 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2032 c
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 1;
2033 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] >>= (insn
& 0xff);
2034 z
= (State
.regs
[REG_D0
+ ((insn
& 0x3) >> 8)] == 0);
2035 n
= (State
.regs
[REG_D0
+ ((insn
& 0x3) >> 8)] & 0x80000000) != 0;
2036 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2037 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2045 State
.regs
[REG_D0
+ (insn
& 0x3)]
2046 <<= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2047 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2048 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2049 PSW
&= ~(PSW_Z
| PSW_N
);
2050 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2058 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] <<= (insn
& 0xff);
2059 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
2060 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
2061 PSW
&= ~(PSW_Z
| PSW_N
);
2062 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2070 State
.regs
[REG_D0
+ (insn
& 0x3)] <<= 2;
2071 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2072 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2073 PSW
&= ~(PSW_Z
| PSW_N
);
2074 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2080 unsigned long value
;
2083 value
= State
.regs
[REG_D0
+ (insn
& 0x3)];
2088 value
|= ((PSW
& PSW_C
) != 0) ? 0x80000000 : 0;
2089 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
2091 n
= (value
& 0x80000000) != 0;
2092 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2093 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2099 unsigned long value
;
2102 value
= State
.regs
[REG_D0
+ (insn
& 0x3)];
2103 if (value
& 0x80000000)
2107 value
|= ((PSW
& PSW_C
) != 0);
2108 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
2110 n
= (value
& 0x80000000) != 0;
2111 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2112 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2118 /* The dispatching code will add 2 after we return, so
2119 we subtract two here to make things right. */
2121 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2127 /* The dispatching code will add 2 after we return, so
2128 we subtract two here to make things right. */
2130 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2136 /* The dispatching code will add 2 after we return, so
2137 we subtract two here to make things right. */
2139 || (((PSW
& PSW_N
) != 0) ^ (PSW
& PSW_V
) != 0)))
2140 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2146 /* The dispatching code will add 2 after we return, so
2147 we subtract two here to make things right. */
2148 if (!(((PSW
& PSW_N
) != 0) ^ (PSW
& PSW_V
) != 0))
2149 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2155 /* The dispatching code will add 2 after we return, so
2156 we subtract two here to make things right. */
2158 || (((PSW
& PSW_N
) != 0) ^ (PSW
& PSW_V
) != 0))
2159 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2165 /* The dispatching code will add 2 after we return, so
2166 we subtract two here to make things right. */
2167 if (((PSW
& PSW_N
) != 0) ^ (PSW
& PSW_V
) != 0)
2168 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2174 /* The dispatching code will add 2 after we return, so
2175 we subtract two here to make things right. */
2176 if (!(((PSW
& PSW_C
) != 0) || (PSW
& PSW_Z
) != 0))
2177 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2183 /* The dispatching code will add 2 after we return, so
2184 we subtract two here to make things right. */
2186 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2192 /* The dispatching code will add 2 after we return, so
2193 we subtract two here to make things right. */
2194 if (((PSW
& PSW_C
) != 0) || (PSW
& PSW_Z
) != 0)
2195 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2201 /* The dispatching code will add 2 after we return, so
2202 we subtract two here to make things right. */
2204 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2210 /* The dispatching code will add 3 after we return, so
2211 we subtract two here to make things right. */
2213 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2219 /* The dispatching code will add 3 after we return, so
2220 we subtract two here to make things right. */
2222 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2228 /* The dispatching code will add 3 after we return, so
2229 we subtract two here to make things right. */
2231 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2237 /* The dispatching code will add 3 after we return, so
2238 we subtract two here to make things right. */
2240 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2246 /* The dispatching code will add 2 after we return, so
2247 we subtract two here to make things right. */
2248 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2326 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
2332 State
.pc
+= SEXT16 (insn
& 0xffff) - 3;
2338 State
.pc
+= (((insn
& 0xffffff) << 8) | extension
) - 5;
2341 /* call label:16,reg_list,imm8 */
2344 unsigned int next_pc
, sp
, adjust
;
2347 sp
= State
.regs
[REG_SP
];
2348 next_pc
= State
.pc
+ 2;
2349 State
.mem
[sp
] = next_pc
& 0xff;
2350 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2351 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2352 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2360 State
.regs
[REG_D0
+ 2] = load_mem (sp
+ adjust
, 4);
2366 State
.regs
[REG_D0
+ 3] = load_mem (sp
+ adjust
, 4);
2372 State
.regs
[REG_A0
+ 2] = load_mem (sp
+ adjust
, 4);
2378 State
.regs
[REG_A0
+ 3] = load_mem (sp
+ adjust
, 4);
2384 State
.regs
[REG_D0
] = load_mem (sp
+ adjust
, 4);
2386 State
.regs
[REG_D0
+ 1] = load_mem (sp
+ adjust
, 4);
2388 State
.regs
[REG_A0
] = load_mem (sp
+ adjust
, 4);
2390 State
.regs
[REG_A0
+ 1] = load_mem (sp
+ adjust
, 4);
2392 State
.regs
[REG_MDR
] = load_mem (sp
+ adjust
, 4);
2394 State
.regs
[REG_LIR
] = load_mem (sp
+ adjust
, 4);
2396 State
.regs
[REG_LAR
] = load_mem (sp
+ adjust
, 4);
2400 /* And make sure to update the stack pointer. */
2401 State
.regs
[REG_SP
] -= extension
;
2402 State
.regs
[REG_MDR
] = next_pc
;
2403 State
.pc
+= SEXT16 ((insn
& 0xffff00) >> 8) - 5;
2406 /* call label:32,reg_list,imm8*/
2409 unsigned int next_pc
, sp
, adjust
;
2412 sp
= State
.regs
[REG_SP
];
2413 next_pc
= State
.pc
+ 2;
2414 State
.mem
[sp
] = next_pc
& 0xff;
2415 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2416 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2417 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2419 mask
= (extension
& 0xff00) >> 8;
2425 State
.regs
[REG_D0
+ 2] = load_mem (sp
+ adjust
, 4);
2431 State
.regs
[REG_D0
+ 3] = load_mem (sp
+ adjust
, 4);
2437 State
.regs
[REG_A0
+ 2] = load_mem (sp
+ adjust
, 4);
2443 State
.regs
[REG_A0
+ 3] = load_mem (sp
+ adjust
, 4);
2449 State
.regs
[REG_D0
] = load_mem (sp
+ adjust
, 4);
2451 State
.regs
[REG_D0
+ 1] = load_mem (sp
+ adjust
, 4);
2453 State
.regs
[REG_A0
] = load_mem (sp
+ adjust
, 4);
2455 State
.regs
[REG_A0
+ 1] = load_mem (sp
+ adjust
, 4);
2457 State
.regs
[REG_MDR
] = load_mem (sp
+ adjust
, 4);
2459 State
.regs
[REG_LIR
] = load_mem (sp
+ adjust
, 4);
2461 State
.regs
[REG_LAR
] = load_mem (sp
+ adjust
, 4);
2465 /* And make sure to update the stack pointer. */
2466 State
.regs
[REG_SP
] -= (extension
& 0xff);
2467 State
.regs
[REG_MDR
] = next_pc
;
2468 State
.pc
+= (((insn
& 0xffffff) << 8) | ((extension
& 0xff0000) >> 16)) - 7;
2474 unsigned int next_pc
, sp
;
2476 sp
= State
.regs
[REG_SP
];
2477 next_pc
= State
.pc
+ 2;
2478 State
.mem
[sp
] = next_pc
& 0xff;
2479 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2480 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2481 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2482 State
.regs
[REG_MDR
] = next_pc
;
2483 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
2486 /* calls label:16 */
2489 unsigned int next_pc
, sp
;
2491 sp
= State
.regs
[REG_SP
];
2492 next_pc
= State
.pc
+ 4;
2493 State
.mem
[sp
] = next_pc
& 0xff;
2494 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2495 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2496 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2497 State
.regs
[REG_MDR
] = next_pc
;
2498 State
.pc
+= SEXT16 (insn
& 0xffff) - 4;
2501 /* calls label:32 */
2504 unsigned int next_pc
, sp
;
2506 sp
= State
.regs
[REG_SP
];
2507 next_pc
= State
.pc
+ 6;
2508 State
.mem
[sp
] = next_pc
& 0xff;
2509 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2510 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2511 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2512 State
.regs
[REG_MDR
] = next_pc
;
2513 State
.pc
+= (((insn
& 0xffff) << 16) | extension
) - 6;
2516 /* ret reg_list, imm8 */
2522 State
.regs
[REG_SP
] += insn
& 0xff;
2523 State
.pc
= State
.regs
[REG_MDR
] - 3;
2524 sp
= State
.regs
[REG_SP
];
2526 mask
= (insn
& 0xff00) >> 8;
2531 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
2533 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
2535 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
2537 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
2539 State
.regs
[REG_A0
] = load_mem (sp
, 4);
2541 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
2543 State
.regs
[REG_D0
] = load_mem (sp
, 4);
2549 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
2555 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
2561 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
2567 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
2572 /* retf reg_list,imm8 */
2578 State
.regs
[REG_SP
] += insn
& 0xff;
2579 State
.pc
= (State
.mem
[sp
] | (State
.mem
[sp
+1] << 8)
2580 | (State
.mem
[sp
+2] << 16) | (State
.mem
[sp
+3] << 24));
2583 sp
= State
.regs
[REG_SP
];
2585 mask
= (insn
& 0xff00) >> 8;
2590 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
2592 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
2594 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
2596 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
2598 State
.regs
[REG_A0
] = load_mem (sp
, 4);
2600 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
2602 State
.regs
[REG_D0
] = load_mem (sp
, 4);
2608 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
2614 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
2620 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
2626 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
2636 sp
= State
.regs
[REG_SP
];
2637 State
.pc
= (State
.mem
[sp
] | (State
.mem
[sp
+1] << 8)
2638 | (State
.mem
[sp
+2] << 16) | (State
.mem
[sp
+3] << 24));
2651 /* We use this for simulated system calls; we may need to change
2652 it to a reserved instruction if we conflict with uses at
2654 int save_errno
= errno
;
2657 /* Registers passed to trap 0 */
2659 /* Function number. */
2660 #define FUNC (load_mem (State.regs[REG_SP] + 4, 4))
2663 #define PARM1 (load_mem (State.regs[REG_SP] + 8, 4))
2664 #define PARM2 (load_mem (State.regs[REG_SP] + 12, 4))
2665 #define PARM3 (load_mem (State.regs[REG_SP] + 16, 4))
2667 /* Registers set by trap 0 */
2669 #define RETVAL State.regs[0] /* return value */
2670 #define RETERR State.regs[1] /* return error code */
2672 /* Turn a pointer in a register into a pointer into real memory. */
2674 #define MEMPTR(x) (State.mem + x)
2678 #if !defined(__GO32__) && !defined(_WIN32)
2683 RETVAL
= execve (MEMPTR (PARM1
), (char **) MEMPTR (PARM2
),
2684 (char **)MEMPTR (PARM3
));
2687 RETVAL
= execve (MEMPTR (PARM1
), (char **) MEMPTR (PARM2
), NULL
);
2692 RETVAL
= mn10300_callback
->read (mn10300_callback
, PARM1
,
2693 MEMPTR (PARM2
), PARM3
);
2697 RETVAL
= (int)mn10300_callback
->write_stdout (mn10300_callback
,
2698 MEMPTR (PARM2
), PARM3
);
2700 RETVAL
= (int)mn10300_callback
->write (mn10300_callback
, PARM1
,
2701 MEMPTR (PARM2
), PARM3
);
2704 RETVAL
= mn10300_callback
->lseek (mn10300_callback
, PARM1
, PARM2
, PARM3
);
2707 RETVAL
= mn10300_callback
->close (mn10300_callback
, PARM1
);
2710 RETVAL
= mn10300_callback
->open (mn10300_callback
, MEMPTR (PARM1
), PARM2
);
2713 /* EXIT - caller can look in PARM1 to work out the
2715 if (PARM1
== 0xdead || PARM1
== 0x1)
2716 State
.exception
= SIGABRT
;
2718 State
.exception
= SIGQUIT
;
2721 case SYS_stat
: /* added at hmsi */
2722 /* stat system call */
2724 struct stat host_stat
;
2727 RETVAL
= stat (MEMPTR (PARM1
), &host_stat
);
2731 /* Just wild-assed guesses. */
2732 store_mem (buf
, 2, host_stat
.st_dev
);
2733 store_mem (buf
+ 2, 2, host_stat
.st_ino
);
2734 store_mem (buf
+ 4, 4, host_stat
.st_mode
);
2735 store_mem (buf
+ 8, 2, host_stat
.st_nlink
);
2736 store_mem (buf
+ 10, 2, host_stat
.st_uid
);
2737 store_mem (buf
+ 12, 2, host_stat
.st_gid
);
2738 store_mem (buf
+ 14, 2, host_stat
.st_rdev
);
2739 store_mem (buf
+ 16, 4, host_stat
.st_size
);
2740 store_mem (buf
+ 20, 4, host_stat
.st_atime
);
2741 store_mem (buf
+ 28, 4, host_stat
.st_mtime
);
2742 store_mem (buf
+ 36, 4, host_stat
.st_ctime
);
2747 RETVAL
= chown (MEMPTR (PARM1
), PARM2
, PARM3
);
2750 RETVAL
= chmod (MEMPTR (PARM1
), PARM2
);
2753 RETVAL
= time (MEMPTR (PARM1
));
2758 RETVAL
= times (&tms
);
2759 store_mem (PARM1
, 4, tms
.tms_utime
);
2760 store_mem (PARM1
+ 4, 4, tms
.tms_stime
);
2761 store_mem (PARM1
+ 8, 4, tms
.tms_cutime
);
2762 store_mem (PARM1
+ 12, 4, tms
.tms_cstime
);
2765 case SYS_gettimeofday
:
2769 RETVAL
= gettimeofday (&t
, &tz
);
2770 store_mem (PARM1
, 4, t
.tv_sec
);
2771 store_mem (PARM1
+ 4, 4, t
.tv_usec
);
2772 store_mem (PARM2
, 4, tz
.tz_minuteswest
);
2773 store_mem (PARM2
+ 4, 4, tz
.tz_dsttime
);
2777 /* Cast the second argument to void *, to avoid type mismatch
2778 if a prototype is present. */
2779 RETVAL
= utime (MEMPTR (PARM1
), (void *) MEMPTR (PARM2
));