This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / sim / mn10300 / mn10300.igen
1 // -*- C -*-
2 :option:::insn-bit-size:8
3 :option:::insn-specifying-widths:true
4 :option:::hi-bit-nr:7
5 :model:::mn10300:mn10300:
6 :model:::am33:am33:
7
8 // What do we do with an illegal instruction?
9 :internal::::illegal:
10 {
11   PC = cia;
12   program_interrupt(SD, CPU, cia, SIM_SIGILL);
13 }
14
15 // 1000 DnDn imm8....; mov imm8,Dn (imm8 is sign extended)
16 4.0x8,2.DM1,2.DN0=DM1+8.IMM8:S0i:::mov
17 "mov"
18 *mn10300
19 *am33
20 {
21   /*  OP_8000 (); */
22   signed32 immed = EXTEND8 (IMM8);
23   State.regs[REG_D0+DN0] = immed;
24   PC = cia;
25 }
26
27 // 1000 DmDn; mov Dm,Dn (Dm != Dn, see above when Dm == Dn)
28 4.0x8,2.DM1,2.DN0!DM1:S0:::mov
29 "mov"
30 *mn10300
31 *am33
32 {
33   PC = cia;
34   /* OP_80 (); */
35   State.regs[REG_D0+DN0] = State.regs[REG_D0+DM1];
36 }
37
38
39 // 1111 0001 1110 DmAn; mov Dm,An
40 8.0xf1+1110,2.DM1,2.AN0:D0:::mov
41 "mov"
42 *mn10300
43 *am33
44 {
45   /* OP_F1E0 (); */
46   PC = cia;
47   State.regs[REG_A0 + AN0] = State.regs[REG_D0 + DM1];
48 }
49
50
51 // 1111 0001 1101 AmDn; mov Am,Dn
52 8.0xf1+1101,2.AM1,2.DN0:D0a:::mov
53 "mov"
54 *mn10300
55 *am33
56 {
57   /* OP_F1D0 (); */
58   PC = cia;
59   State.regs[REG_D0 + DN0] = State.regs[REG_A0 + AM1];
60 }
61
62
63 // 1001 AnAn imm8....; mov imm8,An (imm8 is zero-extended)
64 4.0x9,2.AM1,2.AN0=AM1+8.IMM8:S0ai:::mov
65 "mov"
66 *mn10300
67 *am33
68 {
69    PC = cia;
70    /* OP_9000 (); */
71    State.regs[REG_A0+AN0] = IMM8;
72 }
73
74
75 // 1001 AmAn; mov Am,An (Am != An, save above when Am == An)
76 4.0x9,2.AM1,2.AN0!AM1:S0a:::mov
77 "mov"
78 *mn10300
79 *am33
80 {
81    PC = cia;
82    /* OP_90 (); */
83    State.regs[REG_A0+AN0] = State.regs[REG_A0+AM1];
84 }
85
86
87 // 0011 11An; mov SP,An
88 4.0x3,11,2.AN0:S0b:::mov
89 "mov"
90 *mn10300
91 *am33
92 {
93   /* OP_3C (); */
94   PC = cia;
95   State.regs[REG_A0 + AN0] = State.regs[REG_SP];
96 }
97
98
99 // 1111 0010 1111 Am00; mov Am,SP
100 8.0xf2+4.0xf,2.AM1,00:D0b:::mov
101 "mov"
102 *mn10300
103 *am33
104 {
105   /* OP_F2F0 (); */
106   PC = cia;
107   State.regs[REG_SP] = State.regs[REG_A0 + AM1];
108 }
109
110
111 // 1111 0010 1110 01Dn; mov PSW,Dn
112 8.0xf2+4.0xe,01,2.DN0:D0c:::mov
113 "mov"
114 *mn10300
115 *am33
116 {
117   /* OP_F2E4 (); */
118   PC = cia;
119   State.regs[REG_D0 + DN0] = PSW;
120 }
121
122
123 // 1111 0010 1111 Dm11; mov Dm,PSW
124 8.0xf2+4.0xf,2.DM1,11:D0d:::mov
125 "mov"
126 *mn10300
127 *am33
128 {
129   /* OP_F2F3 (); */
130   PC = cia;
131   PSW = State.regs[REG_D0 + DM1];
132 }
133
134
135 // 1111 0010 1110 00Dn; mov MDR,Dn
136 8.0xf2+4.0xe,00,2.DN0:D0e:::mov
137 "mov"
138 *mn10300
139 *am33
140 {
141   /* OP_F2E0 (); */
142   PC = cia;
143   State.regs[REG_D0 + DN0] = State.regs[REG_MDR];
144 }
145
146
147 // 1111 0010 1111 Dm10; mov Dm,MDR
148 8.0xf2+4.0xf,2.DM1,10:D0f:::mov
149 "mov"
150 *mn10300
151 *am33
152 {
153   /* OP_F2F2 (); */
154   PC = cia;
155   State.regs[REG_MDR] = State.regs[REG_D0 + DM1];
156 }
157
158
159 // 0111 DnAm; mov (Am),Dn
160 4.0x7,2.DN1,2.AM0:S0c:::mov
161 "mov"
162 *mn10300
163 *am33
164 {
165   /* OP_70 (); */
166   PC = cia;
167   State.regs[REG_D0 + DN1] = load_word (State.regs[REG_A0 + AM0]);
168 }
169
170
171 // 1111 1000 0000 DnAm d8......; mov (d8,Am),Dn (d8 is sign-extended)
172 8.0xf8+4.0x0,2.DN1,2.AM0+8.D8:D1:::mov
173 "mov"
174 *mn10300
175 *am33
176 {
177   /* OP_F80000 (); */
178   PC = cia;
179   State.regs[REG_D0 + DN1]
180     = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
181 }
182
183
184 // 1111 1010 0000 DnAm d16.....; mov (d16,Am),Dn (d16 is sign-extended.)
185 8.0xfa+4.0x0,2.DN1,2.AM0+8.D16A+8.D16B:D2:::mov
186 "mov"
187 *mn10300
188 *am33
189 {
190   /* OP_FA000000 (); */
191   PC = cia;
192   State.regs[REG_D0 + DN1]
193     = load_word ((State.regs[REG_A0 + AM0] + EXTEND16 (FETCH16(D16A, D16B))));
194 }
195
196
197 // 1111 1100 0000 DnAm d32.....; mov (d32,Am),Dn
198 8.0xfc+4.0x0,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mov
199 "mov"
200 *mn10300
201 *am33
202 {
203   /* OP_FC000000 (); */
204   PC = cia;
205   State.regs[REG_D0 + DN1]
206     = load_word ((State.regs[REG_A0 + AM0]
207                   + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
208 }
209
210
211 // 0101 10Dn d8......; mov (d8,SP),Dn (d8 is zero-extended)
212 4.0x5,10,2.DN0+8.D8:S1:::mov
213 "mov"
214 *mn10300
215 *am33
216 {
217   /* OP_5800 (); */
218   PC = cia;
219   State.regs[REG_D0 + DN0] = load_word (State.regs[REG_SP] + D8);
220 }
221
222
223 // 1111 1010 1011 01Dn d16.....; mov (d16,SP),Dn (d16 is zero-extended.)
224 8.0xfa+4.0xb,01,2.DN0+8.IMM16A+8.IMM16B:D2a:::mov
225 "mov"
226 *mn10300
227 *am33
228 {
229   /* OP_FAB40000 (); */
230   PC = cia;
231   State.regs[REG_D0 + DN0]
232     = load_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B));
233 }
234
235
236 // 1111 1010 1011 01Dn d32.....; mov (d32,SP),Dn
237 8.0xfc+4.0xb,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::mov
238 "mov"
239 *mn10300
240 *am33
241 {
242   /* OP_FCB40000 (); */
243   PC = cia;
244   State.regs[REG_D0 + DN0]
245      = load_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
246 }
247
248
249 // 1111 0011 00Dn DiAm; mov (Di,Am),Dn
250 8.0xf3+00,2.DN2,2.DI,2.AM0:D0g:::mov
251 "mov"
252 *mn10300
253 *am33
254 {
255   /* OP_F300 (); */
256   PC = cia;
257   State.regs[REG_D0 + DN2]
258     = load_word ((State.regs[REG_A0 + AM0] + State.regs[REG_D0 + DI]));
259 }
260
261
262 // 0011 00Dn abs16...; mov (abs16),Dn (abs16 is zero-extended)
263 4.0x3,00,2.DN0+8.IMM16A+8.IMM16B:S2:::mov
264 "mov"
265 *mn10300
266 *am33
267 {
268   /* OP_300000 (); */
269   PC = cia;
270   State.regs[REG_D0 + DN0] = load_word (FETCH16(IMM16A, IMM16B));
271 }
272
273 // 1111 1100 1010 01Dn abs32...; mov (abs32),Dn
274 8.0xfc+4.0xa,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::mov
275 "mov"
276 *mn10300
277 *am33
278 {
279   /* OP_FCA40000 (); */
280   PC = cia;
281   State.regs[REG_D0 + DN0] = load_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
282 }
283
284
285 // 1111 0000 0000 AnAm; mov (Am),An
286 8.0xf0+4.0x0,2.AN1,2.AM0:D0h:::mov
287 "mov"
288 *mn10300
289 *am33
290 {
291   /* OP_F000 (); */
292   PC = cia;
293   State.regs[REG_A0 + AN1] = load_word (State.regs[REG_A0 + AM0]);
294 }
295
296
297 // 1111 1000 0010 AnAm d8......; mov (d8,Am),An (d8 is sign-extended)
298 8.0xf8+4.0x2,2.AN1,2.AM0+8.D8:D1a:::mov
299 "mov"
300 *mn10300
301 *am33
302 {
303   /* OP_F82000 (); */
304   PC = cia;
305   State.regs[REG_A0 + AN1]
306     = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
307 }
308
309
310 // 1111 1010 0010 AnAm d16.....; mov (d16,Am),An (d16 is sign-extended.)
311 8.0xfa+4.0x2,2.AN1,2.AM0+8.D16A+8.D16B:D2b:::mov
312 "mov"
313 *mn10300
314 *am33
315 {
316   /* OP_FA200000 (); */
317   PC = cia;
318   State.regs[REG_A0 + AN1]
319     = load_word ((State.regs[REG_A0 + AM0]
320                   + EXTEND16 (FETCH16(D16A, D16B))));
321 }
322
323
324 // 1111 1100 0010 AnAm d32.....; mov (d32,Am),An
325 8.0xfc+4.0x2,2.AN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::mov
326 "mov"
327 *mn10300
328 *am33
329 {
330   /* OP_FC200000 (); */
331   PC = cia;
332   State.regs[REG_A0 + AN1]
333     = load_word ((State.regs[REG_A0 + AM0]
334                   + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
335 }
336
337
338 // 0101 11An d8......; mov (d8,SP),An (d8 is zero-extended)
339 4.0x5,11,2.AN0+8.D8:S1a:::mov
340 "mov"
341 *mn10300
342 *am33
343 {
344   /* OP_5C00 (); */
345   PC = cia;
346   State.regs[REG_A0 + AN0]
347     = load_word (State.regs[REG_SP] + D8);
348 }
349
350
351 // 1111 1010 1011 00An d16.....; mov (d16,SP),An (d16 is zero-extended.)
352 8.0xfa+4.0xb,00,2.AN0+8.IMM16A+8.IMM16B:D2c:::mov
353 "mov"
354 *mn10300
355 *am33
356 {
357   /* OP_FAB00000 (); */
358   PC = cia;
359   State.regs[REG_A0 + AN0]
360     = load_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B));
361 }
362
363
364 // 1111 1100 1011 00An d32.....; mov (d32,SP),An
365 8.0xfc+4.0xb,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::mov
366 "mov"
367 *mn10300
368 *am33
369 {
370   /* OP_FCB00000 (); */
371   PC = cia;
372   State.regs[REG_A0 + AN0]
373     = load_word (State.regs[REG_SP]
374                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
375 }
376
377
378 // 1111 0011 10An DiAm; mov (Di,Am),An
379 8.0xf3+10,2.AN2,2.DI,2.AM0:D0i:::mov
380 "mov"
381 *mn10300
382 *am33
383 {
384   /* OP_F380 (); */
385   PC = cia;
386   State.regs[REG_A0 + AN2]
387     = load_word ((State.regs[REG_A0 + AM0]
388                  + State.regs[REG_D0 + DI]));
389 }
390
391
392 // 1111 1010 1010 00An abs16...; mov (abs16),An (abs16 is zero-extended)
393 8.0xfa+4.0xa,00,2.AN0+8.IMM16A+8.IMM16B:D2d:::mov
394 "mov"
395 *mn10300
396 *am33
397 {
398   /* OP_FAA00000 (); */
399   PC = cia;
400   State.regs[REG_A0 + AN0] = load_word (FETCH16(IMM16A, IMM16B));
401 }
402
403
404 // 1111 1100 1010 00An abs32...; mov (abs32),An
405 8.0xfc+4.0xa,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::mov
406 "mov"
407 *mn10300
408 *am33
409 {
410   /* OP_FCA00000 (); */
411   PC = cia;
412   State.regs[REG_A0 + AN0]
413     = load_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
414 }
415
416
417 // 1111 1000 1111 00Am d8......; mov (d8,Am),SP (d8 is sign-extended)
418 8.0xf8+4.0xf,00,2.AM0+8.D8:D1b:::mov
419 "mov"
420 *mn10300
421 *am33
422 {
423   /* OP_F8F000 (); */
424   PC = cia;
425   State.regs[REG_SP]
426     = load_word ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
427 }
428
429
430 // 0110 DmAn; mov Dm,(An)
431 4.0x6,2.DM1,2.AN0:S0d:::mov
432 "mov"
433 *mn10300
434 *am33
435 {
436   /* OP_60 (); */
437   PC = cia;
438   store_word (State.regs[REG_A0 + AN0], State.regs[REG_D0 + DM1]);
439 }
440
441
442 // 1111 1000 0001 DmAn d8......; mov Dm,(d8,An) (d8 is sign-extended)
443 8.0xf8+4.0x1,2.DM1,2.AN0+8.D8:D1c:::mov
444 "mov"
445 *mn10300
446 *am33
447 {
448   /* OP_F81000 (); */
449   PC = cia;
450   store_word ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
451               State.regs[REG_D0 + DM1]);
452 }
453
454
455 // 1111 1010 0001 DmAn d16.....; mov Dm,(d16,An) (d16 is sign-extended.)
456 8.0xfa+4.0x1,2.DM1,2.AN0+8.D16A+8.D16B:D2e:::mov
457 "mov"
458 *mn10300
459 *am33
460 {
461   /* OP_FA100000 (); */
462   PC = cia;
463   store_word ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
464               State.regs[REG_D0 + DM1]);
465 }
466
467
468 // 1111 1100 0001 DmAn d32.....; mov Dm,(d32,An)
469 8.0xfc+4.0x1,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4f:::mov
470 "mov"
471 *mn10300
472 *am33
473 {
474   /* OP_FC100000 (); */
475   PC = cia;
476   store_word ((State.regs[REG_A0 + AN0]
477                + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
478               State.regs[REG_D0 + DM1]);
479 }
480
481
482 // 0100 Dm10 d8......; mov Dm,(d8,SP) (d8 is zero-extended)
483 4.0x4,2.DM1,10+8.D8:S1b:::mov
484 "mov"
485 *mn10300
486 *am33
487 {
488   /* OP_4200 (); */
489   PC = cia;
490   store_word (State.regs[REG_SP] + D8, State.regs[REG_D0 + DM1]);
491 }
492
493
494 // 1111 1010 1001 Dm01 d16.....; mov Dm,(d16,SP) (d16 is zero-extended.)
495 8.0xfa+4.0x9,2.DM1,01+8.IMM16A+8.IMM16B:D2f:::mov
496 "mov"
497 *mn10300
498 *am33
499 {
500   /* OP_FA910000 (); */
501   PC = cia;
502   store_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
503               State.regs[REG_D0 + DM1]);
504 }
505
506
507 // 1111 1100 1001 Dm01 d32.....; mov Dm,(d32,SP)
508 8.0xfc+4.0x9,2.DM1,01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4g:::mov
509 "mov"
510 *mn10300
511 *am33
512 {
513   /* OP_FC910000 (); */
514   PC = cia;
515   store_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
516               State.regs[REG_D0 + DM1]);
517 }
518
519
520 // 1111 0011 01Dm DiAn; mov Dm,(Di,An)
521 8.0xf3+01,2.DM2,2.DI,2.AN0:D0j:::mov
522 "mov"
523 *mn10300
524 *am33
525 {
526   /* OP_F340 (); */
527   PC = cia;
528   store_word ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
529               State.regs[REG_D0 + DM2]);
530 }
531
532
533 // 0000 Dm01 abs16..., mov Dm,(abs16) (abs16 is zero-extended).
534 4.0x0,2.DM1,01+8.IMM16A+8.IMM16B:S2a:::mov
535 "mov"
536 *mn10300
537 *am33
538 {
539   /* OP_10000 (); */
540   PC = cia;
541   store_word (FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DM1]);
542 }
543
544
545 // 1111 1100 1000 Dm01 abs32...; mov Dm,(abs32)
546 8.0xfc+4.0x8,2.DM1,01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4h:::mov
547 "mov"
548 *mn10300
549 *am33
550 {
551   /* OP_FC810000 (); */
552   PC = cia;
553   store_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
554               State.regs[REG_D0 + DM1]);
555 }
556
557
558 // 1111 0000 0001 AmAn; mov Am,(An)
559 8.0xf0+4.0x1,2.AM1,2.AN0:D0k:::mov
560 "mov"
561 *mn10300
562 *am33
563 {
564   /* OP_F010 (); */
565   PC = cia;
566   store_word (State.regs[REG_A0 + AN0], State.regs[REG_A0 + AM1]);
567 }
568
569
570 // 1111 1000 0011 AmAn d8......; mov Am,(d8,An) (d8 is sign-extended)
571 8.0xf8+4.0x3,2.AM1,2.AN0+8.D8:D1d:::mov
572 "mov"
573 *mn10300
574 *am33
575 {
576   /* OP_F83000 (); */
577   PC = cia;
578   store_word ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
579               State.regs[REG_A0 + AM1]);
580 }
581
582
583 // 1111 1010 0011 AmAn d16.....; mov Am,(d16,An) (d16 is sign-extended.)
584 8.0xfa+4.0x3,2.AM1,2.AN0+8.D16A+8.D16B:D2g:::mov
585 "mov"
586 *mn10300
587 *am33
588 {
589   /* OP_FA300000 (); */
590   PC = cia;
591   store_word ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
592               State.regs[REG_A0 + AM1]);
593 }
594
595
596 // 1111 1100 0011 AmAn d32.....; mov Am,(d32,An)
597 8.0xfc+4.0x3,2.AM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4i:::mov
598 "mov"
599 *mn10300
600 *am33
601 {
602   /* OP_FC300000 (); */
603   PC = cia;
604   store_word ((State.regs[REG_A0 + AN0]
605                + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
606               State.regs[REG_A0 + AM1]);
607 }
608
609
610 // 0100 Am11 d8......; mov Am,(d8,SP) (d8 is zero-extended)
611 4.0x4,2.AM1,11+8.D8:S1c:::mov
612 "mov"
613 *mn10300
614
615 *am33
616
617 {
618   /* OP_4300 (); */
619   PC = cia;
620   store_word (State.regs[REG_SP] + (D8), State.regs[REG_A0 + (AM1)]);
621 }
622
623
624 // 1111 1010 1001 Am00 d16.....; mov Am,(d16,SP) (d16 is zero-extended.)
625 8.0xfa+4.0x9,2.AM1,00+8.IMM16A+8.IMM16B:D2h:::mov
626 "mov"
627 *mn10300
628
629 *am33
630
631 {
632   /* OP_FA900000 (); */
633   PC = cia;
634   store_word (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
635               State.regs[REG_A0 + AM1]);
636 }
637
638
639 // 1111 1100 1001 Am00 d32.....; mov Am,(d32,SP)
640 8.0xfc+4.0x9,2.AM1,00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4j:::mov
641 "mov"
642 *mn10300
643
644 *am33
645
646 {
647   /* OP_FC900000 (); */
648   PC = cia;
649   store_word (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
650               State.regs[REG_A0 + AM1]);
651 }
652
653
654 // 1111 0011 11Am DiAn; mov Am,(Di,An)
655 8.0xf3+11,2.AM2,2.DI,2.AN0:D0l:::mov
656 "mov"
657 *mn10300
658
659 *am33
660
661 {
662   /* OP_F3C0 (); */
663   PC = cia;
664   store_word ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
665               State.regs[REG_A0 + AM2]);
666 }
667
668
669 // 1111 1010 1000 Am00 abs16...; mov Am,(abs16) (abs16 is zero-extended)
670 8.0xfa+4.0x8,2.AM1,00+8.IMM16A+8.IMM16B:D2i:::mov
671 "mov"
672 *mn10300
673
674 *am33
675
676 {
677   /* OP_FA800000 (); */
678   PC = cia;
679   store_word (FETCH16(IMM16A, IMM16B),
680               State.regs[REG_A0 + AM1]);
681 }
682
683
684 // 1111 1100 1000 Am00 abs32...; mov Am,(abs32)
685 8.0xfc+4.0x8,2.AM1,00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4k:::mov
686 "mov"
687 *mn10300
688
689 *am33
690
691 {
692   /* OP_FC800000 (); */
693   PC = cia;
694   store_word (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
695               State.regs[REG_A0 + AM1]);
696 }
697
698
699 // 1111 1000 1111 01An d8......; mov SP,(d8,An) (d8 is sign-extended)
700 8.0xf8+4.0xf,01,2.AN0+8.D8:D1e:::mov
701 "mov"
702 *mn10300
703
704 *am33
705
706 {
707   /* OP_F8F400 (); */
708   PC = cia;
709   store_word (State.regs[REG_A0 + AN0] + EXTEND8 (D8),
710               State.regs[REG_SP]);
711 }
712
713
714 // 0010 11Dn imm16...; mov imm16,Dn (imm16 is sign-extended)
715 4.0x2,11,2.DN0+8.IMM16A+8.IMM16B:S2b:::mov
716 "mov"
717 *mn10300
718
719 *am33
720
721 {
722   /* OP_2C0000 (); */
723   unsigned32 value;
724
725   PC = cia;
726   value = EXTEND16 (FETCH16(IMM16A, IMM16B));
727   State.regs[REG_D0 + DN0] = value;
728 }
729
730
731 // 1111 1100 1100 11Dn imm32...; mov imm32,Dn
732 8.0xfc+4.0xc,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4l:::mov
733 "mov"
734 *mn10300
735
736 *am33
737
738 {
739   /* OP_FCCC0000 (); */
740   unsigned32 value;
741
742   PC = cia;
743   value = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
744   State.regs[REG_D0 + DN0] = value;
745 }
746
747
748 // 0010 01An imm16...; mov imm16,An (imm16 is zero-extended)
749 4.0x2,01,2.AN0+8.IMM16A+8.IMM16B:S2c:::mov
750 "mov"
751 *mn10300
752
753 *am33
754
755 {
756   /* OP_240000 (); */
757   unsigned32 value;
758
759   PC = cia;
760   value = FETCH16(IMM16A, IMM16B);
761   State.regs[REG_A0 + AN0] = value;
762 }
763
764
765 // 1111 1100 1101 11An imm32...; mov imm32,An
766 8.0xfc+4.0xd,11,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4m:::mov
767 "mov"
768 *mn10300
769
770 *am33
771
772 {
773     /* OP_FCDC0000 (); */
774     PC = cia;
775     State.regs[REG_A0 + AN0] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
776 }
777
778
779 // 1111 0000 0100 DnAm; movbu (Am),Dn
780 8.0xf0+4.0x4,2.DN1,2.AM0:D0:::movbu
781 "movbu"
782 *mn10300
783
784 *am33
785
786 {
787   /* OP_F040 (); */
788   PC = cia;
789   State.regs[REG_D0 + DN1]
790     = load_byte (State.regs[REG_A0 + AM0]);
791 }
792
793
794 // 1111 1000 0100 DnAm d8......; movbu (d8,Am),Dn (d8 is sign-extended)
795 8.0xf8+4.0x4,2.DN1,2.AM0+8.D8:D1f:::movbu
796 "movbu"
797 *mn10300
798
799 *am33
800
801 {
802   /* OP_F84000 (); */
803   PC = cia;
804   State.regs[REG_D0 + DN1]
805     = load_byte ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
806 }
807
808
809 // 1111 1010 0100 DnAm d16.....; movbu (d16,Am),Dn (d16 is sign-extended.)
810 8.0xfa+4.0x4,2.DN1,2.AM0+8.D16A+8.D16B:D2:::movbu
811 "movbu"
812 *mn10300
813
814 *am33
815
816 {
817   /* OP_FA400000 (); */
818   PC = cia;
819   State.regs[REG_D0 + DN1]
820     = load_byte ((State.regs[REG_A0 + AM0]
821                   + EXTEND16 (FETCH16(D16A, D16B))));
822 }
823
824
825 // 1111 1100 0100 DnAm d32.....; movbu (d32,Am),Dn
826 8.0xfc+4.0x4,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::movbu
827 "movbu"
828 *mn10300
829
830 *am33
831
832 {
833   /* OP_FC400000 (); */
834   PC = cia;
835   State.regs[REG_D0 + DN1]
836     = load_byte ((State.regs[REG_A0 + AM0]
837                   + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
838 }
839
840
841 // 1111 1000 1011 10Dn d8......; movbu (d8,SP),Dn (d8 is zero-extended)
842 8.0xf8+4.0xb,10,2.DN0+8.D8:D1a:::movbu
843 "movbu"
844 *mn10300
845
846 *am33
847
848 {
849   /* OP_F8B800 (); */
850   PC = cia;
851   State.regs[REG_D0 + DN0]
852     = load_byte ((State.regs[REG_SP] + (D8)));
853 }
854
855
856 // 1111 1010 1011 10Dn d16.....; movbu (d16,SP),Dn (d16 is zero-extended.)
857 8.0xfa+4.0xb,10,2.DN0+8.IMM16A+8.IMM16B:D2a:::movbu
858 "movbu"
859 *mn10300
860
861 *am33
862
863 {
864   /* OP_FAB80000 (); */
865   PC = cia;
866   State.regs[REG_D0 + DN0]
867     = load_byte ((State.regs[REG_SP]
868                   + FETCH16(IMM16A, IMM16B)));
869 }
870
871
872 // 1111 1100 1011 10Dn d32.....; movbu (d32,SP),Dn
873 8.0xfc+4.0xb,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::movbu
874 "movbu"
875 *mn10300
876
877 *am33
878
879 {
880   /* OP_FCB80000 (); */
881   PC = cia;
882   State.regs[REG_D0 + DN0]
883     = load_byte (State.regs[REG_SP]
884                  + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
885 }
886
887
888 // 1111 0100 00Dn DiAm; movbu (Di,Am),Dn
889 8.0xf4+00,2.DN2,2.DI,2.AM0:D0a:::movbu
890 "movbu"
891 *mn10300
892
893 *am33
894
895 {
896   /* OP_F400 (); */
897   PC = cia;
898   State.regs[REG_D0 + DN2]
899     = load_byte ((State.regs[REG_A0 + AM0]
900                   + State.regs[REG_D0 + DI]));
901 }
902
903
904 // 0011 01Dn abs16...; movbu (abs16),Dn (abs16 is zero-extended)
905 4.0x3,01,2.DN0+8.IMM16A+8.IMM16B:S2:::movbu
906 "movbu"
907 *mn10300
908
909 *am33
910
911 {
912   /* OP_340000 (); */
913   PC = cia;
914   State.regs[REG_D0 + DN0] = load_byte (FETCH16(IMM16A, IMM16B));
915 }
916
917
918 // 1111 1100 1010 10Dn abs32...; movbu (abs32),Dn
919 8.0xfc+4.0xa,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::movbu
920 "movbu"
921 *mn10300
922
923 *am33
924
925 {
926   /* OP_FCA80000 (); */
927   PC = cia;
928   State.regs[REG_D0 + DN0]
929     = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
930 }
931
932
933 // 1111 0000 0101 DmAn; movbu Dm,(An)
934 8.0xf0+4.0x5,2.DM1,2.AN0:D0b:::movbu
935 "movbu"
936 *mn10300
937
938 *am33
939
940 {
941   /* OP_F050 (); */
942   PC = cia;
943   store_byte (State.regs[REG_A0 + AN0], State.regs[REG_D0 + DM1]);
944 }
945
946
947 // 1111 1000 0101 DmAn d8......; movbu Dm,(d8,An) (d8 is sign-extended)
948 8.0xf8+4.0x5,2.DM1,2.AN0+8.D8:D1b:::movbu
949 "movbu"
950 *mn10300
951
952 *am33
953
954 {
955   /* OP_F85000 (); */
956   PC = cia;
957   store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
958               State.regs[REG_D0 + DM1]);
959 }
960
961
962 // 1111 1010 0101 DmAn d16.....; movbu Dm,(d16,An) (d16 is sign-extended.)
963 8.0xfa+4.0x5,2.DM1,2.AN0+8.D16A+8.D16B:D2b:::movbu
964 "movbu"
965 *mn10300
966
967 *am33
968
969 {
970   /* OP_FA500000 (); */
971   PC = cia;
972   store_byte ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
973               State.regs[REG_D0 + DM1]);
974 }
975
976
977 // 1111 1100 0101 DmAn d32.....; movbu Dm,(d32,An)
978 8.0xfc+4.0x5,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::movbu
979 "movbu"
980 *mn10300
981
982 *am33
983
984 {
985   /* OP_FC500000 (); */
986   PC = cia;
987   store_byte ((State.regs[REG_A0 + AN0]
988                + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
989               State.regs[REG_D0 + DM1]);
990 }
991
992
993 // 1111 1000 1001 Dm10 d8......; movbu Dm,(d8,SP) (d8 is zero-extended)
994 8.0xf8+4.0x9,2.DM1,10+8.D8:D1c:::movbu
995 "movbu"
996 *mn10300
997
998 *am33
999
1000 {
1001   /* OP_F89200 (); */
1002   PC = cia;
1003   store_byte (State.regs[REG_SP] + (D8), State.regs[REG_D0 + DM1]);
1004 }
1005
1006
1007 // 1111 1010 1001 Dm10 d16.....; movbu Dm,(d16,SP) (d16 is zero-extended.)
1008 8.0xfa+4.0x9,2.DM1,10+8.IMM16A+8.IMM16B:D2c:::movbu
1009 "movbu"
1010 *mn10300
1011
1012 *am33
1013
1014 {
1015   /* OP_FA920000 (); */
1016   PC = cia;
1017   store_byte (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
1018               State.regs[REG_D0 + DM1]);
1019 }
1020
1021
1022 // 1111 1100 1001 Dm10 d32.....; movbu Dm,(d32,SP)
1023 8.0xfc+4.0x9,2.DM1,10+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::movbu
1024 "movbu"
1025 *mn10300
1026
1027 *am33
1028
1029 {
1030   /* OP_FC920000 (); */
1031   PC = cia;
1032   store_byte (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1033               State.regs[REG_D0 + DM1]);
1034 }
1035
1036
1037 // 1111 0100 01Dm DiAn; movbu Dm,(Di,An)
1038 8.0xf4+01,2.DM2,2.DI,2.AN0:D0c:::movbu
1039 "movbu"
1040 *mn10300
1041
1042 *am33
1043
1044 {
1045   /* OP_F440 (); */
1046   PC = cia;
1047   store_byte ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
1048               State.regs[REG_D0 + DM2]);
1049 }
1050
1051
1052 // 0000 Dm10 abs16...; movbu Dm,(abs16) (abs16 is zero-extended)
1053 4.0x0,2.DM1,10+8.IMM16A+8.IMM16B:S2a:::movbu
1054 "movbu"
1055 *mn10300
1056
1057 *am33
1058
1059 {
1060   /* OP_20000 (); */
1061   PC = cia;
1062   store_byte (FETCH16(IMM16A, IMM16B),
1063               State.regs[REG_D0 + DM1]);
1064 }
1065
1066
1067 // 1111 1100 1000 Dm10 abs32...; movbu Dm,(abs32)
1068 8.0xfc+4.0x8,2.DM1,10+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::movbu
1069 "movbu"
1070 *mn10300
1071
1072 *am33
1073
1074 {
1075   /* OP_FC820000 (); */
1076   PC = cia;
1077   store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1078               State.regs[REG_D0 + DM1]);
1079 }
1080
1081
1082 // 1111 0000 0110 DnAm; movhu (Am),Dn
1083 8.0xf0+4.0x6,2.DN1,2.AM0:D0:::movhu
1084 "movhu"
1085 *mn10300
1086
1087 *am33
1088
1089 {
1090   /* OP_F060 (); */
1091   PC = cia;
1092   State.regs[REG_D0 + DN1]
1093     = load_half (State.regs[REG_A0 + AM0]);
1094 }
1095
1096
1097 // 1111 1000 0110 DnAm d8......; movhu (d8,Am),Dn (d8 is sign-extended)
1098 8.0xf8+4.0x6,2.DN1,2.AM0+8.D8:D1d:::movhu
1099 "movhu"
1100 *mn10300
1101
1102 *am33
1103
1104 {
1105   /* OP_F86000 (); */
1106   PC = cia;
1107   State.regs[REG_D0 + DN1]
1108     = load_half ((State.regs[REG_A0 + AM0] + EXTEND8 (D8)));
1109 }
1110
1111
1112 // 1111 1010 0110 DnAm d16.....; movhu (d16,Am),Dn (d16 is sign-extended.)
1113 8.0xfa+4.0x6,2.DN1,2.AM0+8.D16A+8.D16B:D2:::movhu
1114 "movhu"
1115 *mn10300
1116
1117 *am33
1118
1119 {
1120   /* OP_FA600000 (); */
1121   PC = cia;
1122   State.regs[REG_D0 + DN1]
1123     = load_half ((State.regs[REG_A0 + AM0]
1124                   + EXTEND16 (FETCH16(D16A, D16B))));
1125 }
1126
1127
1128 // 1111 1100 0110 DnAm d32.....; movhu (d32,Am),Dn
1129 8.0xfc+4.0x6,2.DN1,2.AM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::movhu
1130 "movhu"
1131 *mn10300
1132
1133 *am33
1134
1135 {
1136   /* OP_FC600000 (); */
1137   PC = cia;
1138   State.regs[REG_D0 + DN1]
1139     = load_half ((State.regs[REG_A0 + AM0]
1140                   + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
1141 }
1142
1143
1144 // 1111 1000 1011 11Dn d8.....; movhu (d8,SP),Dn (d8 is zero-extended)
1145 8.0xf8+4.0xb,11,2.DN0+8.D8:D1a:::movhu
1146 "movhu"
1147 *mn10300
1148
1149 *am33
1150
1151 {
1152   /* OP_F8BC00 (); */
1153   PC = cia;
1154   State.regs[REG_D0 + DN0]
1155     = load_half ((State.regs[REG_SP] + (D8)));
1156 }
1157
1158
1159 // 1111 1010 1011 11Dn d16.....; movhu (d16,SP),Dn (d16 is zero-extended.)
1160 8.0xfa+4.0xb,11,2.DN0+8.IMM16A+8.IMM16B:D2a:::movhu
1161 "movhu"
1162 *mn10300
1163
1164 *am33
1165
1166 {
1167   /* OP_FABC0000 (); */
1168   PC = cia;
1169   State.regs[REG_D0 + DN0]
1170     = load_half ((State.regs[REG_SP] + FETCH16(IMM16A, IMM16B)));
1171 }
1172
1173
1174 // 1111 1100 1011 11Dn d32.....; movhu (d32,SP),Dn
1175 8.0xfc+4.0xb,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::movhu
1176 "movhu"
1177 *mn10300
1178
1179 *am33
1180
1181 {
1182   /* OP_FCBC0000 (); */
1183   PC = cia;
1184   State.regs[REG_D0 + DN0]
1185     = load_half (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
1186 }
1187
1188
1189 // 1111 0100 10Dn DiAm; movhu (Di,Am),Dn
1190 8.0xf4+10,2.DN2,2.DI,2.AM0:D0a:::movhu
1191 "movhu"
1192 *mn10300
1193
1194 *am33
1195
1196 {
1197   /* OP_F480 (); */
1198   PC = cia;
1199   State.regs[REG_D0 + DN2]
1200     = load_half ((State.regs[REG_A0 + AM0] + State.regs[REG_D0 + DI]));
1201 }
1202
1203
1204 // 0011 10Dn abs16...; movhu (abs16),Dn (abs16 is zero-extended)
1205 4.0x3,10,2.DN0+8.IMM16A+8.IMM16B:S2:::movhu
1206 "movhu"
1207 *mn10300
1208
1209 *am33
1210
1211 {
1212   /* OP_380000 (); */
1213   PC = cia;
1214   State.regs[REG_D0 + DN0] = load_half (FETCH16(IMM16A, IMM16B));
1215 }
1216
1217
1218 // 1111 1100 1010 11Dn abs32...; movhu (abs32),Dn
1219 8.0xfc+4.0xa,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::movhu
1220 "movhu"
1221 *mn10300
1222
1223 *am33
1224
1225 {
1226   /* OP_FCAC0000 (); */
1227   PC = cia;
1228   State.regs[REG_D0 + DN0]
1229     = load_half (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
1230 }
1231
1232
1233 // 1111 0000 0111 DmAn; movhu Dm,(An)
1234 8.0xf0+4.0x7,2.DM1,2.AN0:D0b:::movhu
1235 "movhu"
1236 *mn10300
1237
1238 *am33
1239
1240 {
1241   /* OP_F070 (); */
1242   PC = cia;
1243   store_half (State.regs[REG_A0 + AN0],
1244               State.regs[REG_D0 + DM1]);
1245 }
1246
1247
1248 // 1111 1000 0111 DmAn d8......; movhu Dm,(d8,An) (d8 is sign-extended)
1249 8.0xf8+4.0x7,2.DM1,2.AN0+8.D8:D1b:::movhu
1250 "movhu"
1251 *mn10300
1252
1253 *am33
1254
1255 {
1256   /* OP_F87000 (); */
1257   PC = cia;
1258   store_half ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)),
1259               State.regs[REG_D0 + DM1]);
1260 }
1261
1262
1263 // 1111 1010 0111 DnAm d16.....; movhu Dm,(d16,An) (d16 is sign-extended.)
1264 8.0xfa+4.0x7,2.DM1,2.AN0+8.D16A+8.D16B:D2b:::movhu
1265 "movhu"
1266 *mn10300
1267
1268 *am33
1269
1270 {
1271   /* OP_FA700000 (); */
1272   PC = cia;
1273   store_half ((State.regs[REG_A0 + AN0] + EXTEND16 (FETCH16(D16A, D16B))),
1274               State.regs[REG_D0 + DM1]);
1275 }
1276
1277
1278 // 1111 1100 0111 DmAn d32.....; movhu Dm,(d32,An)
1279 8.0xfc+4.0x7,2.DM1,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4c:::movhu
1280 "movhu"
1281 *mn10300
1282
1283 *am33
1284
1285 {
1286   /* OP_FC700000 (); */
1287   PC = cia;
1288   store_half ((State.regs[REG_A0 + AN0]
1289                + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)),
1290               State.regs[REG_D0 + DM1]);
1291 }
1292
1293
1294 // 1111 1000 1001 Dm11 d8....; movhu Dm,(d8,SP) (d8 is zero-extended)
1295 8.0xf8+4.0x9,2.DM1,11+8.D8:D1c:::movhu
1296 "movhu"
1297 *mn10300
1298
1299 *am33
1300
1301 {
1302   /* OP_F89300 (); */
1303   PC = cia;
1304   store_half (State.regs[REG_SP] + (D8),
1305               State.regs[REG_D0 + DM1]);
1306 }
1307
1308
1309 // 1111 1010 1001 Dm11 d16.....; movhu Dm,(d16,SP) (d16 is zero-extended.)
1310 8.0xfa+4.0x9,2.DM1,11+8.IMM16A+8.IMM16B:D2c:::movhu
1311 "movhu"
1312 *mn10300
1313
1314 *am33
1315
1316 {
1317   /* OP_FA930000 (); */
1318   PC = cia;
1319   store_half (State.regs[REG_SP] + FETCH16(IMM16A, IMM16B),
1320               State.regs[REG_D0 + DM1]);
1321 }
1322
1323
1324 // 1111 1100 1001 Dm11 d32.....; movhu Dm,(d32,SP)
1325 8.0xfc+4.0x9,2.DM1,11+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4d:::movhu
1326 "movhu"
1327 *mn10300
1328
1329 *am33
1330
1331 {
1332   /* OP_FC930000 (); */
1333   PC = cia;
1334   store_half (State.regs[REG_SP] + FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1335               State.regs[REG_D0 + DM1]);
1336 }
1337
1338
1339 // 1111 0100 11Dm DiAn; movhu Dm,(Di,An)
1340 8.0xf4+11,2.DM2,2.DI,2.AN0:D0c:::movhu
1341 "movhu"
1342 *mn10300
1343
1344 *am33
1345
1346 {
1347   /* OP_F4C0 (); */
1348   PC = cia;
1349   store_half ((State.regs[REG_A0 + AN0] + State.regs[REG_D0 + DI]),
1350               State.regs[REG_D0 + DM2]);
1351 }
1352
1353
1354 // 0000 Dm11 abs16...; movhu Dm,(abs16) (abs16 is zero-extended)
1355 4.0x0,2.DM1,11+8.IMM16A+8.IMM16B:S2a:::movhu
1356 "movhu"
1357 *mn10300
1358
1359 *am33
1360
1361 {
1362   /* OP_30000 (); */
1363   PC = cia;
1364   store_half (FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DM1]);
1365 }
1366
1367
1368 // 1111 1100 1000 Dm11 abs32...; movhu Dm,(abs32)
1369 8.0xfc+4.0x8,2.DM1,11+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4e:::movhu
1370 "movhu"
1371 *mn10300
1372
1373 *am33
1374
1375 {
1376   /* OP_FC830000 (); */
1377   PC = cia;
1378   store_half (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
1379               State.regs[REG_D0 + DM1]);
1380 }
1381
1382
1383 // 1111 0010 1101 00Dn; ext Dn
1384 8.0xf2+4.0xd,00,2.DN0:D0:::ext
1385 "ext"
1386 *mn10300
1387
1388 *am33
1389
1390 {
1391   /* OP_F2D0 (); */
1392   PC = cia;
1393   if (State.regs[REG_D0 + DN0] & 0x80000000)
1394     State.regs[REG_MDR] = -1;
1395   else
1396     State.regs[REG_MDR] = 0;
1397 }
1398
1399
1400 // 0001 00Dn; extb Dn
1401 4.0x1,00,2.DN0:S0:::extb
1402 "extb"
1403 *mn10300
1404
1405 *am33
1406
1407 {
1408   /* OP_10 (); */
1409   PC = cia;
1410   State.regs[REG_D0 + DN0] = EXTEND8 (State.regs[REG_D0 + DN0]);
1411 }
1412
1413
1414 // 0001 01Dn; extbu Dn
1415 4.0x1,01,2.DN0:S0:::extbu
1416 "extbu"
1417 *mn10300
1418
1419 *am33
1420
1421 {
1422   /* OP_14 (); */
1423   PC = cia;
1424   State.regs[REG_D0 + DN0] &= 0xff;
1425 }
1426
1427
1428 // 0001 10Dn; exth Dn
1429 4.0x1,10,2.DN0:S0:::exth
1430 "exth"
1431 *mn10300
1432
1433 *am33
1434
1435 {
1436   /* OP_18 (); */
1437   PC = cia;
1438   State.regs[REG_D0 + DN0] = EXTEND16 (State.regs[REG_D0 + DN0]);
1439 }
1440
1441
1442 // 0001 11Dn; exthu Dn
1443 4.0x1,11,2.DN0:S0:::exthu
1444 "exthu"
1445 *mn10300
1446
1447 *am33
1448
1449 {
1450   /* OP_1C (); */
1451   PC = cia;
1452   State.regs[REG_D0 + DN0] &= 0xffff;
1453 }
1454
1455
1456 // 0000 Dn00; clr Dn
1457 4.0x0,2.DN1,00:S0:::clr
1458 "clr"
1459 *mn10300
1460
1461 *am33
1462
1463 {
1464   /* OP_0 (); */
1465   PC = cia;
1466   State.regs[REG_D0 + DN1] = 0;
1467
1468   PSW |= PSW_Z;
1469   PSW &= ~(PSW_V | PSW_C | PSW_N);
1470 }
1471
1472
1473 // 1110 DmDn; add Dm,Dn
1474 4.0xe,2.DM1,2.DN0:S0:::add
1475 "add"
1476 *mn10300
1477
1478 *am33
1479
1480 {
1481   /* OP_E0 (); */
1482   PC = cia;
1483   genericAdd(State.regs[REG_D0 + DM1], REG_D0 + DN0);
1484 }
1485
1486 // 1111 0001 0110 DmAn; add Dm,An
1487 8.0xf1+4.0x6,2.DM1,2.AN0:D0:::add
1488 "add"
1489 *mn10300
1490
1491 *am33
1492
1493 {
1494   /* OP_F160 (); */
1495   PC = cia;
1496   genericAdd(State.regs[REG_D0 + DM1], REG_A0 + AN0);
1497 }
1498
1499
1500 // 1111 0001 0101 AmDn; add Am,Dn
1501 8.0xf1+4.0x5,2.AM1,2.DN0:D0a:::add
1502 "add"
1503 *mn10300
1504
1505 *am33
1506
1507 {
1508   /* OP_F150 (); */
1509   PC = cia;
1510   genericAdd(State.regs[REG_A0 + AM1], REG_D0 + DN0);
1511 }
1512
1513
1514 // 1111 0001 0111 AmAn; add Am,An
1515 8.0xf1+4.0x7,2.AM1,2.AN0:D0b:::add
1516 "add"
1517 *mn10300
1518
1519 *am33
1520
1521 {
1522   /* OP_F170 (); */
1523   PC = cia;
1524   genericAdd(State.regs[REG_A0 + AM1], REG_A0 + AN0);
1525 }
1526
1527
1528 // 0010 10Dn imm8....; add imm8,Dn (imm8 is sign-extended)
1529 4.0x2,10,2.DN0+8.IMM8:S1:::add
1530 "add"
1531 *mn10300
1532
1533 *am33
1534
1535 {
1536   /* OP_2800 (); */
1537   PC = cia;
1538   genericAdd(EXTEND8(IMM8), REG_D0 + DN0);
1539 }
1540
1541
1542 // 1111 1010 1100 00Dn imm16...; add imm16,Dn
1543 8.0xfa+4.0xc,00,2.DN0+8.IMM16A+8.IMM16B:D2:::add
1544 "add"
1545 *mn10300
1546
1547 *am33
1548
1549 {
1550   /* OP_FAC00000 (); */
1551   PC = cia;
1552   genericAdd(EXTEND16(FETCH16(IMM16A, IMM16B)), REG_D0 + DN0);
1553 }
1554
1555
1556 // 1111 1100 1100 00Dn imm32...; add imm32,Dn
1557 8.0xfc+4.0xc,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::add
1558 "add"
1559 *mn10300
1560
1561 *am33
1562
1563 {
1564   /* OP_FCC00000 (); */
1565   PC = cia;
1566   genericAdd(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
1567 }
1568
1569
1570 // 0010 00An imm8....; add imm8,An (imm8 is sign-extended)
1571 4.0x2,00,2.AN0+8.IMM8:S1a:::add
1572 "add"
1573 *mn10300
1574
1575 *am33
1576
1577 {
1578   /* OP_2000 (); */
1579   PC = cia;
1580   genericAdd(EXTEND8(IMM8), REG_A0 + AN0);
1581 }
1582
1583
1584 // 1111 1010 1101 00An imm16...; add imm16,An (imm16 is sign-extended.)
1585 8.0xfa+4.0xd,00,2.AN0+8.IMM16A+8.IMM16B:D2a:::add
1586 "add"
1587 *mn10300
1588
1589 *am33
1590
1591 {
1592   /* OP_FAD00000 (); */
1593   PC = cia;
1594   genericAdd(EXTEND16(FETCH16(IMM16A, IMM16B)), REG_A0 + AN0);
1595 }
1596
1597
1598 // 1111 1100 1101 00An imm32...; add imm32,An
1599 8.0xfc+4.0xd,00,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::add
1600 "add"
1601 *mn10300
1602
1603 *am33
1604
1605 {
1606   /* OP_FCD00000 (); */
1607   PC = cia;
1608   genericAdd(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_A0 + AN0);
1609 }
1610
1611
1612 // 1111 1000 1111 1110 imm8....; add imm8,SP (imm8 is sign-extended.)
1613 8.0xf8+8.0xfe+8.IMM8:D1:::add
1614 "add"
1615 *mn10300
1616
1617 *am33
1618
1619 {
1620   /* OP_F8FE00 (); */
1621   unsigned32 imm;
1622
1623   /* Note: no PSW changes. */
1624   PC = cia;
1625   imm = EXTEND8 (IMM8);
1626   State.regs[REG_SP] += imm;
1627 }
1628
1629
1630 // 1111 1010 1111 1110 imm16...; add imm16,SP (imm16 is sign-extended.)
1631 8.0xfa+8.0xfe+8.IMM16A+8.IMM16B:D2b:::add
1632 "add"
1633 *mn10300
1634
1635 *am33
1636
1637 {
1638   /* OP_FAFE0000 (); */
1639   unsigned32 imm;
1640
1641   /* Note: no PSW changes. */
1642   PC = cia;
1643   imm = EXTEND16 (FETCH16(IMM16A, IMM16B));
1644   State.regs[REG_SP] += imm;
1645 }
1646
1647
1648 // 1111 1100 1111 1110 imm32...; add imm32,SP
1649 8.0xfc+8.0xfe+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4b:::add
1650 "add"
1651 *mn10300
1652
1653 *am33
1654
1655 {
1656   /* OP_FCFE0000 (); */
1657   unsigned32 imm;
1658
1659   /* Note: no PSW changes. */
1660   PC = cia;
1661   imm = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
1662   State.regs[REG_SP] += imm;
1663 }
1664
1665
1666 // 1111 0001 0100 DmDn; addc Dm,Dn
1667 8.0xf1+4.0x4,2.DM1,2.DN0:D0:::addc
1668 "addc"
1669 *mn10300
1670
1671 *am33
1672
1673 {
1674   /* OP_F140 (); */
1675   int z, c, n, v;
1676   unsigned32 reg1, reg2, sum;
1677
1678   PC = cia;
1679   reg1 = State.regs[REG_D0 + DM1];
1680   reg2 = State.regs[REG_D0 + DN0];
1681   sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
1682   State.regs[REG_D0 + DN0] = sum;
1683
1684   z = ((PSW & PSW_Z) != 0) && (sum == 0);
1685   n = (sum & 0x80000000);
1686   c = (sum < reg1) || (sum < reg2);
1687   v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
1688        && (reg2 & 0x80000000) != (sum & 0x80000000));
1689
1690   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1691   PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1692           | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1693 }
1694
1695
1696 // 1111 0001 0000 DmDn; sub Dm,Dn
1697 8.0xf1+4.0x0,2.DM1,2.DN0:D0:::sub
1698 "sub"
1699 *mn10300
1700
1701 *am33
1702
1703 {
1704   /* OP_F100 (); */
1705   PC = cia;
1706   genericSub(State.regs[REG_D0 + DM1], REG_D0 + DN0);
1707 }
1708
1709 // 1111 0001 0010 DmAn; sub DmAn
1710 8.0xf1+4.0x2,2.DM1,2.AN0:D0a:::sub
1711 "sub"
1712 *mn10300
1713
1714 *am33
1715
1716 {
1717   /* OP_F120 (); */
1718   PC = cia;
1719   genericSub(State.regs[REG_D0 + DM1], REG_A0 + AN0);
1720 }
1721
1722
1723 // 1111 0001 0001 AmDn; sub AmDn
1724 8.0xf1+4.0x1,2.AM1,2.DN0:D0b:::sub
1725 "sub"
1726 *mn10300
1727
1728 *am33
1729
1730 {
1731   /* OP_F110 (); */
1732   PC = cia;
1733   genericSub(State.regs[REG_A0 + AM1], REG_D0 + DN0);
1734 }
1735
1736
1737 // 1111 0001 0011 AmAn; sub Am,An
1738 8.0xf1+4.0x3,2.AM1,2.AN0:D0c:::sub
1739 "sub"
1740 *mn10300
1741
1742 *am33
1743
1744 {
1745   /* OP_F130 (); */
1746   PC = cia;
1747   genericSub(State.regs[REG_A0 + AM1], REG_A0 + AN0);
1748 }
1749
1750
1751 // 1111 1100 1100 01Dn imm32...; sub imm32,Dn
1752 8.0xfc+4.0xc,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::sub
1753 "sub"
1754 *mn10300
1755
1756 *am33
1757
1758 {
1759   /* OP_FCC40000 (); */
1760   PC = cia;
1761   genericSub(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
1762 }
1763
1764
1765 // 1111 1100 1101 01An imm32...; sub imm32,An
1766 8.0xfc+4.0xd,01,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::sub
1767 "sub"
1768 *mn10300
1769
1770 *am33
1771
1772 {
1773   /* OP_FCD40000 (); */
1774   PC = cia;
1775   genericSub(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_A0 + AN0);
1776 }
1777
1778
1779 // 1111 0001 1000 DmDn; subc Dm,Dn
1780 8.0xf1+4.0x8,2.DM1,2.DN0:D0:::subc
1781 "subc"
1782 *mn10300
1783
1784 *am33
1785
1786 {
1787   /* OP_F180 (); */
1788   int z, c, n, v;
1789   unsigned32 reg1, reg2, difference;
1790
1791   PC = cia;
1792   reg1 = State.regs[REG_D0 + DM1];
1793   reg2 = State.regs[REG_D0 + DN0];
1794   difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
1795   State.regs[REG_D0 + DN0] = difference;
1796
1797   z = ((PSW & PSW_Z) != 0) && (difference == 0);
1798   n = (difference & 0x80000000);
1799   c = (reg1 > reg2);
1800   v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1801        && (reg2 & 0x80000000) != (difference & 0x80000000));
1802
1803   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1804   PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1805           | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1806 }
1807
1808
1809 // 1111 0010 0100 DmDn; mul Dm,Dn
1810 8.0xf2+4.0x4,2.DM1,2.DN0:D0:::mul
1811 "mul"
1812 *mn10300
1813
1814 *am33
1815
1816 {
1817   /* OP_F240 (); */
1818   unsigned64 temp;
1819   int n, z;
1820
1821   PC = cia;
1822   temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
1823           *  (signed64)(signed32)State.regs[REG_D0 + DM1]);
1824   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1825   State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1826   z = (State.regs[REG_D0 + DN0] == 0);
1827   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1828   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1829   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1830 }
1831
1832
1833 // 1111 0010 0101 DmDn; mulu Dm,Dn
1834 8.0xf2+4.0x5,2.DM1,2.DN0:D0:::mulu
1835 "mulu"
1836 *mn10300
1837
1838 *am33
1839
1840 {
1841   /* OP_F250 (); */
1842   unsigned64 temp;
1843   int n, z;
1844
1845   PC = cia;
1846   temp = ((unsigned64)State.regs[REG_D0 + DN0]
1847           * (unsigned64)State.regs[REG_D0 + DM1]);
1848   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1849   State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1850   z = (State.regs[REG_D0 + DN0] == 0);
1851   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1852   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1853   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1854 }
1855
1856
1857 // 1111 0010 0110 DmDn; div Dm,Dn
1858 8.0xf2+4.0x6,2.DM1,2.DN0:D0:::div
1859 "div"
1860 *mn10300
1861
1862 *am33
1863
1864 {
1865   /* OP_F260 (); */
1866   signed64 temp;
1867   signed32 denom;
1868   int n, z, v;
1869
1870   PC = cia;
1871   denom = (signed32)State.regs[REG_D0 + DM1];
1872
1873   temp = State.regs[REG_MDR];
1874   temp <<= 32;
1875   temp |= State.regs[REG_D0 + DN0];
1876   if ( !(v = (0 == denom)) )
1877     {
1878       State.regs[REG_MDR] = temp % (signed32)State.regs[REG_D0 + DM1];
1879       temp /= (signed32)State.regs[REG_D0 + DM1];
1880       State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1881     }
1882   else
1883     {
1884       State.regs[REG_MDR] = temp;
1885       State.regs[REG_D0 + DN0] = 0xff;
1886     }
1887   z = (State.regs[REG_D0 + DN0] == 0);
1888   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1889   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1890   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (v ? PSW_V : 0));
1891 }
1892
1893
1894 // 1111 0010 0111 DmDn; divu Dm,Dn
1895 8.0xf2+4.0x7,2.DM1,2.DN0:D0:::divu
1896 "divu"
1897 *mn10300
1898
1899 *am33
1900
1901 {
1902   /* OP_F270 (); */
1903   unsigned64 temp;
1904   unsigned32 denom;
1905   int n, z, v;
1906
1907   PC = cia;
1908   denom = (unsigned32)State.regs[REG_D0 + DM1];
1909   temp = State.regs[REG_MDR];
1910   temp <<= 32;
1911   temp |= State.regs[REG_D0 + DN0];
1912   if ( !(v = (0 == denom)) ) 
1913     {
1914       State.regs[REG_MDR] = temp % State.regs[REG_D0 + DM1];
1915       temp /= State.regs[REG_D0 + DM1];
1916       State.regs[REG_D0 + DN0] = temp & 0xffffffff;
1917     }
1918   else
1919     {
1920       State.regs[REG_MDR] = temp;
1921       State.regs[REG_D0 + DN0] = 0xff;
1922     }
1923   z = (State.regs[REG_D0 + DN0] == 0);
1924   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
1925   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1926   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (v ? PSW_V : 0));
1927 }
1928
1929
1930 // 0100 Dn00; inc Dn
1931 4.0x4,2.DN1,00:S0:::inc
1932 "inc"
1933 *mn10300
1934
1935 *am33
1936
1937 {
1938   /* OP_40 (); */
1939   unsigned32 imm;
1940
1941   PC = cia;
1942   imm = 1;
1943   genericAdd(imm, REG_D0 + DN1);
1944 }
1945
1946
1947 // 0100 An01
1948 4.0x4,2.AN1,01:S0a:::inc
1949 "inc"
1950 *mn10300
1951
1952 *am33
1953
1954 {
1955   /* OP_41 (); */
1956   PC = cia;
1957   State.regs[REG_A0 + AN1] += 1;
1958 }
1959
1960
1961 // 0101 00An; inc4 An
1962 4.0x5,00,2.AN0:S0:::inc4
1963 "inc4"
1964 *mn10300
1965
1966 *am33
1967
1968 {
1969   /* OP_50 (); */
1970   PC = cia;
1971   State.regs[REG_A0 + AN0] += 4;
1972 }
1973
1974
1975 // 1010 DnDn imm8....; cmp imm8,Dn (imm8 is sign-extended.)
1976 4.0xa,2.DM1,2.DN0=DM1+IMM8:S0i:::cmp
1977 "cmp"
1978 *mn10300
1979
1980 *am33
1981
1982 {
1983   PC = cia;
1984   /* OP_A000 (); */
1985   genericCmp(EXTEND8 (IMM8), State.regs[REG_D0 + DN0]);
1986 }
1987
1988
1989 // 1010 DmDn; cmp Dm,Dn (Dm != Dn, see above when Dm == Dn)
1990 4.0xa,2.DM1,2.DN0!DM1:S0:::cmp
1991 "cmp"
1992 *mn10300
1993
1994 *am33
1995
1996 {
1997   PC = cia;
1998   /* OP_A0 (); */
1999   genericCmp(State.regs[REG_D0 + DM1], State.regs[REG_D0 + DN0]);
2000 }
2001
2002
2003 // 1111 0001 1010 DmAn; cmp Dm,An
2004 8.0xf1+4.0xa,2.DM1,2.AN0:D0:::cmp
2005 "cmp"
2006 *mn10300
2007
2008 *am33
2009
2010 {
2011   /* OP_F1A0 (); */
2012   PC = cia;
2013   genericCmp(State.regs[REG_D0 + DM1], State.regs[REG_A0 + AN0]);
2014 }
2015
2016
2017 // 1111 0001 1001 AmDn; cmp Am,Dn
2018 8.0xf1+4.0x9,2.AM1,2.DN0:D0a:::cmp
2019 "cmp"
2020 *mn10300
2021
2022 *am33
2023
2024 {
2025   /* OP_F190 (); */
2026   PC = cia;
2027   genericCmp(State.regs[REG_A0 + AM1], State.regs[REG_D0 + DN0]);
2028 }
2029
2030
2031 // 1011 AnAn imm8....; cmp imm8,An (imm8 is zero-extended.)
2032 4.0xb,2.AM1,2.AN0=AM1+IMM8:S0ai:::cmp
2033 "cmp"
2034 *mn10300
2035
2036 *am33
2037
2038 {
2039   PC = cia;
2040   /* OP_B000 (); */
2041   genericCmp(IMM8,
2042              State.regs[REG_A0 + AN0]);
2043 }
2044
2045
2046 // 1011 AmAn; cmp Am,An (Dm != Dn, see above when Dm == Dn)
2047 4.0xb,2.AM1,2.AN0!AM1:S0a:::cmp
2048 "cmp"
2049 *mn10300
2050
2051 *am33
2052
2053 {
2054   PC = cia;
2055   /* OP_B0 (); */
2056   genericCmp(State.regs[REG_A0 + AM1], State.regs[REG_A0 + AN0]);
2057 }
2058
2059
2060 // 1111 1010 1100 10Dn imm16...; cmp imm16,Dn (imm16 is sign-extended.)
2061 8.0xfa+4.0xc,10,2.DN0+8.IMM16A+8.IMM16B:D2:::cmp
2062 "cmp"
2063 *mn10300
2064
2065 *am33
2066
2067 {
2068   /* OP_FAC80000 (); */
2069   PC = cia;
2070   genericCmp(EXTEND16(FETCH16(IMM16A, IMM16B)),
2071              State.regs[REG_D0 + DN0]);
2072 }
2073
2074
2075 // 1111 1100 1100 10Dn imm32...; cmp imm32,Dn
2076 8.0xfc+4.0xc,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::cmp
2077 "cmp"
2078 *mn10300
2079
2080 *am33
2081
2082 {
2083   /* OP_FCC80000 (); */
2084   PC = cia;
2085   genericCmp(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2086              State.regs[REG_D0 + DN0]);
2087 }
2088
2089
2090 // 1111 1010 1101 10An imm16...; cmp imm16,An (imm16 is zero-extended.)
2091 8.0xfa+4.0xd,10,2.AN0+8.IMM16A+8.IMM16B:D2a:::cmp
2092 "cmp"
2093 *mn10300
2094
2095 *am33
2096
2097 {
2098   /* OP_FAD80000 (); */
2099   PC = cia;
2100   genericCmp(FETCH16(IMM16A, IMM16B),
2101              State.regs[REG_A0 + AN0]);
2102 }
2103
2104
2105 // 1111 1100 1101 10An imm32...; cmp imm32,An
2106 8.0xfc+4.0xd,10,2.AN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::cmp
2107 "cmp"
2108 *mn10300
2109
2110 *am33
2111
2112 {
2113   /* OP_FCD80000 (); */
2114   PC = cia;
2115   genericCmp(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2116              State.regs[REG_A0 + AN0]);
2117 }
2118
2119
2120 // 1111 0010 0000 DmDn; and Dm,Dn
2121 8.0xf2+4.0x0,2.DM1,2.DN0:D0:::and
2122 "and"
2123 *mn10300
2124
2125 *am33
2126
2127 {
2128   /* OP_F200 (); */
2129   int n, z;
2130
2131   PC = cia;
2132   State.regs[REG_D0 + DN0] &= State.regs[REG_D0 + DM1];
2133   z = (State.regs[REG_D0 + DN0] == 0);
2134   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2135   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2136   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2137 }
2138
2139
2140 // 1111 1000 1110 00Dn imm8....; and imm8,Dn (imm8 is zero-extended.)
2141 8.0xf8+4.0xe,00,2.DN0+8.IMM8:D1:::and
2142 "and"
2143 *mn10300
2144
2145 *am33
2146
2147 {
2148   /* OP_F8E000 (); */
2149   int n, z;
2150
2151   PC = cia;
2152   State.regs[REG_D0 + DN0] &= IMM8;
2153   z = (State.regs[REG_D0 + DN0] == 0);
2154   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2155   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2156   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2157 }
2158
2159
2160 // 1111 1010 1110 00Dn imm16...; and imm16,Dn (imm16 is zero-extended.)
2161 8.0xfa+4.0xe,00,2.DN0+8.IMM16A+8.IMM16B:D2:::and
2162 "and"
2163 *mn10300
2164
2165 *am33
2166
2167 {
2168   /* OP_FAE00000 (); */
2169   int n, z;
2170
2171   PC = cia;
2172   State.regs[REG_D0 + DN0] &= FETCH16(IMM16A, IMM16B);
2173   z = (State.regs[REG_D0 + DN0] == 0);
2174   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2175   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2176   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2177 }
2178
2179
2180 // 1111 1100 1110 00Dn imm32...; and imm32,Dn
2181 8.0xfc+4.0xe,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::and
2182 "and"
2183 *mn10300
2184
2185 *am33
2186
2187 {
2188   /* OP_FCE00000 (); */
2189   int n, z;
2190
2191   PC = cia;
2192   State.regs[REG_D0 + DN0]
2193     &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
2194   z = (State.regs[REG_D0 + DN0] == 0);
2195   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2196   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2197   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2198 }
2199
2200
2201 // 1111 1010 1111 1100 imm16...; and imm16,PSW (imm16 is zero-extended.)
2202 8.0xfa+8.0xfc+8.IMM16A+8.IMM16B:D2a:::and
2203 "and"
2204 *mn10300
2205
2206 *am33
2207
2208 {
2209   /* OP_FAFC0000 (); */
2210   PC = cia;
2211   PSW &= FETCH16(IMM16A, IMM16B);
2212 }
2213
2214
2215
2216 // 1111 0010 0001 DmDn; or DmDn
2217 8.0xf2+4.0x1,2.DM1,2.DN0:D0:::or
2218 "or"
2219 *mn10300
2220
2221 *am33
2222
2223 {
2224   /* OP_F210 (); */
2225   PC = cia;
2226   genericOr(State.regs[REG_D0 + DM1], REG_D0 + DN0);
2227 }
2228
2229
2230 // 1111 1000 1110 01Dn imm8....; or imm8,Dn (imm8 is zero-extended.)n
2231 8.0xf8+4.0xe,01,2.DN0+8.IMM8:D1:::or
2232 "or"
2233 *mn10300
2234
2235 *am33
2236
2237 {
2238   /* OP_F8E400 (); */
2239   PC = cia;
2240   genericOr(IMM8, REG_D0 + DN0);
2241 }
2242
2243
2244 // 1111 1010 1110 01Dn imm16...; or imm16,DN (imm16 is zero-extended.)
2245 8.0xfa+4.0xe,01,2.DN0+8.IMM16A+8.IMM16B:D2:::or
2246 "or"
2247 *mn10300
2248
2249 *am33
2250
2251 {
2252   /* OP_FAE40000 (); */
2253   PC = cia;
2254   genericOr(FETCH16(IMM16A, IMM16B), REG_D0 + DN0);
2255 }
2256
2257
2258 // 1111 1100 1110 01Dn imm32...; or imm32,Dn
2259 8.0xfc+4.0xe,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::or
2260 "or"
2261 *mn10300
2262
2263 *am33
2264
2265 {
2266   /* OP_FCE40000 (); */
2267   PC = cia;
2268   genericOr(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
2269 }
2270
2271
2272 // 1111 1010 1111 1101 imm16...; or imm16,PSW (imm16 is zero-extended.)
2273 8.0xfa+8.0xfd+8.IMM16A+8.IMM16B:D2a:::or
2274 "or"
2275 *mn10300
2276
2277 *am33
2278
2279 {
2280   /* OP_FAFD0000 (); */
2281   PC = cia;
2282   PSW |= FETCH16(IMM16A, IMM16B);
2283 }
2284
2285
2286 // 1111 0010 0010 DmDn; xor Dm,Dn
2287 8.0xf2+4.0x2,2.DM1,2.DN0:D0:::xor
2288 "xor"
2289 *mn10300
2290
2291 *am33
2292
2293 {
2294   /* OP_F220 (); */
2295   PC = cia;
2296   genericXor(State.regs[REG_D0 + DM1], REG_D0 + DN0);
2297 }
2298
2299
2300 // 1111 1010 1110 10Dn imm16...; xor imm16,Dn (imm16 is zero-extended.)
2301 8.0xfa+4.0xe,10,2.DN0+8.IMM16A+8.IMM16B:D2:::xor
2302 "xor"
2303 *mn10300
2304
2305 *am33
2306
2307 {
2308   /* OP_FAE80000 (); */
2309   PC = cia;
2310   genericXor(FETCH16(IMM16A, IMM16B), REG_D0 + DN0);
2311 }
2312
2313
2314 // 1111 1100 1110 10Dn imm32...; xor imm32,Dn
2315 8.0xfc+4.0xe,10,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::xor
2316 "xor"
2317 *mn10300
2318
2319 *am33
2320
2321 {
2322   /* OP_FCE80000 (); */
2323   PC = cia;
2324   genericXor(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), REG_D0 + DN0);
2325 }
2326
2327
2328 // 1111 0010 0011 00Dn; not Dn
2329 8.0xf2+4.0x3,00,2.DN0:D0:::not
2330 "not"
2331 *mn10300
2332
2333 *am33
2334
2335 {
2336   /* OP_F230 (); */
2337   int n, z;
2338
2339   PC = cia;
2340   State.regs[REG_D0 + DN0] = ~State.regs[REG_D0 + DN0];
2341   z = (State.regs[REG_D0 + DN0] == 0);
2342   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2343   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2344   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2345 }
2346
2347
2348 // 1111 1000 1110 11Dn imm8....; btst imm8,Dn (imm8 is zero-extended.)
2349 8.0xf8+4.0xe,11,2.DN0+8.IMM8:D1:::btst
2350 "btst"
2351 *mn10300
2352
2353 *am33
2354
2355 {
2356   /* OP_F8EC00 (); */
2357   PC = cia;
2358   genericBtst(IMM8, State.regs[REG_D0 + DN0]);
2359 }
2360
2361
2362 // 1111 1010 1110 11Dn imm16.....; btst imm16,Dn (imm16 is zero-extended.)
2363 8.0xfa+4.0xe,11,2.DN0+8.IMM16A+8.IMM16B:D2:::btst
2364 "btst"
2365 *mn10300
2366
2367 *am33
2368
2369 {
2370   /* OP_FAEC0000 (); */
2371   PC = cia;
2372   genericBtst(FETCH16(IMM16A, IMM16B), State.regs[REG_D0 + DN0]);
2373 }
2374
2375
2376 // 1111 1100 1110 11Dn imm32...; btst imm32,Dn
2377 8.0xfc+4.0xe,11,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::btst
2378 "btst"
2379 *mn10300
2380
2381 *am33
2382
2383 {
2384   /* OP_FCEC0000 (); */
2385   PC = cia;
2386   genericBtst(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D),
2387               State.regs[REG_D0 + DN0]);
2388 }
2389
2390
2391 // 1111 1110 0000 0010 abs32... imm8....; btst imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2392 8.0xfe+8.0x02+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::btst
2393 "btst"
2394 *mn10300
2395
2396 *am33
2397
2398 {
2399   /* OP_FE020000 (); */
2400   PC = cia;
2401   genericBtst(IMM8,
2402               load_byte(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
2403 }
2404
2405
2406 // 1111 1010 1111 10An d8...... imm8....; 
2407 // btst imm8,(d8,An) (d8 is sign-extended,imm8 is zero-extended., processing unit: byte)
2408 8.0xfa+4.0xf,10,2.AN0+8.D8+8.IMM8:D2a:::btst
2409 "btst"
2410 *mn10300
2411
2412 *am33
2413
2414 {
2415   /* OP_FAF80000 (); */
2416   PC = cia;
2417   genericBtst(IMM8,
2418               load_byte(State.regs[REG_A0 + AN0] + EXTEND8(D8)));
2419 }
2420
2421
2422 // 1111 0000 1000 DmAn; bset Dm,(An) (Processing unit byte)
2423 8.0xf0+4.8,2.DM1,2.AN0:D0:::bset
2424 "bset"
2425 *mn10300
2426
2427 *am33
2428
2429 {
2430   /* OP_F080 (); */
2431   unsigned32 temp;
2432   int z;
2433
2434   PC = cia;
2435   temp = load_byte (State.regs[REG_A0 + AN0]);
2436   z = (temp & State.regs[REG_D0 + DM1]) == 0;
2437   temp |= State.regs[REG_D0 + DM1];
2438   store_byte (State.regs[REG_A0 + AN0], temp);
2439   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2440   PSW |= (z ? PSW_Z : 0);
2441 }
2442
2443
2444 // 1111 1110 0000 0000 abs32... imm8....;
2445 // bset imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2446 8.0xfe+8.0x00+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::bset
2447 "bset"
2448 *mn10300
2449
2450 *am33
2451
2452 {
2453   /* OP_FE000000 (); */
2454   unsigned32 temp;
2455   int z;
2456
2457   PC = cia;
2458   temp = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
2459   z = (temp & IMM8) == 0;
2460   temp |= IMM8;
2461   store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), temp);
2462   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2463   PSW |= (z ? PSW_Z : 0);
2464 }
2465
2466
2467 // 1111 1010 1111 00AnAn d8...... imm8....;
2468 // bset imm8,(d8,An) (d8 is sign-extended, imm8 is zero-extended., processing unit: byte)
2469 8.0xfa+4.0xf,00,2.AN0+8.D8+8.IMM8:D2:::bset
2470 "bset"
2471 *mn10300
2472
2473 *am33
2474
2475 {
2476   /* OP_FAF00000 (); */
2477   unsigned32 temp;
2478   int z;
2479
2480   PC = cia;
2481   temp = load_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)));
2482   z = (temp & (IMM8)) == 0;
2483   temp |= (IMM8);
2484   store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)), temp);
2485   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2486   PSW |= (z ? PSW_Z : 0);
2487 }
2488
2489
2490 // 1111 0000 1001 DmAn; bclr Dm,(An) (Processing unit byte)
2491 8.0xf0+4.0x9,2.DM1,2.AN0:D0:::bclr
2492 "bclr"
2493 *mn10300
2494
2495 *am33
2496
2497 {
2498   /* OP_F090 (); */
2499   unsigned32 temp;
2500   int z;
2501
2502   PC = cia;
2503   temp = load_byte (State.regs[REG_A0 + AN0]);
2504   z = (temp & State.regs[REG_D0 + DM1]) == 0;
2505   temp = temp & ~State.regs[REG_D0 + DM1];
2506   store_byte (State.regs[REG_A0 + AN0], temp);
2507   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2508   PSW |= (z ? PSW_Z : 0);
2509 }
2510
2511
2512 // 1111 1110 0000 0001 abs32... imm8....;
2513 // bclr imm8,(abs32) (imm8 is zero-extended., processing unit: byte)
2514 8.0xfe+8.0x01+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D+8.IMM8:D5:::bclr
2515 "bclr"
2516 *mn10300
2517
2518 *am33
2519
2520 {
2521   /* OP_FE010000 (); */
2522   unsigned32 temp;
2523   int z;
2524
2525   PC = cia;
2526   temp = load_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D));
2527   z = (temp & IMM8) == 0;
2528   temp = temp & ~(IMM8);
2529   store_byte (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), temp);
2530   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2531   PSW |= (z ? PSW_Z : 0);
2532 }
2533
2534
2535 // 1111 1010 1111 01An d8...... imm8....;
2536 // bclr imm8,(d8,An) (d8 is sign-extended, imm8 is zero-extended., processing unit: byte)
2537 8.0xfa+4.0xf,01,2.AN0+8.D8+8.IMM8:D2:::bclr
2538 "bclr"
2539 *mn10300
2540
2541 *am33
2542
2543 {
2544   /* OP_FAF40000 (); */
2545   unsigned32 temp;
2546   int z;
2547
2548   PC = cia;
2549   temp = load_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)));
2550   z = (temp & (IMM8)) == 0;
2551   temp = temp & ~(IMM8);
2552   store_byte ((State.regs[REG_A0 + AN0] + EXTEND8 (D8)), temp);
2553   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2554   PSW |= (z ? PSW_Z : 0);
2555 }
2556
2557
2558 // 1111 0010 1011 DmDn; asr Dm,Dn
2559 8.0xf2+4.0xb,2.DM1,2.DN0:D0:::asr
2560 "asr"
2561 *mn10300
2562
2563 *am33
2564
2565 {
2566   /* OP_F2B0 (); */
2567   signed32 temp;
2568   int z, n, c;
2569
2570   PC = cia;
2571   temp = State.regs[REG_D0 + DN0];
2572   c = temp & 1;
2573   temp >>= State.regs[REG_D0 + DM1];
2574   State.regs[REG_D0 + DN0] = temp;
2575   z = (State.regs[REG_D0 + DN0] == 0);
2576   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2577   PSW &= ~(PSW_Z | PSW_N | PSW_C);
2578   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2579 }
2580
2581
2582 // 1111 1000 1100 10Dn imm8...; asr imm8,Dn (imm8 is zero-extended.)
2583 8.0xf8+4.0xc,10,2.DN0+8.IMM8:D1:::asr
2584 "asr"
2585 *mn10300
2586
2587 *am33
2588
2589 {
2590   /* OP_F8C800 (); */
2591   signed32 temp;
2592   int z, n, c;
2593
2594   PC = cia;
2595   temp = State.regs[REG_D0 + DN0];
2596   c = temp & 1;
2597   temp >>= IMM8;
2598   State.regs[REG_D0 + DN0] = temp;
2599   z = (State.regs[REG_D0 + DN0] == 0);
2600   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2601   PSW &= ~(PSW_Z | PSW_N | PSW_C);
2602   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2603 }
2604
2605
2606 // 1111 0010 1010 DmDn; lsr Dm,Dn
2607 8.0xf2+4.0xa,2.DM1,2.DN0:D0:::lsr
2608 "lsr"
2609 *mn10300
2610
2611 *am33
2612
2613 {
2614   /* OP_F2A0 (); */
2615   int z, n, c;
2616
2617   PC = cia;
2618   c = State.regs[REG_D0 + DN0] & 1;
2619   State.regs[REG_D0 + DN0]
2620     >>= State.regs[REG_D0 + DM1];
2621   z = (State.regs[REG_D0 + DN0] == 0);
2622   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2623   PSW &= ~(PSW_Z | PSW_N | PSW_C);
2624   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2625 }
2626
2627
2628 // 1111 1000 1100 01Dn imm8...; lsr imm8,Dn (imm8 is zero-extended.)
2629 8.0xf8+4.0xc,01,2.DN0+8.IMM8:D1:::lsr
2630 "lsr"
2631 *mn10300
2632
2633 *am33
2634
2635 {
2636   /* OP_F8C400 (); */
2637   int z, n, c;
2638
2639   PC = cia;
2640   c = State.regs[REG_D0 + DN0] & 1;
2641   State.regs[REG_D0 + DN0] >>=  IMM8;
2642   z = (State.regs[REG_D0 + DN0] == 0);
2643   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2644   PSW &= ~(PSW_Z | PSW_N | PSW_C);
2645   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2646 }
2647
2648
2649 // 1111 0010 1001 DmDn; asl Dm,Dn
2650 8.0xf2+4.0x9,2.DM1,2.DN0:D0:::asl
2651 "asl"
2652 *mn10300
2653
2654 *am33
2655
2656 {
2657   /* OP_F290 (); */
2658   int n, z;
2659
2660   PC = cia;
2661   State.regs[REG_D0 + DN0]
2662     <<= State.regs[REG_D0 + DM1];
2663   z = (State.regs[REG_D0 + DN0] == 0);
2664   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2665   PSW &= ~(PSW_Z | PSW_N);
2666   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2667 }
2668
2669
2670 // 1111 1000 1100 00Dn imm8...; asl imm8,Dn (imm8 is zero-extended.)
2671 8.0xf8+4.0xc,00,2.DN0+8.IMM8:D1:::asl
2672 "asl"
2673 *mn10300
2674
2675 *am33
2676
2677 {
2678   /* OP_F8C000 (); */
2679   int n, z;
2680
2681   PC = cia;
2682   State.regs[REG_D0 + DN0] <<= IMM8;
2683   z = (State.regs[REG_D0 + DN0] == 0);
2684   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2685   PSW &= ~(PSW_Z | PSW_N);
2686   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2687 }
2688
2689
2690 // 0101 01Dn; als2 Dn
2691 4.0x5,01,2.DN0:S0:::asl2
2692 "asl2"
2693 *mn10300
2694
2695 *am33
2696
2697 {
2698   /* OP_54 (); */
2699   int n, z;
2700   PC = cia;
2701
2702   State.regs[REG_D0 + DN0] <<= 2;
2703   z = (State.regs[REG_D0 + DN0] == 0);
2704   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
2705   PSW &= ~(PSW_Z | PSW_N);
2706   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2707 }
2708
2709
2710 // 1111 0010 1000 01Dn; ror Dn
2711 8.0xf2+4.0x8,01,2.DN0:D0:::ror
2712 "ror"
2713 *mn10300
2714
2715 *am33
2716
2717 {
2718   /* OP_F284 (); */
2719   unsigned32 value;
2720   int c,n,z;
2721
2722   PC = cia;
2723   value = State.regs[REG_D0 + DN0];
2724   c = (value & 0x1);
2725
2726   value >>= 1;
2727   value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
2728   State.regs[REG_D0 + DN0] = value;
2729   z = (value == 0);
2730   n = (value & 0x80000000) != 0;
2731   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2732   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2733 }
2734
2735
2736 // 1111 0010 1000 00Dn; rol Dn
2737 8.0xf2+4.0x8,00,2.DN0:D0:::rol
2738 "rol"
2739 *mn10300
2740
2741 *am33
2742
2743 {
2744   /* OP_F280 (); */
2745   unsigned32 value;
2746   int c,n,z;
2747
2748   PC = cia;
2749   value = State.regs[REG_D0 + DN0];
2750   c = (value & 0x80000000) ? 1 : 0;
2751
2752   value <<= 1;
2753   value |= ((PSW & PSW_C) != 0);
2754   State.regs[REG_D0 + DN0] = value;
2755   z = (value == 0);
2756   n = (value & 0x80000000) != 0;
2757   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2758   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2759 }
2760
2761
2762 // 1100 1000 d8......; beq (d8,PC) (d8 is sign-extended)
2763 8.0xc8+8.D8:S1:::beq
2764 "beq"
2765 *mn10300
2766
2767 *am33
2768
2769 {
2770   /* OP_C800 (); */
2771   PC = cia;
2772   if ((PSW & PSW_Z))
2773     {
2774       State.regs[REG_PC] += EXTEND8 (D8);
2775       nia = PC;
2776     }
2777 }
2778
2779
2780 // 1100 1001 d8......; bne (d8,PC) (d8 is sign-extended)
2781 8.0xc9+8.D8:S1:::bne
2782 "bne"
2783 *mn10300
2784
2785 *am33
2786
2787 {
2788   /* OP_C900 (); */
2789   PC = cia;
2790   if (!(PSW & PSW_Z))
2791     {
2792       State.regs[REG_PC] += EXTEND8 (D8);
2793       nia = PC;
2794     }
2795 }
2796
2797
2798 // 1100 0001 d8......; bgt (d8,PC) (d8 is sign-extended)
2799 8.0xc1+8.D8:S1:::bgt
2800 "bgt"
2801 *mn10300
2802
2803 *am33
2804
2805 {
2806   /* OP_C100 (); */
2807   PC = cia;
2808   if (!((PSW & PSW_Z)
2809         || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
2810     {
2811       State.regs[REG_PC] += EXTEND8 (D8);
2812       nia = PC;
2813     }
2814 }
2815
2816
2817 // 1100 0010 d8......; bge (d8,PC) (d8 is sign-extended)
2818 8.0xc2+8.D8:S1:::bge
2819 "bge"
2820 *mn10300
2821
2822 *am33
2823
2824 {
2825   /* OP_C200 (); */
2826   PC = cia;
2827   if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2828     {
2829       State.regs[REG_PC] += EXTEND8 (D8);
2830       nia = PC;
2831     }
2832 }
2833
2834
2835 // 1100 0011 d8......; ble (d8,PC) (d8 is sign-extended)
2836 8.0xc3+8.D8:S1:::ble
2837 "ble"
2838 *mn10300
2839
2840 *am33
2841
2842 {
2843   /* OP_C300 (); */
2844   PC = cia;
2845   if ((PSW & PSW_Z)
2846       || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
2847     {
2848       State.regs[REG_PC] += EXTEND8 (D8);
2849       nia = PC;
2850     }
2851 }
2852
2853
2854 // 1100 0000 d8......; blt (d8,PC) (d8 is sign-extended)
2855 8.0xc0+8.D8:S1:::blt
2856 "blt"
2857 *mn10300
2858
2859 *am33
2860
2861 {
2862   /* OP_C000 (); */
2863   PC = cia;
2864   if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
2865     {
2866       State.regs[REG_PC] += EXTEND8 (D8);
2867       nia = PC;
2868     }
2869 }
2870
2871
2872 // 1100 0101 d8......; bhi (d8,PC) (d8 is sign-extended)
2873 8.0xc5+8.D8:S1:::bhi
2874 "bhi"
2875 *mn10300
2876
2877 *am33
2878
2879 {
2880   /* OP_C500 (); */
2881   PC = cia;
2882   if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
2883     {
2884       State.regs[REG_PC] += EXTEND8 (D8);
2885       nia = PC;
2886     }
2887 }
2888
2889
2890 // 1100 0110 d8......; bcc (d8,PC) (d8 is sign-extended)
2891 8.0xc6+8.D8:S1:::bcc
2892 "bcc"
2893 *mn10300
2894
2895 *am33
2896
2897 {
2898   /* OP_C600 (); */
2899   PC = cia;
2900   if (!(PSW & PSW_C))
2901     {
2902       State.regs[REG_PC] += EXTEND8 (D8);
2903       nia = PC;
2904     }
2905 }
2906
2907
2908 // 1100 0101 d8......; bls (d8,PC) (d8 is sign-extended)
2909 8.0xc7+8.D8:S1:::bls
2910 "bls"
2911 *mn10300
2912
2913 *am33
2914
2915 {
2916   /* OP_C700 (); */
2917   PC = cia;
2918   if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
2919     {
2920       State.regs[REG_PC] += EXTEND8 (D8);
2921       nia = PC;
2922     }
2923 }
2924
2925
2926 // 1100 0100 d8......; bcs (d8,PC) (d8 is sign-extended)
2927 8.0xc4+8.D8:S1:::bcs
2928 "bcs"
2929 *mn10300
2930
2931 *am33
2932
2933 {
2934   /* OP_C400 (); */
2935   PC = cia;
2936   if (PSW & PSW_C)
2937     {
2938       State.regs[REG_PC] += EXTEND8 (D8);
2939       nia = PC;
2940     }
2941 }
2942
2943
2944 // 1111 1000 1110 1000 d8......; bvc (d8,PC) (d8 is sign-extended)
2945 8.0xf8+8.0xe8+8.D8:D1:::bvc
2946 "bvc"
2947 *mn10300
2948
2949 *am33
2950
2951 {
2952   /* OP_F8E800 (); */
2953   PC = cia;
2954   if (!(PSW & PSW_V))
2955     {
2956       State.regs[REG_PC] += EXTEND8 (D8);
2957       nia = PC;
2958     }
2959 }
2960
2961
2962 // 1111 1000 1110 1001 d8......; bvs (d8,PC) (d8 is sign-extended)
2963 8.0xf8+8.0xe9+8.D8:D1:::bvs
2964 "bvs"
2965 *mn10300
2966
2967 *am33
2968
2969 {
2970   /* OP_F8E900 (); */
2971   PC = cia;
2972   if (PSW & PSW_V)
2973     {
2974       State.regs[REG_PC] += EXTEND8 (D8);
2975       nia = PC;
2976     }
2977 }
2978
2979
2980 // 1111 1000 1110 1010 d8......; bnc (d8,PC) (d8 is sign-extended)
2981 8.0xf8+8.0xea+8.D8:D1:::bnc
2982 "bnc"
2983 *mn10300
2984
2985 *am33
2986
2987 {
2988   /* OP_F8EA00 (); */
2989   PC = cia;
2990   if (!(PSW & PSW_N))
2991     {
2992       State.regs[REG_PC] += EXTEND8 (D8);
2993       nia = PC;
2994     }
2995 }
2996
2997
2998 // 1111 1000 1110 1010 d8......; bns (d8,PC) (d8 is sign-extended)
2999 8.0xf8+8.0xeb+8.D8:D1:::bns
3000 "bns"
3001 *mn10300
3002
3003 *am33
3004
3005 {
3006   /* OP_F8EB00 (); */
3007   PC = cia;
3008   if (PSW & PSW_N)
3009     {
3010       State.regs[REG_PC] += EXTEND8 (D8);
3011       nia = PC;
3012     }
3013 }
3014
3015
3016 // 1100 1010 d8......; bra (d8,PC) (d8 is sign-extended)
3017 8.0xca+8.D8:S1:::bra
3018 "bra"
3019 *mn10300
3020
3021 *am33
3022
3023 {
3024   /* OP_CA00 (); */
3025   PC = cia;
3026   State.regs[REG_PC] += EXTEND8 (D8);
3027   nia = PC;
3028 }
3029
3030
3031 // 1101 1000; leq
3032 8.0xd8:S0:::leq
3033 "leq"
3034 *mn10300
3035
3036 *am33
3037
3038 {
3039   /* OP_D8 (); */
3040   PC = cia;
3041   if (PSW & PSW_Z)
3042     {
3043       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3044       nia = PC;
3045     }
3046 }
3047
3048
3049 // 1101 1001; lne
3050 8.0xd9:S0:::lne
3051 "lne"
3052 *mn10300
3053
3054 *am33
3055
3056 {
3057   /* OP_D9 (); */
3058   PC = cia;
3059   if (!(PSW & PSW_Z))
3060     {
3061       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3062       nia = PC;
3063     }
3064 }
3065
3066
3067 // 1101 0001; lgt
3068 8.0xd1:S0:::lgt
3069 "lgt"
3070 *mn10300
3071
3072 *am33
3073
3074 {
3075   /* OP_D1 (); */
3076   PC = cia;
3077   if (!((PSW & PSW_Z)
3078         || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
3079     {
3080       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3081       nia = PC;
3082     }
3083 }
3084
3085
3086 // 1101 0010; lge
3087 8.0xd2:S0:::lge
3088 "lge"
3089 *mn10300
3090
3091 *am33
3092
3093 {
3094   /* OP_D2 (); */
3095   PC = cia;
3096   if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3097     {
3098       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3099       nia = PC;
3100     }
3101 }
3102
3103
3104 // 1101 0011; lle
3105 8.0xd3:S0:::lle
3106 "lle"
3107 *mn10300
3108
3109 *am33
3110
3111 {
3112   /* OP_D3 (); */
3113   PC = cia;
3114   if ((PSW & PSW_Z)
3115       || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
3116     {
3117       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3118       nia = PC;
3119     }
3120 }
3121
3122
3123 // 1101 0000; llt
3124 8.0xd0:S0:::llt
3125 "llt"
3126 *mn10300
3127
3128 *am33
3129
3130 {
3131   /* OP_D0 (); */
3132   PC = cia;
3133   if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
3134     {
3135       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3136       nia = PC;
3137     }
3138 }
3139
3140
3141 // 1101 0101; lhi
3142 8.0xd5:S0:::lhi
3143 "lhi"
3144 *mn10300
3145
3146 *am33
3147
3148 {
3149   /* OP_D5 (); */
3150   PC = cia;
3151   if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
3152     {
3153       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3154       nia = PC;
3155     }
3156 }
3157
3158
3159 // 1101 0110; lcc
3160 8.0xd6:S0:::lcc
3161 "lcc"
3162 *mn10300
3163
3164 *am33
3165
3166 {
3167   /* OP_D6 (); */
3168   PC = cia;
3169   if (!(PSW & PSW_C))
3170     {
3171       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3172       nia = PC;
3173     }
3174 }
3175
3176
3177 // 1101 0111; lls
3178 8.0xd7:S0:::lls
3179 "lls"
3180 *mn10300
3181
3182 *am33
3183
3184 {
3185   /* OP_D7 (); */
3186   PC = cia;
3187   if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
3188     {
3189       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3190       nia = PC;
3191     }
3192 }
3193
3194
3195 // 1101 0100; lcs
3196 8.0xd4:S0:::lcs
3197 "lcs"
3198 *mn10300
3199
3200 *am33
3201
3202 {
3203   /* OP_D4 (); */
3204   PC = cia;
3205   if (PSW & PSW_C)
3206     {
3207       State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3208       nia = PC;
3209     }
3210 }
3211
3212
3213 // 1101 1010; lra
3214 8.0xda:S0:::lra
3215 "lra"
3216 *mn10300
3217
3218 *am33
3219
3220 {
3221   /* OP_DA (); */
3222   PC = cia;
3223   State.regs[REG_PC] = State.regs[REG_LAR] - 4;
3224   nia = PC;
3225 }
3226
3227
3228 // 1101 1010; setlb
3229 8.0xdb:S0:::setlb
3230 "setlb"
3231 *mn10300
3232
3233 *am33
3234
3235 {
3236   /* OP_DB (); */
3237   PC = cia;
3238   State.regs[REG_LIR] = load_word (State.regs[REG_PC] + 1);
3239   State.regs[REG_LAR] = State.regs[REG_PC] + 5;
3240 }
3241
3242
3243 // 1111 0000 1111 01An; jmp (An)
3244 8.0xf0+4.0xf,01,2.AN0:D0:::jmp
3245 "jmp"
3246 *mn10300
3247
3248 *am33
3249
3250 {
3251   /* OP_F0F4 (); */
3252   PC = State.regs[REG_A0 + AN0];
3253   nia = PC;
3254 }
3255
3256
3257 // 1100 1100 d16.....; jmp (d16,PC) (d16 is sign-extended.)
3258 8.0xcc+8.D16A+8.D16B:S2:::jmp
3259 "jmp"
3260 *mn10300
3261
3262 *am33
3263
3264 {
3265   /* OP_CC0000 (); */
3266   PC = cia + EXTEND16(FETCH16(D16A, D16B));
3267   nia = PC;
3268 }
3269
3270
3271 // 1101 1100 d32........; jmp (d32, PC)
3272 8.0xdc+8.D32A+8.D32B+8.D32C+8.D32D:S4:::jmp
3273 "jmp"
3274 *mn10300
3275
3276 *am33
3277
3278 {
3279   /* OP_DC000000 (); */
3280   PC = cia + FETCH32(D32A, D32B, D32C, D32D);
3281   nia = PC;
3282 }
3283
3284
3285 // 1111 0000 1111 00An; calls (An)
3286 8.0xf0+4.0xf,00,2.AN0:D0:::calls
3287 "calls"
3288 *mn10300
3289
3290 *am33
3291
3292 {
3293   /* OP_F0F0 (); */
3294   unsigned32 next_pc, sp;
3295
3296   PC = cia;
3297   sp = State.regs[REG_SP];
3298   next_pc = State.regs[REG_PC] + 2;
3299   store_word(sp, next_pc);
3300   State.regs[REG_MDR] = next_pc;
3301   State.regs[REG_PC] = State.regs[REG_A0 + AN0];
3302   nia = PC;
3303 }
3304
3305
3306 // 1111 1010 1111 1111 d16.....; calls (d16,PC) (d16 is sign-extended.)
3307 8.0xfa+8.0xff+8.D16A+8.D16B:D2:::calls
3308 "calls"
3309 *mn10300
3310
3311 *am33
3312
3313 {
3314   /* OP_FAFF0000 (); */
3315   unsigned32 next_pc, sp;
3316
3317   PC = cia;
3318   sp = State.regs[REG_SP];
3319   next_pc = State.regs[REG_PC] + 4;
3320   store_word(sp, next_pc);
3321   State.regs[REG_MDR] = next_pc;
3322   State.regs[REG_PC] += EXTEND16 (FETCH16(D16A, D16B));
3323   nia = PC;
3324 }
3325
3326
3327 // 1111 1100 1111 1111 d32.....; calls (d32,PC)
3328 8.0xfc+8.0xff+8.D32A+8.D32B+8.D32C+8.D32D:D4:::calls
3329 "calls"
3330 *mn10300
3331
3332 *am33
3333
3334 {
3335   /* OP_FCFF0000 (); */
3336   unsigned32 next_pc, sp;
3337
3338   PC = cia;
3339   sp = State.regs[REG_SP];
3340   next_pc = State.regs[REG_PC] + 6;
3341   store_word(sp, next_pc);
3342   State.regs[REG_MDR] = next_pc;
3343   State.regs[REG_PC] += FETCH32(D32A, D32B, D32C, D32D);
3344   nia = PC;
3345 }
3346
3347
3348 // 1111 0000 1111 1100; rets
3349 8.0xf0+8.0xfc:D0:::rets
3350 "rets"
3351 *mn10300
3352
3353 *am33
3354
3355 {
3356   /* OP_F0FC (); */
3357   unsigned32 sp;
3358
3359   sp = State.regs[REG_SP];
3360   State.regs[REG_PC] = load_word(sp);
3361   nia = PC;
3362 }
3363
3364
3365 // 1111 0000 1111 1101; rti
3366 8.0xf0+8.0xfd:D0:::rti
3367 "rti"
3368 *mn10300
3369
3370 *am33
3371
3372 {
3373   /* OP_F0FD (); */
3374   unsigned32 sp;
3375
3376   sp = State.regs[REG_SP];
3377   PSW = load_half(sp);
3378   State.regs[REG_PC] = load_word(sp+4);
3379   State.regs[REG_SP] +=8;
3380   nia = PC;
3381 }
3382
3383
3384 // 1111 0000 1111 1110; trap
3385 8.0xf0+8.0xfe:D0:::trap
3386 "trap"
3387 *mn10300
3388
3389 *am33
3390
3391 {
3392   /* OP_F0FE (); */
3393   unsigned32 sp, next_pc;
3394
3395   PC = cia;
3396   sp = State.regs[REG_SP];
3397   next_pc = State.regs[REG_PC] + 2;
3398   store_word(sp, next_pc);
3399   nia = PC;
3400 }
3401
3402
3403 // 1111 0000 1111 1111; rtm
3404 8.0xf0+8.0xff:D0:::rtm
3405 "rtm"
3406 *mn10300
3407
3408 *am33
3409
3410 {
3411   /* OP_F0FF (); */
3412   PC = cia;
3413   abort ();
3414 }
3415
3416
3417 // 1100 1011; nop
3418 8.0xcb:S0:::nop
3419 "nop"
3420 *mn10300
3421
3422 *am33
3423
3424 {
3425   /* OP_CB (); */
3426   PC = cia;
3427 }
3428
3429
3430 // 1111 0101 0000  DmDn; udf20 Dm,Dn
3431 8.0xf5+4.0x0,2.DM1,2.DN0:D0:::putx
3432 "putx"
3433 *mn10300
3434 {
3435   /* OP_F500 (); */
3436   PC = cia;
3437   State.regs[REG_MDRQ] = State.regs[REG_D0 + DN0];
3438 }
3439
3440
3441 // 1111 0110 1111 DmDn; udf15 Dm,Dn
3442 8.0xf6+4.0xf,2.DM1,2.DN0:D0:::getx
3443 "getx"
3444 *mn10300
3445
3446 *am33
3447
3448 {
3449   /* OP_F6F0 (); */
3450   int z, n;
3451
3452   PC = cia;
3453   z = (State.regs[REG_MDRQ] == 0);
3454   n = ((State.regs[REG_MDRQ] & 0x80000000) != 0);
3455   State.regs[REG_D0 + DN0] = State.regs[REG_MDRQ];
3456
3457   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3458   PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
3459 }
3460
3461
3462 // 1111 0110 0000 DmDn; udf00 Dm,Dn
3463 8.0xf6+4.0x0,2.DM1,2.DN0:D0:::mulq
3464 "mulq"
3465 *mn10300
3466
3467 *am33
3468
3469 {
3470   /* OP_F600 (); */
3471   unsigned64 temp;
3472   int n, z;
3473
3474   PC = cia;
3475   temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3476           *  (signed64)(signed32)State.regs[REG_D0 + DM1]);
3477   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3478   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3479   z = (State.regs[REG_D0 + DN0] == 0);
3480   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3481   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3482   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3483 }
3484
3485
3486 // 1111 1001 0000 00Dn imm8....; udf00 imm8,Dn (imm8 is sign-extended.)
3487 8.0xf9+4.0x,00,2.DN0+8.IMM8:D1:::mulq
3488 "mulq"
3489 *mn10300
3490
3491 *am33
3492
3493 {
3494   /* OP_F90000 (); */
3495   unsigned64 temp;
3496   int n, z;
3497
3498   PC = cia;
3499   temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3500           * (signed64)(signed32)EXTEND8 (IMM8));
3501   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3502   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3503   z = (State.regs[REG_D0 + DN0] == 0);
3504   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3505   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3506   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3507 }
3508
3509
3510 // 1111 1011 0000 00Dn imm16...; udf00 imm16,Dn (imm16 is sign-extended.)
3511 8.0xfb+4.0x0,00,2.DN0+8.IMM16A+8.IMM16B:D2:::mulq
3512 "mulq"
3513 *mn10300
3514
3515 *am33
3516
3517 {
3518   /* OP_FB000000 (); */
3519   unsigned64 temp;
3520   int n, z;
3521
3522   PC = cia;
3523   temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3524           * (signed64)(signed32)EXTEND16 (FETCH16(IMM16A, IMM16B)));
3525   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3526   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3527   z = (State.regs[REG_D0 + DN0] == 0);
3528   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3529   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3530   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3531 }
3532
3533
3534 // 1111 1101 0000 00Dn imm32...; udf00 imm32,Dn
3535 8.0xfd+4.0x0,00,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mulq
3536 "mulq"
3537 *mn10300
3538
3539 *am33
3540
3541 {
3542   /* OP_FD000000 (); */
3543   unsigned64 temp;
3544   int n, z;
3545
3546   PC = cia;
3547   temp = ((signed64)(signed32)State.regs[REG_D0 + DN0]
3548           * (signed64)(signed32)(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
3549   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3550   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3551   z = (State.regs[REG_D0 + DN0] == 0);
3552   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3553   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3554   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3555 }
3556
3557
3558 // 1111 0110 0001 DmDn; udf01 Dm,Dn
3559 8.0xf6+4.0x1,2.DM1,2.DN0:D0:::mulqu
3560 "mulqu"
3561 *mn10300
3562
3563 *am33
3564
3565 {
3566   /* OP_F610 (); */
3567   unsigned64 temp;
3568   int n, z;
3569
3570   PC = cia;
3571   temp = ((unsigned64) State.regs[REG_D0 + DN0]
3572           * (unsigned64) State.regs[REG_D0 + DM1]);
3573   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3574   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3575   z = (State.regs[REG_D0 + DN0] == 0);
3576   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3577   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3578   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3579 }
3580
3581
3582 // 1111 1001 0001 01Dn imm8....; udfu01 imm8,Dn (imm8 is zero-extended.)
3583 8.0xf9+4.0x1,01,2.DN0+8.IMM8:D1:::mulqu
3584 "mulqu"
3585 *mn10300
3586
3587 *am33
3588
3589 {
3590   /* OP_F91400 (); */
3591   unsigned64 temp;
3592   int n, z;
3593
3594   PC = cia;
3595   temp = ((unsigned64)State.regs[REG_D0 + DN0]
3596           * (unsigned64)EXTEND8 (IMM8));
3597   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3598   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3599   z = (State.regs[REG_D0 + DN0] == 0);
3600   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3601   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3602   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3603 }
3604
3605
3606 // 1111 1011 0001 01Dn imm16...; udfu01 imm16,Dn (imm16 is zero-extended.)
3607 8.0xfb+4.0x1,01,2.DN0+8.IMM16A+8.IMM16B:D2:::mulqu
3608 "mulqu"
3609 *mn10300
3610
3611 *am33
3612
3613 {
3614   /* OP_FB140000 (); */
3615   unsigned64 temp;
3616   int n, z;
3617
3618   PC = cia;
3619   temp = ((unsigned64)State.regs[REG_D0 + DN0]
3620           * (unsigned64) EXTEND16 (FETCH16(IMM16A, IMM16B)));
3621   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3622   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3623   z = (State.regs[REG_D0 + DN0] == 0);
3624   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3625   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3626   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3627 }
3628
3629
3630 // 1111 1101 0001 01Dn imm32...; udfu01 imm32,Dn
3631 8.0xfd+4.0x1,01,2.DN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4:::mulqu
3632 "mulqu"
3633 *mn10300
3634
3635 *am33
3636
3637 {
3638   /* OP_FD140000 (); */
3639   unsigned64 temp;
3640   int n, z;
3641
3642   PC = cia;
3643   temp = ((unsigned64)State.regs[REG_D0 + DN0]
3644           * (unsigned64)(FETCH32(IMM32A, IMM32B, IMM32C, IMM32D)));
3645   State.regs[REG_D0 + DN0] = temp & 0xffffffff;
3646   State.regs[REG_MDRQ] = (temp & 0xffffffff00000000LL) >> 32;;
3647   z = (State.regs[REG_D0 + DN0] == 0);
3648   n = (State.regs[REG_D0 + DN0] & 0x80000000) != 0;
3649   PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3650   PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3651 }
3652
3653
3654 // 1111 0110 0100 DmDn; udf04 Dm,Dn
3655 8.0xf6+4.0x4,2.DM1,2.DN0:D0:::sat16
3656 "sat16"
3657 *mn10300
3658
3659 *am33
3660
3661 {
3662   /* OP_F640 (); */
3663   int temp;
3664
3665   PC = cia;
3666   temp = State.regs[REG_D0 + DM1];
3667   temp = (temp > 0x7fff ? 0x7fff : temp);
3668   temp = (temp < -0x8000 ? -0x8000 : temp);
3669   State.regs[REG_D0 + DN0] = temp;
3670 }
3671
3672
3673 // 1111 0110 0101 DmDn; udf05 Dm,Dn
3674 8.0xf6+4.0x5,2.DM1,2.DN0:D0:::sat24
3675 "sat24"
3676 *mn10300
3677
3678 *am33
3679
3680 {
3681   /* OP_F650 (); */
3682   int temp;
3683
3684   PC = cia;
3685   temp = State.regs[REG_D0 + DM1];
3686   temp = (temp > 0x7fffff ? 0x7fffff : temp);
3687   temp = (temp < -0x800000 ? -0x800000 : temp);
3688   State.regs[REG_D0 + DN0] = temp;
3689 }
3690
3691
3692 // 1111 0110 0111 DmDn; udf07 Dm,Dn
3693 8.0xf6+4.0x7,2.DM1,2.DN0:D0:::bsch
3694 "bsch"
3695 *mn10300
3696
3697 *am33
3698
3699 {
3700   /* OP_F670 (); */
3701   int temp, c;
3702
3703   PC = cia;
3704   temp = State.regs[REG_D0 + DM1];
3705   temp <<= (State.regs[REG_D0 + DN0] & 0x1f);
3706   c = (temp != 0 ? 1 : 0);
3707   PSW &= ~(PSW_C);
3708   PSW |= (c ? PSW_C : 0);
3709 }
3710
3711
3712 // 1111 0000 1100 0000; syscall
3713 8.0xf0+8.0xc0:D0:::syscall
3714 "syscall"
3715 *mn10300
3716
3717 *am33
3718
3719 {
3720   /* OP_F0C0 (); */
3721   PC = cia;
3722   do_syscall ();
3723 }
3724
3725
3726 // 1111 1111; break
3727 8.0xff:S0:::break
3728 "break"
3729 *mn10300
3730
3731 *am33
3732
3733 {
3734   /* OP_FF (); */
3735   PC = cia;
3736   program_interrupt(SD, CPU, cia, SIM_SIGTRAP);
3737 }
3738
3739 // 1100 1110 regs....; movm (SP),regs
3740 8.0xce+8.REGS:S1:::movm
3741 "movm"
3742 *mn10300
3743
3744 *am33
3745
3746 {
3747   /* OP_CE00 (); */
3748   unsigned32 sp = State.regs[REG_SP];
3749   unsigned32 mask;
3750
3751   PC = cia;
3752   mask = REGS;
3753
3754   if (mask & 0x8)
3755     {
3756       sp += 4;
3757       State.regs[REG_LAR] = load_word (sp);
3758       sp += 4;
3759       State.regs[REG_LIR] = load_word (sp);
3760       sp += 4;
3761       State.regs[REG_MDR] = load_word (sp);
3762       sp += 4;
3763       State.regs[REG_A0 + 1] = load_word (sp);
3764       sp += 4;
3765       State.regs[REG_A0] = load_word (sp);
3766       sp += 4;
3767       State.regs[REG_D0 + 1] = load_word (sp);
3768       sp += 4;
3769       State.regs[REG_D0] = load_word (sp);
3770       sp += 4;
3771     }
3772
3773   if (mask & 0x10)
3774     {
3775       State.regs[REG_A0 + 3] = load_word (sp);
3776       sp += 4;
3777     }
3778
3779   if (mask & 0x20)
3780     {
3781       State.regs[REG_A0 + 2] = load_word (sp);
3782       sp += 4;
3783     }
3784
3785   if (mask & 0x40)
3786     {
3787       State.regs[REG_D0 + 3] = load_word (sp);
3788       sp += 4;
3789     }
3790
3791   if (mask & 0x80)
3792     {
3793       State.regs[REG_D0 + 2] = load_word (sp);
3794       sp += 4;
3795     }
3796
3797   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
3798       )
3799     {
3800       if (mask & 0x1)
3801         {
3802           /* Need to restore MDQR, MCRH, MCRL, and MCVF */
3803           sp += 16;
3804           State.regs[REG_E0 + 1] = load_word (sp);
3805           sp += 4;
3806           State.regs[REG_E0 + 0] = load_word (sp);
3807           sp += 4;
3808         }
3809
3810       if (mask & 0x2)
3811         {
3812           State.regs[REG_E0 + 7] = load_word (sp);
3813           sp += 4;
3814           State.regs[REG_E0 + 6] = load_word (sp);
3815           sp += 4;
3816           State.regs[REG_E0 + 5] = load_word (sp);
3817           sp += 4;
3818           State.regs[REG_E0 + 4] = load_word (sp);
3819           sp += 4;
3820         }
3821
3822       if (mask & 0x4)
3823         {
3824           State.regs[REG_E0 + 3] = load_word (sp);
3825           sp += 4;
3826           State.regs[REG_E0 + 2] = load_word (sp);
3827           sp += 4;
3828         }
3829     }
3830
3831   /* And make sure to update the stack pointer.  */
3832   State.regs[REG_SP] = sp;
3833 }
3834
3835
3836 // 1100 1111 regs....; movm regs,(SP)
3837 8.0xcf+8.REGS:S1a:::movm
3838 "movm"
3839 *mn10300
3840
3841 *am33
3842
3843 {
3844   /* OP_CF00 (); */
3845   unsigned32 sp = State.regs[REG_SP];
3846   unsigned32 mask;
3847
3848   PC = cia;
3849   mask = REGS;
3850
3851   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
3852       )
3853     {
3854       if (mask & 0x4)
3855         {
3856           sp -= 4;
3857           store_word (sp, State.regs[REG_E0 + 2]);
3858           sp -= 4;
3859           store_word (sp, State.regs[REG_E0 + 3]);
3860         }
3861
3862       if (mask & 0x2)
3863         {
3864           sp -= 4;
3865           store_word (sp, State.regs[REG_E0 + 4]);
3866           sp -= 4;
3867           store_word (sp, State.regs[REG_E0 + 5]);
3868           sp -= 4;
3869           store_word (sp, State.regs[REG_E0 + 6]);
3870           sp -= 4;
3871           store_word (sp, State.regs[REG_E0 + 7]);
3872         }
3873
3874       if (mask & 0x1)
3875         {
3876           sp -= 4;
3877           store_word (sp, State.regs[REG_E0 + 0]);
3878           sp -= 4;
3879           store_word (sp, State.regs[REG_E0 + 1]);
3880           sp -= 16;
3881           /* Need to save MDQR, MCRH, MCRL, and MCVF */
3882         }
3883     }
3884
3885   if (mask & 0x80)
3886     {
3887       sp -= 4;
3888       store_word (sp, State.regs[REG_D0 + 2]);
3889     }
3890
3891   if (mask & 0x40)
3892     {
3893       sp -= 4;
3894       store_word (sp, State.regs[REG_D0 + 3]);
3895     }
3896
3897   if (mask & 0x20)
3898     {
3899       sp -= 4;
3900       store_word (sp, State.regs[REG_A0 + 2]);
3901     }
3902
3903   if (mask & 0x10)
3904     {
3905       sp -= 4;
3906       store_word (sp, State.regs[REG_A0 + 3]);
3907     }
3908
3909   if (mask & 0x8)
3910     {
3911       sp -= 4;
3912       store_word (sp, State.regs[REG_D0]);
3913       sp -= 4;
3914       store_word (sp, State.regs[REG_D0 + 1]);
3915       sp -= 4;
3916       store_word (sp, State.regs[REG_A0]);
3917       sp -= 4;
3918       store_word (sp, State.regs[REG_A0 + 1]);
3919       sp -= 4;
3920       store_word (sp, State.regs[REG_MDR]);
3921       sp -= 4;
3922       store_word (sp, State.regs[REG_LIR]);
3923       sp -= 4;
3924       store_word (sp, State.regs[REG_LAR]);
3925       sp -= 4;
3926     }
3927
3928   /* And make sure to update the stack pointer.  */
3929   State.regs[REG_SP] = sp;
3930 }
3931
3932 // 1100 1101 d16..... regs.... imm8....;
3933 // call (d16,PC),regs,imm8 (d16 is sign-extended., imm8 is zero-extended.)
3934 8.0xcd+8.D16A+8.D16B+8.REGS+8.IMM8:S4:::call
3935 "call"
3936 *mn10300
3937
3938 *am33
3939
3940 {
3941   /* OP_CD000000 (); */
3942   unsigned32 next_pc, sp;
3943   unsigned32 mask;
3944
3945   PC = cia;
3946   sp = State.regs[REG_SP];
3947   next_pc = PC + 5;
3948   store_word(sp, next_pc);
3949
3950   mask = REGS;
3951
3952   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
3953       )
3954     {
3955       if (mask & 0x4)
3956         {
3957           sp -= 4;
3958           store_word (sp, State.regs[REG_E0 + 2]);
3959           sp -= 4;
3960           store_word (sp, State.regs[REG_E0 + 3]);
3961         }
3962
3963       if (mask & 0x2)
3964         {
3965           sp -= 4;
3966           store_word (sp, State.regs[REG_E0 + 4]);
3967           sp -= 4;
3968           store_word (sp, State.regs[REG_E0 + 5]);
3969           sp -= 4;
3970           store_word (sp, State.regs[REG_E0 + 6]);
3971           sp -= 4;
3972           store_word (sp, State.regs[REG_E0 + 7]);
3973         }
3974
3975       if (mask & 0x1)
3976         {
3977           sp -= 4;
3978           store_word (sp, State.regs[REG_E0 + 0]);
3979           sp -= 4;
3980           store_word (sp, State.regs[REG_E0 + 1]);
3981           sp -= 16;
3982           /* Need to save MDQR, MCRH, MCRL, and MCVF */
3983         }
3984     }
3985
3986   if (mask & 0x80)
3987     {
3988       sp -= 4;
3989       store_word (sp, State.regs[REG_D0 + 2]);
3990     }
3991
3992   if (mask & 0x40)
3993     {
3994       sp -= 4;
3995       store_word (sp, State.regs[REG_D0 + 3]);
3996     }
3997
3998   if (mask & 0x20)
3999     {
4000       sp -= 4;
4001       store_word (sp, State.regs[REG_A0 + 2]);
4002     }
4003
4004   if (mask & 0x10)
4005     {
4006       sp -= 4;
4007       store_word (sp, State.regs[REG_A0 + 3]);
4008     }
4009
4010   if (mask & 0x8)
4011     {
4012       sp -= 4;
4013       store_word (sp, State.regs[REG_D0]);
4014       sp -= 4;
4015       store_word (sp, State.regs[REG_D0 + 1]);
4016       sp -= 4;
4017       store_word (sp, State.regs[REG_A0]);
4018       sp -= 4;
4019       store_word (sp, State.regs[REG_A0 + 1]);
4020       sp -= 4;
4021       store_word (sp, State.regs[REG_MDR]);
4022       sp -= 4;
4023       store_word (sp, State.regs[REG_LIR]);
4024       sp -= 4;
4025       store_word (sp, State.regs[REG_LAR]);
4026       sp -= 4;
4027     }
4028
4029   /* Update the stack pointer, note that the register saves to do not
4030      modify SP.  The SP adjustment is derived totally from the imm8
4031      field.  */
4032   State.regs[REG_SP] -= IMM8;
4033   State.regs[REG_MDR] = next_pc;
4034   State.regs[REG_PC] += EXTEND16 (FETCH16(D16A, D16B));
4035   nia = PC;
4036 }
4037
4038
4039 // 1101 1101 d32..... regs.... imm8....;
4040 // call (d32,PC),regs,imm8 (imm8 is zero-extended.)
4041 8.0xdd+8.D32A+8.D32B+8.D32C+8.D32D+8.REGS+8.IMM8:S6:::call
4042 "call"
4043 *mn10300
4044
4045 *am33
4046
4047 {
4048   /* OP_DD000000 (); */
4049   unsigned32 next_pc, sp;
4050   unsigned32 mask;
4051
4052   PC = cia;
4053   sp = State.regs[REG_SP];
4054   next_pc = State.regs[REG_PC] + 7;
4055   /* could assert that nia == next_pc here */
4056   store_word(sp, next_pc);
4057
4058   mask = REGS;
4059
4060   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4061       )
4062     {
4063       if (mask & 0x4)
4064         {
4065           sp -= 4;
4066           store_word (sp, State.regs[REG_E0 + 2]);
4067           sp -= 4;
4068           store_word (sp, State.regs[REG_E0 + 3]);
4069         }
4070
4071       if (mask & 0x2)
4072         {
4073           sp -= 4;
4074           store_word (sp, State.regs[REG_E0 + 4]);
4075           sp -= 4;
4076           store_word (sp, State.regs[REG_E0 + 5]);
4077           sp -= 4;
4078           store_word (sp, State.regs[REG_E0 + 6]);
4079           sp -= 4;
4080           store_word (sp, State.regs[REG_E0 + 7]);
4081         }
4082
4083       if (mask & 0x1)
4084         {
4085           sp -= 4;
4086           store_word (sp, State.regs[REG_E0 + 0]);
4087           sp -= 4;
4088           store_word (sp, State.regs[REG_E0 + 1]);
4089           sp -= 16;
4090           /* Need to save MDQR, MCRH, MCRL, and MCVF */
4091         }
4092     }
4093
4094   if (mask & 0x80)
4095     {
4096       sp -= 4;
4097       store_word (sp, State.regs[REG_D0 + 2]);
4098     }
4099
4100   if (mask & 0x40)
4101     {
4102       sp -= 4;
4103       store_word (sp, State.regs[REG_D0 + 3]);
4104     }
4105
4106   if (mask & 0x20)
4107     {
4108       sp -= 4;
4109       store_word (sp, State.regs[REG_A0 + 2]);
4110     }
4111
4112   if (mask & 0x10)
4113     {
4114       sp -= 4;
4115       store_word (sp, State.regs[REG_A0 + 3]);
4116     }
4117
4118   if (mask & 0x8)
4119     {
4120       sp -= 4;
4121       store_word (sp, State.regs[REG_D0]);
4122       sp -= 4;
4123       store_word (sp, State.regs[REG_D0 + 1]);
4124       sp -= 4;
4125       store_word (sp, State.regs[REG_A0]);
4126       sp -= 4;
4127       store_word (sp, State.regs[REG_A0 + 1]);
4128       sp -= 4;
4129       store_word (sp, State.regs[REG_MDR]);
4130       sp -= 4;
4131       store_word (sp, State.regs[REG_LIR]);
4132       sp -= 4;
4133       store_word (sp, State.regs[REG_LAR]);
4134       sp -= 4;
4135     }
4136
4137   /* Update the stack pointer, note that the register saves to do not
4138      modify SP.  The SP adjustment is derived totally from the imm8
4139      field.  */
4140   State.regs[REG_SP] -= IMM8;
4141   State.regs[REG_MDR] = next_pc;
4142   State.regs[REG_PC] += FETCH32(D32A, D32B, D32C, D32D);
4143   nia = PC;
4144 }
4145
4146
4147 // 1101 1111 regs.... imm8....; ret regs,imm8 (imm8 is zero-extended.)
4148 8.0xdf+8.REGS+8.IMM8:S2:::ret
4149 "ret"
4150 *mn10300
4151
4152 *am33
4153
4154 {
4155   /* OP_DF0000 (); */
4156   unsigned32 sp, offset;
4157   unsigned32 mask;
4158
4159   PC = cia;
4160   State.regs[REG_SP] += IMM8;
4161   sp = State.regs[REG_SP];
4162
4163   offset = -4;
4164   mask = REGS;
4165
4166   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4167       )
4168     {
4169
4170       if (mask & 0x4)
4171         {
4172           State.regs[REG_E0 + 2] = load_word (sp + offset);
4173           offset -= 4;
4174           State.regs[REG_E0 + 3] = load_word (sp + offset);
4175           offset -= 4;
4176         }
4177
4178       if (mask & 0x2)
4179         {
4180           State.regs[REG_E0 + 4] = load_word (sp + offset);
4181           offset -= 4;
4182           State.regs[REG_E0 + 5] = load_word (sp + offset);
4183           offset -= 4;
4184           State.regs[REG_E0 + 6] = load_word (sp + offset);
4185           offset -= 4;
4186           State.regs[REG_E0 + 7] = load_word (sp + offset);
4187           offset -= 4;
4188         }
4189
4190       if (mask & 0x1)
4191         {
4192           /* Need to restore MDQR, MCRH, MCRL, and MCVF */
4193           offset -= 16;
4194           State.regs[REG_E0 + 0] = load_word (sp + offset);
4195           offset -= 4;
4196           State.regs[REG_E0 + 1] = load_word (sp + offset);
4197           offset -= 4;
4198         }
4199
4200     }
4201
4202   if (mask & 0x80)
4203     {
4204       State.regs[REG_D0 + 2] = load_word (sp + offset);
4205       offset -= 4;
4206     }
4207
4208   if (mask & 0x40)
4209     {
4210       State.regs[REG_D0 + 3] = load_word (sp + offset);
4211       offset -= 4;
4212     }
4213
4214   if (mask & 0x20)
4215     {
4216       State.regs[REG_A0 + 2] = load_word (sp + offset);
4217       offset -= 4;
4218     }
4219
4220   if (mask & 0x10)
4221     {
4222       State.regs[REG_A0 + 3] = load_word (sp + offset);
4223       offset -= 4;
4224     }
4225
4226   if (mask & 0x8)
4227     {
4228       State.regs[REG_D0] = load_word (sp + offset);
4229       offset -= 4;
4230       State.regs[REG_D0 + 1] = load_word (sp + offset);
4231       offset -= 4;
4232       State.regs[REG_A0] = load_word (sp + offset);
4233       offset -= 4;
4234       State.regs[REG_A0 + 1] = load_word (sp + offset);
4235       offset -= 4;
4236       State.regs[REG_MDR] = load_word (sp + offset);
4237       offset -= 4;
4238       State.regs[REG_LIR] = load_word (sp + offset);
4239       offset -= 4;
4240       State.regs[REG_LAR] = load_word (sp + offset);
4241       offset -= 4;
4242     }
4243
4244   /* Restore the PC value.  */
4245   State.regs[REG_PC] = load_word(sp);
4246   nia = PC;
4247 }
4248
4249
4250 // 1101 1110 regs.... imm8....; retf regs,imm8 (imm8 is zero-extended.)
4251 8.0xde+8.REGS+8.IMM8:S2:::retf
4252 "retf"
4253 *mn10300
4254
4255 *am33
4256
4257 {
4258   /* OP_DE0000 (); */
4259   unsigned32 sp, offset;
4260   unsigned32 mask;
4261
4262   PC = cia;
4263   State.regs[REG_SP] += IMM8;
4264   sp = State.regs[REG_SP];
4265   State.regs[REG_PC] = State.regs[REG_MDR];
4266
4267   offset = -4;
4268   mask = REGS;
4269
4270   if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33
4271       )
4272     {
4273
4274       if (mask & 0x4)
4275         {
4276           State.regs[REG_E0 + 2] = load_word (sp + offset);
4277           offset -= 4;
4278           State.regs[REG_E0 + 3] = load_word (sp + offset);
4279           offset -= 4;
4280         }
4281
4282       if (mask & 0x2)
4283         {
4284           State.regs[REG_E0 + 4] = load_word (sp + offset);
4285           offset -= 4;
4286           State.regs[REG_E0 + 5] = load_word (sp + offset);
4287           offset -= 4;
4288           State.regs[REG_E0 + 6] = load_word (sp + offset);
4289           offset -= 4;
4290           State.regs[REG_E0 + 7] = load_word (sp + offset);
4291           offset -= 4;
4292         }
4293
4294       if (mask & 0x1)
4295         {
4296           /* Need to restore MDQR, MCRH, MCRL, and MCVF */
4297           offset -= 16;
4298           State.regs[REG_E0 + 0] = load_word (sp + offset);
4299           offset -= 4;
4300           State.regs[REG_E0 + 1] = load_word (sp + offset);
4301           offset -= 4;
4302         }
4303
4304     }
4305
4306   if (mask & 0x80)
4307     {
4308       State.regs[REG_D0 + 2] = load_word (sp + offset);
4309       offset -= 4;
4310     }
4311
4312   if (mask & 0x40)
4313     {
4314       State.regs[REG_D0 + 3] = load_word (sp + offset);
4315       offset -= 4;
4316     }
4317
4318   if (mask & 0x20)
4319     {
4320       State.regs[REG_A0 + 2] = load_word (sp + offset);
4321       offset -= 4;
4322     }
4323
4324   if (mask & 0x10)
4325     {
4326       State.regs[REG_A0 + 3] = load_word (sp + offset);
4327       offset -= 4;
4328     }
4329
4330   if (mask & 0x8)
4331     {
4332       State.regs[REG_D0] = load_word (sp + offset);
4333       offset -= 4;
4334       State.regs[REG_D0 + 1] = load_word (sp + offset);
4335       offset -= 4;
4336       State.regs[REG_A0] = load_word (sp + offset);
4337       offset -= 4;
4338       State.regs[REG_A0 + 1] = load_word (sp + offset);
4339       offset -= 4;
4340       State.regs[REG_MDR] = load_word (sp + offset);
4341       offset -= 4;
4342       State.regs[REG_LIR] = load_word (sp + offset);
4343       offset -= 4;
4344       State.regs[REG_LAR] = load_word (sp + offset);
4345       offset -= 4;
4346     }
4347   nia = PC;
4348 }
4349
4350
4351 :include::am33:am33.igen
4352