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