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