]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/mn10300/simops.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / sim / mn10300 / simops.c
1 #include "config.h"
2
3 #include <signal.h>
4 #ifdef HAVE_UNISTD_H
5 #include <unistd.h>
6 #endif
7 #include "mn10300_sim.h"
8 #include "simops.h"
9 #include "sim-types.h"
10 #include "targ-vals.h"
11 #include "bfd.h"
12 #include <errno.h>
13 #include <sys/stat.h>
14 #include <sys/times.h>
15 #include <sys/time.h>
16
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)
24 \f
25 /* mov imm8, dn */
26 void OP_8000 (insn, extension)
27 unsigned long insn, extension;
28 {
29 State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
30 }
31
32 /* mov dm, dn */
33 void OP_80 (insn, extension)
34 unsigned long insn, extension;
35 {
36 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
37 }
38
39 /* mov dm, an */
40 void OP_F1E0 (insn, extension)
41 unsigned long insn, extension;
42 {
43 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
44 }
45
46 /* mov am, dn */
47 void OP_F1D0 (insn, extension)
48 unsigned long insn, extension;
49 {
50 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
51 }
52
53 /* mov imm8, an */
54 void OP_9000 (insn, extension)
55 unsigned long insn, extension;
56 {
57 State.regs[REG_A0 + REG0_8 (insn)] = insn & 0xff;
58 }
59
60 /* mov am, an */
61 void OP_90 (insn, extension)
62 unsigned long insn, extension;
63 {
64 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
65 }
66
67 /* mov sp, an */
68 void OP_3C (insn, extension)
69 unsigned long insn, extension;
70 {
71 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_SP];
72 }
73
74 /* mov am, sp */
75 void OP_F2F0 (insn, extension)
76 unsigned long insn, extension;
77 {
78 State.regs[REG_SP] = State.regs[REG_A0 + REG1 (insn)];
79 }
80
81 /* mov psw, dn */
82 void OP_F2E4 (insn, extension)
83 unsigned long insn, extension;
84 {
85 State.regs[REG_D0 + REG0 (insn)] = PSW;
86 }
87
88 /* mov dm, psw */
89 void OP_F2F3 (insn, extension)
90 unsigned long insn, extension;
91 {
92 PSW = State.regs[REG_D0 + REG1 (insn)];
93 }
94
95 /* mov mdr, dn */
96 void OP_F2E0 (insn, extension)
97 unsigned long insn, extension;
98 {
99 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR];
100 }
101
102 /* mov dm, mdr */
103 void OP_F2F2 (insn, extension)
104 unsigned long insn, extension;
105 {
106 State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)];
107 }
108
109 /* mov (am), dn */
110 void OP_70 (insn, extension)
111 unsigned long insn, extension;
112 {
113 State.regs[REG_D0 + REG1 (insn)]
114 = load_word (State.regs[REG_A0 + REG0 (insn)]);
115 }
116
117 /* mov (d8,am), dn */
118 void OP_F80000 (insn, extension)
119 unsigned long insn, extension;
120 {
121 State.regs[REG_D0 + REG1_8 (insn)]
122 = load_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)));
123 }
124
125 /* mov (d16,am), dn */
126 void OP_FA000000 (insn, extension)
127 unsigned long insn, extension;
128 {
129 State.regs[REG_D0 + REG1_16 (insn)]
130 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
131 + SEXT16 (insn & 0xffff)));
132 }
133
134 /* mov (d32,am), dn */
135 void OP_FC000000 (insn, extension)
136 unsigned long insn, extension;
137 {
138 State.regs[REG_D0 + REG1_16 (insn)]
139 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
140 + ((insn & 0xffff) << 16) + extension));
141 }
142
143 /* mov (d8,sp), dn */
144 void OP_5800 (insn, extension)
145 unsigned long insn, extension;
146 {
147 State.regs[REG_D0 + REG0_8 (insn)]
148 = load_word (State.regs[REG_SP] + (insn & 0xff));
149 }
150
151 /* mov (d16,sp), dn */
152 void OP_FAB40000 (insn, extension)
153 unsigned long insn, extension;
154 {
155 State.regs[REG_D0 + REG0_16 (insn)]
156 = load_word (State.regs[REG_SP] + (insn & 0xffff));
157 }
158
159 /* mov (d32,sp), dn */
160 void OP_FCB40000 (insn, extension)
161 unsigned long insn, extension;
162 {
163 State.regs[REG_D0 + REG0_16 (insn)]
164 = load_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
165 }
166
167 /* mov (di,am), dn */
168 void OP_F300 (insn, extension)
169 unsigned long insn, extension;
170 {
171 State.regs[REG_D0 + REG0_4 (insn)]
172 = load_word ((State.regs[REG_A0 + REG0 (insn)]
173 + State.regs[REG_D0 + REG1 (insn)]));
174 }
175
176 /* mov (abs16), dn */
177 void OP_300000 (insn, extension)
178 unsigned long insn, extension;
179 {
180 State.regs[REG_D0 + REG0_16 (insn)] = load_word ((insn & 0xffff));
181 }
182
183 /* mov (abs32), dn */
184 void OP_FCA40000 (insn, extension)
185 unsigned long insn, extension;
186 {
187 State.regs[REG_D0 + REG0_16 (insn)]
188 = load_word ((((insn & 0xffff) << 16) + extension));
189 }
190
191 /* mov (am), an */
192 void OP_F000 (insn, extension)
193 unsigned long insn, extension;
194 {
195 State.regs[REG_A0 + REG1 (insn)]
196 = load_word (State.regs[REG_A0 + REG0 (insn)]);
197 }
198
199 /* mov (d8,am), an */
200 void OP_F82000 (insn, extension)
201 unsigned long insn, extension;
202 {
203 State.regs[REG_A0 + REG1_8 (insn)]
204 = load_word ((State.regs[REG_A0 + REG0_8 (insn)]
205 + SEXT8 (insn & 0xff)));
206 }
207
208 /* mov (d16,am), an */
209 void OP_FA200000 (insn, extension)
210 unsigned long insn, extension;
211 {
212 State.regs[REG_A0 + REG1_16 (insn)]
213 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
214 + SEXT16 (insn & 0xffff)));
215 }
216
217 /* mov (d32,am), an */
218 void OP_FC200000 (insn, extension)
219 unsigned long insn, extension;
220 {
221 State.regs[REG_A0 + REG1_16 (insn)]
222 = load_word ((State.regs[REG_A0 + REG0_16 (insn)]
223 + ((insn & 0xffff) << 16) + extension));
224 }
225
226 /* mov (d8,sp), an */
227 void OP_5C00 (insn, extension)
228 unsigned long insn, extension;
229 {
230 State.regs[REG_A0 + REG0_8 (insn)]
231 = load_word (State.regs[REG_SP] + (insn & 0xff));
232 }
233
234 /* mov (d16,sp), an */
235 void OP_FAB00000 (insn, extension)
236 unsigned long insn, extension;
237 {
238 State.regs[REG_A0 + REG0_16 (insn)]
239 = load_word (State.regs[REG_SP] + (insn & 0xffff));
240 }
241
242 /* mov (d32,sp), an */
243 void OP_FCB00000 (insn, extension)
244 unsigned long insn, extension;
245 {
246 State.regs[REG_A0 + REG0_16 (insn)]
247 = load_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
248 }
249
250 /* mov (di,am), an */
251 void OP_F380 (insn, extension)
252 unsigned long insn, extension;
253 {
254 State.regs[REG_A0 + REG0_4 (insn)]
255 = load_word ((State.regs[REG_A0 + REG0 (insn)]
256 + State.regs[REG_D0 + REG1 (insn)]));
257 }
258
259 /* mov (abs16), an */
260 void OP_FAA00000 (insn, extension)
261 unsigned long insn, extension;
262 {
263 State.regs[REG_A0 + REG0_16 (insn)] = load_word ((insn & 0xffff));
264 }
265
266 /* mov (abs32), an */
267 void OP_FCA00000 (insn, extension)
268 unsigned long insn, extension;
269 {
270 State.regs[REG_A0 + REG0_16 (insn)]
271 = load_word ((((insn & 0xffff) << 16) + extension));
272 }
273
274 /* mov (d8,am), sp */
275 void OP_F8F000 (insn, extension)
276 unsigned long insn, extension;
277 {
278 State.regs[REG_SP]
279 = load_word ((State.regs[REG_A0 + REG0_8 (insn)]
280 + SEXT8 (insn & 0xff)));
281 }
282
283 /* mov dm, (an) */
284 void OP_60 (insn, extension)
285 unsigned long insn, extension;
286 {
287 store_word (State.regs[REG_A0 + REG0 (insn)],
288 State.regs[REG_D0 + REG1 (insn)]);
289 }
290
291 /* mov dm, (d8,an) */
292 void OP_F81000 (insn, extension)
293 unsigned long insn, extension;
294 {
295 store_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
296 State.regs[REG_D0 + REG1_8 (insn)]);
297 }
298
299 /* mov dm (d16,an) */
300 void OP_FA100000 (insn, extension)
301 unsigned long insn, extension;
302 {
303 store_word ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
304 State.regs[REG_D0 + REG1_16 (insn)]);
305 }
306
307 /* mov dm (d32,an) */
308 void OP_FC100000 (insn, extension)
309 unsigned long insn, extension;
310 {
311 store_word ((State.regs[REG_A0 + REG0_16 (insn)]
312 + ((insn & 0xffff) << 16) + extension),
313 State.regs[REG_D0 + REG1_16 (insn)]);
314 }
315
316 /* mov dm, (d8,sp) */
317 void OP_4200 (insn, extension)
318 unsigned long insn, extension;
319 {
320 store_word (State.regs[REG_SP] + (insn & 0xff),
321 State.regs[REG_D0 + REG1_8 (insn)]);
322 }
323
324 /* mov dm, (d16,sp) */
325 void OP_FA910000 (insn, extension)
326 unsigned long insn, extension;
327 {
328 store_word (State.regs[REG_SP] + (insn & 0xffff),
329 State.regs[REG_D0 + REG1_16 (insn)]);
330 }
331
332 /* mov dm, (d32,sp) */
333 void OP_FC910000 (insn, extension)
334 unsigned long insn, extension;
335 {
336 store_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
337 State.regs[REG_D0 + REG1_16 (insn)]);
338 }
339
340 /* mov dm, (di,an) */
341 void OP_F340 (insn, extension)
342 unsigned long insn, extension;
343 {
344 store_word ((State.regs[REG_A0 + REG0 (insn)]
345 + State.regs[REG_D0 + REG1 (insn)]),
346 State.regs[REG_D0 + REG0_4 (insn)]);
347 }
348
349 /* mov dm, (abs16) */
350 void OP_10000 (insn, extension)
351 unsigned long insn, extension;
352 {
353 store_word ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
354 }
355
356 /* mov dm, (abs32) */
357 void OP_FC810000 (insn, extension)
358 unsigned long insn, extension;
359 {
360 store_word ((((insn & 0xffff) << 16) + extension),
361 State.regs[REG_D0 + REG1_16 (insn)]);
362 }
363
364 /* mov am, (an) */
365 void OP_F010 (insn, extension)
366 unsigned long insn, extension;
367 {
368 store_word (State.regs[REG_A0 + REG0 (insn)],
369 State.regs[REG_A0 + REG1 (insn)]);
370 }
371
372 /* mov am, (d8,an) */
373 void OP_F83000 (insn, extension)
374 unsigned long insn, extension;
375 {
376 store_word ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
377 State.regs[REG_A0 + REG1_8 (insn)]);
378 }
379
380 /* mov am, (d16,an) */
381 void OP_FA300000 (insn, extension)
382 unsigned long insn, extension;
383 {
384 store_word ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
385 State.regs[REG_A0 + REG1_16 (insn)]);
386 }
387
388 /* mov am, (d32,an) */
389 void OP_FC300000 (insn, extension)
390 unsigned long insn, extension;
391 {
392 store_word ((State.regs[REG_A0 + REG0_16 (insn)]
393 + ((insn & 0xffff) << 16) + extension),
394 State.regs[REG_A0 + REG1_16 (insn)]);
395 }
396
397 /* mov am, (d8,sp) */
398 void OP_4300 (insn, extension)
399 unsigned long insn, extension;
400 {
401 store_word (State.regs[REG_SP] + (insn & 0xff),
402 State.regs[REG_A0 + REG1_8 (insn)]);
403 }
404
405 /* mov am, (d16,sp) */
406 void OP_FA900000 (insn, extension)
407 unsigned long insn, extension;
408 {
409 store_word (State.regs[REG_SP] + (insn & 0xffff),
410 State.regs[REG_A0 + REG1_16 (insn)]);
411 }
412
413 /* mov am, (d32,sp) */
414 void OP_FC900000 (insn, extension)
415 unsigned long insn, extension;
416 {
417 store_word (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
418 State.regs[REG_A0 + REG1_16 (insn)]);
419 }
420
421 /* mov am, (di,an) */
422 void OP_F3C0 (insn, extension)
423 unsigned long insn, extension;
424 {
425 store_word ((State.regs[REG_A0 + REG0 (insn)]
426 + State.regs[REG_D0 + REG1 (insn)]),
427 State.regs[REG_A0 + REG0_4 (insn)]);
428 }
429
430 /* mov am, (abs16) */
431 void OP_FA800000 (insn, extension)
432 unsigned long insn, extension;
433 {
434 store_word ((insn & 0xffff), State.regs[REG_A0 + REG1_16 (insn)]);
435 }
436
437 /* mov am, (abs32) */
438 void OP_FC800000 (insn, extension)
439 unsigned long insn, extension;
440 {
441 store_word ((((insn & 0xffff) << 16) + extension), State.regs[REG_A0 + REG1_16 (insn)]);
442 }
443
444 /* mov sp, (d8,an) */
445 void OP_F8F400 (insn, extension)
446 unsigned long insn, extension;
447 {
448 store_word (State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff),
449 State.regs[REG_SP]);
450 }
451
452 /* mov imm16, dn */
453 void OP_2C0000 (insn, extension)
454 unsigned long insn, extension;
455 {
456 unsigned long value;
457
458 value = SEXT16 (insn & 0xffff);
459 State.regs[REG_D0 + REG0_16 (insn)] = value;
460 }
461
462 /* mov imm32,dn */
463 void OP_FCCC0000 (insn, extension)
464 unsigned long insn, extension;
465 {
466 unsigned long value;
467
468 value = ((insn & 0xffff) << 16) + extension;
469 State.regs[REG_D0 + REG0_16 (insn)] = value;
470 }
471
472 /* mov imm16, an */
473 void OP_240000 (insn, extension)
474 unsigned long insn, extension;
475 {
476 unsigned long value;
477
478 value = insn & 0xffff;
479 State.regs[REG_A0 + REG0_16 (insn)] = value;
480 }
481
482 /* mov imm32, an */
483 void OP_FCDC0000 (insn, extension)
484 unsigned long insn, extension;
485 {
486 unsigned long value;
487
488 value = ((insn & 0xffff) << 16) + extension;
489 State.regs[REG_A0 + REG0_16 (insn)] = value;
490 }
491
492 /* movbu (am), dn */
493 void OP_F040 (insn, extension)
494 unsigned long insn, extension;
495 {
496 State.regs[REG_D0 + REG1 (insn)]
497 = load_byte (State.regs[REG_A0 + REG0 (insn)]);
498 }
499
500 /* movbu (d8,am), dn */
501 void OP_F84000 (insn, extension)
502 unsigned long insn, extension;
503 {
504 State.regs[REG_D0 + REG1_8 (insn)]
505 = load_byte ((State.regs[REG_A0 + REG0_8 (insn)]
506 + SEXT8 (insn & 0xff)));
507 }
508
509 /* movbu (d16,am), dn */
510 void OP_FA400000 (insn, extension)
511 unsigned long insn, extension;
512 {
513 State.regs[REG_D0 + REG1_16 (insn)]
514 = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
515 + SEXT16 (insn & 0xffff)));
516 }
517
518 /* movbu (d32,am), dn */
519 void OP_FC400000 (insn, extension)
520 unsigned long insn, extension;
521 {
522 State.regs[REG_D0 + REG1_16 (insn)]
523 = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
524 + ((insn & 0xffff) << 16) + extension));
525 }
526
527 /* movbu (d8,sp), dn */
528 void OP_F8B800 (insn, extension)
529 unsigned long insn, extension;
530 {
531 State.regs[REG_D0 + REG0_8 (insn)]
532 = load_byte ((State.regs[REG_SP] + (insn & 0xff)));
533 }
534
535 /* movbu (d16,sp), dn */
536 void OP_FAB80000 (insn, extension)
537 unsigned long insn, extension;
538 {
539 State.regs[REG_D0 + REG0_16 (insn)]
540 = load_byte ((State.regs[REG_SP] + (insn & 0xffff)));
541 }
542
543 /* movbu (d32,sp), dn */
544 void OP_FCB80000 (insn, extension)
545 unsigned long insn, extension;
546 {
547 State.regs[REG_D0 + REG0_16 (insn)]
548 = load_byte (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
549 }
550
551 /* movbu (di,am), dn */
552 void OP_F400 (insn, extension)
553 unsigned long insn, extension;
554 {
555 State.regs[REG_D0 + REG0_4 (insn)]
556 = load_byte ((State.regs[REG_A0 + REG0 (insn)]
557 + State.regs[REG_D0 + REG1 (insn)]));
558 }
559
560 /* movbu (abs16), dn */
561 void OP_340000 (insn, extension)
562 unsigned long insn, extension;
563 {
564 State.regs[REG_D0 + REG0_16 (insn)] = load_byte ((insn & 0xffff));
565 }
566
567 /* movbu (abs32), dn */
568 void OP_FCA80000 (insn, extension)
569 unsigned long insn, extension;
570 {
571 State.regs[REG_D0 + REG0_16 (insn)]
572 = load_byte ((((insn & 0xffff) << 16) + extension));
573 }
574
575 /* movbu dm, (an) */
576 void OP_F050 (insn, extension)
577 unsigned long insn, extension;
578 {
579 store_byte (State.regs[REG_A0 + REG0 (insn)],
580 State.regs[REG_D0 + REG1 (insn)]);
581 }
582
583 /* movbu dm, (d8,an) */
584 void OP_F85000 (insn, extension)
585 unsigned long insn, extension;
586 {
587 store_byte ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
588 State.regs[REG_D0 + REG1_8 (insn)]);
589 }
590
591 /* movbu dm, (d16,an) */
592 void OP_FA500000 (insn, extension)
593 unsigned long insn, extension;
594 {
595 store_byte ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
596 State.regs[REG_D0 + REG1_16 (insn)]);
597 }
598
599 /* movbu dm, (d32,an) */
600 void OP_FC500000 (insn, extension)
601 unsigned long insn, extension;
602 {
603 store_byte ((State.regs[REG_A0 + REG0_16 (insn)]
604 + ((insn & 0xffff) << 16) + extension),
605 State.regs[REG_D0 + REG1_16 (insn)]);
606 }
607
608 /* movbu dm, (d8,sp) */
609 void OP_F89200 (insn, extension)
610 unsigned long insn, extension;
611 {
612 store_byte (State.regs[REG_SP] + (insn & 0xff),
613 State.regs[REG_D0 + REG1_8 (insn)]);
614 }
615
616 /* movbu dm, (d16,sp) */
617 void OP_FA920000 (insn, extension)
618 unsigned long insn, extension;
619 {
620 store_byte (State.regs[REG_SP] + (insn & 0xffff),
621 State.regs[REG_D0 + REG1_16 (insn)]);
622 }
623
624 /* movbu dm (d32,sp) */
625 void OP_FC920000 (insn, extension)
626 unsigned long insn, extension;
627 {
628 store_byte (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
629 State.regs[REG_D0 + REG1_16 (insn)]);
630 }
631
632 /* movbu dm, (di,an) */
633 void OP_F440 (insn, extension)
634 unsigned long insn, extension;
635 {
636 store_byte ((State.regs[REG_A0 + REG0 (insn)]
637 + State.regs[REG_D0 + REG1 (insn)]),
638 State.regs[REG_D0 + REG0_4 (insn)]);
639 }
640
641 /* movbu dm, (abs16) */
642 void OP_20000 (insn, extension)
643 unsigned long insn, extension;
644 {
645 store_byte ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
646 }
647
648 /* movbu dm, (abs32) */
649 void OP_FC820000 (insn, extension)
650 unsigned long insn, extension;
651 {
652 store_byte ((((insn & 0xffff) << 16) + extension), State.regs[REG_D0 + REG1_16 (insn)]);
653 }
654
655 /* movhu (am), dn */
656 void OP_F060 (insn, extension)
657 unsigned long insn, extension;
658 {
659 State.regs[REG_D0 + REG1 (insn)]
660 = load_half (State.regs[REG_A0 + REG0 (insn)]);
661 }
662
663 /* movhu (d8,am), dn */
664 void OP_F86000 (insn, extension)
665 unsigned long insn, extension;
666 {
667 State.regs[REG_D0 + REG1_8 (insn)]
668 = load_half ((State.regs[REG_A0 + REG0_8 (insn)]
669 + SEXT8 (insn & 0xff)));
670 }
671
672 /* movhu (d16,am), dn */
673 void OP_FA600000 (insn, extension)
674 unsigned long insn, extension;
675 {
676 State.regs[REG_D0 + REG1_16 (insn)]
677 = load_half ((State.regs[REG_A0 + REG0_16 (insn)]
678 + SEXT16 (insn & 0xffff)));
679 }
680
681 /* movhu (d32,am), dn */
682 void OP_FC600000 (insn, extension)
683 unsigned long insn, extension;
684 {
685 State.regs[REG_D0 + REG1_16 (insn)]
686 = load_half ((State.regs[REG_A0 + REG0_16 (insn)]
687 + ((insn & 0xffff) << 16) + extension));
688 }
689
690 /* movhu (d8,sp) dn */
691 void OP_F8BC00 (insn, extension)
692 unsigned long insn, extension;
693 {
694 State.regs[REG_D0 + REG0_8 (insn)]
695 = load_half ((State.regs[REG_SP] + (insn & 0xff)));
696 }
697
698 /* movhu (d16,sp), dn */
699 void OP_FABC0000 (insn, extension)
700 unsigned long insn, extension;
701 {
702 State.regs[REG_D0 + REG0_16 (insn)]
703 = load_half ((State.regs[REG_SP] + (insn & 0xffff)));
704 }
705
706 /* movhu (d32,sp), dn */
707 void OP_FCBC0000 (insn, extension)
708 unsigned long insn, extension;
709 {
710 State.regs[REG_D0 + REG0_16 (insn)]
711 = load_half (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension));
712 }
713
714 /* movhu (di,am), dn */
715 void OP_F480 (insn, extension)
716 unsigned long insn, extension;
717 {
718 State.regs[REG_D0 + REG0_4 (insn)]
719 = load_half ((State.regs[REG_A0 + REG0 (insn)]
720 + State.regs[REG_D0 + REG1 (insn)]));
721 }
722
723 /* movhu (abs16), dn */
724 void OP_380000 (insn, extension)
725 unsigned long insn, extension;
726 {
727 State.regs[REG_D0 + REG0_16 (insn)] = load_half ((insn & 0xffff));
728 }
729
730 /* movhu (abs32), dn */
731 void OP_FCAC0000 (insn, extension)
732 unsigned long insn, extension;
733 {
734 State.regs[REG_D0 + REG0_16 (insn)]
735 = load_half ((((insn & 0xffff) << 16) + extension));
736 }
737
738 /* movhu dm, (an) */
739 void OP_F070 (insn, extension)
740 unsigned long insn, extension;
741 {
742 store_half (State.regs[REG_A0 + REG0 (insn)],
743 State.regs[REG_D0 + REG1 (insn)]);
744 }
745
746 /* movhu dm, (d8,an) */
747 void OP_F87000 (insn, extension)
748 unsigned long insn, extension;
749 {
750 store_half ((State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff)),
751 State.regs[REG_D0 + REG1_8 (insn)]);
752 }
753
754 /* movhu dm, (d16,an) */
755 void OP_FA700000 (insn, extension)
756 unsigned long insn, extension;
757 {
758 store_half ((State.regs[REG_A0 + REG0_16 (insn)] + SEXT16 (insn & 0xffff)),
759 State.regs[REG_D0 + REG1_16 (insn)]);
760 }
761
762 /* movhu dm, (d32,an) */
763 void OP_FC700000 (insn, extension)
764 unsigned long insn, extension;
765 {
766 store_half ((State.regs[REG_A0 + REG0_16 (insn)]
767 + ((insn & 0xffff) << 16) + extension),
768 State.regs[REG_D0 + REG1_16 (insn)]);
769 }
770
771 /* movhu dm,(d8,sp) */
772 void OP_F89300 (insn, extension)
773 unsigned long insn, extension;
774 {
775 store_half (State.regs[REG_SP] + (insn & 0xff),
776 State.regs[REG_D0 + REG1_8 (insn)]);
777 }
778
779 /* movhu dm,(d16,sp) */
780 void OP_FA930000 (insn, extension)
781 unsigned long insn, extension;
782 {
783 store_half (State.regs[REG_SP] + (insn & 0xffff),
784 State.regs[REG_D0 + REG1_16 (insn)]);
785 }
786
787 /* movhu dm,(d32,sp) */
788 void OP_FC930000 (insn, extension)
789 unsigned long insn, extension;
790 {
791 store_half (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension),
792 State.regs[REG_D0 + REG1_16 (insn)]);
793 }
794
795 /* movhu dm, (di,an) */
796 void OP_F4C0 (insn, extension)
797 unsigned long insn, extension;
798 {
799 store_half ((State.regs[REG_A0 + REG0 (insn)]
800 + State.regs[REG_D0 + REG1 (insn)]),
801 State.regs[REG_D0 + REG0_4 (insn)]);
802 }
803
804 /* movhu dm, (abs16) */
805 void OP_30000 (insn, extension)
806 unsigned long insn, extension;
807 {
808 store_half ((insn & 0xffff), State.regs[REG_D0 + REG1_16 (insn)]);
809 }
810
811 /* movhu dm, (abs32) */
812 void OP_FC830000 (insn, extension)
813 unsigned long insn, extension;
814 {
815 store_half ((((insn & 0xffff) << 16) + extension), State.regs[REG_D0 + REG1_16 (insn)]);
816 }
817
818 /* ext dn */
819 void OP_F2D0 (insn, extension)
820 unsigned long insn, extension;
821 {
822 if (State.regs[REG_D0 + REG0 (insn)] & 0x80000000)
823 State.regs[REG_MDR] = -1;
824 else
825 State.regs[REG_MDR] = 0;
826 }
827
828 /* extb dn */
829 void OP_10 (insn, extension)
830 unsigned long insn, extension;
831 {
832 State.regs[REG_D0 + REG0 (insn)] = SEXT8 (State.regs[REG_D0 + REG0 (insn)]);
833 }
834
835 /* extbu dn */
836 void OP_14 (insn, extension)
837 unsigned long insn, extension;
838 {
839 State.regs[REG_D0 + REG0 (insn)] &= 0xff;
840 }
841
842 /* exth dn */
843 void OP_18 (insn, extension)
844 unsigned long insn, extension;
845 {
846 State.regs[REG_D0 + REG0 (insn)]
847 = SEXT16 (State.regs[REG_D0 + REG0 (insn)]);
848 }
849
850 /* exthu dn */
851 void OP_1C (insn, extension)
852 unsigned long insn, extension;
853 {
854 State.regs[REG_D0 + REG0 (insn)] &= 0xffff;
855 }
856
857 /* movm (sp), reg_list */
858 void OP_CE00 (insn, extension)
859 unsigned long insn, extension;
860 {
861 unsigned long sp = State.regs[REG_SP];
862 unsigned long mask;
863
864 mask = insn & 0xff;
865
866 if (mask & 0x8)
867 {
868 sp += 4;
869 State.regs[REG_LAR] = load_word (sp);
870 sp += 4;
871 State.regs[REG_LIR] = load_word (sp);
872 sp += 4;
873 State.regs[REG_MDR] = load_word (sp);
874 sp += 4;
875 State.regs[REG_A0 + 1] = load_word (sp);
876 sp += 4;
877 State.regs[REG_A0] = load_word (sp);
878 sp += 4;
879 State.regs[REG_D0 + 1] = load_word (sp);
880 sp += 4;
881 State.regs[REG_D0] = load_word (sp);
882 sp += 4;
883 }
884
885 if (mask & 0x10)
886 {
887 State.regs[REG_A0 + 3] = load_word (sp);
888 sp += 4;
889 }
890
891 if (mask & 0x20)
892 {
893 State.regs[REG_A0 + 2] = load_word (sp);
894 sp += 4;
895 }
896
897 if (mask & 0x40)
898 {
899 State.regs[REG_D0 + 3] = load_word (sp);
900 sp += 4;
901 }
902
903 if (mask & 0x80)
904 {
905 State.regs[REG_D0 + 2] = load_word (sp);
906 sp += 4;
907 }
908
909 /* And make sure to update the stack pointer. */
910 State.regs[REG_SP] = sp;
911 }
912
913 /* movm reg_list, (sp) */
914 void OP_CF00 (insn, extension)
915 unsigned long insn, extension;
916 {
917 unsigned long sp = State.regs[REG_SP];
918 unsigned long mask;
919
920 mask = insn & 0xff;
921
922 if (mask & 0x80)
923 {
924 sp -= 4;
925 store_word (sp, State.regs[REG_D0 + 2]);
926 }
927
928 if (mask & 0x40)
929 {
930 sp -= 4;
931 store_word (sp, State.regs[REG_D0 + 3]);
932 }
933
934 if (mask & 0x20)
935 {
936 sp -= 4;
937 store_word (sp, State.regs[REG_A0 + 2]);
938 }
939
940 if (mask & 0x10)
941 {
942 sp -= 4;
943 store_word (sp, State.regs[REG_A0 + 3]);
944 }
945
946 if (mask & 0x8)
947 {
948 sp -= 4;
949 store_word (sp, State.regs[REG_D0]);
950 sp -= 4;
951 store_word (sp, State.regs[REG_D0 + 1]);
952 sp -= 4;
953 store_word (sp, State.regs[REG_A0]);
954 sp -= 4;
955 store_word (sp, State.regs[REG_A0 + 1]);
956 sp -= 4;
957 store_word (sp, State.regs[REG_MDR]);
958 sp -= 4;
959 store_word (sp, State.regs[REG_LIR]);
960 sp -= 4;
961 store_word (sp, State.regs[REG_LAR]);
962 sp -= 4;
963 }
964
965 /* And make sure to update the stack pointer. */
966 State.regs[REG_SP] = sp;
967 }
968
969 /* clr dn */
970 void OP_0 (insn, extension)
971 unsigned long insn, extension;
972 {
973 State.regs[REG_D0 + REG1 (insn)] = 0;
974
975 PSW |= PSW_Z;
976 PSW &= ~(PSW_V | PSW_C | PSW_N);
977 }
978
979 /* add dm,dn */
980 void OP_E0 (insn, extension)
981 unsigned long insn, extension;
982 {
983 int z, c, n, v;
984 unsigned long reg1, reg2, value;
985
986 reg1 = State.regs[REG_D0 + REG1 (insn)];
987 reg2 = State.regs[REG_D0 + REG0 (insn)];
988 value = reg1 + reg2;
989 State.regs[REG_D0 + REG0 (insn)] = value;
990
991 z = (value == 0);
992 n = (value & 0x80000000);
993 c = (value < reg1) || (value < reg2);
994 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
995 && (reg2 & 0x80000000) != (value & 0x80000000));
996
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));
1000 }
1001
1002 /* add dm, an */
1003 void OP_F160 (insn, extension)
1004 unsigned long insn, extension;
1005 {
1006 int z, c, n, v;
1007 unsigned long reg1, reg2, value;
1008
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;
1013
1014 z = (value == 0);
1015 n = (value & 0x80000000);
1016 c = (value < reg1) || (value < reg2);
1017 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1018 && (reg2 & 0x80000000) != (value & 0x80000000));
1019
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));
1023 }
1024
1025 /* add am, dn */
1026 void OP_F150 (insn, extension)
1027 unsigned long insn, extension;
1028 {
1029 int z, c, n, v;
1030 unsigned long reg1, reg2, value;
1031
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;
1036
1037 z = (value == 0);
1038 n = (value & 0x80000000);
1039 c = (value < reg1) || (value < reg2);
1040 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1041 && (reg2 & 0x80000000) != (value & 0x80000000));
1042
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));
1046 }
1047
1048 /* add am,an */
1049 void OP_F170 (insn, extension)
1050 unsigned long insn, extension;
1051 {
1052 int z, c, n, v;
1053 unsigned long reg1, reg2, value;
1054
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;
1059
1060 z = (value == 0);
1061 n = (value & 0x80000000);
1062 c = (value < reg1) || (value < reg2);
1063 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1064 && (reg2 & 0x80000000) != (value & 0x80000000));
1065
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));
1069 }
1070
1071 /* add imm8, dn */
1072 void OP_2800 (insn, extension)
1073 unsigned long insn, extension;
1074 {
1075 int z, c, n, v;
1076 unsigned long reg1, imm, value;
1077
1078 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1079 imm = SEXT8 (insn & 0xff);
1080 value = reg1 + imm;
1081 State.regs[REG_D0 + REG0_8 (insn)] = value;
1082
1083 z = (value == 0);
1084 n = (value & 0x80000000);
1085 c = (value < reg1) || (value < imm);
1086 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1087 && (reg1 & 0x80000000) != (value & 0x80000000));
1088
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));
1092 }
1093
1094 /* add imm16, dn */
1095 void OP_FAC00000 (insn, extension)
1096 unsigned long insn, extension;
1097 {
1098 int z, c, n, v;
1099 unsigned long reg1, imm, value;
1100
1101 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1102 imm = SEXT16 (insn & 0xffff);
1103 value = reg1 + imm;
1104 State.regs[REG_D0 + REG0_16 (insn)] = value;
1105
1106 z = (value == 0);
1107 n = (value & 0x80000000);
1108 c = (value < reg1) || (value < imm);
1109 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1110 && (reg1 & 0x80000000) != (value & 0x80000000));
1111
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));
1115 }
1116
1117 /* add imm32,dn */
1118 void OP_FCC00000 (insn, extension)
1119 unsigned long insn, extension;
1120 {
1121 int z, c, n, v;
1122 unsigned long reg1, imm, value;
1123
1124 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1125 imm = ((insn & 0xffff) << 16) + extension;
1126 value = reg1 + imm;
1127 State.regs[REG_D0 + REG0_16 (insn)] = value;
1128
1129 z = (value == 0);
1130 n = (value & 0x80000000);
1131 c = (value < reg1) || (value < imm);
1132 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1133 && (reg1 & 0x80000000) != (value & 0x80000000));
1134
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));
1138 }
1139
1140 /* add imm8, an */
1141 void OP_2000 (insn, extension)
1142 unsigned long insn, extension;
1143 {
1144 int z, c, n, v;
1145 unsigned long reg1, imm, value;
1146
1147 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1148 imm = SEXT8 (insn & 0xff);
1149 value = reg1 + imm;
1150 State.regs[REG_A0 + REG0_8 (insn)] = value;
1151
1152 z = (value == 0);
1153 n = (value & 0x80000000);
1154 c = (value < reg1) || (value < imm);
1155 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1156 && (reg1 & 0x80000000) != (value & 0x80000000));
1157
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));
1161 }
1162
1163 /* add imm16, an */
1164 void OP_FAD00000 (insn, extension)
1165 unsigned long insn, extension;
1166 {
1167 int z, c, n, v;
1168 unsigned long reg1, imm, value;
1169
1170 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1171 imm = SEXT16 (insn & 0xffff);
1172 value = reg1 + imm;
1173 State.regs[REG_A0 + REG0_16 (insn)] = value;
1174
1175 z = (value == 0);
1176 n = (value & 0x80000000);
1177 c = (value < reg1) || (value < imm);
1178 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1179 && (reg1 & 0x80000000) != (value & 0x80000000));
1180
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));
1184 }
1185
1186 /* add imm32, an */
1187 void OP_FCD00000 (insn, extension)
1188 unsigned long insn, extension;
1189 {
1190 int z, c, n, v;
1191 unsigned long reg1, imm, value;
1192
1193 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1194 imm = ((insn & 0xffff) << 16) + extension;
1195 value = reg1 + imm;
1196 State.regs[REG_A0 + REG0_16 (insn)] = value;
1197
1198 z = (value == 0);
1199 n = (value & 0x80000000);
1200 c = (value < reg1) || (value < imm);
1201 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1202 && (reg1 & 0x80000000) != (value & 0x80000000));
1203
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));
1207 }
1208
1209 /* add imm8, sp */
1210 void OP_F8FE00 (insn, extension)
1211 unsigned long insn, extension;
1212 {
1213 unsigned long reg1, imm, value;
1214
1215 reg1 = State.regs[REG_SP];
1216 imm = SEXT8 (insn & 0xff);
1217 value = reg1 + imm;
1218 State.regs[REG_SP] = value;
1219 }
1220
1221 /* add imm16,sp */
1222 void OP_FAFE0000 (insn, extension)
1223 unsigned long insn, extension;
1224 {
1225 unsigned long reg1, imm, value;
1226
1227 reg1 = State.regs[REG_SP];
1228 imm = SEXT16 (insn & 0xffff);
1229 value = reg1 + imm;
1230 State.regs[REG_SP] = value;
1231 }
1232
1233 /* add imm32, sp */
1234 void OP_FCFE0000 (insn, extension)
1235 unsigned long insn, extension;
1236 {
1237 unsigned long reg1, imm, value;
1238
1239 reg1 = State.regs[REG_SP];
1240 imm = ((insn & 0xffff) << 16) + extension;
1241 value = reg1 + imm;
1242 State.regs[REG_SP] = value;
1243 }
1244
1245 /* addc dm,dn */
1246 void OP_F140 (insn, extension)
1247 unsigned long insn, extension;
1248 {
1249 int z, c, n, v;
1250 unsigned long reg1, reg2, value;
1251
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;
1256
1257 z = (value == 0);
1258 n = (value & 0x80000000);
1259 c = (value < reg1) || (value < reg2);
1260 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1261 && (reg2 & 0x80000000) != (value & 0x80000000));
1262
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));
1266 }
1267
1268 /* sub dm, dn */
1269 void OP_F100 (insn, extension)
1270 unsigned long insn, extension;
1271 {
1272 int z, c, n, v;
1273 unsigned long reg1, reg2, value;
1274
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;
1279
1280 z = (value == 0);
1281 n = (value & 0x80000000);
1282 c = (reg1 > reg2);
1283 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1284 && (reg2 & 0x80000000) != (value & 0x80000000));
1285
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));
1289 }
1290
1291 /* sub dm, an */
1292 void OP_F120 (insn, extension)
1293 unsigned long insn, extension;
1294 {
1295 int z, c, n, v;
1296 unsigned long reg1, reg2, value;
1297
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;
1302
1303 z = (value == 0);
1304 n = (value & 0x80000000);
1305 c = (reg1 > reg2);
1306 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1307 && (reg2 & 0x80000000) != (value & 0x80000000));
1308
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));
1312 }
1313
1314 /* sub am, dn */
1315 void OP_F110 (insn, extension)
1316 unsigned long insn, extension;
1317 {
1318 int z, c, n, v;
1319 unsigned long reg1, reg2, value;
1320
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;
1325
1326 z = (value == 0);
1327 n = (value & 0x80000000);
1328 c = (reg1 > reg2);
1329 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1330 && (reg2 & 0x80000000) != (value & 0x80000000));
1331
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));
1335 }
1336
1337 /* sub am, an */
1338 void OP_F130 (insn, extension)
1339 unsigned long insn, extension;
1340 {
1341 int z, c, n, v;
1342 unsigned long reg1, reg2, value;
1343
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;
1348
1349 z = (value == 0);
1350 n = (value & 0x80000000);
1351 c = (reg1 > reg2);
1352 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1353 && (reg2 & 0x80000000) != (value & 0x80000000));
1354
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));
1358 }
1359
1360 /* sub imm32, dn */
1361 void OP_FCC40000 (insn, extension)
1362 unsigned long insn, extension;
1363 {
1364 int z, c, n, v;
1365 unsigned long reg1, imm, value;
1366
1367 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1368 imm = ((insn & 0xffff) << 16) + extension;
1369 value = reg1 - imm;
1370 State.regs[REG_D0 + REG0_16 (insn)] = value;
1371
1372 z = (value == 0);
1373 n = (value & 0x80000000);
1374 c = (reg1 < imm);
1375 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1376 && (reg1 & 0x80000000) != (value & 0x80000000));
1377
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));
1381 }
1382
1383 /* sub imm32, an */
1384 void OP_FCD40000 (insn, extension)
1385 unsigned long insn, extension;
1386 {
1387 int z, c, n, v;
1388 unsigned long reg1, imm, value;
1389
1390 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1391 imm = ((insn & 0xffff) << 16) + extension;
1392 value = reg1 - imm;
1393 State.regs[REG_A0 + REG0_16 (insn)] = value;
1394
1395 z = (value == 0);
1396 n = (value & 0x80000000);
1397 c = (reg1 < imm);
1398 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1399 && (reg1 & 0x80000000) != (value & 0x80000000));
1400
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));
1404 }
1405
1406 /* subc dm, dn */
1407 void OP_F180 (insn, extension)
1408 unsigned long insn, extension;
1409 {
1410 int z, c, n, v;
1411 unsigned long reg1, reg2, value;
1412
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;
1417
1418 z = (value == 0);
1419 n = (value & 0x80000000);
1420 c = (reg1 > reg2);
1421 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1422 && (reg2 & 0x80000000) != (value & 0x80000000));
1423
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));
1427 }
1428
1429 /* mul dm, dn */
1430 void OP_F240 (insn, extension)
1431 unsigned long insn, extension;
1432 {
1433 unsigned long long temp;
1434 int n, z;
1435
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));
1444 }
1445
1446 /* mulu dm, dn */
1447 void OP_F250 (insn, extension)
1448 unsigned long insn, extension;
1449 {
1450 unsigned long long temp;
1451 int n, z;
1452
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));
1461 }
1462
1463 /* div dm, dn */
1464 void OP_F260 (insn, extension)
1465 unsigned long insn, extension;
1466 {
1467 long long temp;
1468 int n, z;
1469
1470 temp = State.regs[REG_MDR];
1471 temp <<= 32;
1472 temp |= State.regs[REG_D0 + REG0 (insn)];
1473 State.regs[REG_MDR] = temp % (long)State.regs[REG_D0 + REG1 (insn)];
1474 temp /= (long)State.regs[REG_D0 + REG1 (insn)];
1475 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1476 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1477 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1478 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1479 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1480 }
1481
1482 /* divu dm, dn */
1483 void OP_F270 (insn, extension)
1484 unsigned long insn, extension;
1485 {
1486 unsigned long long temp;
1487 int n, z;
1488
1489 temp = State.regs[REG_MDR];
1490 temp <<= 32;
1491 temp |= State.regs[REG_D0 + REG0 (insn)];
1492 State.regs[REG_MDR] = temp % State.regs[REG_D0 + REG1 (insn)];
1493 temp /= State.regs[REG_D0 + REG1 (insn)];
1494 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
1495 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1496 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
1497 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1498 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1499 }
1500
1501 /* inc dn */
1502 void OP_40 (insn, extension)
1503 unsigned long insn, extension;
1504 {
1505 int z,n,c,v;
1506 unsigned int value, imm, reg1;
1507
1508 reg1 = State.regs[REG_D0 + REG1 (insn)];
1509 imm = 1;
1510 value = reg1 + imm;
1511 State.regs[REG_D0 + REG1 (insn)] = value;
1512
1513 z = (value == 0);
1514 n = (value & 0x80000000);
1515 c = (value < imm);
1516 v = ((reg1 & 0x80000000) == (imm & 0x80000000)
1517 && (reg1 & 0x80000000) != (value & 0x80000000));
1518
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));
1522 }
1523
1524 /* inc an */
1525 void OP_41 (insn, extension)
1526 unsigned long insn, extension;
1527 {
1528 State.regs[REG_A0 + REG1 (insn)] += 1;
1529 }
1530
1531 /* inc4 an */
1532 void OP_50 (insn, extension)
1533 unsigned long insn, extension;
1534 {
1535 State.regs[REG_A0 + REG0 (insn)] += 4;
1536 }
1537
1538 /* cmp imm8, dn */
1539 void OP_A000 (insn, extension)
1540 unsigned long insn, extension;
1541 {
1542 int z, c, n, v;
1543 unsigned long reg1, imm, value;
1544
1545 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
1546 imm = SEXT8 (insn & 0xff);
1547 value = reg1 - imm;
1548
1549 z = (value == 0);
1550 n = (value & 0x80000000);
1551 c = (reg1 < imm);
1552 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1553 && (reg1 & 0x80000000) != (value & 0x80000000));
1554
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));
1558 }
1559
1560 /* cmp dm, dn */
1561 void OP_A0 (insn, extension)
1562 unsigned long insn, extension;
1563 {
1564 int z, c, n, v;
1565 unsigned long reg1, reg2, value;
1566
1567 reg1 = State.regs[REG_D0 + REG1 (insn)];
1568 reg2 = State.regs[REG_D0 + REG0 (insn)];
1569 value = reg2 - reg1;
1570
1571 z = (value == 0);
1572 n = (value & 0x80000000);
1573 c = (reg1 > reg2);
1574 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1575 && (reg2 & 0x80000000) != (value & 0x80000000));
1576
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));
1580 }
1581
1582 /* cmp dm, an */
1583 void OP_F1A0 (insn, extension)
1584 unsigned long insn, extension;
1585 {
1586 int z, c, n, v;
1587 unsigned long reg1, reg2, value;
1588
1589 reg1 = State.regs[REG_D0 + REG1 (insn)];
1590 reg2 = State.regs[REG_A0 + REG0 (insn)];
1591 value = reg2 - reg1;
1592
1593 z = (value == 0);
1594 n = (value & 0x80000000);
1595 c = (reg1 > reg2);
1596 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1597 && (reg2 & 0x80000000) != (value & 0x80000000));
1598
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));
1602 }
1603
1604 /* cmp am, dn */
1605 void OP_F190 (insn, extension)
1606 unsigned long insn, extension;
1607 {
1608 int z, c, n, v;
1609 unsigned long reg1, reg2, value;
1610
1611 reg1 = State.regs[REG_A0 + REG1 (insn)];
1612 reg2 = State.regs[REG_D0 + REG0 (insn)];
1613 value = reg2 - reg1;
1614
1615 z = (value == 0);
1616 n = (value & 0x80000000);
1617 c = (reg1 > reg2);
1618 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1619 && (reg2 & 0x80000000) != (value & 0x80000000));
1620
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));
1624 }
1625
1626 /* cmp imm8, an */
1627 void OP_B000 (insn, extension)
1628 unsigned long insn, extension;
1629 {
1630 int z, c, n, v;
1631 unsigned long reg1, imm, value;
1632
1633 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
1634 imm = insn & 0xff;
1635 value = reg1 - imm;
1636
1637 z = (value == 0);
1638 n = (value & 0x80000000);
1639 c = (reg1 < imm);
1640 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1641 && (reg1 & 0x80000000) != (value & 0x80000000));
1642
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));
1646 }
1647
1648 /* cmp am, an */
1649 void OP_B0 (insn, extension)
1650 unsigned long insn, extension;
1651 {
1652 int z, c, n, v;
1653 unsigned long reg1, reg2, value;
1654
1655 reg1 = State.regs[REG_A0 + REG1 (insn)];
1656 reg2 = State.regs[REG_A0 + REG0 (insn)];
1657 value = reg2 - reg1;
1658
1659 z = (value == 0);
1660 n = (value & 0x80000000);
1661 c = (reg1 > reg2);
1662 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1663 && (reg2 & 0x80000000) != (value & 0x80000000));
1664
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));
1668 }
1669
1670 /* cmp imm16, dn */
1671 void OP_FAC80000 (insn, extension)
1672 unsigned long insn, extension;
1673 {
1674 int z, c, n, v;
1675 unsigned long reg1, imm, value;
1676
1677 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1678 imm = SEXT16 (insn & 0xffff);
1679 value = reg1 - imm;
1680
1681 z = (value == 0);
1682 n = (value & 0x80000000);
1683 c = (reg1 < imm);
1684 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1685 && (reg1 & 0x80000000) != (value & 0x80000000));
1686
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));
1690 }
1691
1692 /* cmp imm32, dn */
1693 void OP_FCC80000 (insn, extension)
1694 unsigned long insn, extension;
1695 {
1696 int z, c, n, v;
1697 unsigned long reg1, imm, value;
1698
1699 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
1700 imm = ((insn & 0xffff) << 16) + extension;
1701 value = reg1 - imm;
1702
1703 z = (value == 0);
1704 n = (value & 0x80000000);
1705 c = (reg1 < imm);
1706 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1707 && (reg1 & 0x80000000) != (value & 0x80000000));
1708
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));
1712 }
1713
1714 /* cmp imm16, an */
1715 void OP_FAD80000 (insn, extension)
1716 unsigned long insn, extension;
1717 {
1718 int z, c, n, v;
1719 unsigned long reg1, imm, value;
1720
1721 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1722 imm = insn & 0xffff;
1723 value = reg1 - imm;
1724
1725 z = (value == 0);
1726 n = (value & 0x80000000);
1727 c = (reg1 < imm);
1728 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1729 && (reg1 & 0x80000000) != (value & 0x80000000));
1730
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));
1734 }
1735
1736 /* cmp imm32, an */
1737 void OP_FCD80000 (insn, extension)
1738 unsigned long insn, extension;
1739 {
1740 int z, c, n, v;
1741 unsigned long reg1, imm, value;
1742
1743 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
1744 imm = ((insn & 0xffff) << 16) + extension;
1745 value = reg1 - imm;
1746
1747 z = (value == 0);
1748 n = (value & 0x80000000);
1749 c = (reg1 < imm);
1750 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1751 && (reg1 & 0x80000000) != (value & 0x80000000));
1752
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));
1756 }
1757
1758 /* and dm, dn */
1759 void OP_F200 (insn, extension)
1760 unsigned long insn, extension;
1761 {
1762 int n, z;
1763
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));
1769 }
1770
1771 /* and imm8, dn */
1772 void OP_F8E000 (insn, extension)
1773 unsigned long insn, extension;
1774 {
1775 int n, z;
1776
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));
1782 }
1783
1784 /* and imm16, dn */
1785 void OP_FAE00000 (insn, extension)
1786 unsigned long insn, extension;
1787 {
1788 int n, z;
1789
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));
1795 }
1796
1797 /* and imm32, dn */
1798 void OP_FCE00000 (insn, extension)
1799 unsigned long insn, extension;
1800 {
1801 int n, z;
1802
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));
1809 }
1810
1811 /* and imm16, psw */
1812 void OP_FAFC0000 (insn, extension)
1813 unsigned long insn, extension;
1814 {
1815 PSW &= (insn & 0xffff);
1816 }
1817
1818 /* or dm, dn*/
1819 void OP_F210 (insn, extension)
1820 unsigned long insn, extension;
1821 {
1822 int n, z;
1823
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));
1829 }
1830
1831 /* or imm8, dn */
1832 void OP_F8E400 (insn, extension)
1833 unsigned long insn, extension;
1834 {
1835 int n, z;
1836
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));
1842 }
1843
1844 /* or imm16, dn*/
1845 void OP_FAE40000 (insn, extension)
1846 unsigned long insn, extension;
1847 {
1848 int n, z;
1849
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));
1855 }
1856
1857 /* or imm32, dn */
1858 void OP_FCE40000 (insn, extension)
1859 unsigned long insn, extension;
1860 {
1861 int n, z;
1862
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));
1869 }
1870
1871 /* or imm16,psw */
1872 void OP_FAFD0000 (insn, extension)
1873 unsigned long insn, extension;
1874 {
1875 PSW |= (insn & 0xffff);
1876 }
1877
1878 /* xor dm, dn */
1879 void OP_F220 (insn, extension)
1880 unsigned long insn, extension;
1881 {
1882 int n, z;
1883
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));
1889 }
1890
1891 /* xor imm16, dn */
1892 void OP_FAE80000 (insn, extension)
1893 unsigned long insn, extension;
1894 {
1895 int n, z;
1896
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));
1902 }
1903
1904 /* xor imm32, dn */
1905 void OP_FCE80000 (insn, extension)
1906 unsigned long insn, extension;
1907 {
1908 int n, z;
1909
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));
1916 }
1917
1918 /* not dn */
1919 void OP_F230 (insn, extension)
1920 unsigned long insn, extension;
1921 {
1922 int n, z;
1923
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));
1929 }
1930
1931 /* btst imm8, dn */
1932 void OP_F8EC00 (insn, extension)
1933 unsigned long insn, extension;
1934 {
1935 unsigned long temp;
1936 int z, n;
1937
1938 temp = State.regs[REG_D0 + REG0_8 (insn)];
1939 temp &= (insn & 0xff);
1940 n = (temp & 0x80000000) != 0;
1941 z = (temp == 0);
1942 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1943 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1944 }
1945
1946 /* btst imm16, dn */
1947 void OP_FAEC0000 (insn, extension)
1948 unsigned long insn, extension;
1949 {
1950 unsigned long temp;
1951 int z, n;
1952
1953 temp = State.regs[REG_D0 + REG0_16 (insn)];
1954 temp &= (insn & 0xffff);
1955 n = (temp & 0x80000000) != 0;
1956 z = (temp == 0);
1957 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1958 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1959 }
1960
1961 /* btst imm32, dn */
1962 void OP_FCEC0000 (insn, extension)
1963 unsigned long insn, extension;
1964 {
1965 unsigned long temp;
1966 int z, n;
1967
1968 temp = State.regs[REG_D0 + REG0_16 (insn)];
1969 temp &= ((insn & 0xffff) << 16) + extension;
1970 n = (temp & 0x80000000) != 0;
1971 z = (temp == 0);
1972 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1973 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1974 }
1975
1976 /* btst imm8,(abs32) */
1977 void OP_FE020000 (insn, extension)
1978 unsigned long insn, extension;
1979 {
1980 unsigned long temp;
1981 int n, z;
1982
1983 temp = load_byte (((insn & 0xffff) << 16) | (extension >> 8));
1984 temp &= (extension & 0xff);
1985 n = (temp & 0x80000000) != 0;
1986 z = (temp == 0);
1987 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1988 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
1989 }
1990
1991 /* btst imm8,(d8,an) */
1992 void OP_FAF80000 (insn, extension)
1993 unsigned long insn, extension;
1994 {
1995 unsigned long temp;
1996 int n, z;
1997
1998 temp = load_byte ((State.regs[REG_A0 + REG0_16 (insn)]
1999 + SEXT8 ((insn & 0xff00) >> 8)));
2000 temp &= (insn & 0xff);
2001 n = (temp & 0x80000000) != 0;
2002 z = (temp == 0);
2003 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2004 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
2005 }
2006
2007 /* bset dm, (an) */
2008 void OP_F080 (insn, extension)
2009 unsigned long insn, extension;
2010 {
2011 unsigned long temp;
2012 int z;
2013
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);
2020 }
2021
2022 /* bset imm8, (abs32) */
2023 void OP_FE000000 (insn, extension)
2024 unsigned long insn, extension;
2025 {
2026 unsigned long temp;
2027 int z;
2028
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);
2035 }
2036
2037 /* bset imm8,(d8,an) */
2038 void OP_FAF00000 (insn, extension)
2039 unsigned long insn, extension;
2040 {
2041 unsigned long temp;
2042 int z;
2043
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);
2052 }
2053
2054 /* bclr dm, (an) */
2055 void OP_F090 (insn, extension)
2056 unsigned long insn, extension;
2057 {
2058 unsigned long temp;
2059 int z;
2060
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);
2067 }
2068
2069 /* bclr imm8, (abs32) */
2070 void OP_FE010000 (insn, extension)
2071 unsigned long insn, extension;
2072 {
2073 unsigned long temp;
2074 int z;
2075
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);
2082 }
2083
2084 /* bclr imm8,(d8,an) */
2085 void OP_FAF40000 (insn, extension)
2086 unsigned long insn, extension;
2087 {
2088 unsigned long temp;
2089 int z;
2090
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);
2099 }
2100
2101 /* asr dm, dn */
2102 void OP_F2B0 (insn, extension)
2103 unsigned long insn, extension;
2104 {
2105 long temp;
2106 int z, n, c;
2107
2108 temp = State.regs[REG_D0 + REG0 (insn)];
2109 c = temp & 1;
2110 temp >>= State.regs[REG_D0 + REG1 (insn)];
2111 State.regs[REG_D0 + REG0 (insn)] = temp;
2112 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2113 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
2114 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2115 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2116 }
2117
2118 /* asr imm8, dn */
2119 void OP_F8C800 (insn, extension)
2120 unsigned long insn, extension;
2121 {
2122 long temp;
2123 int z, n, c;
2124
2125 temp = State.regs[REG_D0 + REG0_8 (insn)];
2126 c = temp & 1;
2127 temp >>= (insn & 0xff);
2128 State.regs[REG_D0 + REG0_8 (insn)] = temp;
2129 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2130 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2131 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2132 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2133 }
2134
2135 /* lsr dm, dn */
2136 void OP_F2A0 (insn, extension)
2137 unsigned long insn, extension;
2138 {
2139 int z, n, c;
2140
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));
2148 }
2149
2150 /* lsr imm8, dn */
2151 void OP_F8C400 (insn, extension)
2152 unsigned long insn, extension;
2153 {
2154 int z, n, c;
2155
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));
2162 }
2163
2164 /* asl dm, dn */
2165 void OP_F290 (insn, extension)
2166 unsigned long insn, extension;
2167 {
2168 int n, z;
2169
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));
2176 }
2177
2178 /* asl imm8, dn */
2179 void OP_F8C000 (insn, extension)
2180 unsigned long insn, extension;
2181 {
2182 int n, z;
2183
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));
2189 }
2190
2191 /* asl2 dn */
2192 void OP_54 (insn, extension)
2193 unsigned long insn, extension;
2194 {
2195 int n, z;
2196
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));
2202 }
2203
2204 /* ror dn */
2205 void OP_F284 (insn, extension)
2206 unsigned long insn, extension;
2207 {
2208 unsigned long value;
2209 int c,n,z;
2210
2211 value = State.regs[REG_D0 + REG0 (insn)];
2212 c = (value & 0x1);
2213
2214 value >>= 1;
2215 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
2216 State.regs[REG_D0 + REG0 (insn)] = value;
2217 z = (value == 0);
2218 n = (value & 0x80000000) != 0;
2219 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2220 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2221 }
2222
2223 /* rol dn */
2224 void OP_F280 (insn, extension)
2225 unsigned long insn, extension;
2226 {
2227 unsigned long value;
2228 int c,n,z;
2229
2230 value = State.regs[REG_D0 + REG0 (insn)];
2231 c = (value & 0x80000000) ? 1 : 0;
2232
2233 value <<= 1;
2234 value |= ((PSW & PSW_C) != 0);
2235 State.regs[REG_D0 + REG0 (insn)] = value;
2236 z = (value == 0);
2237 n = (value & 0x80000000) != 0;
2238 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2239 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2240 }
2241
2242 /* beq label:8 */
2243 void OP_C800 (insn, extension)
2244 unsigned long insn, extension;
2245 {
2246 /* The dispatching code will add 2 after we return, so
2247 we subtract two here to make things right. */
2248 if (PSW & PSW_Z)
2249 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2250 }
2251
2252 /* bne label:8 */
2253 void OP_C900 (insn, extension)
2254 unsigned long insn, extension;
2255 {
2256 /* The dispatching code will add 2 after we return, so
2257 we subtract two here to make things right. */
2258 if (!(PSW & PSW_Z))
2259 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2260 }
2261
2262 /* bgt label:8 */
2263 void OP_C100 (insn, extension)
2264 unsigned long insn, extension;
2265 {
2266 /* The dispatching code will add 2 after we return, so
2267 we subtract two here to make things right. */
2268 if (!((PSW & PSW_Z)
2269 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2270 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2271 }
2272
2273 /* bge label:8 */
2274 void OP_C200 (insn, extension)
2275 unsigned long insn, extension;
2276 {
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;
2281 }
2282
2283 /* ble label:8 */
2284 void OP_C300 (insn, extension)
2285 unsigned long insn, extension;
2286 {
2287 /* The dispatching code will add 2 after we return, so
2288 we subtract two here to make things right. */
2289 if ((PSW & PSW_Z)
2290 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2291 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2292 }
2293
2294 /* blt label:8 */
2295 void OP_C000 (insn, extension)
2296 unsigned long insn, extension;
2297 {
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;
2302 }
2303
2304 /* bhi label:8 */
2305 void OP_C500 (insn, extension)
2306 unsigned long insn, extension;
2307 {
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;
2312 }
2313
2314 /* bcc label:8 */
2315 void OP_C600 (insn, extension)
2316 unsigned long insn, extension;
2317 {
2318 /* The dispatching code will add 2 after we return, so
2319 we subtract two here to make things right. */
2320 if (!(PSW & PSW_C))
2321 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2322 }
2323
2324 /* bls label:8 */
2325 void OP_C700 (insn, extension)
2326 unsigned long insn, extension;
2327 {
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;
2332 }
2333
2334 /* bcs label:8 */
2335 void OP_C400 (insn, extension)
2336 unsigned long insn, extension;
2337 {
2338 /* The dispatching code will add 2 after we return, so
2339 we subtract two here to make things right. */
2340 if (PSW & PSW_C)
2341 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
2342 }
2343
2344 /* bvc label:8 */
2345 void OP_F8E800 (insn, extension)
2346 unsigned long insn, extension;
2347 {
2348 /* The dispatching code will add 3 after we return, so
2349 we subtract two here to make things right. */
2350 if (!(PSW & PSW_V))
2351 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2352 }
2353
2354 /* bvs label:8 */
2355 void OP_F8E900 (insn, extension)
2356 unsigned long insn, extension;
2357 {
2358 /* The dispatching code will add 3 after we return, so
2359 we subtract two here to make things right. */
2360 if (PSW & PSW_V)
2361 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2362 }
2363
2364 /* bnc label:8 */
2365 void OP_F8EA00 (insn, extension)
2366 unsigned long insn, extension;
2367 {
2368 /* The dispatching code will add 3 after we return, so
2369 we subtract two here to make things right. */
2370 if (!(PSW & PSW_N))
2371 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2372 }
2373
2374 /* bns label:8 */
2375 void OP_F8EB00 (insn, extension)
2376 unsigned long insn, extension;
2377 {
2378 /* The dispatching code will add 3 after we return, so
2379 we subtract two here to make things right. */
2380 if (PSW & PSW_N)
2381 State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
2382 }
2383
2384 /* bra label:8 */
2385 void OP_CA00 (insn, extension)
2386 unsigned long insn, extension;
2387 {
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;
2391 }
2392
2393 /* leq */
2394 void OP_D8 (insn, extension)
2395 unsigned long insn, extension;
2396 {
2397 /* The dispatching code will add 1 after we return, so
2398 we subtract one here to make things right. */
2399 if (PSW & PSW_Z)
2400 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2401 }
2402
2403 /* lne */
2404 void OP_D9 (insn, extension)
2405 unsigned long insn, extension;
2406 {
2407 /* The dispatching code will add 1 after we return, so
2408 we subtract one here to make things right. */
2409 if (!(PSW & PSW_Z))
2410 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2411 }
2412
2413 /* lgt */
2414 void OP_D1 (insn, extension)
2415 unsigned long insn, extension;
2416 {
2417 /* The dispatching code will add 1 after we return, so
2418 we subtract one here to make things right. */
2419 if (!((PSW & PSW_Z)
2420 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2421 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2422 }
2423
2424 /* lge */
2425 void OP_D2 (insn, extension)
2426 unsigned long insn, extension;
2427 {
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;
2432 }
2433
2434 /* lle */
2435 void OP_D3 (insn, extension)
2436 unsigned long insn, extension;
2437 {
2438 /* The dispatching code will add 1 after we return, so
2439 we subtract one here to make things right. */
2440 if ((PSW & PSW_Z)
2441 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2442 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2443 }
2444
2445 /* llt */
2446 void OP_D0 (insn, extension)
2447 unsigned long insn, extension;
2448 {
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;
2453 }
2454
2455 /* lhi */
2456 void OP_D5 (insn, extension)
2457 unsigned long insn, extension;
2458 {
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;
2463 }
2464
2465 /* lcc */
2466 void OP_D6 (insn, extension)
2467 unsigned long insn, extension;
2468 {
2469 /* The dispatching code will add 1 after we return, so
2470 we subtract one here to make things right. */
2471 if (!(PSW & PSW_C))
2472 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2473 }
2474
2475 /* lls */
2476 void OP_D7 (insn, extension)
2477 unsigned long insn, extension;
2478 {
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;
2483 }
2484
2485 /* lcs */
2486 void OP_D4 (insn, extension)
2487 unsigned long insn, extension;
2488 {
2489 /* The dispatching code will add 1 after we return, so
2490 we subtract one here to make things right. */
2491 if (PSW & PSW_C)
2492 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2493 }
2494
2495 /* lra */
2496 void OP_DA (insn, extension)
2497 unsigned long insn, extension;
2498 {
2499 State.regs[REG_PC] = State.regs[REG_LAR] - 4 - 1;
2500 }
2501
2502 /* setlb */
2503 void OP_DB (insn, extension)
2504 unsigned long insn, extension;
2505 {
2506 State.regs[REG_LIR] = load_mem_big (State.regs[REG_PC] + 1, 4);
2507 State.regs[REG_LAR] = State.regs[REG_PC] + 5;
2508 }
2509
2510 /* jmp (an) */
2511 void OP_F0F4 (insn, extension)
2512 unsigned long insn, extension;
2513 {
2514 State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
2515 }
2516
2517 /* jmp label:16 */
2518 void OP_CC0000 (insn, extension)
2519 unsigned long insn, extension;
2520 {
2521 State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 3;
2522 }
2523
2524 /* jmp label:32 */
2525 void OP_DC000000 (insn, extension)
2526 unsigned long insn, extension;
2527 {
2528 State.regs[REG_PC] += (((insn & 0xffffff) << 8) + extension) - 5;
2529 }
2530
2531 /* call label:16,reg_list,imm8 */
2532 void OP_CD000000 (insn, extension)
2533 unsigned long insn, extension;
2534 {
2535 unsigned int next_pc, sp;
2536 unsigned long mask;
2537
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;
2544
2545 mask = insn & 0xff;
2546
2547 if (mask & 0x80)
2548 {
2549 sp -= 4;
2550 store_word (sp, State.regs[REG_D0 + 2]);
2551 }
2552
2553 if (mask & 0x40)
2554 {
2555 sp -= 4;
2556 store_word (sp, State.regs[REG_D0 + 3]);
2557 }
2558
2559 if (mask & 0x20)
2560 {
2561 sp -= 4;
2562 store_word (sp, State.regs[REG_A0 + 2]);
2563 }
2564
2565 if (mask & 0x10)
2566 {
2567 sp -= 4;
2568 store_word (sp, State.regs[REG_A0 + 3]);
2569 }
2570
2571 if (mask & 0x8)
2572 {
2573 sp -= 4;
2574 store_word (sp, State.regs[REG_D0]);
2575 sp -= 4;
2576 store_word (sp, State.regs[REG_D0 + 1]);
2577 sp -= 4;
2578 store_word (sp, State.regs[REG_A0]);
2579 sp -= 4;
2580 store_word (sp, State.regs[REG_A0 + 1]);
2581 sp -= 4;
2582 store_word (sp, State.regs[REG_MDR]);
2583 sp -= 4;
2584 store_word (sp, State.regs[REG_LIR]);
2585 sp -= 4;
2586 store_word (sp, State.regs[REG_LAR]);
2587 sp -= 4;
2588 }
2589
2590 /* Update the stack pointer, note that the register saves to do not
2591 modify SP. The SP adjustment is derived totally from the imm8
2592 field. */
2593 State.regs[REG_SP] -= extension;
2594 State.regs[REG_MDR] = next_pc;
2595 State.regs[REG_PC] += SEXT16 ((insn & 0xffff00) >> 8) - 5;
2596 }
2597
2598 /* call label:32,reg_list,imm8*/
2599 void OP_DD000000 (insn, extension)
2600 unsigned long insn, extension;
2601 {
2602 unsigned int next_pc, sp, adjust;
2603 unsigned long mask;
2604
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;
2611
2612 mask = (extension & 0xff00) >> 8;
2613
2614 if (mask & 0x80)
2615 {
2616 sp -= 4;
2617 store_word (sp, State.regs[REG_D0 + 2]);
2618 }
2619
2620 if (mask & 0x40)
2621 {
2622 sp -= 4;
2623 store_word (sp, State.regs[REG_D0 + 3]);
2624 }
2625
2626 if (mask & 0x20)
2627 {
2628 sp -= 4;
2629 store_word (sp, State.regs[REG_A0 + 2]);
2630 }
2631
2632 if (mask & 0x10)
2633 {
2634 sp -= 4;
2635 store_word (sp, State.regs[REG_A0 + 3]);
2636 }
2637
2638 if (mask & 0x8)
2639 {
2640 sp -= 4;
2641 store_word (sp, State.regs[REG_D0]);
2642 sp -= 4;
2643 store_word (sp, State.regs[REG_D0 + 1]);
2644 sp -= 4;
2645 store_word (sp, State.regs[REG_A0]);
2646 sp -= 4;
2647 store_word (sp, State.regs[REG_A0 + 1]);
2648 sp -= 4;
2649 store_word (sp, State.regs[REG_MDR]);
2650 sp -= 4;
2651 store_word (sp, State.regs[REG_LIR]);
2652 sp -= 4;
2653 store_word (sp, State.regs[REG_LAR]);
2654 sp -= 4;
2655 }
2656
2657 /* Update the stack pointer, note that the register saves to do not
2658 modify SP. The SP adjustment is derived totally from the imm8
2659 field. */
2660 State.regs[REG_SP] -= (extension & 0xff);
2661 State.regs[REG_MDR] = next_pc;
2662 State.regs[REG_PC] += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
2663 }
2664
2665 /* calls (an) */
2666 void OP_F0F0 (insn, extension)
2667 unsigned long insn, extension;
2668 {
2669 unsigned int next_pc, sp;
2670
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;
2679 }
2680
2681 /* calls label:16 */
2682 void OP_FAFF0000 (insn, extension)
2683 unsigned long insn, extension;
2684 {
2685 unsigned int next_pc, sp;
2686
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;
2695 }
2696
2697 /* calls label:32 */
2698 void OP_FCFF0000 (insn, extension)
2699 unsigned long insn, extension;
2700 {
2701 unsigned int next_pc, sp;
2702
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;
2711 }
2712
2713 /* ret reg_list, imm8 */
2714 void OP_DF0000 (insn, extension)
2715 unsigned long insn, extension;
2716 {
2717 unsigned int sp, offset;
2718 unsigned long mask;
2719
2720 State.regs[REG_SP] += insn & 0xff;
2721 sp = State.regs[REG_SP];
2722
2723 offset = -4;
2724 mask = (insn & 0xff00) >> 8;
2725
2726 if (mask & 0x80)
2727 {
2728 State.regs[REG_D0 + 2] = load_word (sp + offset);
2729 offset -= 4;
2730 }
2731
2732 if (mask & 0x40)
2733 {
2734 State.regs[REG_D0 + 3] = load_word (sp + offset);
2735 offset -= 4;
2736 }
2737
2738 if (mask & 0x20)
2739 {
2740 State.regs[REG_A0 + 2] = load_word (sp + offset);
2741 offset -= 4;
2742 }
2743
2744 if (mask & 0x10)
2745 {
2746 State.regs[REG_A0 + 3] = load_word (sp + offset);
2747 offset -= 4;
2748 }
2749
2750 if (mask & 0x8)
2751 {
2752 State.regs[REG_D0] = load_word (sp + offset);
2753 offset -= 4;
2754 State.regs[REG_D0 + 1] = load_word (sp + offset);
2755 offset -= 4;
2756 State.regs[REG_A0] = load_word (sp + offset);
2757 offset -= 4;
2758 State.regs[REG_A0 + 1] = load_word (sp + offset);
2759 offset -= 4;
2760 State.regs[REG_MDR] = load_word (sp + offset);
2761 offset -= 4;
2762 State.regs[REG_LIR] = load_word (sp + offset);
2763 offset -= 4;
2764 State.regs[REG_LAR] = load_word (sp + offset);
2765 offset -= 4;
2766 }
2767
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;
2772 }
2773
2774 /* retf reg_list,imm8 */
2775 void OP_DE0000 (insn, extension)
2776 unsigned long insn, extension;
2777 {
2778 unsigned int sp, offset;
2779 unsigned long mask;
2780
2781 State.regs[REG_SP] += (insn & 0xff);
2782 sp = State.regs[REG_SP];
2783 State.regs[REG_PC] = State.regs[REG_MDR] - 3;
2784
2785 offset = -4;
2786 mask = (insn & 0xff00) >> 8;
2787
2788 if (mask & 0x80)
2789 {
2790 State.regs[REG_D0 + 2] = load_word (sp + offset);
2791 offset -= 4;
2792 }
2793
2794 if (mask & 0x40)
2795 {
2796 State.regs[REG_D0 + 3] = load_word (sp + offset);
2797 offset -= 4;
2798 }
2799
2800 if (mask & 0x20)
2801 {
2802 State.regs[REG_A0 + 2] = load_word (sp + offset);
2803 offset -= 4;
2804 }
2805
2806 if (mask & 0x10)
2807 {
2808 State.regs[REG_A0 + 3] = load_word (sp + offset);
2809 offset -= 4;
2810 }
2811
2812 if (mask & 0x8)
2813 {
2814 State.regs[REG_D0] = load_word (sp + offset);
2815 offset -= 4;
2816 State.regs[REG_D0 + 1] = load_word (sp + offset);
2817 offset -= 4;
2818 State.regs[REG_A0] = load_word (sp + offset);
2819 offset -= 4;
2820 State.regs[REG_A0 + 1] = load_word (sp + offset);
2821 offset -= 4;
2822 State.regs[REG_MDR] = load_word (sp + offset);
2823 offset -= 4;
2824 State.regs[REG_LIR] = load_word (sp + offset);
2825 offset -= 4;
2826 State.regs[REG_LAR] = load_word (sp + offset);
2827 offset -= 4;
2828 }
2829 }
2830
2831 /* rets */
2832 void OP_F0FC (insn, extension)
2833 unsigned long insn, extension;
2834 {
2835 unsigned int sp;
2836
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;
2841 }
2842
2843 /* rti */
2844 void OP_F0FD (insn, extension)
2845 unsigned long insn, extension;
2846 {
2847 unsigned int sp, next_pc;
2848
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;
2854 }
2855
2856 /* trap */
2857 void OP_F0FE (insn, extension)
2858 unsigned long insn, extension;
2859 {
2860 unsigned int sp, next_pc;
2861
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;
2869 }
2870
2871 /* syscall */
2872 void OP_F0C0 (insn, extension)
2873 unsigned long insn, extension;
2874 {
2875 /* We use this for simulated system calls; we may need to change
2876 it to a reserved instruction if we conflict with uses at
2877 Matsushita. */
2878 int save_errno = errno;
2879 errno = 0;
2880
2881 /* Registers passed to trap 0 */
2882
2883 /* Function number. */
2884 #define FUNC (State.regs[0])
2885
2886 /* Parameters. */
2887 #define PARM1 (State.regs[1])
2888 #define PARM2 (load_word (State.regs[REG_SP] + 12))
2889 #define PARM3 (load_word (State.regs[REG_SP] + 16))
2890
2891 /* Registers set by trap 0 */
2892
2893 #define RETVAL State.regs[0] /* return value */
2894 #define RETERR State.regs[1] /* return error code */
2895
2896 /* Turn a pointer in a register into a pointer into real memory. */
2897
2898 #define MEMPTR(x) (State.mem + x)
2899
2900 switch (FUNC)
2901 {
2902 #if !defined(__GO32__) && !defined(_WIN32)
2903 #ifdef TARGET_SYS_fork
2904 case TARGET_SYS_fork:
2905 RETVAL = fork ();
2906 break;
2907 #endif
2908 #ifdef TARGET_SYS_execve
2909 case TARGET_SYS_execve:
2910 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
2911 (char **)MEMPTR (PARM3));
2912 break;
2913 #endif
2914 #ifdef TARGET_SYS_execv
2915 case TARGET_SYS_execv:
2916 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
2917 break;
2918 #endif
2919 #endif /* ! GO32 and ! WIN32 */
2920
2921 case TARGET_SYS_read:
2922 RETVAL = mn10300_callback->read (mn10300_callback, PARM1,
2923 MEMPTR (PARM2), PARM3);
2924 break;
2925 case TARGET_SYS_write:
2926 RETVAL = (int)mn10300_callback->write (mn10300_callback, PARM1,
2927 MEMPTR (PARM2), PARM3);
2928 break;
2929 case TARGET_SYS_lseek:
2930 RETVAL = mn10300_callback->lseek (mn10300_callback, PARM1, PARM2, PARM3);
2931 break;
2932 case TARGET_SYS_close:
2933 RETVAL = mn10300_callback->close (mn10300_callback, PARM1);
2934 break;
2935 case TARGET_SYS_open:
2936 RETVAL = mn10300_callback->open (mn10300_callback, MEMPTR (PARM1), PARM2);
2937 break;
2938 case TARGET_SYS_exit:
2939 /* EXIT - caller can look in PARM1 to work out the
2940 reason */
2941 if (PARM1 == 0xdead)
2942 State.exception = SIGABRT;
2943 else
2944 State.exception = SIGQUIT;
2945 State.exited = 1;
2946 break;
2947
2948 case TARGET_SYS_stat: /* added at hmsi */
2949 /* stat system call */
2950 {
2951 struct stat host_stat;
2952 reg_t buf;
2953
2954 RETVAL = stat (MEMPTR (PARM1), &host_stat);
2955
2956 buf = PARM2;
2957
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);
2970 }
2971 break;
2972
2973 #ifdef TARGET_SYS_chown
2974 case TARGET_SYS_chown:
2975 RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3);
2976 break;
2977 #endif
2978 case TARGET_SYS_chmod:
2979 RETVAL = chmod (MEMPTR (PARM1), PARM2);
2980 break;
2981 #ifdef TARGET_SYS_time
2982 case TARGET_SYS_time:
2983 RETVAL = time ((void*) MEMPTR (PARM1));
2984 break;
2985 #endif
2986 #ifdef TARGET_SYS_times
2987 case TARGET_SYS_times:
2988 {
2989 struct tms tms;
2990 RETVAL = times (&tms);
2991 store_word (PARM1, tms.tms_utime);
2992 store_word (PARM1 + 4, tms.tms_stime);
2993 store_word (PARM1 + 8, tms.tms_cutime);
2994 store_word (PARM1 + 12, tms.tms_cstime);
2995 break;
2996 }
2997 #endif
2998 #ifdef TARGET_SYS_gettimeofday
2999 case TARGET_SYS_gettimeofday:
3000 {
3001 struct timeval t;
3002 struct timezone tz;
3003 RETVAL = gettimeofday (&t, &tz);
3004 store_word (PARM1, t.tv_sec);
3005 store_word (PARM1 + 4, t.tv_usec);
3006 store_word (PARM2, tz.tz_minuteswest);
3007 store_word (PARM2 + 4, tz.tz_dsttime);
3008 break;
3009 }
3010 #endif
3011 #ifdef TARGET_SYS_utime
3012 case TARGET_SYS_utime:
3013 /* Cast the second argument to void *, to avoid type mismatch
3014 if a prototype is present. */
3015 RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
3016 break;
3017 #endif
3018 default:
3019 abort ();
3020 }
3021 RETERR = errno;
3022 errno = save_errno;
3023 }
3024
3025 /* rtm */
3026 void OP_F0FF (insn, extension)
3027 unsigned long insn, extension;
3028 {
3029 abort ();
3030 }
3031
3032 /* nop */
3033 void OP_CB (insn, extension)
3034 unsigned long insn, extension;
3035 {
3036 }
3037
3038 /* putx dm,dm */
3039 void OP_F500 (insn, extension)
3040 unsigned long insn, extension;
3041 {
3042 State.regs[REG_MDRQ] = State.regs[REG_D0 + REG0 (insn)];
3043 }
3044
3045 /* getx dm,dm */
3046 void OP_F6F0 (insn, extension)
3047 unsigned long insn, extension;
3048 {
3049 int z, n;
3050 z = (State.regs[REG_MDRQ] == 0);
3051 n = ((State.regs[REG_MDRQ] & 0x80000000) != 0);
3052 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDRQ];
3053
3054 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3055 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
3056 }
3057
3058 /* mulq dm,dn */
3059 void OP_F600 (insn, extension)
3060 unsigned long insn, extension;
3061 {
3062 unsigned long long temp;
3063 int n, z;
3064
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));
3073 }
3074
3075 /* mulq imm8,dn */
3076 void OP_F90000 (insn, extension)
3077 unsigned long insn, extension;
3078 {
3079 unsigned long long temp;
3080 int n, z;
3081
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));
3090 }
3091
3092 /* mulq imm16,dn */
3093 void OP_FB000000 (insn, extension)
3094 unsigned long insn, extension;
3095 {
3096 unsigned long long temp;
3097 int n, z;
3098
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));
3107 }
3108
3109 /* mulq imm32,dn */
3110 void OP_FD000000 (insn, extension)
3111 unsigned long insn, extension;
3112 {
3113 unsigned long long temp;
3114 int n, z;
3115
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));
3124 }
3125
3126 /* mulqu dm,dn */
3127 void OP_F610 (insn, extension)
3128 unsigned long insn, extension;
3129 {
3130 unsigned long long temp;
3131 int n, z;
3132
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));
3141 }
3142
3143 /* mulqu imm8,dn */
3144 void OP_F91400 (insn, extension)
3145 unsigned long insn, extension;
3146 {
3147 unsigned long long temp;
3148 int n, z;
3149
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));
3158 }
3159
3160 /* mulqu imm16,dn */
3161 void OP_FB140000 (insn, extension)
3162 unsigned long insn, extension;
3163 {
3164 unsigned long long temp;
3165 int n, z;
3166
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));
3175 }
3176
3177 /* mulqu imm32,dn */
3178 void OP_FD140000 (insn, extension)
3179 unsigned long insn, extension;
3180 {
3181 unsigned long long temp;
3182 int n, z;
3183
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));
3192 }
3193
3194 /* sat16 dm,dn */
3195 void OP_F640 (insn, extension)
3196 unsigned long insn, extension;
3197 {
3198 int temp;
3199
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;
3204 }
3205
3206 /* sat24 dm,dn */
3207 void OP_F650 (insn, extension)
3208 unsigned long insn, extension;
3209 {
3210 int temp;
3211
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;
3216 }
3217
3218 /* bsch dm,dn */
3219 void OP_F670 (insn, extension)
3220 unsigned long insn, extension;
3221 {
3222 int temp, c;
3223
3224 temp = State.regs[REG_D0 + REG1 (insn)];
3225 temp <<= (State.regs[REG_D0 + REG0 (insn)] & 0x1f);
3226 c = (temp != 0 ? 1 : 0);
3227 PSW &= ~(PSW_C);
3228 PSW |= (c ? PSW_C : 0);
3229 }
3230
3231 /* breakpoint */
3232 void
3233 OP_FF (insn, extension)
3234 unsigned long insn, extension;
3235 {
3236 State.exception = SIGTRAP;
3237 PC -= 1;
3238 }
3239