* am33.igen: Add some missing instructions.
[deliverable/binutils-gdb.git] / sim / mn10300 / am33.igen
1 // Helper:
2 //
3 // Given an extended register number, translate it into an index into the
4 // register array. This is necessary as the upper 8 extended registers are
5 // actually synonyms for the d0-d3/a0-a3 registers.
6 //
7 //
8
9 :function:::int:translate_rreg:int rreg
10 {
11
12 /* The higher register numbers actually correspond to the
13 basic machine's address and data registers. */
14 if (rreg > 7 && rreg < 12)
15 return REG_A0 + rreg - 8;
16 else if (rreg > 11 && rreg < 16)
17 return REG_D0 + rreg - 12;
18 else
19 return REG_E0 + rreg;
20 }
21
22 // 1111 0000 0010 00An; mov USP,An
23 8.0xf0+4.0x2,00,2.AN0:D0m:::mov
24 "mov"
25 *am33
26 {
27 PC = cia;
28 State.regs[REG_A0 + AN0] = State.regs[REG_USP];
29 }
30
31
32 // 1111 0000 0010 01An; mov SSP,An
33 8.0xf0+4.0x2,01,2.AN0:D0n:::mov
34 "mov"
35 *am33
36 {
37 PC = cia;
38 State.regs[REG_A0 + AN0] = State.regs[REG_SSP];
39 }
40
41
42 // 1111 0000 0010 10An; mov MSP,An
43 8.0xf0+4.0x2,10,2.AN0:D0o:::mov
44 "mov"
45 *am33
46 {
47 PC = cia;
48 State.regs[REG_A0 + AN0] = State.regs[REG_MSP];
49 }
50
51
52 // 1111 0000 0010 11An; mov PC,An
53 8.0xf0+4.0x2,11,2.AN0:D0p:::mov
54 "mov"
55 *am33
56 {
57 PC = cia;
58 State.regs[REG_A0 + AN0] = PC;
59 }
60
61
62 // 1111 0000 0011 Am00; mov Am,USP
63 8.0xf0+4.0x3,2.AM1,00:D0q:::mov
64 "mov"
65 *am33
66 {
67 PC = cia;
68 State.regs[REG_USP] = State.regs[REG_A0 + AM1];
69 }
70
71 // 1111 0000 0011 Am01; mov Am,SSP
72 8.0xf0+4.0x3,2.AM1,01:D0r:::mov
73 "mov"
74 *am33
75 {
76 PC = cia;
77 State.regs[REG_SSP] = State.regs[REG_A0 + AM1];
78 }
79
80 // 1111 0000 0011 Am10; mov Am,MSP
81 8.0xf0+4.0x3,2.AM1,10:D0s:::mov
82 "mov"
83 *am33
84 {
85 PC = cia;
86 State.regs[REG_MSP] = State.regs[REG_A0 + AM1];
87 }
88
89
90 // 1111 0000 1110 imm4; syscall
91 8.0xf0+4.0xe,IMM4:D0t:::syscall
92 "syscall"
93 *am33
94 {
95 unsigned int sp, next_pc;
96
97 PC = cia;
98 sp = State.regs[REG_SP];
99 next_pc = State.regs[REG_PC] + 2;
100 store_word (sp - 4, next_pc);
101 store_word (sp - 8, PSW);
102 State.regs[REG_PC] = 0x40000000 + IMM4 * 8;
103 nia = PC;
104 }
105
106
107 // 1111 0010 1110 11Dn; mov EPSW,Dn
108 8.0xf2+4.0xe,11,2.DN0:D0u:::mov
109 "mov"
110 *am33
111 {
112 PC = cia;
113 State.regs[REG_D0 + DN0] = PSW;
114 }
115
116
117 // 1111 0010 1111 Dm01; mov Dm,EPSW
118 8.0xf2+4.0xf,2.DM1,01:D0v:::mov
119 "mov"
120 *am33
121 {
122 PC = cia;
123 PSW = State.regs[REG_D0 + DM1];
124 }
125
126 // 1111 0101 00Am Rn; mov Am,Rn
127 8.0xf5+00,2.AM1,4.RN0:D0w:::mov
128 "mov"
129 *am33
130 {
131 int destreg = translate_rreg (SD_, RN0);
132
133 PC = cia;
134 State.regs[destreg] = State.regs[REG_A0 + AM1];
135 }
136
137 // 1111 0101 01Dm Rn; mov Dm,Rn
138 8.0xf5+01,2.DM1,4.RN0:D0x:::mov
139 "mov"
140 *am33
141 {
142 int destreg = translate_rreg (SD_, RN0);
143
144 PC = cia;
145 State.regs[destreg] = State.regs[REG_D0 + DM1];
146 }
147
148 // 1111 0101 10Rm An; mov Rm,An
149 8.0xf5+10,4.RM1,2.AN0:D0y:::mov
150 "mov"
151 *am33
152 {
153 int destreg = translate_rreg (SD_, RM1);
154
155 PC = cia;
156 State.regs[REG_A0 + AN0] = State.regs[destreg];
157 }
158
159 // 1111 0101 11Rm Dn; mov Rm,Dn
160 8.0xf5+11,4.RM1,2.DN0:D0z:::mov
161 "mov"
162 *am33
163 {
164 int destreg = translate_rreg (SD_, RM1);
165
166 PC = cia;
167 State.regs[REG_D0 + DN0] = State.regs[destreg];
168 }
169
170
171 // 1111 1000 1100 1110 regs....; movm (USP),regs
172 8.0xf8+8.0xce+8.REGS:D1a:::movm
173 "movm"
174 *am33
175 {
176 unsigned long usp = State.regs[REG_USP];
177 unsigned long mask;
178
179 PC = cia;
180 mask = REGS;
181
182 if (mask & 0x8)
183 {
184 usp += 4;
185 State.regs[REG_LAR] = load_word (usp);
186 usp += 4;
187 State.regs[REG_LIR] = load_word (usp);
188 usp += 4;
189 State.regs[REG_MDR] = load_word (usp);
190 usp += 4;
191 State.regs[REG_A0 + 1] = load_word (usp);
192 usp += 4;
193 State.regs[REG_A0] = load_word (usp);
194 usp += 4;
195 State.regs[REG_D0 + 1] = load_word (usp);
196 usp += 4;
197 State.regs[REG_D0] = load_word (usp);
198 usp += 4;
199 }
200
201 if (mask & 0x10)
202 {
203 State.regs[REG_A0 + 3] = load_word (usp);
204 usp += 4;
205 }
206
207 if (mask & 0x20)
208 {
209 State.regs[REG_A0 + 2] = load_word (usp);
210 usp += 4;
211 }
212
213 if (mask & 0x40)
214 {
215 State.regs[REG_D0 + 3] = load_word (usp);
216 usp += 4;
217 }
218
219 if (mask & 0x80)
220 {
221 State.regs[REG_D0 + 2] = load_word (usp);
222 usp += 4;
223 }
224
225 /* start-sanitize-am33 */
226 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
227 {
228 if (mask & 0x1)
229 {
230 /* Need to restore MDQR, MCRH, MCRL, and MCVF */
231 usp += 16;
232 State.regs[REG_E0 + 1] = load_word (usp);
233 usp += 4;
234 State.regs[REG_E0 + 0] = load_word (usp);
235 usp += 4;
236 }
237
238 if (mask & 0x2)
239 {
240 State.regs[REG_E0 + 7] = load_word (usp);
241 usp += 4;
242 State.regs[REG_E0 + 6] = load_word (usp);
243 usp += 4;
244 State.regs[REG_E0 + 5] = load_word (usp);
245 usp += 4;
246 State.regs[REG_E0 + 4] = load_word (usp);
247 usp += 4;
248 }
249
250 if (mask & 0x4)
251 {
252 State.regs[REG_E0 + 3] = load_word (usp);
253 usp += 4;
254 State.regs[REG_E0 + 2] = load_word (usp);
255 usp += 4;
256 }
257 }
258 /* end-sanitize-am33 */
259
260 /* And make sure to update the stack pointer. */
261 State.regs[REG_USP] = usp;
262 }
263
264 // 1111 1000 1100 1111 regs....; movm (USP),regs
265 8.0xf8+8.0xcf+8.REGS:D1b:::movm
266 "movm"
267 *am33
268 {
269 unsigned long usp = State.regs[REG_USP];
270 unsigned long mask;
271
272 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
273 {
274 if (mask & 0x4)
275 {
276 usp -= 4;
277 store_word (usp, State.regs[REG_E0 + 2]);
278 usp -= 4;
279 store_word (usp, State.regs[REG_E0 + 3]);
280 }
281
282 if (mask & 0x2)
283 {
284 usp -= 4;
285 store_word (usp, State.regs[REG_E0 + 4]);
286 usp -= 4;
287 store_word (usp, State.regs[REG_E0 + 5]);
288 usp -= 4;
289 store_word (usp, State.regs[REG_E0 + 6]);
290 usp -= 4;
291 store_word (usp, State.regs[REG_E0 + 7]);
292 }
293
294 if (mask & 0x1)
295 {
296 usp -= 4;
297 store_word (usp, State.regs[REG_E0 + 0]);
298 usp -= 4;
299 store_word (usp, State.regs[REG_E0 + 1]);
300 usp -= 16;
301 /* Need to save MDQR, MCRH, MCRL, and MCVF */
302 }
303 }
304 /* end-sanitize-am33 */
305
306 if (mask & 0x80)
307 {
308 usp -= 4;
309 store_word (usp, State.regs[REG_D0 + 2]);
310 }
311
312 if (mask & 0x40)
313 {
314 usp -= 4;
315 store_word (usp, State.regs[REG_D0 + 3]);
316 }
317
318 if (mask & 0x20)
319 {
320 usp -= 4;
321 store_word (usp, State.regs[REG_A0 + 2]);
322 }
323
324 if (mask & 0x10)
325 {
326 usp -= 4;
327 store_word (usp, State.regs[REG_A0 + 3]);
328 }
329
330 if (mask & 0x8)
331 {
332 usp -= 4;
333 store_word (usp, State.regs[REG_D0]);
334 usp -= 4;
335 store_word (usp, State.regs[REG_D0 + 1]);
336 usp -= 4;
337 store_word (usp, State.regs[REG_A0]);
338 usp -= 4;
339 store_word (usp, State.regs[REG_A0 + 1]);
340 usp -= 4;
341 store_word (usp, State.regs[REG_MDR]);
342 usp -= 4;
343 store_word (usp, State.regs[REG_LIR]);
344 usp -= 4;
345 store_word (usp, State.regs[REG_LAR]);
346 usp -= 4;
347 }
348
349 /* And make sure to update the stack pointer. */
350 State.regs[REG_USP] = usp;
351 }
352
353 // 1111 1100 1111 1100 imm32...; and imm32,EPSW
354 8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
355 "and"
356 *am33
357 {
358 PC = cia;
359 PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
360 }
361
362 // 1111 1100 1111 1101 imm32...; or imm32,EPSW
363 8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
364 "or"
365 *am33
366 {
367 PC = cia;
368 PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
369 }
370
371 // 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
372 8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
373 "mov"
374 *am33
375 {
376 int srcreg, dstreg;
377
378 PC = cia;
379
380 srcreg = translate_rreg (SD_, RM2);
381 dstreg = translate_rreg (SD_, RN0);
382 State.regs[dstreg] = State.regs[srcreg];
383 }
384
385 // 1111 1001 0001 1000 Rn Rn; ext Rn
386 8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
387 "mov"
388 *am33
389 {
390 int srcreg;
391
392 PC = cia;
393 srcreg = translate_rreg (SD_, RN0);
394 if (State.regs[srcreg] & 0x80000000)
395 State.regs[REG_MDR] = -1;
396 else
397 State.regs[REG_MDR] = 0;
398 }
399
400 // 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
401 8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
402 "extb"
403 *am33
404 {
405 int srcreg, dstreg;
406
407 PC = cia;
408 srcreg = translate_rreg (SD_, RM2);
409 dstreg = translate_rreg (SD_, RN0);
410 State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
411 }
412
413 // 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
414 8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
415 "extbu"
416 *am33
417 {
418 int srcreg, dstreg;
419
420 PC = cia;
421 srcreg = translate_rreg (SD_, RM2);
422 dstreg = translate_rreg (SD_, RN0);
423 State.regs[dstreg] = State.regs[srcreg] & 0xff;
424 }
425
426 // 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
427 8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
428 "exth"
429 *am33
430 {
431 int srcreg, dstreg;
432
433 PC = cia;
434 srcreg = translate_rreg (SD_, RM2);
435 dstreg = translate_rreg (SD_, RN0);
436 State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
437 }
438
439 // 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
440 8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
441 "exthu"
442 *am33
443 {
444 int srcreg, dstreg;
445
446 PC = cia;
447 srcreg = translate_rreg (SD_, RM2);
448 dstreg = translate_rreg (SD_, RN0);
449 State.regs[dstreg] = State.regs[srcreg] & 0xffff;
450 }
451
452 // 1111 1001 0110 1000 Rn Rn; clr Rn
453 8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
454 "clr"
455 *am33
456 {
457 int dstreg;
458
459 PC = cia;
460 dstreg = translate_rreg (SD_, RN0);
461 State.regs[dstreg] = 0;
462 PSW |= PSW_Z;
463 PSW &= ~(PSW_V | PSW_C | PSW_N);
464 }
465
466 // 1111 1001 0111 1000 Rm Rn; add Rm,Rn
467 8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
468 "add"
469 *am33
470 {
471 int srcreg, dstreg;
472
473 PC = cia;
474 srcreg = translate_rreg (SD_, RM2);
475 dstreg = translate_rreg (SD_, RN0);
476 genericAdd (State.regs[srcreg], dstreg);
477 }
478
479 // 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
480 8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
481 "addc"
482 *am33
483 {
484 int srcreg, dstreg;
485 int z, c, n, v;
486 unsigned long reg1, reg2, sum;
487
488 PC = cia;
489 srcreg = translate_rreg (SD_, RM2);
490 dstreg = translate_rreg (SD_, RN0);
491
492 reg1 = State.regs[srcreg];
493 reg2 = State.regs[dstreg];
494 sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
495 State.regs[dstreg] = sum;
496
497 z = ((PSW & PSW_Z) != 0) && (sum == 0);
498 n = (sum & 0x80000000);
499 c = (sum < reg1) || (sum < reg2);
500 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
501 && (reg2 & 0x80000000) != (sum & 0x80000000));
502
503 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
504 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
505 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
506 }
507
508 // 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
509 8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
510 "sub"
511 *am33
512 {
513 int srcreg, dstreg;
514
515 PC = cia;
516 srcreg = translate_rreg (SD_, RM2);
517 dstreg = translate_rreg (SD_, RN0);
518 genericSub (State.regs[srcreg], dstreg);
519 }
520
521 // 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
522 8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
523 "subc"
524 *am33
525 {
526 int srcreg, dstreg;
527 int z, c, n, v;
528 unsigned long reg1, reg2, difference;
529
530 PC = cia;
531 srcreg = translate_rreg (SD_, RM2);
532 dstreg = translate_rreg (SD_, RN0);
533
534 reg1 = State.regs[srcreg];
535 reg2 = State.regs[dstreg];
536 difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
537 State.regs[dstreg] = difference;
538
539 z = ((PSW & PSW_Z) != 0) && (difference == 0);
540 n = (difference & 0x80000000);
541 c = (reg1 > reg2);
542 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
543 && (reg2 & 0x80000000) != (difference & 0x80000000));
544
545 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
546 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
547 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
548 }
549
550 // 1111 1001 1011 1000 Rn Rn; inc Rn
551 8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
552 "inc"
553 *am33
554 {
555 int dstreg;
556
557 PC = cia;
558 dstreg = translate_rreg (SD_, RN0);
559 genericAdd (1, dstreg);
560 }
561
562 // 1111 1001 1101 1000 Rn Rn; inc Rn
563 8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
564 "inc4"
565 *am33
566 {
567 int dstreg;
568
569 PC = cia;
570 dstreg = translate_rreg (SD_, RN0);
571 State.regs[dstreg] += 4;
572 }
573
574 // 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
575 8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
576 "cmp"
577 *am33
578 {
579 int srcreg1, srcreg2;
580
581 PC = cia;
582 srcreg1 = translate_rreg (SD_, RN0);
583 srcreg2 = translate_rreg (SD_, RM2);
584 genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
585 }
586
587 // 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
588 8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
589 "mov"
590 *am33
591 {
592 int dstreg;
593
594 PC = cia;
595 dstreg = translate_rreg (SD_, RN0);
596
597 if (XRM2 == 0)
598 {
599 State.regs[dstreg] = State.regs[REG_SP];
600 }
601 else
602 abort ();
603 }
604
605 // 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
606 8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
607 "mov"
608 *am33
609 {
610 int srcreg;
611
612 PC = cia;
613 srcreg = translate_rreg (SD_, RM2);
614
615 if (XRN0 == 0)
616 {
617 State.regs[REG_SP] = State.regs[srcreg];
618 }
619 else
620 abort ();
621 }
622
623 // 1111 1001 0000 1001 Rm Rn; and Rm,Rn
624 8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
625 "and"
626 *am33
627 {
628 int srcreg, dstreg;
629 int z, n;
630
631 PC = cia;
632
633 srcreg = translate_rreg (SD_, RM2);
634 dstreg = translate_rreg (SD_, RN0);
635
636 State.regs[dstreg] &= State.regs[srcreg];
637 z = (State.regs[dstreg] == 0);
638 n = (State.regs[dstreg] & 0x80000000) != 0;
639 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
640 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
641 }
642
643 // 1111 1001 0001 1001 Rm Rn; or Rm,Rn
644 8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
645 "or"
646 *am33
647 {
648 int srcreg, dstreg;
649 int z, n;
650
651 PC = cia;
652 srcreg = translate_rreg (SD_, RM2);
653 dstreg = translate_rreg (SD_, RN0);
654
655 State.regs[dstreg] |= State.regs[srcreg];
656 z = (State.regs[dstreg] == 0);
657 n = (State.regs[dstreg] & 0x80000000) != 0;
658 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
659 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
660 }
661
662 // 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
663 8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
664 "xor"
665 *am33
666 {
667 int srcreg, dstreg;
668 int z, n;
669
670 PC = cia;
671 srcreg = translate_rreg (SD_, RM2);
672 dstreg = translate_rreg (SD_, RN0);
673
674 State.regs[dstreg] ^= State.regs[srcreg];
675 z = (State.regs[dstreg] == 0);
676 n = (State.regs[dstreg] & 0x80000000) != 0;
677 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
678 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
679 }
680
681 // 1111 1001 0011 1001 Rn Rn; not Rn
682 8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
683 "not"
684 *am33
685 {
686 int dstreg;
687 int z, n;
688
689 PC = cia;
690 dstreg = translate_rreg (SD_, RN0);
691
692 State.regs[dstreg] = ~State.regs[dstreg];
693 z = (State.regs[dstreg] == 0);
694 n = (State.regs[dstreg] & 0x80000000) != 0;
695 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
696 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
697 }
698
699 // 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
700 8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
701 "asr"
702 *am33
703 {
704 int srcreg, dstreg;
705 long temp;
706 int c, z, n;
707
708 PC = cia;
709 srcreg = translate_rreg (SD_, RM2);
710 dstreg = translate_rreg (SD_, RN0);
711
712 temp = State.regs[dstreg];
713 c = temp & 1;
714 temp >>= State.regs[srcreg];
715 State.regs[dstreg] = temp;
716 z = (State.regs[dstreg] == 0);
717 n = (State.regs[dstreg] & 0x80000000) != 0;
718 PSW &= ~(PSW_Z | PSW_N | PSW_C);
719 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
720 }
721
722 // 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
723 8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
724 "lsr"
725 *am33
726 {
727 int srcreg, dstreg;
728 int z, n, c;
729
730 PC = cia;
731
732 srcreg = translate_rreg (SD_, RM2);
733 dstreg = translate_rreg (SD_, RN0);
734
735 c = State.regs[dstreg] & 1;
736 State.regs[dstreg] >>= State.regs[srcreg];
737 z = (State.regs[dstreg] == 0);
738 n = (State.regs[dstreg] & 0x80000000) != 0;
739 PSW &= ~(PSW_Z | PSW_N | PSW_C);
740 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
741 }
742
743 // 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
744 8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
745 "asl"
746 *am33
747 {
748 int srcreg, dstreg;
749 int z, n;
750
751 PC = cia;
752 srcreg = translate_rreg (SD_, RM2);
753 dstreg = translate_rreg (SD_, RN0);
754
755 State.regs[dstreg] <<= State.regs[srcreg];
756 z = (State.regs[dstreg] == 0);
757 n = (State.regs[dstreg] & 0x80000000) != 0;
758 PSW &= ~(PSW_Z | PSW_N);
759 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
760 }
761
762 // 1111 1001 0111 1001 Rn Rn; asl2 Rn
763 8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
764 "asl2"
765 *am33
766 {
767 int dstreg;
768 int n, z;
769
770 PC = cia;
771 dstreg = translate_rreg (SD_, RN0);
772
773 State.regs[dstreg] <<= 2;
774 z = (State.regs[dstreg] == 0);
775 n = (State.regs[dstreg] & 0x80000000) != 0;
776 PSW &= ~(PSW_Z | PSW_N);
777 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
778 }
779
780 // 1111 1001 1000 1001 Rn Rn; ror Rn
781 8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
782 "ror"
783 *am33
784 {
785 int dstreg;
786 int c, n, z;
787 unsigned long value;
788
789 PC = cia;
790 dstreg = translate_rreg (SD_, RN0);
791
792 value = State.regs[dstreg];
793 c = (value & 0x1);
794
795 value >>= 1;
796 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
797 State.regs[dstreg] = value;
798 z = (value == 0);
799 n = (value & 0x80000000) != 0;
800 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
801 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
802 }
803
804 // 1111 1001 1001 1001 Rn Rn; rol Rn
805 8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
806 "rol"
807 *am33
808 {
809 int dstreg;
810 int c, n, z;
811 unsigned long value;
812
813 PC = cia;
814 dstreg = translate_rreg (SD_, RN0);
815
816 value = State.regs[dstreg];
817 c = (value & 0x80000000) ? 1 : 0;
818
819 value <<= 1;
820 value |= ((PSW & PSW_C) != 0);
821 State.regs[dstreg] = value;
822 z = (value == 0);
823 n = (value & 0x80000000) != 0;
824 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
825 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
826 }
827
828 // 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
829 8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
830 "mul"
831 *am33
832 {
833 int srcreg, dstreg;
834 unsigned long long temp;
835 int n, z;
836
837 PC = cia;
838 srcreg = translate_rreg (SD_, RM2);
839 dstreg = translate_rreg (SD_, RN0);
840
841 temp = ((signed64)(signed32)State.regs[dstreg]
842 * (signed64)(signed32)State.regs[srcreg]);
843 State.regs[dstreg] = temp & 0xffffffff;
844 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
845 z = (State.regs[dstreg] == 0);
846 n = (State.regs[dstreg] & 0x80000000) != 0;
847 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
848 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
849 }
850
851 // 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
852 8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
853 "mulu"
854 *am33
855 {
856 int srcreg, dstreg;
857 unsigned long long temp;
858 int n, z;
859
860 PC = cia;
861 srcreg = translate_rreg (SD_, RM2);
862 dstreg = translate_rreg (SD_, RN0);
863
864 temp = ((unsigned64)State.regs[dstreg]
865 * (unsigned64)State.regs[srcreg]);
866 State.regs[dstreg] = temp & 0xffffffff;
867 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
868 z = (State.regs[dstreg] == 0);
869 n = (State.regs[dstreg] & 0x80000000) != 0;
870 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
871 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
872 }
873
874 // 1111 1001 1100 1001 Rm Rn; div Rm,Rn
875 8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
876 "div"
877 *am33
878 {
879 int srcreg, dstreg;
880 long long temp;
881 int n, z;
882
883 PC = cia;
884 srcreg = translate_rreg (SD_, RM2);
885 dstreg = translate_rreg (SD_, RN0);
886
887 temp = State.regs[REG_MDR];
888 temp <<= 32;
889 temp |= State.regs[dstreg];
890 State.regs[REG_MDR] = temp % (signed32)State.regs[srcreg];
891 temp /= (signed32)State.regs[srcreg];
892 State.regs[dstreg] = temp & 0xffffffff;
893 z = (State.regs[dstreg] == 0);
894 n = (State.regs[dstreg] & 0x80000000) != 0;
895 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
896 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
897 }
898
899 // 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
900 8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
901 "divu"
902 *am33
903 {
904 int srcreg, dstreg;
905 unsigned long long temp;
906 int n, z;
907
908 PC = cia;
909 srcreg = translate_rreg (SD_, RM2);
910 dstreg = translate_rreg (SD_, RN0);
911
912 temp = State.regs[REG_MDR];
913 temp <<= 32;
914 temp |= State.regs[dstreg];
915 State.regs[REG_MDR] = temp % State.regs[srcreg];
916 temp /= State.regs[srcreg];
917 State.regs[dstreg] = temp & 0xffffffff;
918 z = (State.regs[dstreg] == 0);
919 n = (State.regs[dstreg] & 0x80000000) != 0;
920 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
921 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
922 }
923
924
925 // 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
926 8.0xf9+8.0x0a+4.RN2,4.RM0:D1h:::mov
927 "mov"
928 *am33
929 {
930 int srcreg, dstreg;
931
932 PC = cia;
933 srcreg = translate_rreg (SD_, RM0);
934 dstreg = translate_rreg (SD_, RN2);
935 State.regs[dstreg] = load_word (State.regs[srcreg]);
936 }
937
938 // 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
939 8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
940 "mov"
941 *am33
942 {
943 int srcreg, dstreg;
944
945 PC = cia;
946 srcreg = translate_rreg (SD_, RM2);
947 dstreg = translate_rreg (SD_, RN0);
948 store_word (State.regs[dstreg], State.regs[srcreg]);
949 }
950
951 // 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
952 8.0xf9+8.0x2a+4.RN2,4.RM0:D1g:::movbu
953 "movbu"
954 *am33
955 {
956 int srcreg, dstreg;
957
958 PC = cia;
959 srcreg = translate_rreg (SD_, RM0);
960 dstreg = translate_rreg (SD_, RN2);
961 State.regs[dstreg] = load_byte (State.regs[srcreg]);
962 }
963
964 // 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
965 8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
966 "movbu"
967 *am33
968 {
969 int srcreg, dstreg;
970
971 PC = cia;
972 srcreg = translate_rreg (SD_, RM2);
973 dstreg = translate_rreg (SD_, RN0);
974 store_byte (State.regs[dstreg], State.regs[srcreg]);
975 }
976
977 // 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
978 8.0xf9+8.0x4a+4.RN2,4.RM0:D1g:::movhu
979 "movhu"
980 *am33
981 {
982 int srcreg, dstreg;
983
984 PC = cia;
985 srcreg = translate_rreg (SD_, RM0);
986 dstreg = translate_rreg (SD_, RN2);
987 State.regs[dstreg] = load_half (State.regs[srcreg]);
988 }
989
990 // 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
991 8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::movhu
992 "movhu"
993 *am33
994 {
995 int srcreg, dstreg;
996
997 PC = cia;
998 srcreg = translate_rreg (SD_, RM2);
999 dstreg = translate_rreg (SD_, RN0);
1000 store_half (State.regs[dstreg], State.regs[srcreg]);
1001 }
1002
1003 // 1111 1001 0110 1010 Rm Rn; mov (Rm+),Rn
1004 8.0xf9+8.0x6a+4.RN2,4.RM0:D1y:::mov
1005 "mov"
1006 *am33
1007 {
1008 int srcreg, dstreg;
1009
1010 PC = cia;
1011 srcreg = translate_rreg (SD_, RM0);
1012 dstreg = translate_rreg (SD_, RN2);
1013 State.regs[dstreg] = load_word (State.regs[srcreg]);
1014 State.regs[srcreg] += 4;
1015 }
1016
1017 // 1111 1001 0111 1010 Rm Rn; mov Rm,(Rn+)
1018 8.0xf9+8.0x7a+4.RM2,4.RN0:D1z:::mov
1019 "mov"
1020 *am33
1021 {
1022 int srcreg, dstreg;
1023
1024 PC = cia;
1025 srcreg = translate_rreg (SD_, RM2);
1026 dstreg = translate_rreg (SD_, RN0);
1027 store_word (State.regs[dstreg], State.regs[srcreg]);
1028 State.regs[dstreg] += 4;
1029 }
1030
1031 // 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
1032 8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
1033 "mov"
1034 *am33
1035 {
1036 int dstreg;
1037
1038 PC = cia;
1039 dstreg = translate_rreg (SD_, RN2);
1040 State.regs[dstreg] = load_word (State.regs[REG_SP]);
1041 }
1042
1043 // 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
1044 8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
1045 "mov"
1046 *am33
1047 {
1048 int srcreg;
1049
1050 PC = cia;
1051 srcreg = translate_rreg (SD_, RM2);
1052 store_word (State.regs[REG_SP], State.regs[srcreg]);
1053 }
1054
1055 // 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
1056 8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
1057 "movbu"
1058 *am33
1059 {
1060 int dstreg;
1061
1062 PC = cia;
1063 dstreg = translate_rreg (SD_, RN2);
1064 State.regs[dstreg] = load_byte (State.regs[REG_SP]);
1065 }
1066
1067 // 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
1068 8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
1069 "movbu"
1070 *am33
1071 {
1072 int srcreg;
1073
1074 PC = cia;
1075 srcreg = translate_rreg (SD_, RM2);
1076 store_byte (State.regs[REG_SP], State.regs[srcreg]);
1077 }
1078
1079 // 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
1080 8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
1081 "movhu"
1082 *am33
1083 {
1084 int dstreg;
1085
1086 PC = cia;
1087 dstreg = translate_rreg (SD_, RN2);
1088 State.regs[dstreg] = load_half (State.regs[REG_SP]);
1089 }
1090
1091 // 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
1092 8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
1093 "movhu"
1094 *am33
1095 {
1096 int srcreg;
1097
1098 PC = cia;
1099 srcreg = translate_rreg (SD_, RM2);
1100 store_half (State.regs[REG_SP], State.regs[srcreg]);
1101 }
1102
1103 // 1111 1001 1110 1010 Rm Rn; movhu (Rm+),Rn
1104 8.0xf9+8.0xea+4.RN2,4.RM0:D1y:::movhu
1105 "movhu"
1106 *am33
1107 {
1108 int srcreg, dstreg;
1109
1110 PC = cia;
1111 srcreg = translate_rreg (SD_, RM0);
1112 dstreg = translate_rreg (SD_, RN2);
1113 State.regs[dstreg] = load_half (State.regs[srcreg]);
1114 State.regs[srcreg] += 2;
1115 }
1116
1117 // 1111 1001 1111 1010 Rm Rn; movhu Rm,(Rn+)
1118 8.0xf9+8.0xfa+4.RM2,4.RN0:D1z:::movhu
1119 "movhu"
1120 *am33
1121 {
1122 int srcreg, dstreg;
1123
1124 PC = cia;
1125 srcreg = translate_rreg (SD_, RM2);
1126 dstreg = translate_rreg (SD_, RN0);
1127 store_half (State.regs[dstreg], State.regs[srcreg]);
1128 State.regs[dstreg] += 2;
1129 }
1130
1131
1132 // 1111 1001 0000 1011 Rm Rn; mac Rm,Rn
1133 8.0xf9+8.0x0b+4.RM2,4.RN0:D1:::mac
1134 "mac"
1135 *am33
1136 {
1137 int srcreg1, srcreg2;
1138 long long temp, sum;
1139 int c, v;
1140
1141 PC = cia;
1142 srcreg1 = translate_rreg (SD_, RM2);
1143 srcreg2 = translate_rreg (SD_, RN0);
1144
1145 temp = ((signed64)(signed32)State.regs[srcreg2]
1146 * (signed64)(signed32)State.regs[srcreg1]);
1147 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1148 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1149 State.regs[REG_MCRL] = sum;
1150 temp >>= 32;
1151 temp &= 0xffffffff;
1152 sum = State.regs[REG_MCRH] + temp + c;
1153 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1154 && (temp & 0x80000000) != (sum & 0x80000000));
1155 State.regs[REG_MCRH] = sum;
1156 if (v)
1157 State.regs[REG_MCVF] = 1;
1158 }
1159
1160 // 1111 1001 0001 1011 Rm Rn; macu Rm,Rn
1161 8.0xf9+8.0x1b+4.RM2,4.RN0:D1:::macu
1162 "macu"
1163 *am33
1164 {
1165 int srcreg1, srcreg2;
1166 unsigned long long temp, sum;
1167 int c, v;
1168
1169 PC = cia;
1170 srcreg1 = translate_rreg (SD_, RM2);
1171 srcreg2 = translate_rreg (SD_, RN0);
1172
1173 temp = ((unsigned64)State.regs[srcreg2]
1174 * (unsigned64)State.regs[srcreg1]);
1175 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1176 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1177 State.regs[REG_MCRL] = sum;
1178 temp >>= 32;
1179 temp &= 0xffffffff;
1180 sum = State.regs[REG_MCRH] + temp + c;
1181 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1182 && (temp & 0x80000000) != (sum & 0x80000000));
1183 State.regs[REG_MCRH] = sum;
1184 if (v)
1185 State.regs[REG_MCVF] = 1;
1186 }
1187
1188 // 1111 1001 0010 1011 Rm Rn; macb Rm,Rn
1189 8.0xf9+8.0x2b+4.RM2,4.RN0:D1:::macb
1190 "macb"
1191 *am33
1192 {
1193 int srcreg1, srcreg2;
1194 long temp, sum;
1195 int v;
1196
1197 PC = cia;
1198 srcreg1 = translate_rreg (SD_, RM2);
1199 srcreg2 = translate_rreg (SD_, RN0);
1200
1201 temp = ((signed32)(signed8)(State.regs[srcreg2] & 0xff)
1202 * (signed32)(signed8)(State.regs[srcreg1] & 0xff));
1203 sum = State.regs[REG_MCRL] + temp;
1204 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1205 && (temp & 0x80000000) != (sum & 0x80000000));
1206 State.regs[REG_MCRL] = sum;
1207 if (v)
1208 State.regs[REG_MCVF] = 1;
1209 }
1210
1211 // 1111 1001 0011 1011 Rm Rn; macbu Rm,Rn
1212 8.0xf9+8.0x3b+4.RM2,4.RN0:D1:::macbu
1213 "macbu"
1214 *am33
1215 {
1216 int srcreg1, srcreg2;
1217 long long temp, sum;
1218 int v;
1219
1220 PC = cia;
1221 srcreg1 = translate_rreg (SD_, RM2);
1222 srcreg2 = translate_rreg (SD_, RN0);
1223
1224 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
1225 * (unsigned32)(State.regs[srcreg1] & 0xff));
1226 sum = State.regs[REG_MCRL] + temp;
1227 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1228 && (temp & 0x80000000) != (sum & 0x80000000));
1229 State.regs[REG_MCRL] = sum;
1230 if (v)
1231 State.regs[REG_MCVF] = 1;
1232 }
1233
1234 // 1111 1001 0100 1011 Rm Rn; mach Rm,Rn
1235 8.0xf9+8.0x4b+4.RM2,4.RN0:D1:::mach
1236 "mach"
1237 *am33
1238 {
1239 int srcreg1, srcreg2;
1240 long long temp, sum;
1241 int c, v;
1242
1243 PC = cia;
1244 srcreg1 = translate_rreg (SD_, RM2);
1245 srcreg2 = translate_rreg (SD_, RN0);
1246
1247 temp = ((unsigned64)(signed16)(State.regs[srcreg2] & 0xffff)
1248 * (unsigned64)(signed16)(State.regs[srcreg1] & 0xffff));
1249 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1250 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1251 State.regs[REG_MCRL] = sum;
1252 temp >>= 32;
1253 temp &= 0xffffffff;
1254 sum = State.regs[REG_MCRH] + temp + c;
1255 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1256 && (temp & 0x80000000) != (sum & 0x80000000));
1257 State.regs[REG_MCRH] = sum;
1258 if (v)
1259 State.regs[REG_MCVF] = 1;
1260 }
1261
1262 // 1111 1001 0101 1011 Rm Rn; machu Rm,Rn
1263 8.0xf9+8.0x5b+4.RM2,4.RN0:D1:::machu
1264 "machu"
1265 *am33
1266 {
1267 int srcreg1, srcreg2;
1268 long long temp, sum;
1269 int c, v;
1270
1271 PC = cia;
1272 srcreg1 = translate_rreg (SD_, RM2);
1273 srcreg2 = translate_rreg (SD_, RN0);
1274
1275 temp = ((unsigned64)(State.regs[srcreg2] & 0xffff)
1276 * (unsigned64)(State.regs[srcreg1] & 0xffff));
1277 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1278 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1279 State.regs[REG_MCRL] = sum;
1280 temp >>= 32;
1281 temp &= 0xffffffff;
1282 sum = State.regs[REG_MCRH] + temp + c;
1283 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1284 && (temp & 0x80000000) != (sum & 0x80000000));
1285 State.regs[REG_MCRH] = sum;
1286 if (v)
1287 State.regs[REG_MCVF] = 1;
1288 }
1289
1290 // 1111 1001 0110 1011 Rm Rn; dmach Rm,Rn
1291 8.0xf9+8.0x6b+4.RM2,4.RN0:D1:::dmach
1292 "dmach"
1293 *am33
1294 {
1295 int srcreg1, srcreg2;
1296 long temp, temp2, sum;
1297 int v;
1298
1299 PC = cia;
1300 srcreg1 = translate_rreg (SD_, RM2);
1301 srcreg2 = translate_rreg (SD_, RN0);
1302
1303 temp = ((signed32)(signed16)(State.regs[srcreg2] & 0xffff)
1304 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
1305 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
1306 * (signed32)(signed16)((State.regs[srcreg2] >> 16) & 0xffff));
1307 sum = temp + temp2 + State.regs[REG_MCRL];
1308 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1309 && (temp & 0x80000000) != (sum & 0x80000000));
1310 State.regs[REG_MCRL] = sum;
1311 if (v)
1312 State.regs[REG_MCVF] = 1;
1313 }
1314
1315 // 1111 1001 0111 1011 Rm Rn; dmachu Rm,Rn
1316 8.0xf9+8.0x7b+4.RM2,4.RN0:D1:::dmachu
1317 "dmachu"
1318 *am33
1319 {
1320 int srcreg1, srcreg2;
1321 unsigned long temp, temp2, sum;
1322 int v;
1323
1324 PC = cia;
1325 srcreg1 = translate_rreg (SD_, RM2);
1326 srcreg2 = translate_rreg (SD_, RN0);
1327
1328 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
1329 * (unsigned32)(State.regs[srcreg1] & 0xffff));
1330 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
1331 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
1332 sum = temp + temp2 + State.regs[REG_MCRL];
1333 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1334 && (temp & 0x80000000) != (sum & 0x80000000));
1335 State.regs[REG_MCRL] = sum;
1336 if (v)
1337 State.regs[REG_MCVF] = 1;
1338 }
1339
1340 // 1111 1001 1000 1011 Rm Rn; dmulh Rm,Rn
1341 8.0xf9+8.0x8b+4.RM2,4.RN0:D1:::dmulh
1342 "dmulh"
1343 *am33
1344 {
1345 int srcreg, dstreg;
1346 long temp;
1347
1348 PC = cia;
1349 srcreg = translate_rreg (SD_, RM2);
1350 dstreg = translate_rreg (SD_, RN0);
1351
1352 temp = ((signed32)(signed16)(State.regs[dstreg] & 0xffff)
1353 * (signed32)(signed16)(State.regs[srcreg] & 0xffff));
1354 State.regs[REG_MDRQ] = temp;
1355 temp = ((signed32)(signed16)((State.regs[dstreg] >> 16) & 0xffff)
1356 * (signed32)(signed16)((State.regs[srcreg] >>16) & 0xffff));
1357 State.regs[dstreg] = temp;
1358 }
1359
1360 // 1111 1001 1001 1011 Rm Rn; dmulhu Rm,Rn
1361 8.0xf9+8.0x9b+4.RM2,4.RN0:D1:::dumachu
1362 "dmachu"
1363 *am33
1364 {
1365 int srcreg, dstreg;
1366 unsigned long temp;
1367
1368 PC = cia;
1369 srcreg = translate_rreg (SD_, RM2);
1370 dstreg = translate_rreg (SD_, RN0);
1371
1372 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
1373 * (unsigned32)(State.regs[srcreg] & 0xffff));
1374 State.regs[REG_MDRQ] = temp;
1375 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
1376 * (unsigned32)((State.regs[srcreg] >>16) & 0xffff));
1377 State.regs[dstreg] = temp;
1378 }
1379
1380 // 1111 1001 1010 1011 Rm Rn; sat16 Rm,Rn
1381 8.0xf9+8.0xab+4.RM2,4.RN0:D1:::sat16
1382 "sat16"
1383 *am33
1384 {
1385 int srcreg, dstreg;
1386 int value, z, n;
1387
1388 PC = cia;
1389 srcreg = translate_rreg (SD_, RM2);
1390 dstreg = translate_rreg (SD_, RN0);
1391
1392 value = State.regs[srcreg];
1393
1394 if (value >= 0x7fff)
1395 State.regs[dstreg] = 0x7fff;
1396 else if (value <= 0xffff8000)
1397 State.regs[dstreg] = 0xffff8000;
1398 else
1399 State.regs[dstreg] = value;
1400
1401 n = (State.regs[dstreg] & 0x8000) != 0;
1402 z = (State.regs[dstreg] == 0);
1403 PSW &= ~(PSW_Z | PSW_N);
1404 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1405 }
1406
1407 // 1111 1001 1011 1011 Rm Rn; mcste Rm,Rn
1408 8.0xf9+8.0xbb+4.RM2,4.RN0:D1:::mcste
1409 "mcste"
1410 *am33
1411 {
1412 int srcreg, dstreg;
1413
1414 PC = cia;
1415 srcreg = translate_rreg (SD_, RM2);
1416 dstreg = translate_rreg (SD_, RN0);
1417
1418 PSW &= ~(PSW_V | PSW_C);
1419 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
1420
1421 /* 32bit saturation. */
1422 if (State.regs[srcreg] == 0x20)
1423 {
1424 long long tmp;
1425
1426 tmp = State.regs[REG_MCRH];
1427 tmp <<= 32;
1428 tmp += State.regs[REG_MCRL];
1429
1430 if (tmp > 0x7fffffff)
1431 State.regs[dstreg] = 0x7fffffff;
1432 else if (tmp < 0xffffffff80000000LL)
1433 State.regs[dstreg] = 0x80000000;
1434 else
1435 State.regs[dstreg] = tmp;
1436 }
1437 /* 16bit saturation */
1438 else if (State.regs[srcreg] == 0x10)
1439 {
1440 long long tmp;
1441
1442 tmp = State.regs[REG_MCRH];
1443 tmp <<= 32;
1444 tmp += State.regs[REG_MCRL];
1445
1446 if (tmp > 0x7fff)
1447 State.regs[dstreg] = 0x7fff;
1448 else if (tmp < 0xffffffffffff8000LL)
1449 State.regs[dstreg] = 0x8000;
1450 else
1451 State.regs[dstreg] = tmp;
1452 }
1453 /* 8 bit saturation */
1454 else if (State.regs[srcreg] == 0x8)
1455 {
1456 long long tmp;
1457
1458 tmp = State.regs[REG_MCRH];
1459 tmp <<= 32;
1460 tmp += State.regs[REG_MCRL];
1461
1462 if (tmp > 0x7f)
1463 State.regs[dstreg] = 0x7f;
1464 else if (tmp < 0xffffffffffffff80LL)
1465 State.regs[dstreg] = 0x80;
1466 else
1467 State.regs[dstreg] = tmp;
1468 }
1469 /* 9 bit saturation */
1470 else if (State.regs[srcreg] == 0x9)
1471 {
1472 long long tmp;
1473
1474 tmp = State.regs[REG_MCRH];
1475 tmp <<= 32;
1476 tmp += State.regs[REG_MCRL];
1477
1478 if (tmp > 0x80)
1479 State.regs[dstreg] = 0x80;
1480 else if (tmp < 0xffffffffffffff81LL)
1481 State.regs[dstreg] = 0x81;
1482 else
1483 State.regs[dstreg] = tmp;
1484 }
1485 /* 9 bit saturation */
1486 else if (State.regs[srcreg] == 0x30)
1487 {
1488 long long tmp;
1489
1490 tmp = State.regs[REG_MCRH];
1491 tmp <<= 32;
1492 tmp += State.regs[REG_MCRL];
1493
1494 if (tmp > 0x7fffffffffffLL)
1495 tmp = 0x7fffffffffffLL;
1496 else if (tmp < 0xffff800000000000LL)
1497 tmp = 0xffff800000000000LL;
1498
1499 tmp >>= 16;
1500 State.regs[dstreg] = tmp;
1501 }
1502 }
1503
1504 // 1111 1001 1100 1011 Rm Rn; swap Rm,Rn
1505 8.0xf9+8.0xcb+4.RM2,4.RN0:D1:::swap
1506 "swap"
1507 *am33
1508 {
1509 int srcreg, dstreg;
1510
1511 PC = cia;
1512 srcreg = translate_rreg (SD_, RM2);
1513 dstreg = translate_rreg (SD_, RN0);
1514
1515 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 24)
1516 | (((State.regs[srcreg] >> 8) & 0xff) << 16)
1517 | (((State.regs[srcreg] >> 16) & 0xff) << 8)
1518 | ((State.regs[srcreg] >> 24) & 0xff));
1519 }
1520
1521 // 1111 1101 1101 1011 Rm Rn; swaph Rm,Rn
1522 8.0xf9+8.0xdb+4.RM2,4.RN0:D1:::swaph
1523 "swaph"
1524 *am33
1525 {
1526 int srcreg, dstreg;
1527
1528 PC = cia;
1529 srcreg = translate_rreg (SD_, RM2);
1530 dstreg = translate_rreg (SD_, RN0);
1531
1532 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 8)
1533 | ((State.regs[srcreg] >> 8) & 0xff)
1534 | (((State.regs[srcreg] >> 16) & 0xff) << 24)
1535 | (((State.regs[srcreg] >> 24) & 0xff) << 16));
1536 }
1537
1538 // 1111 1001 1110 1011 Rm Rn; swhw Rm,Rn
1539 8.0xf9+8.0xeb+4.RM2,4.RN0:D1:::swhw
1540 "swhw"
1541 *am33
1542 {
1543 int srcreg, dstreg;
1544
1545 PC = cia;
1546 srcreg = translate_rreg (SD_, RM2);
1547 dstreg = translate_rreg (SD_, RN0);
1548
1549 State.regs[dstreg] = (((State.regs[srcreg] & 0xffff) << 16)
1550 | ((State.regs[srcreg] >> 16) & 0xffff));
1551 }
1552
1553 // 1111 1001 1111 1011 Rm Rn; bsch Rm,Rn
1554 8.0xf9+8.0xfb+4.RM2,4.RN0:D1:::bsch
1555 "bsch"
1556 *am33
1557 {
1558 int temp, c, i;
1559 int srcreg, dstreg;
1560 int start;
1561
1562 PC = cia;
1563 srcreg = translate_rreg (SD_, RM2);
1564 dstreg = translate_rreg (SD_, RN0);
1565
1566 temp = State.regs[srcreg];
1567 start = (State.regs[dstreg] & 0x1f) - 1;
1568 if (start == -1)
1569 start = 31;
1570
1571 for (i = start; i >= 0; i--)
1572 {
1573 if (temp & (1 << i))
1574 {
1575 c = 1;
1576 State.regs[dstreg] = i;
1577 break;
1578 }
1579 }
1580
1581 if (i < 0)
1582 {
1583 c = 0;
1584 State.regs[dstreg] = 0;
1585 }
1586 PSW &= ~(PSW_C);
1587 PSW |= (c ? PSW_C : 0);
1588 }
1589
1590
1591 // 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
1592 8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
1593 "mov"
1594 *am33
1595 {
1596 int dstreg;
1597
1598 PC = cia;
1599 dstreg = translate_rreg (SD_, RN0);
1600 State.regs[dstreg] = EXTEND8 (IMM8);
1601 }
1602
1603 // 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
1604 8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
1605 "movu"
1606 *am33
1607 {
1608 int dstreg;
1609
1610 PC = cia;
1611 dstreg = translate_rreg (SD_, RN0);
1612 State.regs[dstreg] = IMM8 & 0xff;
1613 }
1614
1615 // 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
1616 8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
1617 "add"
1618 *am33
1619 {
1620 int dstreg;
1621
1622 PC = cia;
1623 dstreg = translate_rreg (SD_, RN0);
1624 genericAdd (EXTEND8 (IMM8), dstreg);
1625 }
1626
1627 // 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
1628 8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
1629 "addc"
1630 *am33
1631 {
1632 int dstreg, imm;
1633 int z, c, n, v;
1634 unsigned long reg1, reg2, sum;
1635
1636 PC = cia;
1637 dstreg = translate_rreg (SD_, RN0);
1638
1639 imm = EXTEND8 (IMM8);
1640 reg2 = State.regs[dstreg];
1641 sum = imm + reg2 + ((PSW & PSW_C) != 0);
1642 State.regs[dstreg] = sum;
1643
1644 z = ((PSW & PSW_Z) != 0) && (sum == 0);
1645 n = (sum & 0x80000000);
1646 c = (sum < imm) || (sum < reg2);
1647 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1648 && (reg2 & 0x80000000) != (sum & 0x80000000));
1649
1650 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1651 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1652 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1653 }
1654
1655 // 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
1656 8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
1657 "sub"
1658 *am33
1659 {
1660 int dstreg;
1661
1662 PC = cia;
1663 dstreg = translate_rreg (SD_, RN0);
1664
1665 genericSub (EXTEND8 (IMM8), dstreg);
1666 }
1667
1668 // 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
1669 8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
1670 "subc"
1671 *am33
1672 {
1673 int imm, dstreg;
1674 int z, c, n, v;
1675 unsigned long reg1, reg2, difference;
1676
1677 PC = cia;
1678 dstreg = translate_rreg (SD_, RN0);
1679
1680 imm = EXTEND8 (IMM8);
1681 reg2 = State.regs[dstreg];
1682 difference = reg2 - imm - ((PSW & PSW_C) != 0);
1683 State.regs[dstreg] = difference;
1684
1685 z = ((PSW & PSW_Z) != 0) && (difference == 0);
1686 n = (difference & 0x80000000);
1687 c = (imm > reg2);
1688 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1689 && (reg2 & 0x80000000) != (difference & 0x80000000));
1690
1691 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1692 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1693 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1694 }
1695
1696 // 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
1697 8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
1698 "cmp"
1699 *am33
1700 {
1701 int srcreg;
1702
1703 PC = cia;
1704 srcreg = translate_rreg (SD_, RN0);
1705 genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
1706 }
1707
1708 // 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
1709 8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
1710 "mov"
1711 *am33
1712 {
1713 int dstreg;
1714
1715 PC = cia;
1716
1717 if (XRN0 == 0)
1718 State.regs[REG_SP] = IMM8;
1719 else
1720 abort ();
1721 }
1722
1723 // 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
1724 8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
1725 "and"
1726 *am33
1727 {
1728 int dstreg;
1729 int z, n;
1730
1731 PC = cia;
1732 dstreg = translate_rreg (SD_, RN0);
1733
1734 State.regs[dstreg] &= (IMM8 & 0xff);
1735 z = (State.regs[dstreg] == 0);
1736 n = (State.regs[dstreg] & 0x80000000) != 0;
1737 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1738 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1739 }
1740
1741 // 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
1742 8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
1743 "or"
1744 *am33
1745 {
1746 int dstreg;
1747 int z, n;
1748
1749 PC = cia;
1750 dstreg = translate_rreg (SD_, RN0);
1751
1752 State.regs[dstreg] |= (IMM8 & 0xff);
1753 z = (State.regs[dstreg] == 0);
1754 n = (State.regs[dstreg] & 0x80000000) != 0;
1755 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1756 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1757 }
1758
1759 // 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
1760 8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
1761 "xor"
1762 *am33
1763 {
1764 int dstreg;
1765 int z, n;
1766
1767 PC = cia;
1768 dstreg = translate_rreg (SD_, RN0);
1769
1770 State.regs[dstreg] ^= (IMM8 & 0xff);
1771 z = (State.regs[dstreg] == 0);
1772 n = (State.regs[dstreg] & 0x80000000) != 0;
1773 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1774 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1775 }
1776
1777 // 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
1778 8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
1779 "asr"
1780 *am33
1781 {
1782 int dstreg;
1783 long temp;
1784 int c, z, n;
1785
1786 PC = cia;
1787 dstreg = translate_rreg (SD_, RN0);
1788
1789 temp = State.regs[dstreg];
1790 c = temp & 1;
1791 temp >>= (IMM8 & 0xff);
1792 State.regs[dstreg] = temp;
1793 z = (State.regs[dstreg] == 0);
1794 n = (State.regs[dstreg] & 0x80000000) != 0;
1795 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1796 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1797 }
1798
1799 // 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
1800 8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
1801 "lsr"
1802 *am33
1803 {
1804 int dstreg;
1805 int z, n, c;
1806
1807 PC = cia;
1808 dstreg = translate_rreg (SD_, RN0);
1809
1810 c = State.regs[dstreg] & 1;
1811 State.regs[dstreg] >>= (IMM8 & 0xff);
1812 z = (State.regs[dstreg] == 0);
1813 n = (State.regs[dstreg] & 0x80000000) != 0;
1814 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1815 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1816 }
1817
1818 // 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
1819 8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
1820 "asl"
1821 *am33
1822 {
1823 int srcreg, dstreg;
1824 int z, n;
1825
1826 PC = cia;
1827 dstreg = translate_rreg (SD_, RN0);
1828
1829 State.regs[dstreg] <<= (IMM8 & 0xff);
1830 z = (State.regs[dstreg] == 0);
1831 n = (State.regs[dstreg] & 0x80000000) != 0;
1832 PSW &= ~(PSW_Z | PSW_N);
1833 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1834 }
1835
1836 // 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
1837 8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
1838 "mul"
1839 *am33
1840 {
1841 int dstreg;
1842 unsigned long long temp;
1843 int z, n;
1844
1845 PC = cia;
1846 dstreg = translate_rreg (SD_, RN0);
1847
1848 temp = ((signed64)(signed32)State.regs[dstreg]
1849 * (signed64)(signed32)EXTEND8 (IMM8));
1850 State.regs[dstreg] = temp & 0xffffffff;
1851 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1852 z = (State.regs[dstreg] == 0);
1853 n = (State.regs[dstreg] & 0x80000000) != 0;
1854 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1855 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1856 }
1857
1858 // 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
1859 8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
1860 "mulu"
1861 *am33
1862 {
1863 int dstreg;
1864 unsigned long long temp;
1865 int z, n;
1866
1867 PC = cia;
1868 dstreg = translate_rreg (SD_, RN0);
1869
1870 temp = ((unsigned64)State.regs[dstreg]
1871 * (unsigned64)(IMM8 & 0xff));
1872 State.regs[dstreg] = temp & 0xffffffff;
1873 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1874 z = (State.regs[dstreg] == 0);
1875 n = (State.regs[dstreg] & 0x80000000) != 0;
1876 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1877 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1878 }
1879
1880 // 1111 1011 1110 1001 Rn Rn IMM8; btst imm8,Rn
1881 8.0xfb+8.0xe9+4.RN2,4.RM0=RN2+8.IMM8:D2l:::btst
1882 "btst"
1883 *am33
1884 {
1885 int srcreg;
1886
1887 PC = cia;
1888 srcreg = translate_rreg (SD_, RM0);
1889 genericBtst(IMM8, State.regs[srcreg]);
1890 }
1891
1892 // 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
1893 8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
1894 "mov"
1895 *am33
1896 {
1897 int srcreg, dstreg;
1898
1899 PC = cia;
1900 srcreg = translate_rreg (SD_, RM0);
1901 dstreg = translate_rreg (SD_, RN2);
1902 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
1903 }
1904
1905 // 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
1906 8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
1907 "mov"
1908 {
1909 int srcreg, dstreg;
1910
1911 PC = cia;
1912 srcreg = translate_rreg (SD_, RM2);
1913 dstreg = translate_rreg (SD_, RN0);
1914 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1915 }
1916
1917 // 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
1918 8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
1919 "movbu"
1920 {
1921 int srcreg, dstreg;
1922
1923 PC = cia;
1924 srcreg = translate_rreg (SD_, RM0);
1925 dstreg = translate_rreg (SD_, RN2);
1926 State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
1927 }
1928
1929 // 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
1930 8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
1931 "movbu"
1932 {
1933 int srcreg, dstreg;
1934
1935 PC = cia;
1936 srcreg = translate_rreg (SD_, RM2);
1937 dstreg = translate_rreg (SD_, RN0);
1938 store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1939 }
1940
1941 // 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
1942 8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
1943 "movhu"
1944 {
1945 int srcreg, dstreg;
1946
1947 PC = cia;
1948 srcreg = translate_rreg (SD_, RM0);
1949 dstreg = translate_rreg (SD_, RN2);
1950 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
1951 }
1952
1953 // 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
1954 8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
1955 "movhu"
1956 {
1957 int srcreg, dstreg;
1958
1959 PC = cia;
1960 srcreg = translate_rreg (SD_, RM2);
1961 dstreg = translate_rreg (SD_, RN0);
1962 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1963 }
1964
1965 // 1111 1011 0110 1010 Rn Rm IMM8; mov (d8,Rm+),Rn
1966 8.0xfb+8.0x6a+4.RN2,4.RM0+8.IMM8:D2y:::mov
1967 "mov"
1968 *am33
1969 {
1970 int srcreg, dstreg;
1971
1972 PC = cia;
1973 srcreg = translate_rreg (SD_, RM0);
1974 dstreg = translate_rreg (SD_, RN2);
1975 State.regs[dstreg] = load_word (State.regs[srcreg]);
1976 State.regs[srcreg] += EXTEND8 (IMM8);
1977 }
1978
1979 // 1111 1011 0111 1010 Rn Rm IMM8; mov Rm,(d8,Rn+)
1980 8.0xfb+8.0x7a+4.RM2,4.RN0+8.IMM8:D2z:::mov
1981 "mov"
1982 {
1983 int srcreg, dstreg;
1984
1985 PC = cia;
1986 srcreg = translate_rreg (SD_, RM2);
1987 dstreg = translate_rreg (SD_, RN0);
1988 store_word (State.regs[dstreg], State.regs[srcreg]);
1989 State.regs[dstreg] += EXTEND8 (IMM8);
1990 }
1991
1992
1993 // 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
1994 8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
1995 "mov"
1996 {
1997 int dstreg;
1998
1999 PC = cia;
2000 dstreg = translate_rreg (SD_, RN2);
2001 State.regs[dstreg] = load_word (State.regs[REG_SP] + EXTEND8 (IMM8));
2002 }
2003
2004 // 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,Rn)
2005 8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
2006 "mov"
2007 {
2008 int srcreg;
2009
2010 PC = cia;
2011 srcreg = translate_rreg (SD_, RM2);
2012 store_word (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2013 }
2014
2015 // 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
2016 8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
2017 "movbu"
2018 {
2019 int dstreg;
2020
2021 PC = cia;
2022 dstreg = translate_rreg (SD_, RN2);
2023 State.regs[dstreg] = load_byte (State.regs[REG_SP] + EXTEND8 (IMM8));
2024 }
2025
2026 // 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(sp,Rn)
2027 8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
2028 "movbu"
2029 {
2030 int srcreg;
2031
2032 PC = cia;
2033 srcreg = translate_rreg (SD_, RM2);
2034 store_byte (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2035 }
2036
2037 // 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
2038 8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
2039 "movhu"
2040 {
2041 int dstreg;
2042
2043 PC = cia;
2044 dstreg = translate_rreg (SD_, RN2);
2045 State.regs[dstreg] = load_half (State.regs[REG_SP] + EXTEND8 (IMM8));
2046 }
2047
2048 // 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
2049 8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
2050 "movhu"
2051 {
2052 int srcreg;
2053
2054 PC = cia;
2055 srcreg = translate_rreg (SD_, RM2);
2056 store_half (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2057 }
2058
2059 // 1111 1011 1110 1010 Rn Rm IMM8; movhu (d8,Rm+),Rn
2060 8.0xfb+8.0xea+4.RN2,4.RM0+8.IMM8:D2y:::movhu
2061 "movhu"
2062 *am33
2063 {
2064 int srcreg, dstreg;
2065
2066 PC = cia;
2067 srcreg = translate_rreg (SD_, RM0);
2068 dstreg = translate_rreg (SD_, RN2);
2069 State.regs[dstreg] = load_half (State.regs[srcreg]);
2070 State.regs[srcreg] += EXTEND8 (IMM8);
2071 }
2072
2073 // 1111 1011 1111 1010 Rn Rm IMM8; movhu Rm,(d8,Rn+)
2074 8.0xfb+8.0xfa+4.RM2,4.RN0+8.IMM8:D2z:::movhu
2075 "movhu"
2076 {
2077 int srcreg, dstreg;
2078
2079 PC = cia;
2080 srcreg = translate_rreg (SD_, RM2);
2081 dstreg = translate_rreg (SD_, RN0);
2082 store_half (State.regs[dstreg], State.regs[srcreg]);
2083 State.regs[dstreg] += EXTEND8 (IMM8);
2084 }
2085
2086
2087 // 1111 1011 0000 1011 Rn Rn IMM8; mac imm8,Rn
2088 8.0xfb+8.0x0b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mac
2089 "mac"
2090 {
2091 int srcreg;
2092 long long temp, sum;
2093 int c, v;
2094
2095 PC = cia;
2096 srcreg = translate_rreg (SD_, RN2);
2097
2098 temp = ((signed64)(signed32)EXTEND8 (IMM8)
2099 * (signed64)(signed32)State.regs[srcreg]);
2100 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2101 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2102 State.regs[REG_MCRL] = sum;
2103 temp >>= 32;
2104 temp &= 0xffffffff;
2105 sum = State.regs[REG_MCRH] + temp + c;
2106 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2107 && (temp & 0x80000000) != (sum & 0x80000000));
2108 State.regs[REG_MCRH] = sum;
2109 if (v)
2110 State.regs[REG_MCVF] = 1;
2111 }
2112
2113 // 1111 1011 0001 1011 Rn Rn IMM8; macu imm8,Rn
2114 8.0xfb+8.0x1b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macu
2115 "macu"
2116 {
2117 int srcreg;
2118 long long temp, sum;
2119 int c, v;
2120
2121 PC = cia;
2122 srcreg = translate_rreg (SD_, RN2);
2123
2124 temp = ((unsigned64) (IMM8)
2125 * (unsigned64)State.regs[srcreg]);
2126 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2127 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2128 State.regs[REG_MCRL] = sum;
2129 temp >>= 32;
2130 temp &= 0xffffffff;
2131 sum = State.regs[REG_MCRH] + temp + c;
2132 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2133 && (temp & 0x80000000) != (sum & 0x80000000));
2134 State.regs[REG_MCRH] = sum;
2135 if (v)
2136 State.regs[REG_MCVF] = 1;
2137 }
2138
2139 // 1111 1011 0010 1011 Rn Rn IMM8; macb imm8,Rn
2140 8.0xfb+8.0x2b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macb
2141 "macb"
2142 {
2143 int srcreg;
2144 long long temp, sum;
2145 int c, v;
2146
2147 PC = cia;
2148 srcreg = translate_rreg (SD_, RN2);
2149
2150 temp = ((signed64)(signed8)EXTEND8 (IMM8)
2151 * (signed64)(signed8)State.regs[srcreg] & 0xff);
2152 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2153 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2154 State.regs[REG_MCRL] = sum;
2155 temp >>= 32;
2156 temp &= 0xffffffff;
2157 sum = State.regs[REG_MCRH] + temp + c;
2158 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2159 && (temp & 0x80000000) != (sum & 0x80000000));
2160 State.regs[REG_MCRH] = sum;
2161 if (v)
2162 State.regs[REG_MCVF] = 1;
2163 }
2164
2165 // 1111 1011 0011 1011 Rn Rn IMM8; macbu imm8,Rn
2166 8.0xfb+8.0x3b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macbu
2167 "macbu"
2168 {
2169 int srcreg;
2170 long long temp, sum;
2171 int c, v;
2172
2173 PC = cia;
2174 srcreg = translate_rreg (SD_, RN2);
2175
2176 temp = ((unsigned64) (IMM8)
2177 * (unsigned64)State.regs[srcreg] & 0xff);
2178 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2179 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2180 State.regs[REG_MCRL] = sum;
2181 temp >>= 32;
2182 temp &= 0xffffffff;
2183 sum = State.regs[REG_MCRH] + temp + c;
2184 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2185 && (temp & 0x80000000) != (sum & 0x80000000));
2186 State.regs[REG_MCRH] = sum;
2187 if (v)
2188 State.regs[REG_MCVF] = 1;
2189 }
2190
2191 // 1111 1011 0100 1011 Rn Rn IMM8; mach imm8,Rn
2192 8.0xfb+8.0x4b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mach
2193 "mach"
2194 {
2195 int srcreg;
2196 long long temp, sum;
2197 int c, v;
2198
2199 PC = cia;
2200 srcreg = translate_rreg (SD_, RN2);
2201
2202 temp = ((signed64)(signed16)EXTEND8 (IMM8)
2203 * (signed64)(signed16)State.regs[srcreg] & 0xffff);
2204 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2205 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2206 State.regs[REG_MCRL] = sum;
2207 temp >>= 32;
2208 temp &= 0xffffffff;
2209 sum = State.regs[REG_MCRH] + temp + c;
2210 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2211 && (temp & 0x80000000) != (sum & 0x80000000));
2212 State.regs[REG_MCRH] = sum;
2213 if (v)
2214 State.regs[REG_MCVF] = 1;
2215 }
2216
2217 // 1111 1011 0101 1011 Rn Rn IMM8; machu imm8,Rn
2218 8.0xfb+8.0x5b+4.RN2,4.RN0=RN2+8.IMM8:D2:::machu
2219 "machu"
2220 {
2221 int srcreg;
2222 long long temp, sum;
2223 int c, v;
2224
2225 PC = cia;
2226 srcreg = translate_rreg (SD_, RN2);
2227
2228 temp = ((unsigned64) (IMM8)
2229 * (unsigned64)State.regs[srcreg] & 0xffff);
2230 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2231 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2232 State.regs[REG_MCRL] = sum;
2233 temp >>= 32;
2234 temp &= 0xffffffff;
2235 sum = State.regs[REG_MCRH] + temp + c;
2236 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2237 && (temp & 0x80000000) != (sum & 0x80000000));
2238 State.regs[REG_MCRH] = sum;
2239 if (v)
2240 State.regs[REG_MCVF] = 1;
2241 }
2242
2243 // 1111 1011 1011 1011 Rn Rn IMM8; mcste imm8,Rn
2244 8.0xfb+8.0xbb+4.RN2,4.RN0=RN2+8.IMM8:D2:::mcste
2245 "mcste"
2246 {
2247 int dstreg;
2248
2249 PC = cia;
2250 dstreg = translate_rreg (SD_, RN0);
2251
2252 PSW &= ~(PSW_V | PSW_C);
2253 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
2254
2255 /* 32bit saturation. */
2256 if (IMM8 == 0x20)
2257 {
2258 long long tmp;
2259
2260 tmp = State.regs[REG_MCRH];
2261 tmp <<= 32;
2262 tmp += State.regs[REG_MCRL];
2263
2264 if (tmp > 0x7fffffff)
2265 State.regs[dstreg] = 0x7fffffff;
2266 else if (tmp < 0xffffffff80000000LL)
2267 State.regs[dstreg] = 0x80000000;
2268 else
2269 State.regs[dstreg] = tmp;
2270 }
2271 /* 16bit saturation */
2272 else if (IMM8 == 0x10)
2273 {
2274 long long tmp;
2275
2276 tmp = State.regs[REG_MCRH];
2277 tmp <<= 32;
2278 tmp += State.regs[REG_MCRL];
2279
2280 if (tmp > 0x7fff)
2281 State.regs[dstreg] = 0x7fff;
2282 else if (tmp < 0xffffffffffff8000LL)
2283 State.regs[dstreg] = 0x8000;
2284 else
2285 State.regs[dstreg] = tmp;
2286 }
2287 /* 8 bit saturation */
2288 else if (IMM8 == 0x8)
2289 {
2290 long long tmp;
2291
2292 tmp = State.regs[REG_MCRH];
2293 tmp <<= 32;
2294 tmp += State.regs[REG_MCRL];
2295
2296 if (tmp > 0x7f)
2297 State.regs[dstreg] = 0x7f;
2298 else if (tmp < 0xffffffffffffff80LL)
2299 State.regs[dstreg] = 0x80;
2300 else
2301 State.regs[dstreg] = tmp;
2302 }
2303 /* 9 bit saturation */
2304 else if (IMM8 == 0x9)
2305 {
2306 long long tmp;
2307
2308 tmp = State.regs[REG_MCRH];
2309 tmp <<= 32;
2310 tmp += State.regs[REG_MCRL];
2311
2312 if (tmp > 0x80)
2313 State.regs[dstreg] = 0x80;
2314 else if (tmp < 0xffffffffffffff81LL)
2315 State.regs[dstreg] = 0x81;
2316 else
2317 State.regs[dstreg] = tmp;
2318 }
2319 /* 9 bit saturation */
2320 else if (IMM8 == 0x30)
2321 {
2322 long long tmp;
2323
2324 tmp = State.regs[REG_MCRH];
2325 tmp <<= 32;
2326 tmp += State.regs[REG_MCRL];
2327
2328 if (tmp > 0x7fffffffffffLL)
2329 tmp = 0x7fffffffffffLL;
2330 else if (tmp < 0xffff800000000000LL)
2331 tmp = 0xffff800000000000LL;
2332
2333 tmp >>= 16;
2334 State.regs[dstreg] = tmp;
2335 }
2336 }
2337
2338 // 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
2339 8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
2340 "add"
2341 *am33
2342 {
2343 int z, c, n, v;
2344 unsigned long sum, source1, source2;
2345 int srcreg1, srcreg2, dstreg;
2346
2347 PC = cia;
2348 srcreg1 = translate_rreg (SD_, RM2);
2349 srcreg2 = translate_rreg (SD_, RN0);
2350 dstreg = translate_rreg (SD_, RD0);
2351
2352 source1 = State.regs[srcreg1];
2353 source2 = State.regs[srcreg2];
2354 sum = source1 + source2;
2355 State.regs[dstreg] = sum;
2356
2357 z = (sum == 0);
2358 n = (sum & 0x80000000);
2359 c = (sum < source1) || (sum < source2);
2360 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2361 && (source1 & 0x80000000) != (sum & 0x80000000));
2362
2363 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2364 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2365 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2366 }
2367
2368 // 1111 1011 1000 1100 Rm Rn Rd; addc Rm,Rn,Rd
2369 8.0xfb+8.0x8c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::addc
2370 "addc"
2371 *am33
2372 {
2373 int z, c, n, v;
2374 unsigned long sum, source1, source2;
2375 int srcreg1, srcreg2, dstreg;
2376
2377 PC = cia;
2378 srcreg1 = translate_rreg (SD_, RM2);
2379 srcreg2 = translate_rreg (SD_, RN0);
2380 dstreg = translate_rreg (SD_, RD0);
2381
2382 source1 = State.regs[srcreg1];
2383 source2 = State.regs[srcreg2];
2384 sum = source1 + source2 + ((PSW & PSW_C) != 0);
2385 State.regs[dstreg] = sum;
2386
2387 z = ((PSW & PSW_Z) != 0) && (sum == 0);
2388 n = (sum & 0x80000000);
2389 c = (sum < source1) || (sum < source2);
2390 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2391 && (source1 & 0x80000000) != (sum & 0x80000000));
2392
2393 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2394 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2395 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2396 }
2397
2398 // 1111 1011 1001 1100 Rm Rn Rd; sub Rm,Rn,Rd
2399 8.0xfb+8.0x9c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::sub
2400 "sub"
2401 *am33
2402 {
2403 int z, c, n, v;
2404 unsigned long difference, source1, source2;
2405 int srcreg1, srcreg2, dstreg;
2406
2407 PC = cia;
2408 srcreg1 = translate_rreg (SD_, RM2);
2409 srcreg2 = translate_rreg (SD_, RN0);
2410 dstreg = translate_rreg (SD_, RD0);
2411
2412 source1 = State.regs[srcreg1];
2413 source2 = State.regs[srcreg2];
2414 difference = source2 - source1;
2415 State.regs[dstreg] = difference;
2416
2417 z = (difference == 0);
2418 n = (difference & 0x80000000);
2419 c = (source1 > source1);
2420 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2421 && (source1 & 0x80000000) != (difference & 0x80000000));
2422
2423 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2424 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2425 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2426 }
2427
2428 // 1111 1011 1010 1100 Rm Rn Rd; subc Rm,Rn,Rd
2429 8.0xfb+8.0xac+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::subc
2430 "subc"
2431 *am33
2432 {
2433 int z, c, n, v;
2434 unsigned long difference, source1, source2;
2435 int srcreg1, srcreg2, dstreg;
2436
2437 PC = cia;
2438 srcreg1 = translate_rreg (SD_, RM2);
2439 srcreg2 = translate_rreg (SD_, RN0);
2440 dstreg = translate_rreg (SD_, RD0);
2441
2442 source1 = State.regs[srcreg1];
2443 source2 = State.regs[srcreg2];
2444 difference = source2 - source1 - ((PSW & PSW_C) != 0);
2445 State.regs[dstreg] = difference;
2446
2447 z = ((PSW & PSW_Z) != 0) && (difference == 0);
2448 n = (difference & 0x80000000);
2449 c = (source1 > source2);
2450 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2451 && (source1 & 0x80000000) != (difference & 0x80000000));
2452
2453 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2454 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2455 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2456 }
2457
2458 // 1111 1011 0000 1101 Rm Rn Rd; and Rm,Rn,Rd
2459 8.0xfb+8.0x0d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::and
2460 "and"
2461 *am33
2462 {
2463 int z, n;
2464 int srcreg1, srcreg2, dstreg;
2465
2466 PC = cia;
2467 srcreg1 = translate_rreg (SD_, RM2);
2468 srcreg2 = translate_rreg (SD_, RN0);
2469 dstreg = translate_rreg (SD_, RD0);
2470
2471 State.regs[dstreg] = State.regs[srcreg1] & State.regs[srcreg2];
2472
2473 z = (State.regs[dstreg] == 0);
2474 n = (State.regs[dstreg] & 0x80000000);
2475
2476 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2477 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2478 }
2479
2480 // 1111 1011 0001 1101 Rm Rn Rd; or Rm,Rn,Rd
2481 8.0xfb+8.0x1d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::or
2482 "or"
2483 *am33
2484 {
2485 int z, n;
2486 int srcreg1, srcreg2, dstreg;
2487
2488 PC = cia;
2489 srcreg1 = translate_rreg (SD_, RM2);
2490 srcreg2 = translate_rreg (SD_, RN0);
2491 dstreg = translate_rreg (SD_, RD0);
2492
2493 State.regs[dstreg] = State.regs[srcreg1] | State.regs[srcreg2];
2494
2495 z = (State.regs[dstreg] == 0);
2496 n = (State.regs[dstreg] & 0x80000000);
2497
2498 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2499 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2500 }
2501
2502 // 1111 1011 0010 1101 Rm Rn Rd; xor Rm,Rn,Rd
2503 8.0xfb+8.0x2d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::xor
2504 "xor"
2505 *am33
2506 {
2507 int z, n;
2508 int srcreg1, srcreg2, dstreg;
2509
2510 PC = cia;
2511 srcreg1 = translate_rreg (SD_, RM2);
2512 srcreg2 = translate_rreg (SD_, RN0);
2513 dstreg = translate_rreg (SD_, RD0);
2514
2515 State.regs[dstreg] = State.regs[srcreg1] ^ State.regs[srcreg2];
2516
2517 z = (State.regs[dstreg] == 0);
2518 n = (State.regs[dstreg] & 0x80000000);
2519
2520 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2521 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2522 }
2523
2524 // 1111 1011 0100 1101 Rm Rn Rd; asr Rm,Rn,Rd
2525 8.0xfb+8.0x4d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asr
2526 "asr"
2527 *am33
2528 {
2529 int z, c, n;
2530 long temp;
2531 int srcreg1, srcreg2, dstreg;
2532
2533 PC = cia;
2534 srcreg1 = translate_rreg (SD_, RM2);
2535 srcreg2 = translate_rreg (SD_, RN0);
2536 dstreg = translate_rreg (SD_, RD0);
2537
2538 temp = State.regs[srcreg2];
2539 c = temp & 1;
2540 temp >>= State.regs[srcreg1];
2541 State.regs[dstreg] = temp;
2542
2543 z = (State.regs[dstreg] == 0);
2544 n = (State.regs[dstreg] & 0x80000000);
2545
2546 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2547 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2548 }
2549
2550 // 1111 1011 0101 1101 Rm Rn Rd; lsr Rm,Rn,Rd
2551 8.0xfb+8.0x5d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::lsr
2552 "lsr"
2553 *am33
2554 {
2555 int z, c, n;
2556 int srcreg1, srcreg2, dstreg;
2557
2558 PC = cia;
2559 srcreg1 = translate_rreg (SD_, RM2);
2560 srcreg2 = translate_rreg (SD_, RN0);
2561 dstreg = translate_rreg (SD_, RD0);
2562
2563 c = State.regs[srcreg2] & 1;
2564 State.regs[dstreg] = State.regs[srcreg2] >> State.regs[srcreg1];
2565
2566 z = (State.regs[dstreg] == 0);
2567 n = (State.regs[dstreg] & 0x80000000);
2568
2569 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2570 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2571 }
2572
2573 // 1111 1011 0110 1101 Rm Rn Rd; asl Rm,Rn,Rd
2574 8.0xfb+8.0x6d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asl
2575 "asl"
2576 *am33
2577 {
2578 int z, n;
2579 int srcreg1, srcreg2, dstreg;
2580
2581 PC = cia;
2582 srcreg1 = translate_rreg (SD_, RM2);
2583 srcreg2 = translate_rreg (SD_, RN0);
2584 dstreg = translate_rreg (SD_, RD0);
2585
2586 State.regs[dstreg] = State.regs[srcreg2] << State.regs[srcreg1];;
2587
2588 z = (State.regs[dstreg] == 0);
2589 n = (State.regs[dstreg] & 0x80000000);
2590
2591 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2592 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2593 }
2594
2595 // 1111 1011 1010 1101 Rm Rn Rd1 Rd2; mul Rm,Rn,Rd1,Rd2
2596 8.0xfb+8.0xad+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mul
2597 "mul"
2598 *am33
2599 {
2600 int srcreg1, srcreg2, dstreg1, dstreg2;
2601 signed long long temp;
2602 int n, z;
2603
2604 PC = cia;
2605 srcreg1 = translate_rreg (SD_, RM2);
2606 srcreg2 = translate_rreg (SD_, RN0);
2607 dstreg1 = translate_rreg (SD_, RD0);
2608 dstreg2 = translate_rreg (SD_, RD2);
2609
2610 temp = ((signed64)(signed32)State.regs[srcreg1]
2611 * (signed64)(signed32)State.regs[srcreg2]);
2612 State.regs[dstreg1] = temp & 0xffffffff;
2613 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2614
2615 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2616 n = (State.regs[dstreg2] & 0x80000000);
2617
2618 PSW &= ~(PSW_Z | PSW_N);
2619 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2620 }
2621
2622 // 1111 1011 1011 1101 Rm Rn Rd1 Rd2; mulu Rm,Rn,Rd1,Rd2
2623 8.0xfb+8.0xbd+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mulu
2624 "mulu"
2625 *am33
2626 {
2627 int srcreg1, srcreg2, dstreg1, dstreg2;
2628 signed long long temp;
2629 int n, z;
2630
2631 PC = cia;
2632 srcreg1 = translate_rreg (SD_, RM2);
2633 srcreg2 = translate_rreg (SD_, RN0);
2634 dstreg1 = translate_rreg (SD_, RD0);
2635 dstreg2 = translate_rreg (SD_, RD2);
2636
2637 temp = ((unsigned64)State.regs[srcreg1]
2638 * (unsigned64)State.regs[srcreg2]);
2639 State.regs[dstreg1] = temp & 0xffffffff;
2640 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2641
2642 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2643 n = (State.regs[dstreg2] & 0x80000000);
2644
2645 PSW &= ~(PSW_Z | PSW_N);
2646 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2647 }
2648
2649 // 1111 1011 0000 1110 Rn 0000 abs8 ; mov (abs8),Rn
2650 8.0xfb+8.0x0e+4.RN2,4.0x0+8.IMM8:D2p:::mov
2651 "mov"
2652 *am33
2653 {
2654 int dstreg;
2655
2656 PC = cia;
2657 dstreg = translate_rreg (SD_, RN2);
2658 State.regs[dstreg] = load_word (IMM8);
2659 }
2660
2661 // 1111 1011 0001 1110 Rm 0000 abs8 ; mov Rn,(abs8)
2662 8.0xfb+8.0x1e+4.RM2,4.0x0+8.IMM8:D2q:::mov
2663 "mov"
2664 *am33
2665 {
2666 int srcreg;
2667
2668 PC = cia;
2669 srcreg = translate_rreg (SD_, RM2);
2670 store_word (IMM8, State.regs[srcreg]);
2671 }
2672
2673 // 1111 1011 0010 1110 Rn 0000 abs8 ; movbu (abs8),Rn
2674 8.0xfb+8.0x2e+4.RN2,4.0x0+8.IMM8:D2p:::movbu
2675 "movbu"
2676 *am33
2677 {
2678 int dstreg;
2679
2680 PC = cia;
2681 dstreg = translate_rreg (SD_, RN2);
2682 State.regs[dstreg] = load_byte (IMM8);
2683 }
2684
2685 // 1111 1011 0011 1110 Rm 0000 abs8 ; movbu Rn,(abs8)
2686 8.0xfb+8.0x3e+4.RM2,4.0x0+8.IMM8:D2q:::movbu
2687 "movbu"
2688 *am33
2689 {
2690 int srcreg;
2691
2692 PC = cia;
2693 srcreg = translate_rreg (SD_, RM2);
2694 store_byte (IMM8, State.regs[srcreg]);
2695 }
2696
2697 // 1111 1011 0100 1110 Rn 0000 abs8 ; movhu (abs8),Rn
2698 8.0xfb+8.0x4e+4.RN2,4.0x0+8.IMM8:D2p:::movhu
2699 "movhu"
2700 *am33
2701 {
2702 int dstreg;
2703
2704 PC = cia;
2705 dstreg = translate_rreg (SD_, RN2);
2706 State.regs[dstreg] = load_half (IMM8);
2707 }
2708
2709 // 1111 1011 0101 1110 Rm 0000 abs8 ; movhu Rn,(abs8)
2710 8.0xfb+8.0x5e+4.RM2,4.0x0+8.IMM8:D2q:::movhu
2711 "movhu"
2712 *am33
2713 {
2714 int srcreg;
2715
2716 PC = cia;
2717 srcreg = translate_rreg (SD_, RM2);
2718 store_half (IMM8, State.regs[srcreg]);
2719 }
2720
2721 // 1111 1011 1000 1110 Ri Rm Rn; mov (Ri,Rm),Rn
2722 8.0xfb+8.0x8e+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::mov
2723 "mov"
2724 *am33
2725 {
2726 int srcreg1, srcreg2, dstreg;
2727
2728 PC = cia;
2729 srcreg1 = translate_rreg (SD_, RM0);
2730 srcreg1 = translate_rreg (SD_, RI0);
2731 dstreg = translate_rreg (SD_, RN0);
2732 State.regs[dstreg] = load_word (State.regs[srcreg1] + State.regs[srcreg2]);
2733 }
2734
2735 // 1111 1011 1001 1110 Ri Rm Rn; mov Rn,(Ri,Rm)
2736 8.0xfb+8.0x9e+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::mov
2737 "mov"
2738 *am33
2739 {
2740 int srcreg, dstreg1, dstreg2;
2741
2742 PC = cia;
2743 srcreg = translate_rreg (SD_, RM0);
2744 dstreg1 = translate_rreg (SD_, RI0);
2745 dstreg2 = translate_rreg (SD_, RN0);
2746 store_word (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2747 }
2748
2749 // 1111 1011 1010 1110 Ri Rm Rn; movbu (Ri,Rm),Rn
2750 8.0xfb+8.0xae+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movbu
2751 "movbu"
2752 *am33
2753 {
2754 int srcreg1, srcreg2, dstreg;
2755
2756 PC = cia;
2757 srcreg1 = translate_rreg (SD_, RM0);
2758 srcreg1 = translate_rreg (SD_, RI0);
2759 dstreg = translate_rreg (SD_, RN0);
2760 State.regs[dstreg] = load_byte (State.regs[srcreg1] + State.regs[srcreg2]);
2761 }
2762
2763 // 1111 1011 1011 1110 Ri Rm Rn; movbu Rn,(Ri,Rm)
2764 8.0xfb+8.0xbe+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movbu
2765 "movbu"
2766 *am33
2767 {
2768 int srcreg, dstreg1, dstreg2;
2769
2770 PC = cia;
2771 srcreg = translate_rreg (SD_, RM0);
2772 dstreg1 = translate_rreg (SD_, RI0);
2773 dstreg2 = translate_rreg (SD_, RN0);
2774 store_byte (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2775 }
2776
2777 // 1111 1011 1100 1110 Ri Rm Rn; movhu (Ri,Rm),Rn
2778 8.0xfb+8.0xce+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movhu
2779 "movhu"
2780 *am33
2781 {
2782 int srcreg1, srcreg2, dstreg;
2783
2784 PC = cia;
2785 srcreg1 = translate_rreg (SD_, RM0);
2786 srcreg1 = translate_rreg (SD_, RI0);
2787 dstreg = translate_rreg (SD_, RN0);
2788 State.regs[dstreg] = load_half (State.regs[srcreg1] + State.regs[srcreg2]);
2789 }
2790
2791 // 1111 1011 1101 1110 Ri Rm Rn; movhu Rn,(Ri,Rm)
2792 8.0xfb+8.0xde+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movhu
2793 "movhu"
2794 *am33
2795 {
2796 int srcreg, dstreg1, dstreg2;
2797
2798 PC = cia;
2799 srcreg = translate_rreg (SD_, RM0);
2800 dstreg1 = translate_rreg (SD_, RI0);
2801 dstreg2 = translate_rreg (SD_, RN0);
2802 store_half (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2803 }
2804
2805 // 1111 1011 0000 1111 Rm Rn Rd1 Rd2; mac Rm,Rn,Rd1,Rd2
2806 8.0xfb+8.0x0f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mac
2807 "mac"
2808 *am33
2809 {
2810 int srcreg1, srcreg2, dstreg1, dstreg2;
2811 signed long long temp;
2812 unsigned long sum;
2813 int c, v;
2814
2815 PC = cia;
2816 srcreg1 = translate_rreg (SD_, RM2);
2817 srcreg2 = translate_rreg (SD_, RN0);
2818 dstreg1 = translate_rreg (SD_, RD0);
2819 dstreg2 = translate_rreg (SD_, RD2);
2820
2821 temp = ((signed64)(signed32)State.regs[srcreg1]
2822 * (signed64)(signed32)State.regs[srcreg2]);
2823
2824 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2825 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2826 State.regs[dstreg2] = sum;
2827 temp >>= 32;
2828 temp &= 0xffffffff;
2829 sum = State.regs[dstreg1] + temp + c;
2830 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2831 && (temp & 0x80000000) != (sum & 0x80000000));
2832 State.regs[dstreg1] = sum;
2833 if (v)
2834 {
2835 State.regs[REG_MCVF] = 1;
2836 PSW &= ~(PSW_V);
2837 PSW |= (( v ? PSW_V : 0));
2838 }
2839 }
2840
2841 // 1111 1011 0001 1111 Rm Rn Rd1 Rd2; macu Rm,Rn,Rd1,Rd2
2842 8.0xfb+8.0x1f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::macu
2843 "macu"
2844 *am33
2845 {
2846 int srcreg1, srcreg2, dstreg1, dstreg2;
2847 signed long long temp;
2848 unsigned long sum;
2849 int c, v;
2850
2851 PC = cia;
2852 srcreg1 = translate_rreg (SD_, RM2);
2853 srcreg2 = translate_rreg (SD_, RN0);
2854 dstreg1 = translate_rreg (SD_, RD0);
2855 dstreg2 = translate_rreg (SD_, RD2);
2856
2857 temp = ((unsigned64)State.regs[srcreg1]
2858 * (unsigned64)State.regs[srcreg2]);
2859
2860 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2861 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2862 State.regs[dstreg2] = sum;
2863 temp >>= 32;
2864 temp &= 0xffffffff;
2865 sum = State.regs[dstreg1] + temp + c;
2866 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2867 && (temp & 0x80000000) != (sum & 0x80000000));
2868 State.regs[dstreg1] = sum;
2869 if (v)
2870 {
2871 State.regs[REG_MCVF] = 1;
2872 PSW &= ~(PSW_V);
2873 PSW |= (( v ? PSW_V : 0));
2874 }
2875 }
2876
2877 // 1111 1011 0010 1111 Rm Rn Rd1; macb Rm,Rn,Rd1
2878 8.0xfb+8.0x2f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macb
2879 "macb"
2880 *am33
2881 {
2882 int srcreg1, srcreg2, dstreg;
2883 long temp, sum;
2884 int v;
2885
2886 PC = cia;
2887 srcreg1 = translate_rreg (SD_, RM2);
2888 srcreg2 = translate_rreg (SD_, RN0);
2889 dstreg = translate_rreg (SD_, RD0);
2890
2891 temp = ((signed32)(State.regs[srcreg2] & 0xff)
2892 * (signed32)(State.regs[srcreg1] & 0xff));
2893 sum = State.regs[dstreg] + temp;
2894 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2895 && (temp & 0x80000000) != (sum & 0x80000000));
2896 State.regs[dstreg] = sum;
2897 if (v)
2898 {
2899 State.regs[REG_MCVF] = 1;
2900 PSW &= ~(PSW_V);
2901 PSW |= ((v ? PSW_V : 0));
2902 }
2903 }
2904
2905 // 1111 1011 0011 1111 Rm Rn Rd1; macbu Rm,Rn,Rd1
2906 8.0xfb+8.0x3f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macbu
2907 "macbu"
2908 *am33
2909 {
2910 int srcreg1, srcreg2, dstreg;
2911 long temp, sum;
2912 int v;
2913
2914 PC = cia;
2915 srcreg1 = translate_rreg (SD_, RM2);
2916 srcreg2 = translate_rreg (SD_, RN0);
2917 dstreg = translate_rreg (SD_, RD0);
2918
2919 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
2920 * (unsigned32)(State.regs[srcreg1] & 0xff));
2921 sum = State.regs[dstreg] + temp;
2922 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2923 && (temp & 0x80000000) != (sum & 0x80000000));
2924 State.regs[dstreg] = sum;
2925 if (v)
2926 {
2927 State.regs[REG_MCVF] = 1;
2928 PSW &= ~(PSW_V);
2929 PSW |= ((v ? PSW_V : 0));
2930 }
2931 }
2932
2933 // 1111 1011 0100 1111 Rm Rn Rd1; mach Rm,Rn,Rd1
2934 8.0xfb+8.0x4f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::mach
2935 "mach"
2936 *am33
2937 {
2938 int srcreg1, srcreg2, dstreg;
2939 long temp, sum;
2940 int v;
2941
2942 PC = cia;
2943 srcreg1 = translate_rreg (SD_, RM2);
2944 srcreg2 = translate_rreg (SD_, RN0);
2945 dstreg = translate_rreg (SD_, RD0);
2946
2947 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
2948 * (signed32)(State.regs[srcreg1] & 0xffff));
2949 sum = State.regs[dstreg] + temp;
2950 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2951 && (temp & 0x80000000) != (sum & 0x80000000));
2952 State.regs[dstreg] = sum;
2953 if (v)
2954 {
2955 State.regs[REG_MCVF] = 1;
2956 PSW &= ~(PSW_V);
2957 PSW |= ((v ? PSW_V : 0));
2958 }
2959 }
2960
2961 // 1111 1011 0101 1111 Rm Rn Rd1; machu Rm,Rn,Rd1
2962 8.0xfb+8.0x5f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::machu
2963 "machu"
2964 *am33
2965 {
2966 int srcreg1, srcreg2, dstreg;
2967 long temp, sum;
2968 int v;
2969
2970 PC = cia;
2971 srcreg1 = translate_rreg (SD_, RM2);
2972 srcreg2 = translate_rreg (SD_, RN0);
2973 dstreg = translate_rreg (SD_, RD0);
2974
2975 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
2976 * (unsigned32)(State.regs[srcreg1] & 0xffff));
2977 sum = State.regs[dstreg] + temp;
2978 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2979 && (temp & 0x80000000) != (sum & 0x80000000));
2980 State.regs[dstreg] = sum;
2981 if (v)
2982 {
2983 State.regs[REG_MCVF] = 1;
2984 PSW &= ~(PSW_V);
2985 PSW |= ((v ? PSW_V : 0));
2986 }
2987 }
2988
2989 // 1111 1011 0110 1111 Rm Rn Rd1; dmach Rm,Rn,Rd1
2990 8.0xfb+8.0x6f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmach
2991 "dmach"
2992 *am33
2993 {
2994 int srcreg1, srcreg2, dstreg;
2995 long temp, temp2, sum;
2996 int v;
2997
2998 PC = cia;
2999 srcreg1 = translate_rreg (SD_, RM2);
3000 srcreg2 = translate_rreg (SD_, RN0);
3001 dstreg = translate_rreg (SD_, RD0);
3002
3003 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
3004 * (signed32)(State.regs[srcreg1] & 0xffff));
3005 temp2 = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3006 * (signed32)((State.regs[srcreg2] >> 16) & 0xffff));
3007 sum = temp + temp2 + State.regs[dstreg];
3008 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3009 && (temp & 0x80000000) != (sum & 0x80000000));
3010 State.regs[dstreg] = sum;
3011 if (v)
3012 {
3013 State.regs[REG_MCVF] = 1;
3014 PSW &= ~(PSW_V);
3015 PSW |= ((v ? PSW_V : 0));
3016 }
3017 }
3018
3019 // 1111 1011 0111 1111 Rm Rn Rd1; dmachu Rm,Rn,Rd1
3020 8.0xfb+8.0x7f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmachu
3021 "dmachu"
3022 *am33
3023 {
3024 int srcreg1, srcreg2, dstreg;
3025 long temp, temp2, sum;
3026 int v;
3027
3028 PC = cia;
3029 srcreg1 = translate_rreg (SD_, RM2);
3030 srcreg2 = translate_rreg (SD_, RN0);
3031 dstreg = translate_rreg (SD_, RD0);
3032
3033 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
3034 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3035 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3036 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
3037 sum = temp + temp2 + State.regs[dstreg];
3038 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3039 && (temp & 0x80000000) != (sum & 0x80000000));
3040 State.regs[dstreg] = sum;
3041 if (v)
3042 {
3043 State.regs[REG_MCVF] = 1;
3044 PSW &= ~(PSW_V);
3045 PSW |= ((v ? PSW_V : 0));
3046 }
3047 }
3048
3049 // 1111 1011 1000 1111 Rm Rn Rd1 Rd2; dmulh Rm,Rn,Rd1,Rd2
3050 8.0xfb+8.0x8f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulh
3051 "dmulh"
3052 *am33
3053 {
3054 int srcreg1, srcreg2, dstreg1, dstreg2;
3055 signed long long temp;
3056
3057 PC = cia;
3058 srcreg1 = translate_rreg (SD_, RM2);
3059 srcreg2 = translate_rreg (SD_, RN0);
3060 dstreg1 = translate_rreg (SD_, RD0);
3061 dstreg2 = translate_rreg (SD_, RD2);
3062
3063 temp = ((signed32)(State.regs[srcreg1] & 0xffff)
3064 * (signed32)(State.regs[srcreg1] & 0xffff));
3065 State.regs[dstreg2] = temp;
3066 temp = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3067 * (signed32)((State.regs[srcreg1] >>16) & 0xffff));
3068 State.regs[dstreg1] = temp;
3069 }
3070
3071 // 1111 1011 1001 1111 Rm Rn Rd1 Rd2; dmulhu Rm,Rn,Rd1,Rd2
3072 8.0xfb+8.0x9f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulhu
3073 "dmulhu"
3074 *am33
3075 {
3076 int srcreg1, srcreg2, dstreg1, dstreg2;
3077 signed long long temp;
3078
3079 PC = cia;
3080 srcreg1 = translate_rreg (SD_, RM2);
3081 srcreg2 = translate_rreg (SD_, RN0);
3082 dstreg1 = translate_rreg (SD_, RD0);
3083 dstreg2 = translate_rreg (SD_, RD2);
3084
3085 temp = ((unsigned32)(State.regs[srcreg1] & 0xffff)
3086 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3087 State.regs[dstreg2] = temp;
3088 temp = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3089 * (unsigned32)((State.regs[srcreg1] >>16) & 0xffff));
3090 State.regs[dstreg1] = temp;
3091 }
3092
3093 // 1111 1011 1010 1111 Rm Rn; sat24 Rm,Rn
3094 8.0xfb+8.0xaf+4.RM2,4.RN0+8.0x0:D2:::sat24
3095 "sat24"
3096 *am33
3097 {
3098 int srcreg, dstreg;
3099 int value, n, z;
3100
3101 PC = cia;
3102 srcreg = translate_rreg (SD_, RM2);
3103 dstreg = translate_rreg (SD_, RN0);
3104
3105 value = State.regs[srcreg];
3106
3107 if (value >= 0x7fffff)
3108 State.regs[dstreg] = 0x7fffff;
3109 else if (value <= 0xff800000)
3110 State.regs[dstreg] = 0xff800000;
3111 else
3112 State.regs[dstreg] = value;
3113
3114 n = (State.regs[dstreg] & 0x800000) != 0;
3115 z = (State.regs[dstreg] == 0);
3116 PSW &= ~(PSW_Z | PSW_N);
3117 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3118 }
3119
3120 // 1111 1011 1111 1111 Rm Rn Rd1; bsch Rm,Rn,Rd1
3121 8.0xfb+8.0xff+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::bsch
3122 "bsch"
3123 *am33
3124 {
3125 int temp, c, i;
3126 int srcreg1, srcreg2, dstreg;
3127 int start;
3128
3129 PC = cia;
3130 srcreg1 = translate_rreg (SD_, RM2);
3131 srcreg2 = translate_rreg (SD_, RN0);
3132 dstreg = translate_rreg (SD_, RD0);
3133
3134 temp = State.regs[srcreg1];
3135 start = (State.regs[srcreg2] & 0x1f) - 1;
3136 if (start == -1)
3137 start = 31;
3138
3139 for (i = start; i >= 0; i--)
3140 {
3141 if (temp & (1 << i))
3142 {
3143 c = 1;
3144 State.regs[dstreg] = i;
3145 break;
3146 }
3147 }
3148
3149 if (i < 0)
3150 {
3151 c = 0;
3152 State.regs[dstreg] = 0;
3153 }
3154 PSW &= ~(PSW_C);
3155 PSW |= (c ? PSW_C : 0);
3156 }
3157
3158 // 1111 1101 0000 1000 Rn Rn IMM32; mov imm24,Rn
3159 8.0xfd+8.0x08+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::mov
3160 "mov"
3161 *am33
3162 {
3163 int dstreg;
3164
3165 PC = cia;
3166 dstreg = translate_rreg (SD_, RN0);
3167 State.regs[dstreg] = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3168 }
3169
3170 // 1111 1101 0001 1000 Rn Rn IMM32; movu imm24,Rn
3171 8.0xfd+8.0x18+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::movu
3172 "movu"
3173 *am33
3174 {
3175 int dstreg;
3176
3177 PC = cia;
3178 dstreg = translate_rreg (SD_, RN0);
3179 State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3180 }
3181
3182 // 1111 1101 0111 1000 Rn Rn IMM32; add imm24,Rn
3183 8.0xfd+8.0x78+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::add
3184 "add"
3185 *am33
3186 {
3187 int dstreg;
3188
3189 PC = cia;
3190 dstreg = translate_rreg (SD_, RN0);
3191 genericAdd (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3192 }
3193
3194 // 1111 1101 1000 1000 Rn Rn IMM32; addc imm24,Rn
3195 8.0xfd+8.0x88+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::addc
3196 "addc"
3197 *am33
3198 {
3199 int dstreg, z, n, c, v;
3200 unsigned long sum, imm, reg2;
3201
3202 PC = cia;
3203 dstreg = translate_rreg (SD_, RN0);
3204
3205 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3206 reg2 = State.regs[dstreg];
3207 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3208 State.regs[dstreg] = sum;
3209
3210 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3211 n = (sum & 0x80000000);
3212 c = (sum < imm) || (sum < reg2);
3213 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3214 && (reg2 & 0x80000000) != (sum & 0x80000000));
3215
3216 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3217 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3218 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3219 }
3220
3221 // 1111 1101 1001 1000 Rn Rn IMM32; sub imm24,Rn
3222 8.0xfd+8.0x98+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::sub
3223 "sub"
3224 *am33
3225 {
3226 int dstreg;
3227
3228 PC = cia;
3229 dstreg = translate_rreg (SD_, RN0);
3230 genericSub (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3231 }
3232
3233 // 1111 1101 1010 1000 Rn Rn IMM32; subc imm24,Rn
3234 8.0xfd+8.0xa8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::subc
3235 "subc"
3236 *am33
3237 {
3238 int dstreg, z, n, c, v;
3239 unsigned long difference, imm, reg2;
3240
3241 PC = cia;
3242 dstreg = translate_rreg (SD_, RN0);
3243
3244 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3245 reg2 = State.regs[dstreg];
3246 difference = reg2 - imm - ((PSW & PSW_C) != 0);
3247 State.regs[dstreg] = difference;
3248
3249 z = ((PSW & PSW_Z) != 0) && (difference == 0);
3250 n = (difference & 0x80000000);
3251 c = (imm > reg2);
3252 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3253 && (reg2 & 0x80000000) != (difference & 0x80000000));
3254
3255 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3256 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3257 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3258 }
3259
3260 // 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
3261 8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
3262 "cmp"
3263 *am33
3264 {
3265 int srcreg;
3266
3267 PC = cia;
3268 srcreg = translate_rreg (SD_, RN0);
3269 genericCmp (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), State.regs[srcreg]);
3270 }
3271
3272 // 1111 1101 1111 1000 XRn XRn IMM32; mov imm24,XRn
3273 8.0xfd+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::mov
3274 "mov"
3275 *am33
3276 {
3277 PC = cia;
3278
3279 if (XRN0 == 0)
3280 {
3281 State.regs[REG_SP] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3282 }
3283 else
3284 abort ();
3285 }
3286
3287 // 1111 1101 0000 1001 Rn Rn IMM24; and imm24,Rn
3288 8.0xfd+8.0x09+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::and
3289 "and"
3290 *am33
3291 {
3292 int dstreg;
3293 int z,n;
3294
3295 PC = cia;
3296 dstreg = translate_rreg (SD_, RN0);
3297
3298 State.regs[dstreg] &= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3299 z = (State.regs[dstreg] == 0);
3300 n = (State.regs[dstreg] & 0x80000000) != 0;
3301 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3302 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3303 }
3304
3305 // 1111 1101 0001 1001 Rn Rn IMM24; or imm24,Rn
3306 8.0xfd+8.0x19+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::or
3307 "or"
3308 *am33
3309 {
3310 int dstreg;
3311 int z,n;
3312
3313 PC = cia;
3314 dstreg = translate_rreg (SD_, RN0);
3315
3316 State.regs[dstreg] |= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3317 z = (State.regs[dstreg] == 0);
3318 n = (State.regs[dstreg] & 0x80000000) != 0;
3319 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3320 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3321 }
3322
3323 // 1111 1101 0010 1001 Rn Rn IMM24; xor imm24,Rn
3324 8.0xfd+8.0x29+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::xor
3325 "xor"
3326 *am33
3327 {
3328 int dstreg;
3329 int z,n;
3330
3331 PC = cia;
3332 dstreg = translate_rreg (SD_, RN0);
3333
3334 State.regs[dstreg] ^= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3335 z = (State.regs[dstreg] == 0);
3336 n = (State.regs[dstreg] & 0x80000000) != 0;
3337 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3338 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3339 }
3340
3341 // 1111 1101 0100 1001 Rn Rn IMM24; asr imm24,Rn
3342 8.0xfd+8.0x49+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asr
3343 "asr"
3344 *am33
3345 {
3346 int dstreg;
3347 long temp;
3348 int c, z, n;
3349
3350 PC = cia;
3351 dstreg = translate_rreg (SD_, RN0);
3352
3353 temp = State.regs[dstreg];
3354 c = temp & 1;
3355 temp >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3356 State.regs[dstreg] = temp;
3357 z = (State.regs[dstreg] == 0);
3358 n = (State.regs[dstreg] & 0x80000000) != 0;
3359 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3360 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3361 }
3362
3363
3364 // 1111 1101 0101 1001 Rn Rn IMM24; lsr imm24,Rn
3365 8.0xfd+8.0x59+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::lsr
3366 "lsr"
3367 *am33
3368 {
3369 int dstreg;
3370 int z, n, c;
3371
3372 PC = cia;
3373 dstreg = translate_rreg (SD_, RN0);
3374
3375 c = State.regs[dstreg] & 1;
3376 State.regs[dstreg] >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3377 z = (State.regs[dstreg] == 0);
3378 n = (State.regs[dstreg] & 0x80000000) != 0;
3379 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3380 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3381 }
3382
3383 // 1111 1101 0110 1001 Rn Rn IMM24; asl imm24,Rn
3384 8.0xfd+8.0x69+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asl
3385 "asl"
3386 *am33
3387 {
3388 int srcreg, dstreg;
3389 int z, n;
3390
3391 PC = cia;
3392 dstreg = translate_rreg (SD_, RN0);
3393
3394 State.regs[dstreg] <<= (FETCH24 (IMM24A, IMM24B, IMM24C));
3395 z = (State.regs[dstreg] == 0);
3396 n = (State.regs[dstreg] & 0x80000000) != 0;
3397 PSW &= ~(PSW_Z | PSW_N);
3398 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3399 }
3400
3401 // 1111 1101 1010 1001 Rn Rn IMM24; mul imm24,Rn
3402 8.0xfd+8.0xa9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mul
3403 "mul"
3404 *am33
3405 {
3406 int dstreg;
3407 unsigned long long temp;
3408 int z, n;
3409
3410 PC = cia;
3411 dstreg = translate_rreg (SD_, RN0);
3412
3413 temp = ((signed64)(signed32)State.regs[dstreg]
3414 * (signed64)(signed32)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3415 State.regs[dstreg] = temp & 0xffffffff;
3416 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3417 z = (State.regs[dstreg] == 0);
3418 n = (State.regs[dstreg] & 0x80000000) != 0;
3419 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3420 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3421 }
3422
3423 // 1111 1101 1011 1001 Rn Rn IMM24; mulu imm24,Rn
3424 8.0xfd+8.0xb9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mulu
3425 "mulu"
3426 *am33
3427 {
3428 int dstreg;
3429 unsigned long long temp;
3430 int z, n;
3431
3432 PC = cia;
3433 dstreg = translate_rreg (SD_, RN0);
3434
3435 temp = ((unsigned64)State.regs[dstreg]
3436 * (unsigned64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3437 State.regs[dstreg] = temp & 0xffffffff;
3438 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3439 z = (State.regs[dstreg] == 0);
3440 n = (State.regs[dstreg] & 0x80000000) != 0;
3441 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3442 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3443 }
3444
3445 // 1111 1101 1110 1001 Rn Rn IMM24; btst imm24,,Rn
3446 8.0xfd+8.0xe9+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::btst
3447 "btst"
3448 *am33
3449 {
3450 int srcreg;
3451
3452 PC = cia;
3453 srcreg = translate_rreg (SD_, RN0);
3454 genericBtst (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3455 }
3456
3457 // 1111 1101 0000 1010 Rn Rm IMM24; mov (d24,Rm),Rn
3458 8.0xfd+8.0x0a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::mov
3459 "mov"
3460 *am33
3461 {
3462 int srcreg, dstreg;
3463
3464 PC = cia;
3465 srcreg = translate_rreg (SD_, RM0);
3466 dstreg = translate_rreg (SD_, RN2);
3467 State.regs[dstreg] = load_word (State.regs[srcreg]
3468 + EXTEND24 (FETCH24 (IMM24A,
3469 IMM24B, IMM24C)));
3470 }
3471
3472 // 1111 1101 0001 1010 Rm Rn IMM24; mov Rm,(d24,Rn)
3473 8.0xfd+8.0x1a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::mov
3474 "mov"
3475 *am33
3476 {
3477 int srcreg, dstreg;
3478
3479 PC = cia;
3480 srcreg = translate_rreg (SD_, RM2);
3481 dstreg = translate_rreg (SD_, RN0);
3482 store_word (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3483 State.regs[srcreg]);
3484 }
3485
3486 // 1111 1101 0010 1010 Rn Rm IMM24; movbu (d24,Rm),Rn
3487 8.0xfd+8.0x2a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movbu
3488 "movbu"
3489 *am33
3490 {
3491 int srcreg, dstreg;
3492
3493 PC = cia;
3494 srcreg = translate_rreg (SD_, RM0);
3495 dstreg = translate_rreg (SD_, RN2);
3496 State.regs[dstreg] = load_byte (State.regs[srcreg]
3497 + EXTEND24 (FETCH24 (IMM24A,
3498 IMM24B, IMM24C)));
3499 }
3500
3501 // 1111 1101 0011 1010 Rm Rn IMM24; movbu Rm,(d24,Rn)
3502 8.0xfd+8.0x3a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movbu
3503 "movbu"
3504 *am33
3505 {
3506 int srcreg, dstreg;
3507
3508 PC = cia;
3509 srcreg = translate_rreg (SD_, RM2);
3510 dstreg = translate_rreg (SD_, RN0);
3511 store_byte (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3512 State.regs[srcreg]);
3513 }
3514
3515 // 1111 1101 0100 1010 Rn Rm IMM24; movhu (d24,Rm),Rn
3516 8.0xfd+8.0x4a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movhu
3517 "movhu"
3518 *am33
3519 {
3520 int srcreg, dstreg;
3521
3522 PC = cia;
3523 srcreg = translate_rreg (SD_, RM0);
3524 dstreg = translate_rreg (SD_, RN2);
3525 State.regs[dstreg] = load_half (State.regs[srcreg]
3526 + EXTEND24 (FETCH24 (IMM24A,
3527 IMM24B, IMM24C)));
3528 }
3529
3530 // 1111 1101 0101 1010 Rm Rn IMM24; movhu Rm,(d24,Rn)
3531 8.0xfd+8.0x5a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movhu
3532 "movhu"
3533 *am33
3534 {
3535 int srcreg, dstreg;
3536
3537 PC = cia;
3538 srcreg = translate_rreg (SD_, RM2);
3539 dstreg = translate_rreg (SD_, RN0);
3540 store_half (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3541 State.regs[srcreg]);
3542 }
3543
3544 // 1111 1101 0110 1010 Rn Rm IMM24; mov (d24,Rm+),Rn
3545 8.0xfd+8.0x6a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::mov
3546 "mov"
3547 *am33
3548 {
3549 int srcreg, dstreg;
3550
3551 PC = cia;
3552 srcreg = translate_rreg (SD_, RM0);
3553 dstreg = translate_rreg (SD_, RN2);
3554 State.regs[dstreg] = load_word (State.regs[srcreg]);
3555 State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3556 }
3557
3558 // 1111 1101 0111 1010 Rm Rn IMM24; mov Rm,(d24,Rn+)
3559 8.0xfd+8.0x7a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mov
3560 "mov"
3561 *am33
3562 {
3563 int srcreg, dstreg;
3564
3565 PC = cia;
3566 srcreg = translate_rreg (SD_, RM2);
3567 dstreg = translate_rreg (SD_, RN0);
3568 store_word (State.regs[dstreg], State.regs[srcreg]);
3569 State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3570 }
3571
3572
3573 // 1111 1101 1000 1010 Rn 0000 IMM24; mov (d24,sp),Rn
3574 8.0xfd+8.0x8a+4.RN2,4.0x0+IMM24A+8.IMM24B+8.IMM24C:D4r:::mov
3575 "mov"
3576 *am33
3577 {
3578 int dstreg;
3579
3580 PC = cia;
3581 dstreg = translate_rreg (SD_, RN2);
3582 State.regs[dstreg] = load_word (State.regs[REG_SP]
3583 + EXTEND24 (FETCH24 (IMM24A,
3584 IMM24B, IMM24C)));
3585 }
3586
3587 // 1111 1101 1001 1010 Rm 0000 IMM24; mov Rm,(d24,sp)
3588 8.0xfd+8.0x9a+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::mov
3589 "mov"
3590 *am33
3591 {
3592 int srcreg;
3593
3594 PC = cia;
3595 srcreg = translate_rreg (SD_, RM2);
3596 store_word (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3597 State.regs[srcreg]);
3598 }
3599
3600 // 1111 1101 1010 1010 Rn 0000 IMM24; movbu (d24,Rm),Rn
3601 8.0xfd+8.0xaa+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movbu
3602 "movbu"
3603 *am33
3604 {
3605 int dstreg;
3606
3607 PC = cia;
3608 dstreg = translate_rreg (SD_, RN2);
3609 State.regs[dstreg] = load_byte (State.regs[REG_SP]
3610 + EXTEND24 (FETCH24 (IMM24A,
3611 IMM24B, IMM24C)));
3612 }
3613
3614 // 1111 1101 1011 1010 Rm 0000 IMM24; movbu Rm,(d24,sp)
3615 8.0xfd+8.0xba+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movbu
3616 "movbu"
3617 *am33
3618 {
3619 int srcreg;
3620
3621 PC = cia;
3622 srcreg = translate_rreg (SD_, RM2);
3623 store_byte (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3624 State.regs[srcreg]);
3625 }
3626
3627 // 1111 1101 1100 1010 Rn 0000 IMM24; movhu (d24,sp),Rn
3628 8.0xfd+8.0xca+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movhu
3629 "movhu"
3630 *am33
3631 {
3632 int dstreg;
3633
3634 PC = cia;
3635 dstreg = translate_rreg (SD_, RN2);
3636 State.regs[dstreg] = load_half (State.regs[REG_SP]
3637 + EXTEND24 (FETCH24 (IMM24A,
3638 IMM24B, IMM24C)));
3639 }
3640
3641 // 1111 1101 1101 1010 Rm Rn IMM24; movhu Rm,(d24,sp)
3642 8.0xfd+8.0xda+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movhu
3643 "movhu"
3644 *am33
3645 {
3646 int srcreg;
3647
3648 PC = cia;
3649 srcreg = translate_rreg (SD_, RM2);
3650 store_half (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3651 State.regs[srcreg]);
3652 }
3653
3654 // 1111 1101 1110 1010 Rn Rm IMM24; movhu (d24,Rm+),Rn
3655 8.0xfd+8.0xea+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::movhu
3656 "movhu"
3657 *am33
3658 {
3659 int srcreg, dstreg;
3660
3661 PC = cia;
3662 srcreg = translate_rreg (SD_, RM0);
3663 dstreg = translate_rreg (SD_, RN2);
3664 State.regs[dstreg] = load_half (State.regs[srcreg]);
3665 State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3666 }
3667
3668 // 1111 1101 1111 1010 Rm Rn IMM24; movhu Rm,(d24,Rn+)
3669 8.0xfd+8.0xfa+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::movhu
3670 "movhu"
3671 *am33
3672 {
3673 int srcreg, dstreg;
3674
3675 PC = cia;
3676 srcreg = translate_rreg (SD_, RM2);
3677 dstreg = translate_rreg (SD_, RN0);
3678 store_half (State.regs[dstreg], State.regs[srcreg]);
3679 State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3680 }
3681
3682 // 1111 1101 0000 1011 Rn IMM24; mac imm24,Rn
3683 8.0xfd+8.0x0b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mac
3684 "mac"
3685 *am33
3686 {
3687 int srcreg;
3688 long long temp, sum;
3689 int c, v;
3690
3691 PC = cia;
3692 srcreg = translate_rreg (SD_, RN2);
3693
3694 temp = ((signed64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C))
3695 * (signed64)State.regs[srcreg]);
3696 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3697 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3698 State.regs[REG_MCRL] = sum;
3699 temp >>= 32;
3700 temp &= 0xffffffff;
3701 sum = State.regs[REG_MCRH] + temp + c;
3702 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3703 && (temp & 0x80000000) != (sum & 0x80000000));
3704 State.regs[REG_MCRH] = sum;
3705 if (v)
3706 State.regs[REG_MCVF] = 1;
3707 }
3708
3709 // 1111 1101 0001 1011 Rn IMM24; macu imm24,Rn
3710 8.0xfd+8.0x1b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macu
3711 "macu"
3712 *am33
3713 {
3714 int srcreg;
3715 long long temp, sum;
3716 int c, v;
3717
3718 PC = cia;
3719 srcreg = translate_rreg (SD_, RN2);
3720
3721 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3722 * (unsigned64)State.regs[srcreg]);
3723 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3724 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3725 State.regs[REG_MCRL] = sum;
3726 temp >>= 32;
3727 temp &= 0xffffffff;
3728 sum = State.regs[REG_MCRH] + temp + c;
3729 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3730 && (temp & 0x80000000) != (sum & 0x80000000));
3731 State.regs[REG_MCRH] = sum;
3732 if (v)
3733 State.regs[REG_MCVF] = 1;
3734 }
3735
3736 // 1111 1101 0010 1011 Rn IMM24; macb imm24,Rn
3737 8.0xfd+8.0x2b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macb
3738 "macb"
3739 *am33
3740 {
3741 int srcreg;
3742 long long temp, sum;
3743 int c, v;
3744
3745 PC = cia;
3746 srcreg = translate_rreg (SD_, RN2);
3747
3748 temp = ((signed64)EXTEND8 (FETCH24 (IMM24A, IMM24B, IMM24C))
3749 * (signed64)State.regs[srcreg] & 0xff);
3750 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3751 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3752 State.regs[REG_MCRL] = sum;
3753 temp >>= 32;
3754 temp &= 0xffffffff;
3755 sum = State.regs[REG_MCRH] + temp + c;
3756 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3757 && (temp & 0x80000000) != (sum & 0x80000000));
3758 State.regs[REG_MCRH] = sum;
3759 if (v)
3760 State.regs[REG_MCVF] = 1;
3761 }
3762
3763 // 1111 1101 0011 1011 Rn IMM24; macbu imm24,Rn
3764 8.0xfd+8.0x3b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macbu
3765 "macbu"
3766 *am33
3767 {
3768 int srcreg;
3769 long long temp, sum;
3770 int c, v;
3771
3772 PC = cia;
3773 srcreg = translate_rreg (SD_, RN2);
3774
3775 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3776 * (unsigned64)State.regs[srcreg] & 0xff);
3777 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3778 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3779 State.regs[REG_MCRL] = sum;
3780 temp >>= 32;
3781 temp &= 0xffffffff;
3782 sum = State.regs[REG_MCRH] + temp + c;
3783 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3784 && (temp & 0x80000000) != (sum & 0x80000000));
3785 State.regs[REG_MCRH] = sum;
3786 if (v)
3787 State.regs[REG_MCVF] = 1;
3788 }
3789
3790 // 1111 1101 0100 1011 Rn IMM24; mach imm24,Rn
3791 8.0xfd+8.0x4b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mach
3792 "mach"
3793 *am33
3794 {
3795 int srcreg;
3796 long long temp, sum;
3797 int c, v;
3798
3799 PC = cia;
3800 srcreg = translate_rreg (SD_, RN2);
3801
3802 temp = ((signed64)EXTEND16 (FETCH24 (IMM24A, IMM24B, IMM24C))
3803 * (signed64)State.regs[srcreg] & 0xffff);
3804 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3805 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3806 State.regs[REG_MCRL] = sum;
3807 temp >>= 32;
3808 temp &= 0xffffffff;
3809 sum = State.regs[REG_MCRH] + temp + c;
3810 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3811 && (temp & 0x80000000) != (sum & 0x80000000));
3812 State.regs[REG_MCRH] = sum;
3813 if (v)
3814 State.regs[REG_MCVF] = 1;
3815 }
3816
3817 // 1111 1101 0101 1011 Rn IMM24; machu imm24,Rn
3818 8.0xfd+8.0x5b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::machu
3819 "machu"
3820 *am33
3821 {
3822 int srcreg;
3823 long long temp, sum;
3824 int c, v;
3825
3826 PC = cia;
3827 srcreg = translate_rreg (SD_, RN2);
3828
3829 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffff)
3830 * (unsigned64)State.regs[srcreg] & 0xffff);
3831 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3832 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3833 State.regs[REG_MCRL] = sum;
3834 temp >>= 32;
3835 temp &= 0xffffffff;
3836 sum = State.regs[REG_MCRH] + temp + c;
3837 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3838 && (temp & 0x80000000) != (sum & 0x80000000));
3839 State.regs[REG_MCRH] = sum;
3840 if (v)
3841 State.regs[REG_MCVF] = 1;
3842 }
3843
3844 // 1111 1101 0000 1110 Rn 0000 ABS24; mov (abs24),Rn
3845 8.0xfd+8.0x0e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::mov
3846 "mov"
3847 *am33
3848 {
3849 int dstreg;
3850
3851 PC = cia;
3852 dstreg = translate_rreg (SD_, RN2);
3853 State.regs[dstreg] = load_word (FETCH24 (IMM24A, IMM24B, IMM24C));
3854 }
3855
3856 // 1111 1101 0001 1110 Rm 0000 ABS24; mov Rm,(abs24)
3857 8.0xfd+8.0x1e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4v:::mov
3858 "mov"
3859 *am33
3860 {
3861 int srcreg;
3862
3863 PC = cia;
3864 srcreg = translate_rreg (SD_, RM2);
3865 store_word (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3866 }
3867
3868
3869 // 1111 1101 0010 1110 Rn 0000 ABS24; movbu (abs24),Rn
3870 8.0xfd+8.0x2e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movbu
3871 "movbu"
3872 *am33
3873 {
3874 int dstreg;
3875
3876 PC = cia;
3877 dstreg = translate_rreg (SD_, RN2);
3878 State.regs[dstreg] = load_byte (FETCH24 (IMM24A, IMM24B, IMM24C));
3879 }
3880
3881 // 1111 1101 0011 1110 Rm 0000 ABS24; movbu Rm,(abs24)
3882 8.0xfd+8.0x3e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movbu
3883 "movbu"
3884 *am33
3885 {
3886 int srcreg;
3887
3888 PC = cia;
3889 srcreg = translate_rreg (SD_, RM2);
3890 store_byte (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3891 }
3892
3893
3894 // 1111 1101 0100 1110 Rn 0000 ABS24; movhu (abs24),Rn
3895 8.0xfd+8.0x4e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movhu
3896 "movhu"
3897 *am33
3898 {
3899 int dstreg;
3900
3901 PC = cia;
3902 dstreg = translate_rreg (SD_, RN2);
3903 State.regs[dstreg] = load_half (FETCH24 (IMM24A, IMM24B, IMM24C));
3904 }
3905
3906 // 1111 1101 0101 1110 Rm 0000 ABS24; movhu Rm,(abs24)
3907 8.0xfd+8.0x5e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movhu
3908 "movhu"
3909 *am33
3910 {
3911 int srcreg;
3912
3913 PC = cia;
3914 srcreg = translate_rreg (SD_, RM2);
3915 store_half (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3916 }
3917
3918
3919 // 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
3920 8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
3921 "mov"
3922 *am33
3923 {
3924 int dstreg;
3925
3926 PC = cia;
3927 dstreg = translate_rreg (SD_, RN0);
3928 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3929 }
3930
3931 // 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
3932 8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
3933 "movu"
3934 *am33
3935 {
3936 int dstreg;
3937
3938 PC = cia;
3939 dstreg = translate_rreg (SD_, RN0);
3940 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3941 }
3942
3943 // 1111 1110 0111 1000 Rn Rn IMM32; add imm32,Rn
3944 8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
3945 "add"
3946 *am33
3947 {
3948 int dstreg;
3949
3950 PC = cia;
3951 dstreg = translate_rreg (SD_, RN0);
3952 genericAdd (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
3953 }
3954
3955 // 1111 1110 1000 1000 Rn Rn IMM32; addc imm32,Rn
3956 8.0xfe+8.0x88+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::addc
3957 "addc"
3958 *am33
3959 {
3960 int dstreg;
3961 unsigned int imm, reg2, sum;
3962 int z, n, c, v;
3963
3964 PC = cia;
3965 dstreg = translate_rreg (SD_, RN0);
3966
3967 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
3968 reg2 = State.regs[dstreg];
3969 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3970 State.regs[dstreg] = sum;
3971
3972 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3973 n = (sum & 0x80000000);
3974 c = (sum < imm) || (sum < reg2);
3975 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3976 && (reg2 & 0x80000000) != (sum & 0x80000000));
3977
3978 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3979 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3980 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3981 }
3982
3983 // 1111 1110 1001 1000 Rn Rn IMM32; sub imm32,Rn
3984 8.0xfe+8.0x98+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::sub
3985 "sub"
3986 *am33
3987 {
3988 int dstreg;
3989
3990 PC = cia;
3991 dstreg = translate_rreg (SD_, RN0);
3992 genericSub (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
3993 }
3994
3995 // 1111 1110 1010 1000 Rn Rn IMM32; subc imm32,Rn
3996 8.0xfe+8.0xa8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::subc
3997 "subc"
3998 *am33
3999 {
4000 int dstreg;
4001 unsigned int imm, reg2, difference;
4002 int z, n, c, v;
4003
4004 PC = cia;
4005 dstreg = translate_rreg (SD_, RN0);
4006
4007 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4008 reg2 = State.regs[dstreg];
4009 difference = reg2 - imm - ((PSW & PSW_C) != 0);
4010 State.regs[dstreg] = difference;
4011
4012 z = ((PSW & PSW_Z) != 0) && (difference == 0);
4013 n = (difference & 0x80000000);
4014 c = (imm > reg2);
4015 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4016 && (reg2 & 0x80000000) != (difference & 0x80000000));
4017
4018 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4019 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4020 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4021 }
4022
4023 // 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
4024 8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
4025 "cmp"
4026 *am33
4027 {
4028 int srcreg;
4029
4030 PC = cia;
4031 srcreg = translate_rreg (SD_, RN0);
4032 genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4033 }
4034
4035 // 1111 1110 1111 1000 XRn XRn IMM32; mov imm32,XRn
4036 8.0xfe+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::mov
4037 "mov"
4038 *am33
4039 {
4040 PC = cia;
4041
4042 if (XRN0 == 0)
4043 State.regs[REG_SP] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
4044 else
4045 abort ();
4046 }
4047
4048 // 1111 1110 0000 1001 Rn Rn IMM32; and imm32,Rn
4049 8.0xfe+8.0x09+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::and
4050 "and"
4051 *am33
4052 {
4053 int dstreg;
4054 int z,n;
4055
4056 PC = cia;
4057 dstreg = translate_rreg (SD_, RN0);
4058
4059 State.regs[dstreg] &= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4060 z = (State.regs[dstreg] == 0);
4061 n = (State.regs[dstreg] & 0x80000000) != 0;
4062 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4063 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4064 }
4065
4066 // 1111 1110 0001 1001 Rn Rn IMM32; or imm32,Rn
4067 8.0xfe+8.0x19+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::or
4068 "or"
4069 *am33
4070 {
4071 int dstreg;
4072 int z,n;
4073
4074 PC = cia;
4075 dstreg = translate_rreg (SD_, RN0);
4076
4077 State.regs[dstreg] |= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4078 z = (State.regs[dstreg] == 0);
4079 n = (State.regs[dstreg] & 0x80000000) != 0;
4080 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4081 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4082 }
4083
4084 // 1111 1110 0010 1001 Rn Rn IMM32; xor imm32,Rn
4085 8.0xfe+8.0x29+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::xor
4086 "xor"
4087 *am33
4088 {
4089 int dstreg;
4090 int z,n;
4091
4092 PC = cia;
4093 dstreg = translate_rreg (SD_, RN0);
4094
4095 State.regs[dstreg] ^= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4096 z = (State.regs[dstreg] == 0);
4097 n = (State.regs[dstreg] & 0x80000000) != 0;
4098 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4099 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4100 }
4101
4102 // 1111 1110 0100 1001 Rn Rn IMM32; asr imm32,Rn
4103 8.0xfe+8.0x49+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asr
4104 "asr"
4105 *am33
4106 {
4107 int dstreg;
4108 long temp;
4109 int c, z, n;
4110
4111 PC = cia;
4112 dstreg = translate_rreg (SD_, RN0);
4113
4114 temp = State.regs[dstreg];
4115 c = temp & 1;
4116 temp >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4117 State.regs[dstreg] = temp;
4118 z = (State.regs[dstreg] == 0);
4119 n = (State.regs[dstreg] & 0x80000000) != 0;
4120 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4121 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4122 }
4123
4124 // 1111 1110 0101 1001 Rn Rn IMM32; lsr imm32,Rn
4125 8.0xfe+8.0x59+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::lsr
4126 "lsr"
4127 *am33
4128 {
4129 int dstreg;
4130 int z, n, c;
4131
4132 PC = cia;
4133 dstreg = translate_rreg (SD_, RN0);
4134
4135 c = State.regs[dstreg] & 1;
4136 State.regs[dstreg] >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4137 z = (State.regs[dstreg] == 0);
4138 n = (State.regs[dstreg] & 0x80000000) != 0;
4139 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4140 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4141 }
4142
4143 // 1111 1110 0110 1001 Rn Rn IMM32; asl imm32,Rn
4144 8.0xfe+8.0x69+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asl
4145 "asl"
4146 *am33
4147 {
4148 int srcreg, dstreg;
4149 int z, n;
4150
4151 PC = cia;
4152 dstreg = translate_rreg (SD_, RN0);
4153
4154 State.regs[dstreg] <<= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4155 z = (State.regs[dstreg] == 0);
4156 n = (State.regs[dstreg] & 0x80000000) != 0;
4157 PSW &= ~(PSW_Z | PSW_N);
4158 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4159 }
4160
4161 // 1111 1110 1010 1001 Rn Rn IMM32; mul imm32,Rn
4162 8.0xfe+8.0xa9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mul
4163 "mul"
4164 *am33
4165 {
4166 int dstreg;
4167 unsigned long long temp;
4168 int z, n;
4169
4170 PC = cia;
4171 dstreg = translate_rreg (SD_, RN0);
4172
4173 temp = ((signed64)(signed32)State.regs[dstreg]
4174 * (signed64)(signed32)(FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4175 State.regs[dstreg] = temp & 0xffffffff;
4176 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
4177 z = (State.regs[dstreg] == 0);
4178 n = (State.regs[dstreg] & 0x80000000) != 0;
4179 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4180 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4181 }
4182
4183 // 1111 1110 1011 1001 Rn Rn IMM32; mulu imm32,Rn
4184 8.0xfe+8.0xb9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mulu
4185 "mulu"
4186 *am33
4187 {
4188 int dstreg;
4189 unsigned long long temp;
4190 int z, n;
4191
4192 PC = cia;
4193 dstreg = translate_rreg (SD_, RN0);
4194
4195 temp = ((unsigned64)State.regs[dstreg]
4196 * (unsigned64) (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4197 State.regs[dstreg] = temp & 0xffffffff;
4198 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
4199 z = (State.regs[dstreg] == 0);
4200 n = (State.regs[dstreg] & 0x80000000) != 0;
4201 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4202 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4203 }
4204
4205 // 1111 1110 1110 1001 Rn Rn IMM32; btst imm32,Rn
4206 8.0xfe+8.0xe9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::btst
4207 "btst"
4208 *am33
4209 {
4210 int srcreg;
4211
4212 PC = cia;
4213 srcreg = translate_rreg (SD_, RN0);
4214 genericBtst (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4215 }
4216
4217 // 1111 1110 0000 1010 Rn Rm IMM32; mov (d32,Rm),Rn
4218 8.0xfe+8.0x0a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::mov
4219 "mov"
4220 *am33
4221 {
4222 int srcreg, dstreg;
4223
4224 PC = cia;
4225 srcreg = translate_rreg (SD_, RM0);
4226 dstreg = translate_rreg (SD_, RN2);
4227 State.regs[dstreg] = load_word (State.regs[srcreg]
4228 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4229 }
4230
4231 // 1111 1110 0001 1010 Rm Rn IMM32; mov Rm,(d32,Rn)
4232 8.0xfe+8.0x1a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::mov
4233 "mov"
4234 *am33
4235 {
4236 int srcreg, dstreg;
4237
4238 PC = cia;
4239 srcreg = translate_rreg (SD_, RM2);
4240 dstreg = translate_rreg (SD_, RN0);
4241 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4242 State.regs[srcreg]);
4243 }
4244
4245 // 1111 1110 0010 1010 Rn Rm IMM32; movbu (d32,Rm),Rn
4246 8.0xfe+8.0x2a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movbu
4247 "movbu"
4248 *am33
4249 {
4250 int srcreg, dstreg;
4251
4252 PC = cia;
4253 srcreg = translate_rreg (SD_, RM0);
4254 dstreg = translate_rreg (SD_, RN2);
4255 State.regs[dstreg] = load_byte (State.regs[srcreg]
4256 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4257 }
4258
4259 // 1111 1110 0011 1010 Rm Rn IMM32; movbu Rm,(d32,Rn)
4260 8.0xfe+8.0x3a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movbu
4261 "movbu"
4262 *am33
4263 {
4264 int srcreg, dstreg;
4265
4266 PC = cia;
4267 srcreg = translate_rreg (SD_, RM2);
4268 dstreg = translate_rreg (SD_, RN0);
4269 store_byte (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4270 State.regs[srcreg]);
4271 }
4272
4273 // 1111 1110 0100 1010 Rn Rm IMM32; movhu (d32,Rm),Rn
4274 8.0xfe+8.0x4a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movhu
4275 "movhu"
4276 *am33
4277 {
4278 int srcreg, dstreg;
4279
4280 PC = cia;
4281 srcreg = translate_rreg (SD_, RM0);
4282 dstreg = translate_rreg (SD_, RN2);
4283 State.regs[dstreg] = load_half (State.regs[srcreg]
4284 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4285 }
4286
4287 // 1111 1110 0101 1010 Rm Rn IMM32; movhu Rm,(d32,Rn)
4288 8.0xfe+8.0x5a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movhu
4289 "movhu"
4290 *am33
4291 {
4292 int srcreg, dstreg;
4293
4294 PC = cia;
4295 srcreg = translate_rreg (SD_, RM2);
4296 dstreg = translate_rreg (SD_, RN0);
4297 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4298 State.regs[srcreg]);
4299 }
4300
4301 // 1111 1110 0110 1010 Rn Rm IMM32; mov (d32,Rm+),Rn
4302 8.0xfe+8.0x6a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::mov
4303 "mov"
4304 *am33
4305 {
4306 int srcreg, dstreg;
4307
4308 PC = cia;
4309 srcreg = translate_rreg (SD_, RM0);
4310 dstreg = translate_rreg (SD_, RN2);
4311 State.regs[dstreg] = load_word (State.regs[srcreg]);
4312 State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4313 }
4314
4315 // 1111 1110 0111 1010 Rm Rn IMM32; mov Rm,(d32,Rn+)
4316 8.0xfe+8.0x7a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5z:::mov
4317 "mov"
4318 *am33
4319 {
4320 int srcreg, dstreg;
4321
4322 PC = cia;
4323 srcreg = translate_rreg (SD_, RM2);
4324 dstreg = translate_rreg (SD_, RN0);
4325 store_word (State.regs[dstreg], State.regs[srcreg]);
4326 State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4327 }
4328
4329
4330 // 1111 1110 1000 1010 Rn 0000 IMM32; mov (d32,sp),Rn
4331 8.0xfe+8.0x8a+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::mov
4332 "mov"
4333 *am33
4334 {
4335 int dstreg;
4336
4337 PC = cia;
4338 dstreg = translate_rreg (SD_, RN2);
4339 State.regs[dstreg] = load_word (State.regs[REG_SP]
4340 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4341 }
4342
4343 // 1111 1110 1001 1010 Rm 0000 IMM32; mov Rm,(d32,sp)
4344 8.0xfe+8.0x9a+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::mov
4345 "mov"
4346 *am33
4347 {
4348 int srcreg;
4349
4350 PC = cia;
4351 srcreg = translate_rreg (SD_, RM2);
4352 store_word (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4353 State.regs[srcreg]);
4354 }
4355
4356 // 1111 1110 1010 1010 Rn 0000 IMM32; movbu (d32,sp),Rn
4357 8.0xfe+8.0xaa+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movbu
4358 "movbu"
4359 *am33
4360 {
4361 int dstreg;
4362
4363 PC = cia;
4364 dstreg = translate_rreg (SD_, RN2);
4365 State.regs[dstreg] = load_byte (State.regs[REG_SP]
4366 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4367 }
4368
4369 // 1111 1110 1011 1010 Rm 0000 IMM32; movbu Rm,(d32,sp)
4370 8.0xfe+8.0xba+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movbu
4371 "movbu"
4372 *am33
4373 {
4374 int srcreg;
4375
4376 PC = cia;
4377 srcreg = translate_rreg (SD_, RM2);
4378 store_byte (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4379 State.regs[srcreg]);
4380 }
4381
4382 // 1111 1110 1100 1010 Rn 0000 IMM32; movhu (d32,sp),Rn
4383 8.0xfe+8.0xca+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movhu
4384 "movhu"
4385 *am33
4386 {
4387 int dstreg;
4388
4389 PC = cia;
4390 dstreg = translate_rreg (SD_, RN2);
4391 State.regs[dstreg] = load_half (State.regs[REG_SP]
4392 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4393 }
4394
4395 // 1111 1110 1101 1010 Rm 0000 IMM32; movhu Rm,(d32,sp)
4396 8.0xfe+8.0xda+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movhu
4397 "movhu"
4398 *am33
4399 {
4400 int srcreg;
4401
4402 PC = cia;
4403 srcreg = translate_rreg (SD_, RM2);
4404 store_half (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4405 State.regs[srcreg]);
4406 }
4407
4408
4409 // 1111 1110 1110 1010 Rn Rm IMM32; movhu (d32,Rm+),Rn
4410 8.0xfe+8.0xea+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::movhu
4411 "movhu"
4412 *am33
4413 {
4414 int srcreg, dstreg;
4415
4416 PC = cia;
4417 srcreg = translate_rreg (SD_, RM0);
4418 dstreg = translate_rreg (SD_, RN2);
4419 State.regs[dstreg] = load_half (State.regs[srcreg]);
4420 State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4421 }
4422
4423 // 1111 1110 1111 1010 Rm Rn IMM32; movhu Rm,(d32,Rn+)
4424 8.0xfe+8.0xfa+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::movhu
4425 "movhu"
4426 *am33
4427 {
4428 int srcreg, dstreg;
4429
4430 PC = cia;
4431 srcreg = translate_rreg (SD_, RM2);
4432 dstreg = translate_rreg (SD_, RN0);
4433 store_half (State.regs[dstreg], State.regs[srcreg]);
4434 State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4435 }
4436
4437
4438 // 1111 1110 0000 1011 Rn Rn IMM32; mac imm32,Rn
4439 8.0xfe+8.0x0b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mac
4440 "mac"
4441 *am33
4442 {
4443 int srcreg, imm;
4444 long long temp, sum;
4445 int c, v;
4446
4447 PC = cia;
4448 srcreg = translate_rreg (SD_, RN0);
4449 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4450
4451 temp = ((signed64)(signed32)State.regs[srcreg]
4452 * (signed64)(signed32)imm);
4453 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
4454 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
4455 State.regs[REG_MCRL] = sum;
4456 temp >>= 32;
4457 temp &= 0xffffffff;
4458 sum = State.regs[REG_MCRH] + temp + c;
4459 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
4460 && (temp & 0x80000000) != (sum & 0x80000000));
4461 State.regs[REG_MCRH] = sum;
4462 if (v)
4463 State.regs[REG_MCVF] = 1;
4464 }
4465
4466 // 1111 1110 0001 1011 Rn Rn IMM32; macu imm32,Rn
4467 8.0xfe+8.0x1b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macu
4468 "macu"
4469 *am33
4470 {
4471 int srcreg, imm;
4472 long long temp, sum;
4473 int c, v;
4474
4475 PC = cia;
4476 srcreg = translate_rreg (SD_, RN0);
4477 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4478
4479 temp = ((unsigned64)State.regs[srcreg]
4480 * (unsigned64)imm);
4481 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
4482 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
4483 State.regs[REG_MCRL] = sum;
4484 temp >>= 32;
4485 temp &= 0xffffffff;
4486 sum = State.regs[REG_MCRH] + temp + c;
4487 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
4488 && (temp & 0x80000000) != (sum & 0x80000000));
4489 State.regs[REG_MCRH] = sum;
4490 if (v)
4491 State.regs[REG_MCVF] = 1;
4492 }
4493
4494 // 1111 1110 0010 1011 Rn Rn IMM32; macb imm32,Rn
4495 8.0xfe+8.0x2b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macb
4496 "macb"
4497 *am33
4498 {
4499 int srcreg, imm;
4500 long temp, sum;
4501 int v;
4502
4503 PC = cia;
4504 srcreg = translate_rreg (SD_, RN0);
4505 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4506
4507 temp = ((signed32)(signed8)(State.regs[srcreg] & 0xff)
4508 * (signed32)(signed8)(imm & 0xff));
4509 sum = State.regs[REG_MCRL] + temp;
4510 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4511 && (temp & 0x80000000) != (sum & 0x80000000));
4512 State.regs[REG_MCRL] = sum;
4513 if (v)
4514 State.regs[REG_MCVF] = 1;
4515 }
4516
4517 // 1111 1110 0011 1011 Rn Rn IMM32; macbu imm32,Rn
4518 8.0xfe+8.0x3b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macbu
4519 "macbu"
4520 *am33
4521 {
4522 int srcreg, imm;
4523 long temp, sum;
4524 int v;
4525
4526 PC = cia;
4527 srcreg = translate_rreg (SD_, RN0);
4528 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4529
4530 temp = ((unsigned32)(State.regs[srcreg] & 0xff)
4531 * (unsigned32)(imm & 0xff));
4532 sum = State.regs[REG_MCRL] + temp;
4533 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4534 && (temp & 0x80000000) != (sum & 0x80000000));
4535 State.regs[REG_MCRL] = sum;
4536 if (v)
4537 State.regs[REG_MCVF] = 1;
4538 }
4539
4540 // 1111 1110 0100 1011 Rn Rn IMM32; mach imm32,Rn
4541 8.0xfe+8.0x4b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mach
4542 "mach"
4543 *am33
4544 {
4545 int srcreg, imm;
4546 long temp, sum;
4547 int v;
4548
4549 PC = cia;
4550 srcreg = translate_rreg (SD_, RN0);
4551 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4552
4553 temp = ((signed32)(signed16)(State.regs[srcreg] & 0xffff)
4554 * (signed32)(signed16)(imm & 0xffff));
4555 sum = State.regs[REG_MCRL] + temp;
4556 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4557 && (temp & 0x80000000) != (sum & 0x80000000));
4558 State.regs[REG_MCRL] = sum;
4559 if (v)
4560 State.regs[REG_MCVF] = 1;
4561 }
4562
4563 // 1111 1110 0101 1011 Rn Rn IMM32; machu imm32,Rn
4564 8.0xfe+8.0x5b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::machu
4565 "machu"
4566 *am33
4567 {
4568 int srcreg, imm;
4569 long temp, sum;
4570 int v;
4571
4572 PC = cia;
4573 srcreg = translate_rreg (SD_, RN0);
4574 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4575
4576 temp = ((unsigned32)(State.regs[srcreg] & 0xffff)
4577 * (unsigned32)(imm & 0xffff));
4578 sum = State.regs[REG_MCRL] + temp;
4579 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4580 && (temp & 0x80000000) != (sum & 0x80000000));
4581 State.regs[REG_MCRL] = sum;
4582 if (v)
4583 State.regs[REG_MCVF] = 1;
4584 }
4585
4586 // 1111 1110 0110 1011 Rn Rn IMM32; dmach imm32,Rn
4587 8.0xfe+8.0x6b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmach
4588 "dmach"
4589 *am33
4590 {
4591 int srcreg, imm;
4592 long temp, temp2, sum;
4593 int v;
4594
4595 PC = cia;
4596 srcreg = translate_rreg (SD_, RN0);
4597 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4598
4599 temp = ((signed32)(signed16)(State.regs[srcreg] & 0xffff)
4600 * (signed32)(signed16)(imm & 0xffff));
4601 temp2 = ((signed32)(signed16)((State.regs[srcreg] >> 16) & 0xffff)
4602 * (signed32)(signed16)((imm >> 16) & 0xffff));
4603 sum = temp + temp2 + State.regs[REG_MCRL];
4604 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4605 && (temp & 0x80000000) != (sum & 0x80000000));
4606 State.regs[REG_MCRL] = sum;
4607 if (v)
4608 State.regs[REG_MCVF] = 1;
4609 }
4610
4611 // 1111 1110 0111 1011 Rn Rn IMM32; dmachu imm32,Rn
4612 8.0xfe+8.0x7b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmachu
4613 "dmachu"
4614 *am33
4615 {
4616 int srcreg, imm;
4617 long temp, temp2, sum;
4618 int v;
4619
4620 PC = cia;
4621 srcreg = translate_rreg (SD_, RN0);
4622 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4623
4624 temp = ((unsigned32)(State.regs[srcreg] & 0xffff)
4625 * (unsigned32)(imm & 0xffff));
4626 temp2 = ((unsigned32)((State.regs[srcreg] >> 16) & 0xffff)
4627 * (unsigned32)((imm >> 16) & 0xffff));
4628 sum = temp + temp2 + State.regs[REG_MCRL];
4629 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4630 && (temp & 0x80000000) != (sum & 0x80000000));
4631 State.regs[REG_MCRL] = sum;
4632 if (v)
4633 State.regs[REG_MCVF] = 1;
4634 }
4635
4636 // 1111 1110 1000 1011 Rn Rn IMM32; dmulh imm32,Rn
4637 8.0xfe+8.0x8b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulh
4638 "dmulh"
4639 *am33
4640 {
4641 int imm, dstreg;
4642 long temp;
4643
4644 PC = cia;
4645 dstreg = translate_rreg (SD_, RN0);
4646 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4647
4648 temp = ((signed32)(signed16)(State.regs[dstreg] & 0xffff)
4649 * (signed32)(signed16)(imm & 0xffff));
4650 State.regs[REG_MDRQ] = temp;
4651 temp = ((signed32)(signed16)((State.regs[dstreg] >> 16) & 0xffff)
4652 * (signed32)(signed16)((imm>>16) & 0xffff));
4653 State.regs[dstreg] = temp;
4654 }
4655
4656 // 1111 1110 1001 1011 Rn Rn IMM32; dmulhu imm32,Rn
4657 8.0xfe+8.0x9b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulhu
4658 "dmulhu"
4659 *am33
4660 {
4661 int imm, dstreg;
4662 long temp;
4663
4664 PC = cia;
4665 dstreg = translate_rreg (SD_, RN0);
4666 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4667
4668 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
4669 * (unsigned32)(imm & 0xffff));
4670 State.regs[REG_MDRQ] = temp;
4671 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
4672 * (unsigned32)((imm >>16) & 0xffff));
4673 State.regs[dstreg] = temp;
4674 }
4675
4676 // 1111 1110 0000 1110 Rn 0000 IMM32; mov (abs32),Rn
4677 8.0xfe+8.0x0e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5h:::mov
4678 "mov"
4679 *am33
4680 {
4681 int dstreg;
4682
4683 PC = cia;
4684 dstreg = translate_rreg (SD_, RN2);
4685 State.regs[dstreg] = load_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4686 }
4687
4688 // 1111 1110 0001 1110 Rm 0000 IMM32; mov Rn,(abs32)
4689 8.0xfe+8.0x1e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::mov
4690 "mov"
4691 *am33
4692 {
4693 int srcreg;
4694
4695 PC = cia;
4696 srcreg = translate_rreg (SD_, RM2);
4697 store_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4698 }
4699
4700 // 1111 1110 0020 1110 Rn 0000 IMM32; movbu (abs32),Rn
4701 8.0xfe+8.0x2e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5i:::movbu
4702 "movbu"
4703 *am33
4704 {
4705 int dstreg;
4706
4707 PC = cia;
4708 dstreg = translate_rreg (SD_, RN2);
4709 State.regs[dstreg] = load_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4710 }
4711
4712 // 1111 1110 0011 1110 Rm 0000 IMM32; movbu Rn,(abs32)
4713 8.0xfe+8.0x3e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movbu
4714 "movbu"
4715 *am33
4716 {
4717 int srcreg;
4718
4719 PC = cia;
4720 srcreg = translate_rreg (SD_, RM2);
4721 store_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4722 }
4723
4724 // 1111 1110 0100 1110 Rn 0000 IMM32; movhu (abs32),Rn
4725 8.0xfe+8.0x4e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5j:::movhu
4726 "movhu"
4727 *am33
4728 {
4729 int dstreg;
4730
4731 PC = cia;
4732 dstreg = translate_rreg (SD_, RN2);
4733 State.regs[dstreg] = load_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4734 }
4735
4736 // 1111 1110 0101 1110 Rm 0000 IMM32; movhu Rn,(abs32)
4737 8.0xfe+8.0x5e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movhu
4738 "movhu"
4739 *am33
4740 {
4741 int srcreg;
4742
4743 PC = cia;
4744 srcreg = translate_rreg (SD_, RM2);
4745 store_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4746 }
4747
4748 // 1111 0111 0000 0000 Rm1 Rn1 Rm2 Rn2; add_add Rm1, Rn1, Rm2, Rn2
4749 8.0xf7+8.0x00+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_add
4750 "add_add"
4751 *am33
4752 {
4753 int srcreg1, srcreg2, dstreg1, dstreg2;
4754
4755 PC = cia;
4756 srcreg1 = translate_rreg (SD_, RM1);
4757 srcreg2 = translate_rreg (SD_, RM2);
4758 dstreg1 = translate_rreg (SD_, RN1);
4759 dstreg2 = translate_rreg (SD_, RN2);
4760
4761 State.regs[dstreg1] += State.regs[srcreg1];
4762 State.regs[dstreg2] += State.regs[srcreg2];
4763 }
4764
4765 // 1111 0111 0001 0000 Rm1 Rn1 imm4 Rn2; add_add Rm1, Rn1, imm4, Rn2
4766 8.0xf7+8.0x10+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_add
4767 "add_add"
4768 *am33
4769 {
4770 int srcreg1, dstreg1, dstreg2;
4771
4772 PC = cia;
4773 srcreg1 = translate_rreg (SD_, RM1);
4774 dstreg1 = translate_rreg (SD_, RN1);
4775 dstreg2 = translate_rreg (SD_, RN2);
4776
4777 State.regs[dstreg1] += State.regs[srcreg1];
4778 State.regs[dstreg2] += EXTEND4 (IMM4);
4779 }
4780
4781 // 1111 0111 0010 0000 Rm1 Rn1 Rm2 Rn2; add_sub Rm1, Rn1, Rm2, Rn2
4782 8.0xf7+8.0x20+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_sub
4783 "add_sub"
4784 *am33
4785 {
4786 int srcreg1, srcreg2, dstreg1, dstreg2;
4787
4788 PC = cia;
4789 srcreg1 = translate_rreg (SD_, RM1);
4790 srcreg2 = translate_rreg (SD_, RM2);
4791 dstreg1 = translate_rreg (SD_, RN1);
4792 dstreg2 = translate_rreg (SD_, RN2);
4793
4794 State.regs[dstreg1] += State.regs[srcreg1];
4795 State.regs[dstreg2] -= State.regs[srcreg2];
4796 }
4797
4798 // 1111 0111 0011 0000 Rm1 Rn1 imm4 Rn2; add_sub Rm1, Rn1, imm4, Rn2
4799 8.0xf7+8.0x30+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_sub
4800 "add_sub"
4801 *am33
4802 {
4803 int srcreg1, dstreg1, dstreg2;
4804
4805 PC = cia;
4806 srcreg1 = translate_rreg (SD_, RM1);
4807 dstreg1 = translate_rreg (SD_, RN1);
4808 dstreg2 = translate_rreg (SD_, RN2);
4809
4810 State.regs[dstreg1] += State.regs[srcreg1];
4811 State.regs[dstreg2] -= EXTEND4 (IMM4);
4812 }
4813
4814 // 1111 0111 0100 0000 Rm1 Rn1 Rm2 Rn2; add_cmp Rm1, Rn1, Rm2, Rn2
4815 8.0xf7+8.0x40+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_cmp
4816 "add_cmp"
4817 *am33
4818 {
4819 int srcreg1, srcreg2, dstreg1, dstreg2;
4820
4821 PC = cia;
4822 srcreg1 = translate_rreg (SD_, RM1);
4823 srcreg2 = translate_rreg (SD_, RM2);
4824 dstreg1 = translate_rreg (SD_, RN1);
4825 dstreg2 = translate_rreg (SD_, RN2);
4826
4827 State.regs[dstreg1] += State.regs[srcreg1];
4828 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
4829 }
4830
4831 // 1111 0111 0101 0000 Rm1 Rn1 imm4 Rn2; add_cmp Rm1, Rn1, imm4, Rn2
4832 8.0xf7+8.0x50+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_cmp
4833 "add_cmp"
4834 *am33
4835 {
4836 int srcreg1, dstreg1, dstreg2;
4837
4838 PC = cia;
4839 srcreg1 = translate_rreg (SD_, RM1);
4840 dstreg1 = translate_rreg (SD_, RN1);
4841 dstreg2 = translate_rreg (SD_, RN2);
4842
4843 State.regs[dstreg1] += State.regs[srcreg1];
4844 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
4845 }
4846
4847 // 1111 0111 0110 0000 Rm1 Rn1 Rm2 Rn2; add_mov Rm1, Rn1, Rm2, Rn2
4848 8.0xf7+8.0x60+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_mov
4849 "add_mov"
4850 *am33
4851 {
4852 int srcreg1, srcreg2, dstreg1, dstreg2;
4853
4854 PC = cia;
4855 srcreg1 = translate_rreg (SD_, RM1);
4856 srcreg2 = translate_rreg (SD_, RM2);
4857 dstreg1 = translate_rreg (SD_, RN1);
4858 dstreg2 = translate_rreg (SD_, RN2);
4859
4860 State.regs[dstreg1] += State.regs[srcreg1];
4861 State.regs[dstreg2] = State.regs[srcreg2];
4862 }
4863
4864 // 1111 0111 0111 0000 Rm1 Rn1 imm4 Rn2; add_mov Rm1, Rn1, imm4, Rn2
4865 8.0xf7+8.0x70+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_mov
4866 "add_mov"
4867 *am33
4868 {
4869 int srcreg1, dstreg1, dstreg2;
4870
4871 PC = cia;
4872 srcreg1 = translate_rreg (SD_, RM1);
4873 dstreg1 = translate_rreg (SD_, RN1);
4874 dstreg2 = translate_rreg (SD_, RN2);
4875
4876 State.regs[dstreg1] += State.regs[srcreg1];
4877 State.regs[dstreg2] = EXTEND4 (IMM4);
4878 }
4879
4880 // 1111 0111 1000 0000 Rm1 Rn1 Rm2 Rn2; add_asr Rm1, Rn1, Rm2, Rn2
4881 8.0xf7+8.0x80+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asr
4882 "add_asr"
4883 *am33
4884 {
4885 int srcreg1, srcreg2, dstreg1, dstreg2;
4886 signed int temp;
4887
4888 PC = cia;
4889 srcreg1 = translate_rreg (SD_, RM1);
4890 srcreg2 = translate_rreg (SD_, RM2);
4891 dstreg1 = translate_rreg (SD_, RN1);
4892 dstreg2 = translate_rreg (SD_, RN2);
4893
4894 State.regs[dstreg1] += State.regs[srcreg1];
4895 temp = State.regs[dstreg2];
4896 temp >>= State.regs[srcreg2];
4897 State.regs[dstreg2] = temp;
4898 }
4899
4900 // 1111 0111 1001 0000 Rm1 Rn1 imm4 Rn2; add_asr Rm1, Rn1, imm4, Rn2
4901 8.0xf7+8.0x90+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asr
4902 "add_asr"
4903 *am33
4904 {
4905 int srcreg1, dstreg1, dstreg2;
4906 signed int temp;
4907
4908 PC = cia;
4909 srcreg1 = translate_rreg (SD_, RM1);
4910 dstreg1 = translate_rreg (SD_, RN1);
4911 dstreg2 = translate_rreg (SD_, RN2);
4912
4913 State.regs[dstreg1] += State.regs[srcreg1];
4914 temp = State.regs[dstreg2];
4915 temp >>= IMM4;
4916 State.regs[dstreg2] = temp;
4917 }
4918
4919 // 1111 0111 1010 0000 Rm1 Rn1 Rm2 Rn2; add_lsr Rm1, Rn1, Rm2, Rn2
4920 8.0xf7+8.0xa0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_lsr
4921 "add_lsr"
4922 *am33
4923 {
4924 int srcreg1, srcreg2, dstreg1, dstreg2;
4925
4926 PC = cia;
4927 srcreg1 = translate_rreg (SD_, RM1);
4928 srcreg2 = translate_rreg (SD_, RM2);
4929 dstreg1 = translate_rreg (SD_, RN1);
4930 dstreg2 = translate_rreg (SD_, RN2);
4931
4932 State.regs[dstreg1] += State.regs[srcreg1];
4933 State.regs[dstreg2] >>= State.regs[srcreg2];
4934 }
4935
4936 // 1111 0111 1011 0000 Rm1 Rn1 imm4 Rn2; add_lsr Rm1, Rn1, imm4, Rn2
4937 8.0xf7+8.0xb0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_lsr
4938 "add_lsr"
4939 *am33
4940 {
4941 int srcreg1, dstreg1, dstreg2;
4942 signed int temp;
4943
4944 PC = cia;
4945 srcreg1 = translate_rreg (SD_, RM1);
4946 dstreg1 = translate_rreg (SD_, RN1);
4947 dstreg2 = translate_rreg (SD_, RN2);
4948
4949 State.regs[dstreg1] += State.regs[srcreg1];
4950 State.regs[dstreg2] >>= IMM4;
4951 }
4952
4953
4954 // 1111 0111 1100 0000 Rm1 Rn1 Rm2 Rn2; add_asl Rm1, Rn1, Rm2, Rn2
4955 8.0xf7+8.0xc0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asl
4956 "add_asl"
4957 *am33
4958 {
4959 int srcreg1, srcreg2, dstreg1, dstreg2;
4960
4961 PC = cia;
4962 srcreg1 = translate_rreg (SD_, RM1);
4963 srcreg2 = translate_rreg (SD_, RM2);
4964 dstreg1 = translate_rreg (SD_, RN1);
4965 dstreg2 = translate_rreg (SD_, RN2);
4966
4967 State.regs[dstreg1] += State.regs[srcreg1];
4968 State.regs[dstreg2] <<= State.regs[srcreg2];
4969 }
4970
4971 // 1111 0111 1101 0000 Rm1 Rn1 imm4 Rn2; add_asl Rm1, Rn1, imm4, Rn2
4972 8.0xf7+8.0xd0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asl
4973 "add_asl"
4974 *am33
4975 {
4976 int srcreg1, dstreg1, dstreg2;
4977 signed int temp;
4978
4979 PC = cia;
4980 srcreg1 = translate_rreg (SD_, RM1);
4981 dstreg1 = translate_rreg (SD_, RN1);
4982 dstreg2 = translate_rreg (SD_, RN2);
4983
4984 State.regs[dstreg1] += State.regs[srcreg1];
4985 State.regs[dstreg2] <<= IMM4;
4986 }
4987
4988 // 1111 0111 0000 0001 Rm1 Rn1 Rm2 Rn2; cmp_add Rm1, Rn1, Rm2, Rn2
4989 8.0xf7+8.0x01+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_add
4990 "cmp_add"
4991 *am33
4992 {
4993 int srcreg1, srcreg2, dstreg1, dstreg2;
4994
4995 PC = cia;
4996 srcreg1 = translate_rreg (SD_, RM1);
4997 srcreg2 = translate_rreg (SD_, RM2);
4998 dstreg1 = translate_rreg (SD_, RN1);
4999 dstreg2 = translate_rreg (SD_, RN2);
5000
5001 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5002 State.regs[dstreg2] += State.regs[srcreg2];
5003 }
5004
5005 // 1111 0111 0001 0001 Rm1 Rn1 imm4 Rn2; cmp_add Rm1, Rn1, imm4, Rn2
5006 8.0xf7+8.0x11+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_add
5007 "cmp_add"
5008 *am33
5009 {
5010 int srcreg1, dstreg1, dstreg2;
5011
5012 PC = cia;
5013 srcreg1 = translate_rreg (SD_, RM1);
5014 dstreg1 = translate_rreg (SD_, RN1);
5015 dstreg2 = translate_rreg (SD_, RN2);
5016
5017 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5018 State.regs[dstreg2] += EXTEND4 (IMM4);
5019 }
5020
5021 // 1111 0111 0010 0001 Rm1 Rn1 Rm2 Rn2; cmp_sub Rm1, Rn1, Rm2, Rn2
5022 8.0xf7+8.0x21+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_sub
5023 "cmp_sub"
5024 *am33
5025 {
5026 int srcreg1, srcreg2, dstreg1, dstreg2;
5027
5028 PC = cia;
5029 srcreg1 = translate_rreg (SD_, RM1);
5030 srcreg2 = translate_rreg (SD_, RM2);
5031 dstreg1 = translate_rreg (SD_, RN1);
5032 dstreg2 = translate_rreg (SD_, RN2);
5033
5034 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5035 State.regs[dstreg2] -= State.regs[srcreg2];
5036 }
5037
5038 // 1111 0111 0011 0001 Rm1 Rn1 imm4 Rn2; cmp_sub Rm1, Rn1, imm4, Rn2
5039 8.0xf7+8.0x31+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_sub
5040 "cmp_sub"
5041 *am33
5042 {
5043 int srcreg1, dstreg1, dstreg2;
5044
5045 PC = cia;
5046 srcreg1 = translate_rreg (SD_, RM1);
5047 dstreg1 = translate_rreg (SD_, RN1);
5048 dstreg2 = translate_rreg (SD_, RN2);
5049
5050 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5051 State.regs[dstreg2] -= EXTEND4 (IMM4);
5052 }
5053
5054 // 1111 0111 0110 0001 Rm1 Rn1 Rm2 Rn2; cmp_mov Rm1, Rn1, Rm2, Rn2
5055 8.0xf7+8.0x61+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_mov
5056 "cmp_mov"
5057 *am33
5058 {
5059 int srcreg1, srcreg2, dstreg1, dstreg2;
5060
5061 PC = cia;
5062 srcreg1 = translate_rreg (SD_, RM1);
5063 srcreg2 = translate_rreg (SD_, RM2);
5064 dstreg1 = translate_rreg (SD_, RN1);
5065 dstreg2 = translate_rreg (SD_, RN2);
5066
5067 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5068 State.regs[dstreg2] = State.regs[srcreg2];
5069 }
5070
5071 // 1111 0111 0111 0001 Rm1 Rn1 imm4 Rn2; cmp_mov Rm1, Rn1, imm4, Rn2
5072 8.0xf7+8.0x71+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_mov
5073 "cmp_mov"
5074 *am33
5075 {
5076 int srcreg1, dstreg1, dstreg2;
5077
5078 PC = cia;
5079 srcreg1 = translate_rreg (SD_, RM1);
5080 dstreg1 = translate_rreg (SD_, RN1);
5081 dstreg2 = translate_rreg (SD_, RN2);
5082
5083 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5084 State.regs[dstreg2] = EXTEND4 (IMM4);
5085 }
5086
5087 // 1111 0111 1000 0001 Rm1 Rn1 Rm2 Rn2; cmp_asr Rm1, Rn1, Rm2, Rn2
5088 8.0xf7+8.0x81+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asr
5089 "cmp_asr"
5090 *am33
5091 {
5092 int srcreg1, srcreg2, dstreg1, dstreg2;
5093 signed int temp;
5094
5095 PC = cia;
5096 srcreg1 = translate_rreg (SD_, RM1);
5097 srcreg2 = translate_rreg (SD_, RM2);
5098 dstreg1 = translate_rreg (SD_, RN1);
5099 dstreg2 = translate_rreg (SD_, RN2);
5100
5101 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5102 temp = State.regs[dstreg2];
5103 temp >>= State.regs[srcreg2];
5104 State.regs[dstreg2] = temp;
5105 }
5106
5107 // 1111 0111 1001 0001 Rm1 Rn1 imm4 Rn2; cmp_asr Rm1, Rn1, imm4, Rn2
5108 8.0xf7+8.0x91+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asr
5109 "cmp_asr"
5110 *am33
5111 {
5112 int srcreg1, dstreg1, dstreg2;
5113 signed int temp;
5114
5115 PC = cia;
5116 srcreg1 = translate_rreg (SD_, RM1);
5117 dstreg1 = translate_rreg (SD_, RN1);
5118 dstreg2 = translate_rreg (SD_, RN2);
5119
5120 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5121 temp = State.regs[dstreg2];
5122 temp >>= IMM4;
5123 State.regs[dstreg2] = temp;
5124 }
5125
5126 // 1111 0111 1010 0001 Rm1 Rn1 Rm2 Rn2; cmp_lsr Rm1, Rn1, Rm2, Rn2
5127 8.0xf7+8.0xa1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_lsr
5128 "cmp_lsr"
5129 *am33
5130 {
5131 int srcreg1, srcreg2, dstreg1, dstreg2;
5132
5133 PC = cia;
5134 srcreg1 = translate_rreg (SD_, RM1);
5135 srcreg2 = translate_rreg (SD_, RM2);
5136 dstreg1 = translate_rreg (SD_, RN1);
5137 dstreg2 = translate_rreg (SD_, RN2);
5138
5139 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5140 State.regs[dstreg2] >>= State.regs[srcreg2];
5141 }
5142
5143 // 1111 0111 1011 0001 Rm1 Rn1 imm4 Rn2; cmp_lsr Rm1, Rn1, imm4, Rn2
5144 8.0xf7+8.0xb1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_lsr
5145 "cmp_lsr"
5146 *am33
5147 {
5148 int srcreg1, dstreg1, dstreg2;
5149 signed int temp;
5150
5151 PC = cia;
5152 srcreg1 = translate_rreg (SD_, RM1);
5153 dstreg1 = translate_rreg (SD_, RN1);
5154 dstreg2 = translate_rreg (SD_, RN2);
5155
5156 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5157 State.regs[dstreg2] >>= IMM4;
5158 }
5159
5160
5161 // 1111 0111 1100 0001 Rm1 Rn1 Rm2 Rn2; cmp_asl Rm1, Rn1, Rm2, Rn2
5162 8.0xf7+8.0xc1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asl
5163 "cmp_asl"
5164 *am33
5165 {
5166 int srcreg1, srcreg2, dstreg1, dstreg2;
5167
5168 PC = cia;
5169 srcreg1 = translate_rreg (SD_, RM1);
5170 srcreg2 = translate_rreg (SD_, RM2);
5171 dstreg1 = translate_rreg (SD_, RN1);
5172 dstreg2 = translate_rreg (SD_, RN2);
5173
5174 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5175 State.regs[dstreg2] <<= State.regs[srcreg2];
5176 }
5177
5178 // 1111 0111 1101 0001 Rm1 Rn1 imm4 Rn2; cmp_asl Rm1, Rn1, imm4, Rn2
5179 8.0xf7+8.0xd1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asl
5180 "cmp_asl"
5181 *am33
5182 {
5183 int srcreg1, dstreg1, dstreg2;
5184 signed int temp;
5185
5186 PC = cia;
5187 srcreg1 = translate_rreg (SD_, RM1);
5188 dstreg1 = translate_rreg (SD_, RN1);
5189 dstreg2 = translate_rreg (SD_, RN2);
5190
5191 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5192 State.regs[dstreg2] <<= IMM4;
5193 }
5194
5195 // 1111 0111 0000 0010 Rm1 Rn1 Rm2 Rn2; sub_add Rm1, Rn1, Rm2, Rn2
5196 8.0xf7+8.0x02+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_add
5197 "sub_add"
5198 *am33
5199 {
5200 int srcreg1, srcreg2, dstreg1, dstreg2;
5201
5202 PC = cia;
5203 srcreg1 = translate_rreg (SD_, RM1);
5204 srcreg2 = translate_rreg (SD_, RM2);
5205 dstreg1 = translate_rreg (SD_, RN1);
5206 dstreg2 = translate_rreg (SD_, RN2);
5207
5208 State.regs[dstreg1] -= State.regs[srcreg1];
5209 State.regs[dstreg2] += State.regs[srcreg2];
5210 }
5211
5212 // 1111 0111 0001 0010 Rm1 Rn1 imm4 Rn2; sub_add Rm1, Rn1, imm4, Rn2
5213 8.0xf7+8.0x12+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_add
5214 "sub_add"
5215 *am33
5216 {
5217 int srcreg1, dstreg1, dstreg2;
5218
5219 PC = cia;
5220 srcreg1 = translate_rreg (SD_, RM1);
5221 dstreg1 = translate_rreg (SD_, RN1);
5222 dstreg2 = translate_rreg (SD_, RN2);
5223
5224 State.regs[dstreg1] -= State.regs[srcreg1];
5225 State.regs[dstreg2] += EXTEND4 (IMM4);
5226 }
5227
5228 // 1111 0111 0010 0010 Rm1 Rn1 Rm2 Rn2; sub_sub Rm1, Rn1, Rm2, Rn2
5229 8.0xf7+8.0x22+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_sub
5230 "sub_sub"
5231 *am33
5232 {
5233 int srcreg1, srcreg2, dstreg1, dstreg2;
5234
5235 PC = cia;
5236 srcreg1 = translate_rreg (SD_, RM1);
5237 srcreg2 = translate_rreg (SD_, RM2);
5238 dstreg1 = translate_rreg (SD_, RN1);
5239 dstreg2 = translate_rreg (SD_, RN2);
5240
5241 State.regs[dstreg1] -= State.regs[srcreg1];
5242 State.regs[dstreg2] -= State.regs[srcreg2];
5243 }
5244
5245 // 1111 0111 0011 0010 Rm1 Rn1 imm4 Rn2; sub_sub Rm1, Rn1, imm4, Rn2
5246 8.0xf7+8.0x32+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_sub
5247 "sub_sub"
5248 *am33
5249 {
5250 int srcreg1, dstreg1, dstreg2;
5251
5252 PC = cia;
5253 srcreg1 = translate_rreg (SD_, RM1);
5254 dstreg1 = translate_rreg (SD_, RN1);
5255 dstreg2 = translate_rreg (SD_, RN2);
5256
5257 State.regs[dstreg1] -= State.regs[srcreg1];
5258 State.regs[dstreg2] -= EXTEND4 (IMM4);
5259 }
5260
5261 // 1111 0111 0100 0010 Rm1 Rn1 Rm2 Rn2; sub_cmp Rm1, Rn1, Rm2, Rn2
5262 8.0xf7+8.0x42+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_cmp
5263 "sub_cmp"
5264 *am33
5265 {
5266 int srcreg1, srcreg2, dstreg1, dstreg2;
5267
5268 PC = cia;
5269 srcreg1 = translate_rreg (SD_, RM1);
5270 srcreg2 = translate_rreg (SD_, RM2);
5271 dstreg1 = translate_rreg (SD_, RN1);
5272 dstreg2 = translate_rreg (SD_, RN2);
5273
5274 State.regs[dstreg1] -= State.regs[srcreg1];
5275 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5276 }
5277
5278 // 1111 0111 0101 0010 Rm1 Rn1 imm4 Rn2; sub_cmp Rm1, Rn1, imm4, Rn2
5279 8.0xf7+8.0x52+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_cmp
5280 "sub_cmp"
5281 *am33
5282 {
5283 int srcreg1, dstreg1, dstreg2;
5284
5285 PC = cia;
5286 srcreg1 = translate_rreg (SD_, RM1);
5287 dstreg1 = translate_rreg (SD_, RN1);
5288 dstreg2 = translate_rreg (SD_, RN2);
5289
5290 State.regs[dstreg1] -= State.regs[srcreg1];
5291 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5292 }
5293
5294 // 1111 0111 0110 0010 Rm1 Rn1 Rm2 Rn2; sub_mov Rm1, Rn1, Rm2, Rn2
5295 8.0xf7+8.0x62+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_mov
5296 "sub_mov"
5297 *am33
5298 {
5299 int srcreg1, srcreg2, dstreg1, dstreg2;
5300
5301 PC = cia;
5302 srcreg1 = translate_rreg (SD_, RM1);
5303 srcreg2 = translate_rreg (SD_, RM2);
5304 dstreg1 = translate_rreg (SD_, RN1);
5305 dstreg2 = translate_rreg (SD_, RN2);
5306
5307 State.regs[dstreg1] -= State.regs[srcreg1];
5308 State.regs[dstreg2] = State.regs[srcreg2];
5309 }
5310
5311 // 1111 0111 0111 0010 Rm1 Rn1 imm4 Rn2; sub_mov Rm1, Rn1, imm4, Rn2
5312 8.0xf7+8.0x72+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_mov
5313 "sub_mov"
5314 *am33
5315 {
5316 int srcreg1, dstreg1, dstreg2;
5317
5318 PC = cia;
5319 srcreg1 = translate_rreg (SD_, RM1);
5320 dstreg1 = translate_rreg (SD_, RN1);
5321 dstreg2 = translate_rreg (SD_, RN2);
5322
5323 State.regs[dstreg1] -= State.regs[srcreg1];
5324 State.regs[dstreg2] = EXTEND4 (IMM4);
5325 }
5326
5327 // 1111 0111 1000 0010 Rm1 Rn1 Rm2 Rn2; sub_asr Rm1, Rn1, Rm2, Rn2
5328 8.0xf7+8.0x82+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asr
5329 "sub_asr"
5330 *am33
5331 {
5332 int srcreg1, srcreg2, dstreg1, dstreg2;
5333 signed int temp;
5334
5335 PC = cia;
5336 srcreg1 = translate_rreg (SD_, RM1);
5337 srcreg2 = translate_rreg (SD_, RM2);
5338 dstreg1 = translate_rreg (SD_, RN1);
5339 dstreg2 = translate_rreg (SD_, RN2);
5340
5341 State.regs[dstreg1] -= State.regs[srcreg1];
5342 temp = State.regs[dstreg2];
5343 temp >>= State.regs[srcreg2];
5344 State.regs[dstreg2] = temp;
5345 }
5346
5347 // 1111 0111 1001 0010 Rm1 Rn1 imm4 Rn2; sub_asr Rm1, Rn1, imm4, Rn2
5348 8.0xf7+8.0x92+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asr
5349 "sub_asr"
5350 *am33
5351 {
5352 int srcreg1, dstreg1, dstreg2;
5353 signed int temp;
5354
5355 PC = cia;
5356 srcreg1 = translate_rreg (SD_, RM1);
5357 dstreg1 = translate_rreg (SD_, RN1);
5358 dstreg2 = translate_rreg (SD_, RN2);
5359
5360 State.regs[dstreg1] -= State.regs[srcreg1];
5361 temp = State.regs[dstreg2];
5362 temp >>= IMM4;
5363 State.regs[dstreg2] = temp;
5364 }
5365
5366 // 1111 0111 1010 0010 Rm1 Rn1 Rm2 Rn2; sub_lsr Rm1, Rn1, Rm2, Rn2
5367 8.0xf7+8.0xa2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_lsr
5368 "sub_lsr"
5369 *am33
5370 {
5371 int srcreg1, srcreg2, dstreg1, dstreg2;
5372
5373 PC = cia;
5374 srcreg1 = translate_rreg (SD_, RM1);
5375 srcreg2 = translate_rreg (SD_, RM2);
5376 dstreg1 = translate_rreg (SD_, RN1);
5377 dstreg2 = translate_rreg (SD_, RN2);
5378
5379 State.regs[dstreg1] -= State.regs[srcreg1];
5380 State.regs[dstreg2] >>= State.regs[srcreg2];
5381 }
5382
5383 // 1111 0111 1011 0010 Rm1 Rn1 imm4 Rn2; sub_lsr Rm1, Rn1, imm4, Rn2
5384 8.0xf7+8.0xb2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_lsr
5385 "sub_lsr"
5386 *am33
5387 {
5388 int srcreg1, dstreg1, dstreg2;
5389 signed int temp;
5390
5391 PC = cia;
5392 srcreg1 = translate_rreg (SD_, RM1);
5393 dstreg1 = translate_rreg (SD_, RN1);
5394 dstreg2 = translate_rreg (SD_, RN2);
5395
5396 State.regs[dstreg1] -= State.regs[srcreg1];
5397 State.regs[dstreg2] >>= IMM4;
5398 }
5399
5400
5401 // 1111 0111 1100 0010 Rm1 Rn1 Rm2 Rn2; sub_asl Rm1, Rn1, Rm2, Rn2
5402 8.0xf7+8.0xc2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asl
5403 "sub_asl"
5404 *am33
5405 {
5406 int srcreg1, srcreg2, dstreg1, dstreg2;
5407
5408 PC = cia;
5409 srcreg1 = translate_rreg (SD_, RM1);
5410 srcreg2 = translate_rreg (SD_, RM2);
5411 dstreg1 = translate_rreg (SD_, RN1);
5412 dstreg2 = translate_rreg (SD_, RN2);
5413
5414 State.regs[dstreg1] -= State.regs[srcreg1];
5415 State.regs[dstreg2] <<= State.regs[srcreg2];
5416 }
5417
5418 // 1111 0111 1101 0010 Rm1 Rn1 imm4 Rn2; sub_asl Rm1, Rn1, imm4, Rn2
5419 8.0xf7+8.0xd2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asl
5420 "sub_asl"
5421 *am33
5422 {
5423 int srcreg1, dstreg1, dstreg2;
5424 signed int temp;
5425
5426 PC = cia;
5427 srcreg1 = translate_rreg (SD_, RM1);
5428 dstreg1 = translate_rreg (SD_, RN1);
5429 dstreg2 = translate_rreg (SD_, RN2);
5430
5431 State.regs[dstreg1] -= State.regs[srcreg1];
5432 State.regs[dstreg2] <<= IMM4;
5433 }
5434
5435 // 1111 0111 0000 0011 Rm1 Rn1 Rm2 Rn2; mov_add Rm1, Rn1, Rm2, Rn2
5436 8.0xf7+8.0x03+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_add
5437 "mov_add"
5438 *am33
5439 {
5440 int srcreg1, srcreg2, dstreg1, dstreg2;
5441
5442 PC = cia;
5443 srcreg1 = translate_rreg (SD_, RM1);
5444 srcreg2 = translate_rreg (SD_, RM2);
5445 dstreg1 = translate_rreg (SD_, RN1);
5446 dstreg2 = translate_rreg (SD_, RN2);
5447
5448 State.regs[dstreg1] = State.regs[srcreg1];
5449 State.regs[dstreg2] += State.regs[srcreg2];
5450 }
5451
5452 // 1111 0111 0001 0011 Rm1 Rn1 imm4 Rn2; mov_add Rm1, Rn1, imm4, Rn2
5453 8.0xf7+8.0x13+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_add
5454 "mov_add"
5455 *am33
5456 {
5457 int srcreg1, dstreg1, dstreg2;
5458
5459 PC = cia;
5460 srcreg1 = translate_rreg (SD_, RM1);
5461 dstreg1 = translate_rreg (SD_, RN1);
5462 dstreg2 = translate_rreg (SD_, RN2);
5463
5464 State.regs[dstreg1] = State.regs[srcreg1];
5465 State.regs[dstreg2] += EXTEND4 (IMM4);
5466 }
5467
5468 // 1111 0111 0010 0011 Rm1 Rn1 Rm2 Rn2; mov_sub Rm1, Rn1, Rm2, Rn2
5469 8.0xf7+8.0x23+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_sub
5470 "mov_sub"
5471 *am33
5472 {
5473 int srcreg1, srcreg2, dstreg1, dstreg2;
5474
5475 PC = cia;
5476 srcreg1 = translate_rreg (SD_, RM1);
5477 srcreg2 = translate_rreg (SD_, RM2);
5478 dstreg1 = translate_rreg (SD_, RN1);
5479 dstreg2 = translate_rreg (SD_, RN2);
5480
5481 State.regs[dstreg1] = State.regs[srcreg1];
5482 State.regs[dstreg2] -= State.regs[srcreg2];
5483 }
5484
5485 // 1111 0111 0011 0011 Rm1 Rn1 imm4 Rn2; mov_sub Rm1, Rn1, imm4, Rn2
5486 8.0xf7+8.0x33+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_sub
5487 "mov_sub"
5488 *am33
5489 {
5490 int srcreg1, dstreg1, dstreg2;
5491
5492 PC = cia;
5493 srcreg1 = translate_rreg (SD_, RM1);
5494 dstreg1 = translate_rreg (SD_, RN1);
5495 dstreg2 = translate_rreg (SD_, RN2);
5496
5497 State.regs[dstreg1] = State.regs[srcreg1];
5498 State.regs[dstreg2] -= EXTEND4 (IMM4);
5499 }
5500
5501 // 1111 0111 0100 0011 Rm1 Rn1 Rm2 Rn2; mov_cmp Rm1, Rn1, Rm2, Rn2
5502 8.0xf7+8.0x43+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_cmp
5503 "mov_cmp"
5504 *am33
5505 {
5506 int srcreg1, srcreg2, dstreg1, dstreg2;
5507
5508 PC = cia;
5509 srcreg1 = translate_rreg (SD_, RM1);
5510 srcreg2 = translate_rreg (SD_, RM2);
5511 dstreg1 = translate_rreg (SD_, RN1);
5512 dstreg2 = translate_rreg (SD_, RN2);
5513
5514 State.regs[dstreg1] = State.regs[srcreg1];
5515 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5516 }
5517
5518 // 1111 0111 0101 0011 Rm1 Rn1 imm4 Rn2; mov_cmp Rm1, Rn1, imm4, Rn2
5519 8.0xf7+8.0x53+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_cmp
5520 "mov_cmp"
5521 *am33
5522 {
5523 int srcreg1, dstreg1, dstreg2;
5524
5525 PC = cia;
5526 srcreg1 = translate_rreg (SD_, RM1);
5527 dstreg1 = translate_rreg (SD_, RN1);
5528 dstreg2 = translate_rreg (SD_, RN2);
5529
5530 State.regs[dstreg1] = State.regs[srcreg1];
5531 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5532 }
5533
5534 // 1111 0111 0110 0011 Rm1 Rn1 Rm2 Rn2; mov_mov Rm1, Rn1, Rm2, Rn2
5535 8.0xf7+8.0x63+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_mov
5536 "mov_mov"
5537 *am33
5538 {
5539 int srcreg1, srcreg2, dstreg1, dstreg2;
5540
5541 PC = cia;
5542 srcreg1 = translate_rreg (SD_, RM1);
5543 srcreg2 = translate_rreg (SD_, RM2);
5544 dstreg1 = translate_rreg (SD_, RN1);
5545 dstreg2 = translate_rreg (SD_, RN2);
5546
5547 State.regs[dstreg1] = State.regs[srcreg1];
5548 State.regs[dstreg2] = State.regs[srcreg2];
5549 }
5550
5551 // 1111 0111 0111 0011 Rm1 Rn1 imm4 Rn2; mov_mov Rm1, Rn1, imm4, Rn2
5552 8.0xf7+8.0x73+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_mov
5553 "mov_mov"
5554 *am33
5555 {
5556 int srcreg1, dstreg1, dstreg2;
5557
5558 PC = cia;
5559 srcreg1 = translate_rreg (SD_, RM1);
5560 dstreg1 = translate_rreg (SD_, RN1);
5561 dstreg2 = translate_rreg (SD_, RN2);
5562
5563 State.regs[dstreg1] = State.regs[srcreg1];
5564 State.regs[dstreg2] = EXTEND4 (IMM4);
5565 }
5566
5567 // 1111 0111 1000 0011 Rm1 Rn1 Rm2 Rn2; mov_asr Rm1, Rn1, Rm2, Rn2
5568 8.0xf7+8.0x83+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asr
5569 "mov_asr"
5570 *am33
5571 {
5572 int srcreg1, srcreg2, dstreg1, dstreg2;
5573 signed int temp;
5574
5575 PC = cia;
5576 srcreg1 = translate_rreg (SD_, RM1);
5577 srcreg2 = translate_rreg (SD_, RM2);
5578 dstreg1 = translate_rreg (SD_, RN1);
5579 dstreg2 = translate_rreg (SD_, RN2);
5580
5581 State.regs[dstreg1] = State.regs[srcreg1];
5582 temp = State.regs[dstreg2];
5583 temp >>= State.regs[srcreg2];
5584 State.regs[dstreg2] = temp;
5585 }
5586
5587 // 1111 0111 1001 0011 Rm1 Rn1 imm4 Rn2; mov_asr Rm1, Rn1, imm4, Rn2
5588 8.0xf7+8.0x93+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asr
5589 "mov_asr"
5590 *am33
5591 {
5592 int srcreg1, dstreg1, dstreg2;
5593 signed int temp;
5594
5595 PC = cia;
5596 srcreg1 = translate_rreg (SD_, RM1);
5597 dstreg1 = translate_rreg (SD_, RN1);
5598 dstreg2 = translate_rreg (SD_, RN2);
5599
5600 State.regs[dstreg1] = State.regs[srcreg1];
5601 temp = State.regs[dstreg2];
5602 temp >>= IMM4;
5603 State.regs[dstreg2] = temp;
5604 }
5605
5606 // 1111 0111 1010 0011 Rm1 Rn1 Rm2 Rn2; mov_lsr Rm1, Rn1, Rm2, Rn2
5607 8.0xf7+8.0xa3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_lsr
5608 "mov_lsr"
5609 *am33
5610 {
5611 int srcreg1, srcreg2, dstreg1, dstreg2;
5612
5613 PC = cia;
5614 srcreg1 = translate_rreg (SD_, RM1);
5615 srcreg2 = translate_rreg (SD_, RM2);
5616 dstreg1 = translate_rreg (SD_, RN1);
5617 dstreg2 = translate_rreg (SD_, RN2);
5618
5619 State.regs[dstreg1] = State.regs[srcreg1];
5620 State.regs[dstreg2] >>= State.regs[srcreg2];
5621 }
5622
5623 // 1111 0111 1011 0011 Rm1 Rn1 imm4 Rn2; mov_lsr Rm1, Rn1, imm4, Rn2
5624 8.0xf7+8.0xb3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_lsr
5625 "mov_lsr"
5626 *am33
5627 {
5628 int srcreg1, dstreg1, dstreg2;
5629 signed int temp;
5630
5631 PC = cia;
5632 srcreg1 = translate_rreg (SD_, RM1);
5633 dstreg1 = translate_rreg (SD_, RN1);
5634 dstreg2 = translate_rreg (SD_, RN2);
5635
5636 State.regs[dstreg1] = State.regs[srcreg1];
5637 State.regs[dstreg2] >>= IMM4;
5638 }
5639
5640
5641 // 1111 0111 1100 0011 Rm1 Rn1 Rm2 Rn2; mov_asl Rm1, Rn1, Rm2, Rn2
5642 8.0xf7+8.0xc3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asl
5643 "mov_asl"
5644 *am33
5645 {
5646 int srcreg1, srcreg2, dstreg1, dstreg2;
5647
5648 PC = cia;
5649 srcreg1 = translate_rreg (SD_, RM1);
5650 srcreg2 = translate_rreg (SD_, RM2);
5651 dstreg1 = translate_rreg (SD_, RN1);
5652 dstreg2 = translate_rreg (SD_, RN2);
5653
5654 State.regs[dstreg1] = State.regs[srcreg1];
5655 State.regs[dstreg2] <<= State.regs[srcreg2];
5656 }
5657
5658 // 1111 0111 1101 0011 Rm1 Rn1 imm4 Rn2; mov_asl Rm1, Rn1, imm4, Rn2
5659 8.0xf7+8.0xd3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asl
5660 "mov_asl"
5661 *am33
5662 {
5663 int srcreg1, dstreg1, dstreg2;
5664 signed int temp;
5665
5666 PC = cia;
5667 srcreg1 = translate_rreg (SD_, RM1);
5668 dstreg1 = translate_rreg (SD_, RN1);
5669 dstreg2 = translate_rreg (SD_, RN2);
5670
5671 State.regs[dstreg1] = State.regs[srcreg1];
5672 State.regs[dstreg2] <<= IMM4;
5673 }
5674
5675 // 1111 0111 0000 0100 imm4 Rn1 Rm2 Rn2; add_add imm4, Rn1, Rm2, Rn2
5676 8.0xf7+8.0x04+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_add
5677 "add_add"
5678 *am33
5679 {
5680 int srcreg2, dstreg1, dstreg2;
5681
5682 PC = cia;
5683 srcreg2 = translate_rreg (SD_, RM2);
5684 dstreg1 = translate_rreg (SD_, RN1);
5685 dstreg2 = translate_rreg (SD_, RN2);
5686
5687 State.regs[dstreg1] += EXTEND4 (IMM4A);
5688 State.regs[dstreg2] += State.regs[srcreg2];
5689 }
5690
5691 // 1111 0111 0001 0100 imm4 Rn1 imm4 Rn2; add_add imm4, Rn1, imm4, Rn2
5692 8.0xf7+8.0x14+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_add
5693 "add_add"
5694 *am33
5695 {
5696 int dstreg1, dstreg2;
5697
5698 PC = cia;
5699 dstreg1 = translate_rreg (SD_, RN1);
5700 dstreg2 = translate_rreg (SD_, RN2);
5701
5702 State.regs[dstreg1] += EXTEND4 (IMM4A);
5703 State.regs[dstreg2] += EXTEND4 (IMM4);
5704 }
5705
5706 // 1111 0111 0010 0100 imm4 Rn1 Rm2 Rn2; add_sub imm4, Rn1, Rm2, Rn2
5707 8.0xf7+8.0x24+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_sub
5708 "add_sub"
5709 *am33
5710 {
5711 int srcreg2, dstreg1, dstreg2;
5712
5713 PC = cia;
5714 srcreg2 = translate_rreg (SD_, RM2);
5715 dstreg1 = translate_rreg (SD_, RN1);
5716 dstreg2 = translate_rreg (SD_, RN2);
5717
5718 State.regs[dstreg1] += EXTEND4 (IMM4A);
5719 State.regs[dstreg2] -= State.regs[srcreg2];
5720 }
5721
5722 // 1111 0111 0011 0100 imm4 Rn1 imm4 Rn2; add_sub imm4, Rn1, imm4, Rn2
5723 8.0xf7+8.0x34+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_sub
5724 "add_sub"
5725 *am33
5726 {
5727 int dstreg1, dstreg2;
5728
5729 PC = cia;
5730 dstreg1 = translate_rreg (SD_, RN1);
5731 dstreg2 = translate_rreg (SD_, RN2);
5732
5733 State.regs[dstreg1] += EXTEND4 (IMM4A);
5734 State.regs[dstreg2] -= EXTEND4 (IMM4);
5735 }
5736
5737 // 1111 0111 0100 0100 imm4 Rn1 Rm2 Rn2; add_cmp imm4, Rn1, Rm2, Rn2
5738 8.0xf7+8.0x44+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_cmp
5739 "add_cmp"
5740 *am33
5741 {
5742 int srcreg2, dstreg1, dstreg2;
5743
5744 PC = cia;
5745 srcreg2 = translate_rreg (SD_, RM2);
5746 dstreg1 = translate_rreg (SD_, RN1);
5747 dstreg2 = translate_rreg (SD_, RN2);
5748
5749 State.regs[dstreg1] += EXTEND4 (IMM4A);
5750 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5751 }
5752
5753 // 1111 0111 0101 0100 imm4 Rn1 imm4 Rn2; add_cmp imm4, Rn1, imm4, Rn2
5754 8.0xf7+8.0x54+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_cmp
5755 "add_cmp"
5756 *am33
5757 {
5758 int dstreg1, dstreg2;
5759
5760 PC = cia;
5761 dstreg1 = translate_rreg (SD_, RN1);
5762 dstreg2 = translate_rreg (SD_, RN2);
5763
5764 State.regs[dstreg1] += EXTEND4 (IMM4A);
5765 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5766 }
5767
5768 // 1111 0111 0110 0100 imm4 Rn1 Rm2 Rn2; add_mov imm4, Rn1, Rm2, Rn2
5769 8.0xf7+8.0x64+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_mov
5770 "add_mov"
5771 *am33
5772 {
5773 int srcreg2, dstreg1, dstreg2;
5774
5775 PC = cia;
5776 srcreg2 = translate_rreg (SD_, RM2);
5777 dstreg1 = translate_rreg (SD_, RN1);
5778 dstreg2 = translate_rreg (SD_, RN2);
5779
5780 State.regs[dstreg1] += EXTEND4 (IMM4A);
5781 State.regs[dstreg2] = State.regs[srcreg2];
5782 }
5783
5784 // 1111 0111 0111 0100 imm4 Rn1 imm4 Rn2; add_mov imm4, Rn1, imm4, Rn2
5785 8.0xf7+8.0x74+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_mov
5786 "add_mov"
5787 *am33
5788 {
5789 int dstreg1, dstreg2;
5790
5791 PC = cia;
5792 dstreg1 = translate_rreg (SD_, RN1);
5793 dstreg2 = translate_rreg (SD_, RN2);
5794
5795 State.regs[dstreg1] += EXTEND4 (IMM4A);
5796 State.regs[dstreg2] = EXTEND4 (IMM4);
5797 }
5798
5799 // 1111 0111 1000 0100 imm4 Rn1 Rm2 Rn2; add_asr imm4, Rn1, Rm2, Rn2
5800 8.0xf7+8.0x84+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asr
5801 "add_asr"
5802 *am33
5803 {
5804 int srcreg2, dstreg1, dstreg2;
5805 signed int temp;
5806
5807 PC = cia;
5808 srcreg2 = translate_rreg (SD_, RM2);
5809 dstreg1 = translate_rreg (SD_, RN1);
5810 dstreg2 = translate_rreg (SD_, RN2);
5811
5812 State.regs[dstreg1] += EXTEND4 (IMM4A);
5813 temp = State.regs[dstreg2];
5814 temp >>= State.regs[srcreg2];
5815 State.regs[dstreg2] = temp;
5816 }
5817
5818 // 1111 0111 1001 0100 imm4 Rn1 imm4 Rn2; add_asr imm4, Rn1, imm4, Rn2
5819 8.0xf7+8.0x94+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asr
5820 "add_asr"
5821 *am33
5822 {
5823 int dstreg1, dstreg2;
5824 signed int temp;
5825
5826 PC = cia;
5827 dstreg1 = translate_rreg (SD_, RN1);
5828 dstreg2 = translate_rreg (SD_, RN2);
5829
5830 State.regs[dstreg1] += EXTEND4 (IMM4A);
5831 temp = State.regs[dstreg2];
5832 temp >>= IMM4;
5833 State.regs[dstreg2] = temp;
5834 }
5835
5836 // 1111 0111 1010 0100 imm4 Rn1 Rm2 Rn2; add_lsr imm4, Rn1, Rm2, Rn2
5837 8.0xf7+8.0xa4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_lsr
5838 "add_lsr"
5839 *am33
5840 {
5841 int srcreg2, dstreg1, dstreg2;
5842
5843 PC = cia;
5844 srcreg2 = translate_rreg (SD_, RM2);
5845 dstreg1 = translate_rreg (SD_, RN1);
5846 dstreg2 = translate_rreg (SD_, RN2);
5847
5848 State.regs[dstreg1] += EXTEND4 (IMM4A);
5849 State.regs[dstreg2] >>= State.regs[srcreg2];
5850 }
5851
5852 // 1111 0111 1011 0100 imm4 Rn1 imm4 Rn2; add_lsr imm4, Rn1, imm4, Rn2
5853 8.0xf7+8.0xb4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_lsr
5854 "add_lsr"
5855 *am33
5856 {
5857 int dstreg1, dstreg2;
5858 signed int temp;
5859
5860 PC = cia;
5861 dstreg1 = translate_rreg (SD_, RN1);
5862 dstreg2 = translate_rreg (SD_, RN2);
5863
5864 State.regs[dstreg1] += EXTEND4 (IMM4A);
5865 State.regs[dstreg2] >>= IMM4;
5866 }
5867
5868
5869 // 1111 0111 1100 0100 imm4 Rn1 Rm2 Rn2; add_asl imm4, Rn1, Rm2, Rn2
5870 8.0xf7+8.0xc4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asl
5871 "add_asl"
5872 *am33
5873 {
5874 int srcreg2, dstreg1, dstreg2;
5875
5876 PC = cia;
5877 srcreg2 = translate_rreg (SD_, RM2);
5878 dstreg1 = translate_rreg (SD_, RN1);
5879 dstreg2 = translate_rreg (SD_, RN2);
5880
5881 State.regs[dstreg1] += EXTEND4 (IMM4A);
5882 State.regs[dstreg2] <<= State.regs[srcreg2];
5883 }
5884
5885 // 1111 0111 1101 0100 imm4 Rn1 imm4 Rn2; add_asl imm4, Rn1, imm4, Rn2
5886 8.0xf7+8.0xd4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asl
5887 "add_asl"
5888 *am33
5889 {
5890 int dstreg1, dstreg2;
5891 signed int temp;
5892
5893 PC = cia;
5894 dstreg1 = translate_rreg (SD_, RN1);
5895 dstreg2 = translate_rreg (SD_, RN2);
5896
5897 State.regs[dstreg1] += EXTEND4 (IMM4A);
5898 State.regs[dstreg2] <<= IMM4;
5899 }
5900
5901 // 1111 0111 0000 0101 imm4 Rn1 Rm2 Rn2; cmp_add imm4, Rn1, Rm2, Rn2
5902 8.0xf7+8.0x05+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_add
5903 "cmp_add"
5904 *am33
5905 {
5906 int srcreg2, dstreg1, dstreg2;
5907
5908 PC = cia;
5909 srcreg2 = translate_rreg (SD_, RM2);
5910 dstreg1 = translate_rreg (SD_, RN1);
5911 dstreg2 = translate_rreg (SD_, RN2);
5912
5913 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5914 State.regs[dstreg2] += State.regs[srcreg2];
5915 }
5916
5917 // 1111 0111 0001 0101 imm4 Rn1 imm4 Rn2; cmp_add imm4, Rn1, imm4, Rn2
5918 8.0xf7+8.0x15+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_add
5919 "cmp_add"
5920 *am33
5921 {
5922 int dstreg1, dstreg2;
5923
5924 PC = cia;
5925 dstreg1 = translate_rreg (SD_, RN1);
5926 dstreg2 = translate_rreg (SD_, RN2);
5927
5928 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5929 State.regs[dstreg2] += EXTEND4 (IMM4);
5930 }
5931
5932 // 1111 0111 0010 0101 imm4 Rn1 Rm2 Rn2; cmp_sub imm4, Rn1, Rm2, Rn2
5933 8.0xf7+8.0x25+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_sub
5934 "cmp_sub"
5935 *am33
5936 {
5937 int srcreg2, dstreg1, dstreg2;
5938
5939 PC = cia;
5940 srcreg2 = translate_rreg (SD_, RM2);
5941 dstreg1 = translate_rreg (SD_, RN1);
5942 dstreg2 = translate_rreg (SD_, RN2);
5943
5944 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5945 State.regs[dstreg2] -= State.regs[srcreg2];
5946 }
5947
5948 // 1111 0111 0011 0101 imm4 Rn1 imm4 Rn2; cmp_sub imm4, Rn1, imm4, Rn2
5949 8.0xf7+8.0x35+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_sub
5950 "cmp_sub"
5951 *am33
5952 {
5953 int dstreg1, dstreg2;
5954
5955 PC = cia;
5956 dstreg1 = translate_rreg (SD_, RN1);
5957 dstreg2 = translate_rreg (SD_, RN2);
5958
5959 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5960 State.regs[dstreg2] -= EXTEND4 (IMM4);
5961 }
5962
5963 // 1111 0111 0110 0101 imm4 Rn1 Rm2 Rn2; cmp_mov imm4, Rn1, Rm2, Rn2
5964 8.0xf7+8.0x65+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_mov
5965 "cmp_mov"
5966 *am33
5967 {
5968 int srcreg2, dstreg1, dstreg2;
5969
5970 PC = cia;
5971 srcreg2 = translate_rreg (SD_, RM2);
5972 dstreg1 = translate_rreg (SD_, RN1);
5973 dstreg2 = translate_rreg (SD_, RN2);
5974
5975 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5976 State.regs[dstreg2] = State.regs[srcreg2];
5977 }
5978
5979 // 1111 0111 0111 0101 imm4 Rn1 imm4 Rn2; cmp_mov imm4, Rn1, imm4, Rn2
5980 8.0xf7+8.0x75+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_mov
5981 "cmp_mov"
5982 *am33
5983 {
5984 int dstreg1, dstreg2;
5985
5986 PC = cia;
5987 dstreg1 = translate_rreg (SD_, RN1);
5988 dstreg2 = translate_rreg (SD_, RN2);
5989
5990 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5991 State.regs[dstreg2] = EXTEND4 (IMM4);
5992 }
5993
5994 // 1111 0111 1000 0101 imm4 Rn1 Rm2 Rn2; cmp_asr imm4, Rn1, Rm2, Rn2
5995 8.0xf7+8.0x85+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asr
5996 "cmp_asr"
5997 *am33
5998 {
5999 int srcreg2, dstreg1, dstreg2;
6000 signed int temp;
6001
6002 PC = cia;
6003 srcreg2 = translate_rreg (SD_, RM2);
6004 dstreg1 = translate_rreg (SD_, RN1);
6005 dstreg2 = translate_rreg (SD_, RN2);
6006
6007 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6008 temp = State.regs[dstreg2];
6009 temp >>= State.regs[srcreg2];
6010 State.regs[dstreg2] = temp;
6011 }
6012
6013 // 1111 0111 1001 0101 imm4 Rn1 imm4 Rn2; cmp_asr imm4, Rn1, imm4, Rn2
6014 8.0xf7+8.0x95+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asr
6015 "cmp_asr"
6016 *am33
6017 {
6018 int dstreg1, dstreg2;
6019 signed int temp;
6020
6021 PC = cia;
6022 dstreg1 = translate_rreg (SD_, RN1);
6023 dstreg2 = translate_rreg (SD_, RN2);
6024
6025 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6026 temp = State.regs[dstreg2];
6027 temp >>= IMM4;
6028 State.regs[dstreg2] = temp;
6029 }
6030
6031 // 1111 0111 1010 0101 imm4 Rn1 Rm2 Rn2; cmp_lsr imm4, Rn1, Rm2, Rn2
6032 8.0xf7+8.0xa5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_lsr
6033 "cmp_lsr"
6034 *am33
6035 {
6036 int srcreg2, dstreg1, dstreg2;
6037
6038 PC = cia;
6039 srcreg2 = translate_rreg (SD_, RM2);
6040 dstreg1 = translate_rreg (SD_, RN1);
6041 dstreg2 = translate_rreg (SD_, RN2);
6042
6043 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6044 State.regs[dstreg2] >>= State.regs[srcreg2];
6045 }
6046
6047 // 1111 0111 1011 0101 imm4 Rn1 imm4 Rn2; cmp_lsr imm4, Rn1, imm4, Rn2
6048 8.0xf7+8.0xb5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_lsr
6049 "cmp_lsr"
6050 *am33
6051 {
6052 int dstreg1, dstreg2;
6053 signed int temp;
6054
6055 PC = cia;
6056 dstreg1 = translate_rreg (SD_, RN1);
6057 dstreg2 = translate_rreg (SD_, RN2);
6058
6059 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6060 State.regs[dstreg2] >>= IMM4;
6061 }
6062
6063
6064 // 1111 0111 1100 0101 imm4 Rn1 Rm2 Rn2; cmp_asl imm4, Rn1, Rm2, Rn2
6065 8.0xf7+8.0xc5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asl
6066 "cmp_asl"
6067 *am33
6068 {
6069 int srcreg2, dstreg1, dstreg2;
6070
6071 PC = cia;
6072 srcreg2 = translate_rreg (SD_, RM2);
6073 dstreg1 = translate_rreg (SD_, RN1);
6074 dstreg2 = translate_rreg (SD_, RN2);
6075
6076 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6077 State.regs[dstreg2] <<= State.regs[srcreg2];
6078 }
6079
6080 // 1111 0111 1101 0101 imm4 Rn1 imm4 Rn2; cmp_asl imm4, Rn1, imm4, Rn2
6081 8.0xf7+8.0xd5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asl
6082 "cmp_asl"
6083 *am33
6084 {
6085 int dstreg1, dstreg2;
6086 signed int temp;
6087
6088 PC = cia;
6089 dstreg1 = translate_rreg (SD_, RN1);
6090 dstreg2 = translate_rreg (SD_, RN2);
6091
6092 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6093 State.regs[dstreg2] <<= IMM4;
6094 }
6095
6096 // 1111 0111 0000 0110 imm4 Rn1 Rm2 Rn2; sub_add imm4, Rn1, Rm2, Rn2
6097 8.0xf7+8.0x06+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_add
6098 "sub_add"
6099 *am33
6100 {
6101 int srcreg2, dstreg1, dstreg2;
6102
6103 PC = cia;
6104 srcreg2 = translate_rreg (SD_, RM2);
6105 dstreg1 = translate_rreg (SD_, RN1);
6106 dstreg2 = translate_rreg (SD_, RN2);
6107
6108 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6109 State.regs[dstreg2] += State.regs[srcreg2];
6110 }
6111
6112 // 1111 0111 0001 0110 imm4 Rn1 imm4 Rn2; sub_add imm4, Rn1, imm4, Rn2
6113 8.0xf7+8.0x16+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_add
6114 "sub_add"
6115 *am33
6116 {
6117 int dstreg1, dstreg2;
6118
6119 PC = cia;
6120 dstreg1 = translate_rreg (SD_, RN1);
6121 dstreg2 = translate_rreg (SD_, RN2);
6122
6123 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6124 State.regs[dstreg2] += EXTEND4 (IMM4);
6125 }
6126
6127 // 1111 0111 0010 0110 imm4 Rn1 Rm2 Rn2; sub_sub imm4, Rn1, Rm2, Rn2
6128 8.0xf7+8.0x26+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_sub
6129 "sub_sub"
6130 *am33
6131 {
6132 int srcreg2, dstreg1, dstreg2;
6133
6134 PC = cia;
6135 srcreg2 = translate_rreg (SD_, RM2);
6136 dstreg1 = translate_rreg (SD_, RN1);
6137 dstreg2 = translate_rreg (SD_, RN2);
6138
6139 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6140 State.regs[dstreg2] -= State.regs[srcreg2];
6141 }
6142
6143 // 1111 0111 0011 0110 imm4 Rn1 imm4 Rn2; sub_sub imm4, Rn1, imm4, Rn2
6144 8.0xf7+8.0x36+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_sub
6145 "sub_sub"
6146 *am33
6147 {
6148 int dstreg1, dstreg2;
6149
6150 PC = cia;
6151 dstreg1 = translate_rreg (SD_, RN1);
6152 dstreg2 = translate_rreg (SD_, RN2);
6153
6154 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6155 State.regs[dstreg2] -= EXTEND4 (IMM4);
6156 }
6157
6158 // 1111 0111 0100 0110 imm4 Rn1 Rm2 Rn2; sub_cmp imm4, Rn1, Rm2, Rn2
6159 8.0xf7+8.0x46+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_cmp
6160 "sub_cmp"
6161 *am33
6162 {
6163 int srcreg2, dstreg1, dstreg2;
6164
6165 PC = cia;
6166 srcreg2 = translate_rreg (SD_, RM2);
6167 dstreg1 = translate_rreg (SD_, RN1);
6168 dstreg2 = translate_rreg (SD_, RN2);
6169
6170 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6171 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6172 }
6173
6174 // 1111 0111 0101 0110 imm4 Rn1 imm4 Rn2; sub_cmp imm4, Rn1, imm4, Rn2
6175 8.0xf7+8.0x56+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_cmp
6176 "sub_cmp"
6177 *am33
6178 {
6179 int dstreg1, dstreg2;
6180
6181 PC = cia;
6182 dstreg1 = translate_rreg (SD_, RN1);
6183 dstreg2 = translate_rreg (SD_, RN2);
6184
6185 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6186 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6187 }
6188
6189 // 1111 0111 0110 0110 imm4 Rn1 Rm2 Rn2; sub_mov imm4, Rn1, Rm2, Rn2
6190 8.0xf7+8.0x66+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_mov
6191 "sub_mov"
6192 *am33
6193 {
6194 int srcreg2, dstreg1, dstreg2;
6195
6196 PC = cia;
6197 srcreg2 = translate_rreg (SD_, RM2);
6198 dstreg1 = translate_rreg (SD_, RN1);
6199 dstreg2 = translate_rreg (SD_, RN2);
6200
6201 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6202 State.regs[dstreg2] = State.regs[srcreg2];
6203 }
6204
6205 // 1111 0111 0111 0110 imm4 Rn1 imm4 Rn2; sub_mov imm4, Rn1, imm4, Rn2
6206 8.0xf7+8.0x76+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_mov
6207 "sub_mov"
6208 *am33
6209 {
6210 int dstreg1, dstreg2;
6211
6212 PC = cia;
6213 dstreg1 = translate_rreg (SD_, RN1);
6214 dstreg2 = translate_rreg (SD_, RN2);
6215
6216 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6217 State.regs[dstreg2] = EXTEND4 (IMM4);
6218 }
6219
6220 // 1111 0111 1000 0110 imm4 Rn1 Rm2 Rn2; sub_asr imm4, Rn1, Rm2, Rn2
6221 8.0xf7+8.0x86+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asr
6222 "sub_asr"
6223 *am33
6224 {
6225 int srcreg2, dstreg1, dstreg2;
6226 signed int temp;
6227
6228 PC = cia;
6229 srcreg2 = translate_rreg (SD_, RM2);
6230 dstreg1 = translate_rreg (SD_, RN1);
6231 dstreg2 = translate_rreg (SD_, RN2);
6232
6233 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6234 temp = State.regs[dstreg2];
6235 temp >>= State.regs[srcreg2];
6236 State.regs[dstreg2] = temp;
6237 }
6238
6239 // 1111 0111 1001 0110 imm4 Rn1 imm4 Rn2; sub_asr imm4, Rn1, imm4, Rn2
6240 8.0xf7+8.0x96+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asr
6241 "sub_asr"
6242 *am33
6243 {
6244 int dstreg1, dstreg2;
6245 signed int temp;
6246
6247 PC = cia;
6248 dstreg1 = translate_rreg (SD_, RN1);
6249 dstreg2 = translate_rreg (SD_, RN2);
6250
6251 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6252 temp = State.regs[dstreg2];
6253 temp >>= IMM4;
6254 State.regs[dstreg2] = temp;
6255 }
6256
6257 // 1111 0111 1010 0110 imm4 Rn1 Rm2 Rn2; sub_lsr imm4, Rn1, Rm2, Rn2
6258 8.0xf7+8.0xa6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_lsr
6259 "sub_lsr"
6260 *am33
6261 {
6262 int srcreg2, dstreg1, dstreg2;
6263
6264 PC = cia;
6265 srcreg2 = translate_rreg (SD_, RM2);
6266 dstreg1 = translate_rreg (SD_, RN1);
6267 dstreg2 = translate_rreg (SD_, RN2);
6268
6269 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6270 State.regs[dstreg2] >>= State.regs[srcreg2];
6271 }
6272
6273 // 1111 0111 1011 0110 imm4 Rn1 imm4 Rn2; sub_lsr imm4, Rn1, imm4, Rn2
6274 8.0xf7+8.0xb6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_lsr
6275 "sub_lsr"
6276 *am33
6277 {
6278 int dstreg1, dstreg2;
6279 signed int temp;
6280
6281 PC = cia;
6282 dstreg1 = translate_rreg (SD_, RN1);
6283 dstreg2 = translate_rreg (SD_, RN2);
6284
6285 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6286 State.regs[dstreg2] >>= IMM4;
6287 }
6288
6289
6290 // 1111 0111 1100 0110 imm4 Rn1 Rm2 Rn2; sub_asl imm4, Rn1, Rm2, Rn2
6291 8.0xf7+8.0xc6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asl
6292 "sub_asl"
6293 *am33
6294 {
6295 int srcreg2, dstreg1, dstreg2;
6296
6297 PC = cia;
6298 srcreg2 = translate_rreg (SD_, RM2);
6299 dstreg1 = translate_rreg (SD_, RN1);
6300 dstreg2 = translate_rreg (SD_, RN2);
6301
6302 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6303 State.regs[dstreg2] <<= State.regs[srcreg2];
6304 }
6305
6306 // 1111 0111 1101 0110 imm4 Rn1 imm4 Rn2; sub_asl imm4, Rn1, imm4, Rn2
6307 8.0xf7+8.0xd6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asl
6308 "sub_asl"
6309 *am33
6310 {
6311 int dstreg1, dstreg2;
6312 signed int temp;
6313
6314 PC = cia;
6315 dstreg1 = translate_rreg (SD_, RN1);
6316 dstreg2 = translate_rreg (SD_, RN2);
6317
6318 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6319 State.regs[dstreg2] <<= IMM4;
6320 }
6321
6322 // 1111 0111 0000 0111 imm4 Rn1 Rm2 Rn2; mov_add imm4, Rn1, Rm2, Rn2
6323 8.0xf7+8.0x07+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_add
6324 "mov_add"
6325 *am33
6326 {
6327 int srcreg2, dstreg1, dstreg2;
6328
6329 PC = cia;
6330 srcreg2 = translate_rreg (SD_, RM2);
6331 dstreg1 = translate_rreg (SD_, RN1);
6332 dstreg2 = translate_rreg (SD_, RN2);
6333
6334 State.regs[dstreg1] = EXTEND4 (IMM4A);
6335 State.regs[dstreg2] += State.regs[srcreg2];
6336 }
6337
6338 // 1111 0111 0001 0111 imm4 Rn1 imm4 Rn2; mov_add imm4, Rn1, imm4, Rn2
6339 8.0xf7+8.0x17+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_add
6340 "mov_add"
6341 *am33
6342 {
6343 int dstreg1, dstreg2;
6344
6345 PC = cia;
6346 dstreg1 = translate_rreg (SD_, RN1);
6347 dstreg2 = translate_rreg (SD_, RN2);
6348
6349 State.regs[dstreg1] = EXTEND4 (IMM4A);
6350 State.regs[dstreg2] += EXTEND4 (IMM4);
6351 }
6352
6353 // 1111 0111 0010 0111 imm4 Rn1 Rm2 Rn2; mov_sub imm4, Rn1, Rm2, Rn2
6354 8.0xf7+8.0x27+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_sub
6355 "mov_sub"
6356 *am33
6357 {
6358 int srcreg2, dstreg1, dstreg2;
6359
6360 PC = cia;
6361 srcreg2 = translate_rreg (SD_, RM2);
6362 dstreg1 = translate_rreg (SD_, RN1);
6363 dstreg2 = translate_rreg (SD_, RN2);
6364
6365 State.regs[dstreg1] = EXTEND4 (IMM4A);
6366 State.regs[dstreg2] -= State.regs[srcreg2];
6367 }
6368
6369 // 1111 0111 0011 0111 imm4 Rn1 imm4 Rn2; mov_sub imm4, Rn1, imm4, Rn2
6370 8.0xf7+8.0x37+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_sub
6371 "mov_sub"
6372 *am33
6373 {
6374 int dstreg1, dstreg2;
6375
6376 PC = cia;
6377 dstreg1 = translate_rreg (SD_, RN1);
6378 dstreg2 = translate_rreg (SD_, RN2);
6379
6380 State.regs[dstreg1] = EXTEND4 (IMM4A);
6381 State.regs[dstreg2] -= EXTEND4 (IMM4);
6382 }
6383
6384 // 1111 0111 0100 0111 imm4 Rn1 Rm2 Rn2; mov_cmp imm4, Rn1, Rm2, Rn2
6385 8.0xf7+8.0x47+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_cmp
6386 "mov_cmp"
6387 *am33
6388 {
6389 int srcreg2, dstreg1, dstreg2;
6390
6391 PC = cia;
6392 srcreg2 = translate_rreg (SD_, RM2);
6393 dstreg1 = translate_rreg (SD_, RN1);
6394 dstreg2 = translate_rreg (SD_, RN2);
6395
6396 State.regs[dstreg1] = EXTEND4 (IMM4A);
6397 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6398 }
6399
6400 // 1111 0111 0101 0111 imm4 Rn1 imm4 Rn2; mov_cmp imm4, Rn1, imm4, Rn2
6401 8.0xf7+8.0x57+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_cmp
6402 "mov_cmp"
6403 *am33
6404 {
6405 int dstreg1, dstreg2;
6406
6407 PC = cia;
6408 dstreg1 = translate_rreg (SD_, RN1);
6409 dstreg2 = translate_rreg (SD_, RN2);
6410
6411 State.regs[dstreg1] = EXTEND4 (IMM4A);
6412 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6413 }
6414
6415 // 1111 0111 0110 0111 imm4 Rn1 Rm2 Rn2; mov_mov imm4, Rn1, Rm2, Rn2
6416 8.0xf7+8.0x67+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_mov
6417 "mov_mov"
6418 *am33
6419 {
6420 int srcreg2, dstreg1, dstreg2;
6421
6422 PC = cia;
6423 srcreg2 = translate_rreg (SD_, RM2);
6424 dstreg1 = translate_rreg (SD_, RN1);
6425 dstreg2 = translate_rreg (SD_, RN2);
6426
6427 State.regs[dstreg1] = EXTEND4 (IMM4A);
6428 State.regs[dstreg2] = State.regs[srcreg2];
6429 }
6430
6431 // 1111 0111 0111 0111 imm4 Rn1 imm4 Rn2; mov_mov imm4, Rn1, imm4, Rn2
6432 8.0xf7+8.0x77+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_mov
6433 "mov_mov"
6434 *am33
6435 {
6436 int dstreg1, dstreg2;
6437
6438 PC = cia;
6439 dstreg1 = translate_rreg (SD_, RN1);
6440 dstreg2 = translate_rreg (SD_, RN2);
6441
6442 State.regs[dstreg1] = EXTEND4 (IMM4A);
6443 State.regs[dstreg2] = EXTEND4 (IMM4);
6444 }
6445
6446 // 1111 0111 1000 0111 imm4 Rn1 Rm2 Rn2; mov_asr imm4, Rn1, Rm2, Rn2
6447 8.0xf7+8.0x87+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asr
6448 "mov_asr"
6449 *am33
6450 {
6451 int srcreg2, dstreg1, dstreg2;
6452 signed int temp;
6453
6454 PC = cia;
6455 srcreg2 = translate_rreg (SD_, RM2);
6456 dstreg1 = translate_rreg (SD_, RN1);
6457 dstreg2 = translate_rreg (SD_, RN2);
6458
6459 State.regs[dstreg1] = EXTEND4 (IMM4A);
6460 temp = State.regs[dstreg2];
6461 temp >>= State.regs[srcreg2];
6462 State.regs[dstreg2] = temp;
6463 }
6464
6465 // 1111 0111 1001 0111 imm4 Rn1 imm4 Rn2; mov_asr imm4, Rn1, imm4, Rn2
6466 8.0xf7+8.0x97+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asr
6467 "mov_asr"
6468 *am33
6469 {
6470 int dstreg1, dstreg2;
6471 signed int temp;
6472
6473 PC = cia;
6474 dstreg1 = translate_rreg (SD_, RN1);
6475 dstreg2 = translate_rreg (SD_, RN2);
6476
6477 State.regs[dstreg1] = EXTEND4 (IMM4A);
6478 temp = State.regs[dstreg2];
6479 temp >>= IMM4;
6480 State.regs[dstreg2] = temp;
6481 }
6482
6483 // 1111 0111 1010 0111 imm4 Rn1 Rm2 Rn2; mov_lsr imm4, Rn1, Rm2, Rn2
6484 8.0xf7+8.0xa7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_lsr
6485 "mov_lsr"
6486 *am33
6487 {
6488 int srcreg2, dstreg1, dstreg2;
6489
6490 PC = cia;
6491 srcreg2 = translate_rreg (SD_, RM2);
6492 dstreg1 = translate_rreg (SD_, RN1);
6493 dstreg2 = translate_rreg (SD_, RN2);
6494
6495 State.regs[dstreg1] = EXTEND4 (IMM4A);
6496 State.regs[dstreg2] >>= State.regs[srcreg2];
6497 }
6498
6499 // 1111 0111 1011 0111 imm4 Rn1 imm4 Rn2; mov_lsr imm4, Rn1, imm4, Rn2
6500 8.0xf7+8.0xb7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_lsr
6501 "mov_lsr"
6502 *am33
6503 {
6504 int dstreg1, dstreg2;
6505 signed int temp;
6506
6507 PC = cia;
6508 dstreg1 = translate_rreg (SD_, RN1);
6509 dstreg2 = translate_rreg (SD_, RN2);
6510
6511 State.regs[dstreg1] = EXTEND4 (IMM4A);
6512 State.regs[dstreg2] >>= IMM4;
6513 }
6514
6515
6516 // 1111 0111 1100 0111 imm4 Rn1 Rm2 Rn2; mov_asl imm4, Rn1, Rm2, Rn2
6517 8.0xf7+8.0xc7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asl
6518 "mov_asl"
6519 *am33
6520 {
6521 int srcreg2, dstreg1, dstreg2;
6522
6523 PC = cia;
6524 srcreg2 = translate_rreg (SD_, RM2);
6525 dstreg1 = translate_rreg (SD_, RN1);
6526 dstreg2 = translate_rreg (SD_, RN2);
6527
6528 State.regs[dstreg1] = EXTEND4 (IMM4A);
6529 State.regs[dstreg2] <<= State.regs[srcreg2];
6530 }
6531
6532 // 1111 0111 1101 0111 imm4 Rn1 imm4 Rn2; mov_asl imm4, Rn1, imm4, Rn2
6533 8.0xf7+8.0xd7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asl
6534 "mov_asl"
6535 *am33
6536 {
6537 int dstreg1, dstreg2;
6538 signed int temp;
6539
6540 PC = cia;
6541 dstreg1 = translate_rreg (SD_, RN1);
6542 dstreg2 = translate_rreg (SD_, RN2);
6543
6544 State.regs[dstreg1] = EXTEND4 (IMM4A);
6545 State.regs[dstreg2] <<= IMM4;
6546 }
6547
6548 // 1111 0111 0000 1000 Rm1 Rn1 Rm2 Rn2; and_add Rm1, Rn1, Rm2, Rn2
6549 8.0xf7+8.0x08+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_add
6550 "and_add"
6551 *am33
6552 {
6553 int srcreg1, srcreg2, dstreg1, dstreg2;
6554
6555 PC = cia;
6556 srcreg1 = translate_rreg (SD_, RM1);
6557 srcreg2 = translate_rreg (SD_, RM2);
6558 dstreg1 = translate_rreg (SD_, RN1);
6559 dstreg2 = translate_rreg (SD_, RN2);
6560
6561 State.regs[dstreg1] &= State.regs[srcreg1];
6562 State.regs[dstreg2] += State.regs[srcreg2];
6563 }
6564
6565 // 1111 0111 0001 1000 Rm1 Rn1 imm4 Rn2; and_add Rm1, Rn1, imm4, Rn2
6566 8.0xf7+8.0x18+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_add
6567 "and_add"
6568 *am33
6569 {
6570 int srcreg1, dstreg1, dstreg2;
6571
6572 PC = cia;
6573 srcreg1 = translate_rreg (SD_, RM1);
6574 dstreg1 = translate_rreg (SD_, RN1);
6575 dstreg2 = translate_rreg (SD_, RN2);
6576
6577 State.regs[dstreg1] &= State.regs[srcreg1];
6578 State.regs[dstreg2] += EXTEND4 (IMM4);
6579 }
6580
6581 // 1111 0111 0010 1000 Rm1 Rn1 Rm2 Rn2; and_sub Rm1, Rn1, Rm2, Rn2
6582 8.0xf7+8.0x28+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_sub
6583 "and_sub"
6584 *am33
6585 {
6586 int srcreg1, srcreg2, dstreg1, dstreg2;
6587
6588 PC = cia;
6589 srcreg1 = translate_rreg (SD_, RM1);
6590 srcreg2 = translate_rreg (SD_, RM2);
6591 dstreg1 = translate_rreg (SD_, RN1);
6592 dstreg2 = translate_rreg (SD_, RN2);
6593
6594 State.regs[dstreg1] &= State.regs[srcreg1];
6595 State.regs[dstreg2] -= State.regs[srcreg2];
6596 }
6597
6598 // 1111 0111 0011 1000 Rm1 Rn1 imm4 Rn2; and_sub Rm1, Rn1, imm4, Rn2
6599 8.0xf7+8.0x38+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_sub
6600 "and_sub"
6601 *am33
6602 {
6603 int srcreg1, dstreg1, dstreg2;
6604
6605 PC = cia;
6606 srcreg1 = translate_rreg (SD_, RM1);
6607 dstreg1 = translate_rreg (SD_, RN1);
6608 dstreg2 = translate_rreg (SD_, RN2);
6609
6610 State.regs[dstreg1] &= State.regs[srcreg1];
6611 State.regs[dstreg2] -= EXTEND4 (IMM4);
6612 }
6613
6614 // 1111 0111 0100 1000 Rm1 Rn1 Rm2 Rn2; and_cmp Rm1, Rn1, Rm2, Rn2
6615 8.0xf7+8.0x48+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_cmp
6616 "and_cmp"
6617 *am33
6618 {
6619 int srcreg1, srcreg2, dstreg1, dstreg2;
6620
6621 PC = cia;
6622 srcreg1 = translate_rreg (SD_, RM1);
6623 srcreg2 = translate_rreg (SD_, RM2);
6624 dstreg1 = translate_rreg (SD_, RN1);
6625 dstreg2 = translate_rreg (SD_, RN2);
6626
6627 State.regs[dstreg1] &= State.regs[srcreg1];
6628 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6629 }
6630
6631 // 1111 0111 0101 1000 Rm1 Rn1 imm4 Rn2; and_cmp Rm1, Rn1, imm4, Rn2
6632 8.0xf7+8.0x58+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_cmp
6633 "and_cmp"
6634 *am33
6635 {
6636 int srcreg1, dstreg1, dstreg2;
6637
6638 PC = cia;
6639 srcreg1 = translate_rreg (SD_, RM1);
6640 dstreg1 = translate_rreg (SD_, RN1);
6641 dstreg2 = translate_rreg (SD_, RN2);
6642
6643 State.regs[dstreg1] &= State.regs[srcreg1];
6644 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6645 }
6646
6647 // 1111 0111 0110 1000 Rm1 Rn1 Rm2 Rn2; and_mov Rm1, Rn1, Rm2, Rn2
6648 8.0xf7+8.0x68+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_mov
6649 "and_mov"
6650 *am33
6651 {
6652 int srcreg1, srcreg2, dstreg1, dstreg2;
6653
6654 PC = cia;
6655 srcreg1 = translate_rreg (SD_, RM1);
6656 srcreg2 = translate_rreg (SD_, RM2);
6657 dstreg1 = translate_rreg (SD_, RN1);
6658 dstreg2 = translate_rreg (SD_, RN2);
6659
6660 State.regs[dstreg1] &= State.regs[srcreg1];
6661 State.regs[dstreg2] = State.regs[srcreg2];
6662 }
6663
6664 // 1111 0111 0111 1000 Rm1 Rn1 imm4 Rn2; and_mov Rm1, Rn1, imm4, Rn2
6665 8.0xf7+8.0x78+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_mov
6666 "and_mov"
6667 *am33
6668 {
6669 int srcreg1, dstreg1, dstreg2;
6670
6671 PC = cia;
6672 srcreg1 = translate_rreg (SD_, RM1);
6673 dstreg1 = translate_rreg (SD_, RN1);
6674 dstreg2 = translate_rreg (SD_, RN2);
6675
6676 State.regs[dstreg1] &= State.regs[srcreg1];
6677 State.regs[dstreg2] = EXTEND4 (IMM4);
6678 }
6679
6680 // 1111 0111 1000 1000 Rm1 Rn1 Rm2 Rn2; and_asr Rm1, Rn1, Rm2, Rn2
6681 8.0xf7+8.0x88+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asr
6682 "and_asr"
6683 *am33
6684 {
6685 int srcreg1, srcreg2, dstreg1, dstreg2;
6686 signed int temp;
6687
6688 PC = cia;
6689 srcreg1 = translate_rreg (SD_, RM1);
6690 srcreg2 = translate_rreg (SD_, RM2);
6691 dstreg1 = translate_rreg (SD_, RN1);
6692 dstreg2 = translate_rreg (SD_, RN2);
6693
6694 State.regs[dstreg1] &= State.regs[srcreg1];
6695 temp = State.regs[dstreg2];
6696 temp >>= State.regs[srcreg2];
6697 State.regs[dstreg2] = temp;
6698 }
6699
6700 // 1111 0111 1001 1000 Rm1 Rn1 imm4 Rn2; and_asr Rm1, Rn1, imm4, Rn2
6701 8.0xf7+8.0x98+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asr
6702 "and_asr"
6703 *am33
6704 {
6705 int srcreg1, dstreg1, dstreg2;
6706 signed int temp;
6707
6708 PC = cia;
6709 srcreg1 = translate_rreg (SD_, RM1);
6710 dstreg1 = translate_rreg (SD_, RN1);
6711 dstreg2 = translate_rreg (SD_, RN2);
6712
6713 State.regs[dstreg1] &= State.regs[srcreg1];
6714 temp = State.regs[dstreg2];
6715 temp >>= IMM4;
6716 State.regs[dstreg2] = temp;
6717 }
6718
6719 // 1111 0111 1010 1000 Rm1 Rn1 Rm2 Rn2; and_lsr Rm1, Rn1, Rm2, Rn2
6720 8.0xf7+8.0xa8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_lsr
6721 "and_lsr"
6722 *am33
6723 {
6724 int srcreg1, srcreg2, dstreg1, dstreg2;
6725
6726 PC = cia;
6727 srcreg1 = translate_rreg (SD_, RM1);
6728 srcreg2 = translate_rreg (SD_, RM2);
6729 dstreg1 = translate_rreg (SD_, RN1);
6730 dstreg2 = translate_rreg (SD_, RN2);
6731
6732 State.regs[dstreg1] &= State.regs[srcreg1];
6733 State.regs[dstreg2] >>= State.regs[srcreg2];
6734 }
6735
6736 // 1111 0111 1011 1000 Rm1 Rn1 imm4 Rn2; and_lsr Rm1, Rn1, imm4, Rn2
6737 8.0xf7+8.0xb8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_lsr
6738 "and_lsr"
6739 *am33
6740 {
6741 int srcreg1, dstreg1, dstreg2;
6742 signed int temp;
6743
6744 PC = cia;
6745 srcreg1 = translate_rreg (SD_, RM1);
6746 dstreg1 = translate_rreg (SD_, RN1);
6747 dstreg2 = translate_rreg (SD_, RN2);
6748
6749 State.regs[dstreg1] &= State.regs[srcreg1];
6750 State.regs[dstreg2] >>= IMM4;
6751 }
6752
6753
6754 // 1111 0111 1100 1000 Rm1 Rn1 Rm2 Rn2; and_asl Rm1, Rn1, Rm2, Rn2
6755 8.0xf7+8.0xc8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asl
6756 "and_asl"
6757 *am33
6758 {
6759 int srcreg1, srcreg2, dstreg1, dstreg2;
6760
6761 PC = cia;
6762 srcreg1 = translate_rreg (SD_, RM1);
6763 srcreg2 = translate_rreg (SD_, RM2);
6764 dstreg1 = translate_rreg (SD_, RN1);
6765 dstreg2 = translate_rreg (SD_, RN2);
6766
6767 State.regs[dstreg1] &= State.regs[srcreg1];
6768 State.regs[dstreg2] <<= State.regs[srcreg2];
6769 }
6770
6771 // 1111 0111 1101 1000 Rm1 Rn1 imm4 Rn2; and_asl Rm1, Rn1, imm4, Rn2
6772 8.0xf7+8.0xd8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asl
6773 "and_asl"
6774 *am33
6775 {
6776 int srcreg1, dstreg1, dstreg2;
6777 signed int temp;
6778
6779 PC = cia;
6780 srcreg1 = translate_rreg (SD_, RM1);
6781 dstreg1 = translate_rreg (SD_, RN1);
6782 dstreg2 = translate_rreg (SD_, RN2);
6783
6784 State.regs[dstreg1] &= State.regs[srcreg1];
6785 State.regs[dstreg2] <<= IMM4;
6786 }
6787
6788 // 1111 0111 0000 1001 Rm1 Rn1 Rm2 Rn2; dmach_add Rm1, Rn1, Rm2, Rn2
6789 8.0xf7+8.0x09+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_add
6790 "dmach_add"
6791 *am33
6792 {
6793 int srcreg1, srcreg2, dstreg1, dstreg2;
6794 long temp, temp2, sum;
6795
6796 PC = cia;
6797 srcreg1 = translate_rreg (SD_, RM1);
6798 srcreg2 = translate_rreg (SD_, RM2);
6799 dstreg1 = translate_rreg (SD_, RN1);
6800 dstreg2 = translate_rreg (SD_, RN2);
6801
6802 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6803 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6804 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6805 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6806 sum = temp + temp2 + State.regs[REG_MCRL];
6807
6808 State.regs[dstreg1] = sum;
6809 State.regs[dstreg2] += State.regs[srcreg2];
6810 }
6811
6812 // 1111 0111 0001 1001 Rm1 Rn1 imm4 Rn2; dmach_add Rm1, Rn1, imm4, Rn2
6813 8.0xf7+8.0x19+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_add
6814 "dmach_add"
6815 *am33
6816 {
6817 int srcreg1, dstreg1, dstreg2;
6818 long temp, temp2, sum;
6819
6820 PC = cia;
6821 srcreg1 = translate_rreg (SD_, RM1);
6822 dstreg1 = translate_rreg (SD_, RN1);
6823 dstreg2 = translate_rreg (SD_, RN2);
6824
6825 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6826 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6827 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6828 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6829 sum = temp + temp2 + State.regs[REG_MCRL];
6830
6831 State.regs[dstreg1] = sum;
6832 State.regs[dstreg2] += EXTEND4 (IMM4);
6833 }
6834
6835 // 1111 0111 0010 1001 Rm1 Rn1 Rm2 Rn2; dmach_sub Rm1, Rn1, Rm2, Rn2
6836 8.0xf7+8.0x29+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_sub
6837 "dmach_sub"
6838 *am33
6839 {
6840 int srcreg1, srcreg2, dstreg1, dstreg2;
6841 long temp, temp2, sum;
6842
6843 PC = cia;
6844 srcreg1 = translate_rreg (SD_, RM1);
6845 srcreg2 = translate_rreg (SD_, RM2);
6846 dstreg1 = translate_rreg (SD_, RN1);
6847 dstreg2 = translate_rreg (SD_, RN2);
6848
6849 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6850 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6851 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6852 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6853 sum = temp + temp2 + State.regs[REG_MCRL];
6854
6855 State.regs[dstreg1] = sum;
6856 State.regs[dstreg2] -= State.regs[srcreg2];
6857 }
6858
6859 // 1111 0111 0011 1001 Rm1 Rn1 imm4 Rn2; dmach_sub Rm1, Rn1, imm4, Rn2
6860 8.0xf7+8.0x39+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_sub
6861 "dmach_sub"
6862 *am33
6863 {
6864 int srcreg1, dstreg1, dstreg2;
6865 long temp, temp2, sum;
6866
6867 PC = cia;
6868 srcreg1 = translate_rreg (SD_, RM1);
6869 dstreg1 = translate_rreg (SD_, RN1);
6870 dstreg2 = translate_rreg (SD_, RN2);
6871
6872 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6873 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6874 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6875 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6876 sum = temp + temp2 + State.regs[REG_MCRL];
6877
6878 State.regs[dstreg1] = sum;
6879 State.regs[dstreg2] -= EXTEND4 (IMM4);
6880 }
6881
6882 // 1111 0111 0100 1001 Rm1 Rn1 Rm2 Rn2; dmach_cmp Rm1, Rn1, Rm2, Rn2
6883 8.0xf7+8.0x49+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_cmp
6884 "dmach_cmp"
6885 *am33
6886 {
6887 int srcreg1, srcreg2, dstreg1, dstreg2;
6888 long temp, temp2, sum;
6889
6890 PC = cia;
6891 srcreg1 = translate_rreg (SD_, RM1);
6892 srcreg2 = translate_rreg (SD_, RM2);
6893 dstreg1 = translate_rreg (SD_, RN1);
6894 dstreg2 = translate_rreg (SD_, RN2);
6895
6896 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6897 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6898 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6899 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6900 sum = temp + temp2 + State.regs[REG_MCRL];
6901
6902 State.regs[dstreg1] = sum;
6903 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6904 }
6905
6906 // 1111 0111 0101 1001 Rm1 Rn1 imm4 Rn2; dmach_cmp Rm1, Rn1, imm4, Rn2
6907 8.0xf7+8.0x59+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_cmp
6908 "dmach_cmp"
6909 *am33
6910 {
6911 int srcreg1, dstreg1, dstreg2;
6912 long temp, temp2, sum;
6913
6914 PC = cia;
6915 srcreg1 = translate_rreg (SD_, RM1);
6916 dstreg1 = translate_rreg (SD_, RN1);
6917 dstreg2 = translate_rreg (SD_, RN2);
6918
6919 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6920 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6921 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6922 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6923 sum = temp + temp2 + State.regs[REG_MCRL];
6924
6925 State.regs[dstreg1] = sum;
6926 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6927 }
6928
6929 // 1111 0111 0110 1001 Rm1 Rn1 Rm2 Rn2; dmach_mov Rm1, Rn1, Rm2, Rn2
6930 8.0xf7+8.0x69+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_mov
6931 "dmach_mov"
6932 *am33
6933 {
6934 int srcreg1, srcreg2, dstreg1, dstreg2;
6935 long temp, temp2, sum;
6936
6937 PC = cia;
6938 srcreg1 = translate_rreg (SD_, RM1);
6939 srcreg2 = translate_rreg (SD_, RM2);
6940 dstreg1 = translate_rreg (SD_, RN1);
6941 dstreg2 = translate_rreg (SD_, RN2);
6942
6943 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6944 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6945 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6946 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6947 sum = temp + temp2 + State.regs[REG_MCRL];
6948
6949 State.regs[dstreg1] = sum;
6950 State.regs[dstreg2] = State.regs[srcreg2];
6951 }
6952
6953 // 1111 0111 0111 1001 Rm1 Rn1 imm4 Rn2; dmach_mov Rm1, Rn1, imm4, Rn2
6954 8.0xf7+8.0x79+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_mov
6955 "dmach_mov"
6956 *am33
6957 {
6958 int srcreg1, dstreg1, dstreg2;
6959 long temp, temp2, sum;
6960
6961 PC = cia;
6962 srcreg1 = translate_rreg (SD_, RM1);
6963 dstreg1 = translate_rreg (SD_, RN1);
6964 dstreg2 = translate_rreg (SD_, RN2);
6965
6966 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6967 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6968 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6969 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6970 sum = temp + temp2 + State.regs[REG_MCRL];
6971
6972 State.regs[dstreg1] = sum;
6973 State.regs[dstreg2] = EXTEND4 (IMM4);
6974 }
6975
6976 // 1111 0111 1000 1001 Rm1 Rn1 Rm2 Rn2; dmach_asr Rm1, Rn1, Rm2, Rn2
6977 8.0xf7+8.0x89+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asr
6978 "dmach_asr"
6979 *am33
6980 {
6981 int srcreg1, srcreg2, dstreg1, dstreg2;
6982 long temp, temp2, sum;
6983
6984 PC = cia;
6985 srcreg1 = translate_rreg (SD_, RM1);
6986 srcreg2 = translate_rreg (SD_, RM2);
6987 dstreg1 = translate_rreg (SD_, RN1);
6988 dstreg2 = translate_rreg (SD_, RN2);
6989
6990 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6991 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6992 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6993 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6994 sum = temp + temp2 + State.regs[REG_MCRL];
6995
6996 State.regs[dstreg1] = sum;
6997 temp = State.regs[dstreg2];
6998 temp >>= State.regs[srcreg2];
6999 State.regs[dstreg2] = temp;
7000 }
7001
7002 // 1111 0111 1001 1001 Rm1 Rn1 imm4 Rn2; dmach_asr Rm1, Rn1, imm4, Rn2
7003 8.0xf7+8.0x99+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asr
7004 "dmach_asr"
7005 *am33
7006 {
7007 int srcreg1, dstreg1, dstreg2;
7008 long temp, temp2, sum;
7009
7010 PC = cia;
7011 srcreg1 = translate_rreg (SD_, RM1);
7012 dstreg1 = translate_rreg (SD_, RN1);
7013 dstreg2 = translate_rreg (SD_, RN2);
7014
7015 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7016 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7017 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7018 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7019 sum = temp + temp2 + State.regs[REG_MCRL];
7020
7021 State.regs[dstreg1] = sum;
7022 temp = State.regs[dstreg2];
7023 temp >>= IMM4;
7024 State.regs[dstreg2] = temp;
7025 }
7026
7027 // 1111 0111 1010 1001 Rm1 Rn1 Rm2 Rn2; dmach_lsr Rm1, Rn1, Rm2, Rn2
7028 8.0xf7+8.0xa9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_lsr
7029 "dmach_lsr"
7030 *am33
7031 {
7032 int srcreg1, srcreg2, dstreg1, dstreg2;
7033 long temp, temp2, sum;
7034
7035 PC = cia;
7036 srcreg1 = translate_rreg (SD_, RM1);
7037 srcreg2 = translate_rreg (SD_, RM2);
7038 dstreg1 = translate_rreg (SD_, RN1);
7039 dstreg2 = translate_rreg (SD_, RN2);
7040
7041 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7042 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7043 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7044 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7045 sum = temp + temp2 + State.regs[REG_MCRL];
7046
7047 State.regs[dstreg1] = sum;
7048 State.regs[dstreg2] >>= State.regs[srcreg2];
7049 }
7050
7051 // 1111 0111 1011 1001 Rm1 Rn1 imm4 Rn2; dmach_lsr Rm1, Rn1, imm4, Rn2
7052 8.0xf7+8.0xb9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_lsr
7053 "dmach_lsr"
7054 *am33
7055 {
7056 int srcreg1, dstreg1, dstreg2;
7057 long temp, temp2, sum;
7058
7059 PC = cia;
7060 srcreg1 = translate_rreg (SD_, RM1);
7061 dstreg1 = translate_rreg (SD_, RN1);
7062 dstreg2 = translate_rreg (SD_, RN2);
7063
7064 State.regs[dstreg2] >>= IMM4;
7065 }
7066
7067
7068 // 1111 0111 1100 1001 Rm1 Rn1 Rm2 Rn2; dmach_asl Rm1, Rn1, Rm2, Rn2
7069 8.0xf7+8.0xc9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asl
7070 "dmach_asl"
7071 *am33
7072 {
7073 int srcreg1, srcreg2, dstreg1, dstreg2;
7074 long temp, temp2, sum;
7075
7076 PC = cia;
7077 srcreg1 = translate_rreg (SD_, RM1);
7078 srcreg2 = translate_rreg (SD_, RM2);
7079 dstreg1 = translate_rreg (SD_, RN1);
7080 dstreg2 = translate_rreg (SD_, RN2);
7081
7082 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7083 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7084 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7085 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7086 sum = temp + temp2 + State.regs[REG_MCRL];
7087
7088 State.regs[dstreg1] = sum;
7089 State.regs[dstreg2] <<= State.regs[srcreg2];
7090 }
7091
7092 // 1111 0111 1101 1001 Rm1 Rn1 imm4 Rn2; dmach_asl Rm1, Rn1, imm4, Rn2
7093 8.0xf7+8.0xd9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asl
7094 "dmach_asl"
7095 *am33
7096 {
7097 int srcreg1, dstreg1, dstreg2;
7098 long temp, temp2, sum;
7099
7100 PC = cia;
7101 srcreg1 = translate_rreg (SD_, RM1);
7102 dstreg1 = translate_rreg (SD_, RN1);
7103 dstreg2 = translate_rreg (SD_, RN2);
7104
7105 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7106 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7107 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7108 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7109 sum = temp + temp2 + State.regs[REG_MCRL];
7110
7111 State.regs[dstreg1] = sum;
7112 State.regs[dstreg2] <<= IMM4;
7113 }
7114
7115 // 1111 0111 0000 1010 Rm1 Rn1 Rm2 Rn2; xor_add Rm1, Rn1, Rm2, Rn2
7116 8.0xf7+8.0x0a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_add
7117 "xor_add"
7118 *am33
7119 {
7120 int srcreg1, srcreg2, dstreg1, dstreg2;
7121
7122 PC = cia;
7123 srcreg1 = translate_rreg (SD_, RM1);
7124 srcreg2 = translate_rreg (SD_, RM2);
7125 dstreg1 = translate_rreg (SD_, RN1);
7126 dstreg2 = translate_rreg (SD_, RN2);
7127
7128 State.regs[dstreg1] ^= State.regs[srcreg1];
7129 State.regs[dstreg2] += State.regs[srcreg2];
7130 }
7131
7132 // 1111 0111 0001 1010 Rm1 Rn1 imm4 Rn2; xor_add Rm1, Rn1, imm4, Rn2
7133 8.0xf7+8.0x1a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_add
7134 "xor_add"
7135 *am33
7136 {
7137 int srcreg1, dstreg1, dstreg2;
7138
7139 PC = cia;
7140 srcreg1 = translate_rreg (SD_, RM1);
7141 dstreg1 = translate_rreg (SD_, RN1);
7142 dstreg2 = translate_rreg (SD_, RN2);
7143
7144 State.regs[dstreg1] ^= State.regs[srcreg1];
7145 State.regs[dstreg2] += EXTEND4 (IMM4);
7146 }
7147
7148 // 1111 0111 0010 1010 Rm1 Rn1 Rm2 Rn2; xor_sub Rm1, Rn1, Rm2, Rn2
7149 8.0xf7+8.0x2a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_sub
7150 "xor_sub"
7151 *am33
7152 {
7153 int srcreg1, srcreg2, dstreg1, dstreg2;
7154
7155 PC = cia;
7156 srcreg1 = translate_rreg (SD_, RM1);
7157 srcreg2 = translate_rreg (SD_, RM2);
7158 dstreg1 = translate_rreg (SD_, RN1);
7159 dstreg2 = translate_rreg (SD_, RN2);
7160
7161 State.regs[dstreg1] ^= State.regs[srcreg1];
7162 State.regs[dstreg2] -= State.regs[srcreg2];
7163 }
7164
7165 // 1111 0111 0011 1010 Rm1 Rn1 imm4 Rn2; xor_sub Rm1, Rn1, imm4, Rn2
7166 8.0xf7+8.0x3a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_sub
7167 "xor_sub"
7168 *am33
7169 {
7170 int srcreg1, dstreg1, dstreg2;
7171
7172 PC = cia;
7173 srcreg1 = translate_rreg (SD_, RM1);
7174 dstreg1 = translate_rreg (SD_, RN1);
7175 dstreg2 = translate_rreg (SD_, RN2);
7176
7177 State.regs[dstreg1] ^= State.regs[srcreg1];
7178 State.regs[dstreg2] -= EXTEND4 (IMM4);
7179 }
7180
7181 // 1111 0111 0100 1010 Rm1 Rn1 Rm2 Rn2; xor_cmp Rm1, Rn1, Rm2, Rn2
7182 8.0xf7+8.0x4a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_cmp
7183 "xor_cmp"
7184 *am33
7185 {
7186 int srcreg1, srcreg2, dstreg1, dstreg2;
7187
7188 PC = cia;
7189 srcreg1 = translate_rreg (SD_, RM1);
7190 srcreg2 = translate_rreg (SD_, RM2);
7191 dstreg1 = translate_rreg (SD_, RN1);
7192 dstreg2 = translate_rreg (SD_, RN2);
7193
7194 State.regs[dstreg1] ^= State.regs[srcreg1];
7195 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7196 }
7197
7198 // 1111 0111 0101 1010 Rm1 Rn1 imm4 Rn2; xor_cmp Rm1, Rn1, imm4, Rn2
7199 8.0xf7+8.0x5a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_cmp
7200 "xor_cmp"
7201 *am33
7202 {
7203 int srcreg1, dstreg1, dstreg2;
7204
7205 PC = cia;
7206 srcreg1 = translate_rreg (SD_, RM1);
7207 dstreg1 = translate_rreg (SD_, RN1);
7208 dstreg2 = translate_rreg (SD_, RN2);
7209
7210 State.regs[dstreg1] ^= State.regs[srcreg1];
7211 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7212 }
7213
7214 // 1111 0111 0110 1010 Rm1 Rn1 Rm2 Rn2; xor_mov Rm1, Rn1, Rm2, Rn2
7215 8.0xf7+8.0x6a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_mov
7216 "xor_mov"
7217 *am33
7218 {
7219 int srcreg1, srcreg2, dstreg1, dstreg2;
7220
7221 PC = cia;
7222 srcreg1 = translate_rreg (SD_, RM1);
7223 srcreg2 = translate_rreg (SD_, RM2);
7224 dstreg1 = translate_rreg (SD_, RN1);
7225 dstreg2 = translate_rreg (SD_, RN2);
7226
7227 State.regs[dstreg1] ^= State.regs[srcreg1];
7228 State.regs[dstreg2] = State.regs[srcreg2];
7229 }
7230
7231 // 1111 0111 0111 1010 Rm1 Rn1 imm4 Rn2; xor_mov Rm1, Rn1, imm4, Rn2
7232 8.0xf7+8.0x7a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_mov
7233 "xor_mov"
7234 *am33
7235 {
7236 int srcreg1, dstreg1, dstreg2;
7237
7238 PC = cia;
7239 srcreg1 = translate_rreg (SD_, RM1);
7240 dstreg1 = translate_rreg (SD_, RN1);
7241 dstreg2 = translate_rreg (SD_, RN2);
7242
7243 State.regs[dstreg1] ^= State.regs[srcreg1];
7244 State.regs[dstreg2] = EXTEND4 (IMM4);
7245 }
7246
7247 // 1111 0111 1000 1010 Rm1 Rn1 Rm2 Rn2; xor_asr Rm1, Rn1, Rm2, Rn2
7248 8.0xf7+8.0x8a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asr
7249 "xor_asr"
7250 *am33
7251 {
7252 int srcreg1, srcreg2, dstreg1, dstreg2;
7253 signed int temp;
7254
7255 PC = cia;
7256 srcreg1 = translate_rreg (SD_, RM1);
7257 srcreg2 = translate_rreg (SD_, RM2);
7258 dstreg1 = translate_rreg (SD_, RN1);
7259 dstreg2 = translate_rreg (SD_, RN2);
7260
7261 State.regs[dstreg1] ^= State.regs[srcreg1];
7262 temp = State.regs[dstreg2];
7263 temp >>= State.regs[srcreg2];
7264 State.regs[dstreg2] = temp;
7265 }
7266
7267 // 1111 0111 1001 1010 Rm1 Rn1 imm4 Rn2; xor_asr Rm1, Rn1, imm4, Rn2
7268 8.0xf7+8.0x9a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asr
7269 "xor_asr"
7270 *am33
7271 {
7272 int srcreg1, dstreg1, dstreg2;
7273 signed int temp;
7274
7275 PC = cia;
7276 srcreg1 = translate_rreg (SD_, RM1);
7277 dstreg1 = translate_rreg (SD_, RN1);
7278 dstreg2 = translate_rreg (SD_, RN2);
7279
7280 State.regs[dstreg1] ^= State.regs[srcreg1];
7281 temp = State.regs[dstreg2];
7282 temp >>= IMM4;
7283 State.regs[dstreg2] = temp;
7284 }
7285
7286 // 1111 0111 1010 1010 Rm1 Rn1 Rm2 Rn2; xor_lsr Rm1, Rn1, Rm2, Rn2
7287 8.0xf7+8.0xaa+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_lsr
7288 "xor_lsr"
7289 *am33
7290 {
7291 int srcreg1, srcreg2, dstreg1, dstreg2;
7292
7293 PC = cia;
7294 srcreg1 = translate_rreg (SD_, RM1);
7295 srcreg2 = translate_rreg (SD_, RM2);
7296 dstreg1 = translate_rreg (SD_, RN1);
7297 dstreg2 = translate_rreg (SD_, RN2);
7298
7299 State.regs[dstreg1] ^= State.regs[srcreg1];
7300 State.regs[dstreg2] >>= State.regs[srcreg2];
7301 }
7302
7303 // 1111 0111 1011 1010 Rm1 Rn1 imm4 Rn2; xor_lsr Rm1, Rn1, imm4, Rn2
7304 8.0xf7+8.0xba+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_lsr
7305 "xor_lsr"
7306 *am33
7307 {
7308 int srcreg1, dstreg1, dstreg2;
7309 signed int temp;
7310
7311 PC = cia;
7312 srcreg1 = translate_rreg (SD_, RM1);
7313 dstreg1 = translate_rreg (SD_, RN1);
7314 dstreg2 = translate_rreg (SD_, RN2);
7315
7316 State.regs[dstreg1] ^= State.regs[srcreg1];
7317 State.regs[dstreg2] >>= IMM4;
7318 }
7319
7320
7321 // 1111 0111 1100 1010 Rm1 Rn1 Rm2 Rn2; xor_asl Rm1, Rn1, Rm2, Rn2
7322 8.0xf7+8.0xca+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asl
7323 "xor_asl"
7324 *am33
7325 {
7326 int srcreg1, srcreg2, dstreg1, dstreg2;
7327
7328 PC = cia;
7329 srcreg1 = translate_rreg (SD_, RM1);
7330 srcreg2 = translate_rreg (SD_, RM2);
7331 dstreg1 = translate_rreg (SD_, RN1);
7332 dstreg2 = translate_rreg (SD_, RN2);
7333
7334 State.regs[dstreg1] ^= State.regs[srcreg1];
7335 State.regs[dstreg2] <<= State.regs[srcreg2];
7336 }
7337
7338 // 1111 0111 1101 1010 Rm1 Rn1 imm4 Rn2; xor_asl Rm1, Rn1, imm4, Rn2
7339 8.0xf7+8.0xda+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asl
7340 "xor_asl"
7341 *am33
7342 {
7343 int srcreg1, dstreg1, dstreg2;
7344 signed int temp;
7345
7346 PC = cia;
7347 srcreg1 = translate_rreg (SD_, RM1);
7348 dstreg1 = translate_rreg (SD_, RN1);
7349 dstreg2 = translate_rreg (SD_, RN2);
7350
7351 State.regs[dstreg1] ^= State.regs[srcreg1];
7352 State.regs[dstreg2] <<= IMM4;
7353 }
7354
7355 // 1111 0111 0000 1011 Rm1 Rn1 Rm2 Rn2; swhw_add Rm1, Rn1, Rm2, Rn2
7356 8.0xf7+8.0x0b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_add
7357 "swhw_add"
7358 *am33
7359 {
7360 int srcreg1, srcreg2, dstreg1, dstreg2;
7361
7362 PC = cia;
7363 srcreg1 = translate_rreg (SD_, RM1);
7364 srcreg2 = translate_rreg (SD_, RM2);
7365 dstreg1 = translate_rreg (SD_, RN1);
7366 dstreg2 = translate_rreg (SD_, RN2);
7367
7368 State.regs[dstreg1] ^= State.regs[srcreg1];
7369 State.regs[dstreg2] += State.regs[srcreg2];
7370 }
7371
7372 // 1111 0111 0001 1011 Rm1 Rn1 imm4 Rn2; swhw_add Rm1, Rn1, imm4, Rn2
7373 8.0xf7+8.0x1b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_add
7374 "swhw_add"
7375 *am33
7376 {
7377 int srcreg1, dstreg1, dstreg2;
7378
7379 PC = cia;
7380 srcreg1 = translate_rreg (SD_, RM1);
7381 dstreg1 = translate_rreg (SD_, RN1);
7382 dstreg2 = translate_rreg (SD_, RN2);
7383
7384 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7385 | ((State.regs[srcreg1] >> 16) & 0xffff));
7386 State.regs[dstreg2] += EXTEND4 (IMM4);
7387 }
7388
7389 // 1111 0111 0010 1011 Rm1 Rn1 Rm2 Rn2; swhw_sub Rm1, Rn1, Rm2, Rn2
7390 8.0xf7+8.0x2b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_sub
7391 "swhw_sub"
7392 *am33
7393 {
7394 int srcreg1, srcreg2, dstreg1, dstreg2;
7395
7396 PC = cia;
7397 srcreg1 = translate_rreg (SD_, RM1);
7398 srcreg2 = translate_rreg (SD_, RM2);
7399 dstreg1 = translate_rreg (SD_, RN1);
7400 dstreg2 = translate_rreg (SD_, RN2);
7401
7402 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7403 | ((State.regs[srcreg1] >> 16) & 0xffff));
7404 State.regs[dstreg2] -= State.regs[srcreg2];
7405 }
7406
7407 // 1111 0111 0011 1011 Rm1 Rn1 imm4 Rn2; swhw_sub Rm1, Rn1, imm4, Rn2
7408 8.0xf7+8.0x3b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_sub
7409 "swhw_sub"
7410 *am33
7411 {
7412 int srcreg1, dstreg1, dstreg2;
7413
7414 PC = cia;
7415 srcreg1 = translate_rreg (SD_, RM1);
7416 dstreg1 = translate_rreg (SD_, RN1);
7417 dstreg2 = translate_rreg (SD_, RN2);
7418
7419 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7420 | ((State.regs[srcreg1] >> 16) & 0xffff));
7421 State.regs[dstreg2] -= EXTEND4 (IMM4);
7422 }
7423
7424 // 1111 0111 0100 1011 Rm1 Rn1 Rm2 Rn2; swhw_cmp Rm1, Rn1, Rm2, Rn2
7425 8.0xf7+8.0x4b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_cmp
7426 "swhw_cmp"
7427 *am33
7428 {
7429 int srcreg1, srcreg2, dstreg1, dstreg2;
7430
7431 PC = cia;
7432 srcreg1 = translate_rreg (SD_, RM1);
7433 srcreg2 = translate_rreg (SD_, RM2);
7434 dstreg1 = translate_rreg (SD_, RN1);
7435 dstreg2 = translate_rreg (SD_, RN2);
7436
7437 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7438 | ((State.regs[srcreg1] >> 16) & 0xffff));
7439 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7440 }
7441
7442 // 1111 0111 0101 1011 Rm1 Rn1 imm4 Rn2; swhw_cmp Rm1, Rn1, imm4, Rn2
7443 8.0xf7+8.0x5b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_cmp
7444 "swhw_cmp"
7445 *am33
7446 {
7447 int srcreg1, dstreg1, dstreg2;
7448
7449 PC = cia;
7450 srcreg1 = translate_rreg (SD_, RM1);
7451 dstreg1 = translate_rreg (SD_, RN1);
7452 dstreg2 = translate_rreg (SD_, RN2);
7453
7454 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7455 | ((State.regs[srcreg1] >> 16) & 0xffff));
7456 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7457 }
7458
7459 // 1111 0111 0110 1011 Rm1 Rn1 Rm2 Rn2; swhw_mov Rm1, Rn1, Rm2, Rn2
7460 8.0xf7+8.0x6b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_mov
7461 "swhw_mov"
7462 *am33
7463 {
7464 int srcreg1, srcreg2, dstreg1, dstreg2;
7465
7466 PC = cia;
7467 srcreg1 = translate_rreg (SD_, RM1);
7468 srcreg2 = translate_rreg (SD_, RM2);
7469 dstreg1 = translate_rreg (SD_, RN1);
7470 dstreg2 = translate_rreg (SD_, RN2);
7471
7472 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7473 | ((State.regs[srcreg1] >> 16) & 0xffff));
7474 State.regs[dstreg2] = State.regs[srcreg2];
7475 }
7476
7477 // 1111 0111 0111 1011 Rm1 Rn1 imm4 Rn2; swhw_mov Rm1, Rn1, imm4, Rn2
7478 8.0xf7+8.0x7b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_mov
7479 "swhw_mov"
7480 *am33
7481 {
7482 int srcreg1, dstreg1, dstreg2;
7483
7484 PC = cia;
7485 srcreg1 = translate_rreg (SD_, RM1);
7486 dstreg1 = translate_rreg (SD_, RN1);
7487 dstreg2 = translate_rreg (SD_, RN2);
7488
7489 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7490 | ((State.regs[srcreg1] >> 16) & 0xffff));
7491 State.regs[dstreg2] = EXTEND4 (IMM4);
7492 }
7493
7494 // 1111 0111 1000 1011 Rm1 Rn1 Rm2 Rn2; swhw_asr Rm1, Rn1, Rm2, Rn2
7495 8.0xf7+8.0x8b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asr
7496 "swhw_asr"
7497 *am33
7498 {
7499 int srcreg1, srcreg2, dstreg1, dstreg2;
7500 signed int temp;
7501
7502 PC = cia;
7503 srcreg1 = translate_rreg (SD_, RM1);
7504 srcreg2 = translate_rreg (SD_, RM2);
7505 dstreg1 = translate_rreg (SD_, RN1);
7506 dstreg2 = translate_rreg (SD_, RN2);
7507
7508 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7509 | ((State.regs[srcreg1] >> 16) & 0xffff));
7510 temp = State.regs[dstreg2];
7511 temp >>= State.regs[srcreg2];
7512 State.regs[dstreg2] = temp;
7513 }
7514
7515 // 1111 0111 1001 1011 Rm1 Rn1 imm4 Rn2; swhw_asr Rm1, Rn1, imm4, Rn2
7516 8.0xf7+8.0x9b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asr
7517 "swhw_asr"
7518 *am33
7519 {
7520 int srcreg1, dstreg1, dstreg2;
7521 signed int temp;
7522
7523 PC = cia;
7524 srcreg1 = translate_rreg (SD_, RM1);
7525 dstreg1 = translate_rreg (SD_, RN1);
7526 dstreg2 = translate_rreg (SD_, RN2);
7527
7528 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7529 | ((State.regs[srcreg1] >> 16) & 0xffff));
7530 temp = State.regs[dstreg2];
7531 temp >>= IMM4;
7532 State.regs[dstreg2] = temp;
7533 }
7534
7535 // 1111 0111 1010 1011 Rm1 Rn1 Rm2 Rn2; swhw_lsr Rm1, Rn1, Rm2, Rn2
7536 8.0xf7+8.0xab+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_lsr
7537 "swhw_lsr"
7538 *am33
7539 {
7540 int srcreg1, srcreg2, dstreg1, dstreg2;
7541
7542 PC = cia;
7543 srcreg1 = translate_rreg (SD_, RM1);
7544 srcreg2 = translate_rreg (SD_, RM2);
7545 dstreg1 = translate_rreg (SD_, RN1);
7546 dstreg2 = translate_rreg (SD_, RN2);
7547
7548 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7549 | ((State.regs[srcreg1] >> 16) & 0xffff));
7550 State.regs[dstreg2] >>= State.regs[srcreg2];
7551 }
7552
7553 // 1111 0111 1011 1011 Rm1 Rn1 imm4 Rn2; swhw_lsr Rm1, Rn1, imm4, Rn2
7554 8.0xf7+8.0xbb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_lsr
7555 "swhw_lsr"
7556 *am33
7557 {
7558 int srcreg1, dstreg1, dstreg2;
7559 signed int temp;
7560
7561 PC = cia;
7562 srcreg1 = translate_rreg (SD_, RM1);
7563 dstreg1 = translate_rreg (SD_, RN1);
7564 dstreg2 = translate_rreg (SD_, RN2);
7565
7566 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7567 | ((State.regs[srcreg1] >> 16) & 0xffff));
7568 State.regs[dstreg2] >>= IMM4;
7569 }
7570
7571
7572 // 1111 0111 1100 1011 Rm1 Rn1 Rm2 Rn2; swhw_asl Rm1, Rn1, Rm2, Rn2
7573 8.0xf7+8.0xcb+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asl
7574 "swhw_asl"
7575 *am33
7576 {
7577 int srcreg1, srcreg2, dstreg1, dstreg2;
7578
7579 PC = cia;
7580 srcreg1 = translate_rreg (SD_, RM1);
7581 srcreg2 = translate_rreg (SD_, RM2);
7582 dstreg1 = translate_rreg (SD_, RN1);
7583 dstreg2 = translate_rreg (SD_, RN2);
7584
7585 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7586 | ((State.regs[srcreg1] >> 16) & 0xffff));
7587 State.regs[dstreg2] <<= State.regs[srcreg2];
7588 }
7589
7590 // 1111 0111 1101 1011 Rm1 Rn1 imm4 Rn2; swhw_asl Rm1, Rn1, imm4, Rn2
7591 8.0xf7+8.0xdb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asl
7592 "swhw_asl"
7593 *am33
7594 {
7595 int srcreg1, dstreg1, dstreg2;
7596 signed int temp;
7597
7598 PC = cia;
7599 srcreg1 = translate_rreg (SD_, RM1);
7600 dstreg1 = translate_rreg (SD_, RN1);
7601 dstreg2 = translate_rreg (SD_, RN2);
7602
7603 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7604 | ((State.regs[srcreg1] >> 16) & 0xffff));
7605 State.regs[dstreg2] <<= IMM4;
7606 }
7607
7608 // 1111 0111 0000 1100 Rm1 Rn1 Rm2 Rn2; or_add Rm1, Rn1, Rm2, Rn2
7609 8.0xf7+8.0x0c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_add
7610 "or_add"
7611 *am33
7612 {
7613 int srcreg1, srcreg2, dstreg1, dstreg2;
7614
7615 PC = cia;
7616 srcreg1 = translate_rreg (SD_, RM1);
7617 srcreg2 = translate_rreg (SD_, RM2);
7618 dstreg1 = translate_rreg (SD_, RN1);
7619 dstreg2 = translate_rreg (SD_, RN2);
7620
7621 State.regs[dstreg1] |= State.regs[srcreg1];
7622 State.regs[dstreg2] += State.regs[srcreg2];
7623 }
7624
7625 // 1111 0111 0001 1100 Rm1 Rn1 imm4 Rn2; or_add Rm1, Rn1, imm4, Rn2
7626 8.0xf7+8.0x1c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_add
7627 "or_add"
7628 *am33
7629 {
7630 int srcreg1, dstreg1, dstreg2;
7631
7632 PC = cia;
7633 srcreg1 = translate_rreg (SD_, RM1);
7634 dstreg1 = translate_rreg (SD_, RN1);
7635 dstreg2 = translate_rreg (SD_, RN2);
7636
7637 State.regs[dstreg1] |= State.regs[srcreg1];
7638 State.regs[dstreg2] += EXTEND4 (IMM4);
7639 }
7640
7641 // 1111 0111 0010 1100 Rm1 Rn1 Rm2 Rn2; or_sub Rm1, Rn1, Rm2, Rn2
7642 8.0xf7+8.0x2c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_sub
7643 "or_sub"
7644 *am33
7645 {
7646 int srcreg1, srcreg2, dstreg1, dstreg2;
7647
7648 PC = cia;
7649 srcreg1 = translate_rreg (SD_, RM1);
7650 srcreg2 = translate_rreg (SD_, RM2);
7651 dstreg1 = translate_rreg (SD_, RN1);
7652 dstreg2 = translate_rreg (SD_, RN2);
7653
7654 State.regs[dstreg1] |= State.regs[srcreg1];
7655 State.regs[dstreg2] -= State.regs[srcreg2];
7656 }
7657
7658 // 1111 0111 0011 1100 Rm1 Rn1 imm4 Rn2; or_sub Rm1, Rn1, imm4, Rn2
7659 8.0xf7+8.0x3c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_sub
7660 "or_sub"
7661 *am33
7662 {
7663 int srcreg1, dstreg1, dstreg2;
7664
7665 PC = cia;
7666 srcreg1 = translate_rreg (SD_, RM1);
7667 dstreg1 = translate_rreg (SD_, RN1);
7668 dstreg2 = translate_rreg (SD_, RN2);
7669
7670 State.regs[dstreg1] |= State.regs[srcreg1];
7671 State.regs[dstreg2] -= EXTEND4 (IMM4);
7672 }
7673
7674 // 1111 0111 0100 1100 Rm1 Rn1 Rm2 Rn2; or_cmp Rm1, Rn1, Rm2, Rn2
7675 8.0xf7+8.0x4c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_cmp
7676 "or_cmp"
7677 *am33
7678 {
7679 int srcreg1, srcreg2, dstreg1, dstreg2;
7680
7681 PC = cia;
7682 srcreg1 = translate_rreg (SD_, RM1);
7683 srcreg2 = translate_rreg (SD_, RM2);
7684 dstreg1 = translate_rreg (SD_, RN1);
7685 dstreg2 = translate_rreg (SD_, RN2);
7686
7687 State.regs[dstreg1] |= State.regs[srcreg1];
7688 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7689 }
7690
7691 // 1111 0111 0101 1100 Rm1 Rn1 imm4 Rn2; or_cmp Rm1, Rn1, imm4, Rn2
7692 8.0xf7+8.0x5c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_cmp
7693 "or_cmp"
7694 *am33
7695 {
7696 int srcreg1, dstreg1, dstreg2;
7697
7698 PC = cia;
7699 srcreg1 = translate_rreg (SD_, RM1);
7700 dstreg1 = translate_rreg (SD_, RN1);
7701 dstreg2 = translate_rreg (SD_, RN2);
7702
7703 State.regs[dstreg1] |= State.regs[srcreg1];
7704 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7705 }
7706
7707 // 1111 0111 0110 1100 Rm1 Rn1 Rm2 Rn2; or_mov Rm1, Rn1, Rm2, Rn2
7708 8.0xf7+8.0x6c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_mov
7709 "or_mov"
7710 *am33
7711 {
7712 int srcreg1, srcreg2, dstreg1, dstreg2;
7713
7714 PC = cia;
7715 srcreg1 = translate_rreg (SD_, RM1);
7716 srcreg2 = translate_rreg (SD_, RM2);
7717 dstreg1 = translate_rreg (SD_, RN1);
7718 dstreg2 = translate_rreg (SD_, RN2);
7719
7720 State.regs[dstreg1] |= State.regs[srcreg1];
7721 State.regs[dstreg2] = State.regs[srcreg2];
7722 }
7723
7724 // 1111 0111 0111 1100 Rm1 Rn1 imm4 Rn2; or_mov Rm1, Rn1, imm4, Rn2
7725 8.0xf7+8.0x7c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_mov
7726 "or_mov"
7727 *am33
7728 {
7729 int srcreg1, dstreg1, dstreg2;
7730
7731 PC = cia;
7732 srcreg1 = translate_rreg (SD_, RM1);
7733 dstreg1 = translate_rreg (SD_, RN1);
7734 dstreg2 = translate_rreg (SD_, RN2);
7735
7736 State.regs[dstreg1] |= State.regs[srcreg1];
7737 State.regs[dstreg2] = EXTEND4 (IMM4);
7738 }
7739
7740 // 1111 0111 1000 1100 Rm1 Rn1 Rm2 Rn2; or_asr Rm1, Rn1, Rm2, Rn2
7741 8.0xf7+8.0x8c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asr
7742 "or_asr"
7743 *am33
7744 {
7745 int srcreg1, srcreg2, dstreg1, dstreg2;
7746 signed int temp;
7747
7748 PC = cia;
7749 srcreg1 = translate_rreg (SD_, RM1);
7750 srcreg2 = translate_rreg (SD_, RM2);
7751 dstreg1 = translate_rreg (SD_, RN1);
7752 dstreg2 = translate_rreg (SD_, RN2);
7753
7754 State.regs[dstreg1] |= State.regs[srcreg1];
7755 temp = State.regs[dstreg2];
7756 temp >>= State.regs[srcreg2];
7757 State.regs[dstreg2] = temp;
7758 }
7759
7760 // 1111 0111 1001 1100 Rm1 Rn1 imm4 Rn2; or_asr Rm1, Rn1, imm4, Rn2
7761 8.0xf7+8.0x9c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asr
7762 "or_asr"
7763 *am33
7764 {
7765 int srcreg1, dstreg1, dstreg2;
7766 signed int temp;
7767
7768 PC = cia;
7769 srcreg1 = translate_rreg (SD_, RM1);
7770 dstreg1 = translate_rreg (SD_, RN1);
7771 dstreg2 = translate_rreg (SD_, RN2);
7772
7773 State.regs[dstreg1] |= State.regs[srcreg1];
7774 temp = State.regs[dstreg2];
7775 temp >>= IMM4;
7776 State.regs[dstreg2] = temp;
7777 }
7778
7779 // 1111 0111 1010 1100 Rm1 Rn1 Rm2 Rn2; or_lsr Rm1, Rn1, Rm2, Rn2
7780 8.0xf7+8.0xac+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_lsr
7781 "or_lsr"
7782 *am33
7783 {
7784 int srcreg1, srcreg2, dstreg1, dstreg2;
7785
7786 PC = cia;
7787 srcreg1 = translate_rreg (SD_, RM1);
7788 srcreg2 = translate_rreg (SD_, RM2);
7789 dstreg1 = translate_rreg (SD_, RN1);
7790 dstreg2 = translate_rreg (SD_, RN2);
7791
7792 State.regs[dstreg1] |= State.regs[srcreg1];
7793 State.regs[dstreg2] >>= State.regs[srcreg2];
7794 }
7795
7796 // 1111 0111 1011 1100 Rm1 Rn1 imm4 Rn2; or_lsr Rm1, Rn1, imm4, Rn2
7797 8.0xf7+8.0xbc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_lsr
7798 "or_lsr"
7799 *am33
7800 {
7801 int srcreg1, dstreg1, dstreg2;
7802 signed int temp;
7803
7804 PC = cia;
7805 srcreg1 = translate_rreg (SD_, RM1);
7806 dstreg1 = translate_rreg (SD_, RN1);
7807 dstreg2 = translate_rreg (SD_, RN2);
7808
7809 State.regs[dstreg1] |= State.regs[srcreg1];
7810 State.regs[dstreg2] >>= IMM4;
7811 }
7812
7813
7814 // 1111 0111 1100 1100 Rm1 Rn1 Rm2 Rn2; or_asl Rm1, Rn1, Rm2, Rn2
7815 8.0xf7+8.0xcc+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asl
7816 "or_asl"
7817 *am33
7818 {
7819 int srcreg1, srcreg2, dstreg1, dstreg2;
7820
7821 PC = cia;
7822 srcreg1 = translate_rreg (SD_, RM1);
7823 srcreg2 = translate_rreg (SD_, RM2);
7824 dstreg1 = translate_rreg (SD_, RN1);
7825 dstreg2 = translate_rreg (SD_, RN2);
7826
7827 State.regs[dstreg1] |= State.regs[srcreg1];
7828 State.regs[dstreg2] <<= State.regs[srcreg2];
7829 }
7830
7831 // 1111 0111 1101 1100 Rm1 Rn1 imm4 Rn2; or_asl Rm1, Rn1, imm4, Rn2
7832 8.0xf7+8.0xdc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asl
7833 "or_asl"
7834 *am33
7835 {
7836 int srcreg1, dstreg1, dstreg2;
7837 signed int temp;
7838
7839 PC = cia;
7840 srcreg1 = translate_rreg (SD_, RM1);
7841 dstreg1 = translate_rreg (SD_, RN1);
7842 dstreg2 = translate_rreg (SD_, RN2);
7843
7844 State.regs[dstreg1] |= State.regs[srcreg1];
7845 State.regs[dstreg2] <<= IMM4;
7846 }
7847
7848 // 1111 0111 0000 1101 Rm1 Rn1 Rm2 Rn2; sat16_add Rm1, Rn1, Rm2, Rn2
7849 8.0xf7+8.0x0d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_add
7850 "sat16_add"
7851 *am33
7852 {
7853 int srcreg1, srcreg2, dstreg1, dstreg2;
7854
7855 PC = cia;
7856 srcreg1 = translate_rreg (SD_, RM1);
7857 srcreg2 = translate_rreg (SD_, RM2);
7858 dstreg1 = translate_rreg (SD_, RN1);
7859 dstreg2 = translate_rreg (SD_, RN2);
7860
7861 if (State.regs[srcreg1] >= 0x7fff)
7862 State.regs[dstreg1] = 0x7fff;
7863 else if (State.regs[srcreg1] <= 0xffff8000)
7864 State.regs[dstreg1] = 0xffff8000;
7865 else
7866 State.regs[dstreg1] = State.regs[srcreg1];
7867
7868 State.regs[dstreg2] += State.regs[srcreg2];
7869 }
7870
7871 // 1111 0111 0001 1101 Rm1 Rn1 imm4 Rn2; sat16_add Rm1, Rn1, imm4, Rn2
7872 8.0xf7+8.0x1d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_add
7873 "sat16_add"
7874 *am33
7875 {
7876 int srcreg1, dstreg1, dstreg2;
7877
7878 PC = cia;
7879 srcreg1 = translate_rreg (SD_, RM1);
7880 dstreg1 = translate_rreg (SD_, RN1);
7881 dstreg2 = translate_rreg (SD_, RN2);
7882
7883 if (State.regs[srcreg1] >= 0x7fff)
7884 State.regs[dstreg1] = 0x7fff;
7885 else if (State.regs[srcreg1] <= 0xffff8000)
7886 State.regs[dstreg1] = 0xffff8000;
7887 else
7888 State.regs[dstreg1] = State.regs[srcreg1];
7889
7890 State.regs[dstreg2] += EXTEND4 (IMM4);
7891 }
7892
7893 // 1111 0111 0010 1101 Rm1 Rn1 Rm2 Rn2; sat16_sub Rm1, Rn1, Rm2, Rn2
7894 8.0xf7+8.0x2d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_sub
7895 "sat16_sub"
7896 *am33
7897 {
7898 int srcreg1, srcreg2, dstreg1, dstreg2;
7899
7900 PC = cia;
7901 srcreg1 = translate_rreg (SD_, RM1);
7902 srcreg2 = translate_rreg (SD_, RM2);
7903 dstreg1 = translate_rreg (SD_, RN1);
7904 dstreg2 = translate_rreg (SD_, RN2);
7905
7906 if (State.regs[srcreg1] >= 0x7fff)
7907 State.regs[dstreg1] = 0x7fff;
7908 else if (State.regs[srcreg1] <= 0xffff8000)
7909 State.regs[dstreg1] = 0xffff8000;
7910 else
7911 State.regs[dstreg1] = State.regs[srcreg1];
7912
7913 State.regs[dstreg2] -= State.regs[srcreg2];
7914 }
7915
7916 // 1111 0111 0011 1101 Rm1 Rn1 imm4 Rn2; sat16_sub Rm1, Rn1, imm4, Rn2
7917 8.0xf7+8.0x3d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_sub
7918 "sat16_sub"
7919 *am33
7920 {
7921 int srcreg1, dstreg1, dstreg2;
7922
7923 PC = cia;
7924 srcreg1 = translate_rreg (SD_, RM1);
7925 dstreg1 = translate_rreg (SD_, RN1);
7926 dstreg2 = translate_rreg (SD_, RN2);
7927
7928 if (State.regs[srcreg1] >= 0x7fff)
7929 State.regs[dstreg1] = 0x7fff;
7930 else if (State.regs[srcreg1] <= 0xffff8000)
7931 State.regs[dstreg1] = 0xffff8000;
7932 else
7933 State.regs[dstreg1] = State.regs[srcreg1];
7934
7935 State.regs[dstreg2] -= EXTEND4 (IMM4);
7936 }
7937
7938 // 1111 0111 0100 1101 Rm1 Rn1 Rm2 Rn2; sat16_cmp Rm1, Rn1, Rm2, Rn2
7939 8.0xf7+8.0x4d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_cmp
7940 "sat16_cmp"
7941 *am33
7942 {
7943 int srcreg1, srcreg2, dstreg1, dstreg2;
7944
7945 PC = cia;
7946 srcreg1 = translate_rreg (SD_, RM1);
7947 srcreg2 = translate_rreg (SD_, RM2);
7948 dstreg1 = translate_rreg (SD_, RN1);
7949 dstreg2 = translate_rreg (SD_, RN2);
7950
7951 if (State.regs[srcreg1] >= 0x7fff)
7952 State.regs[dstreg1] = 0x7fff;
7953 else if (State.regs[srcreg1] <= 0xffff8000)
7954 State.regs[dstreg1] = 0xffff8000;
7955 else
7956 State.regs[dstreg1] = State.regs[srcreg1];
7957
7958 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7959 }
7960
7961 // 1111 0111 0101 1101 Rm1 Rn1 imm4 Rn2; sat16_cmp Rm1, Rn1, imm4, Rn2
7962 8.0xf7+8.0x5d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_cmp
7963 "sat16_cmp"
7964 *am33
7965 {
7966 int srcreg1, dstreg1, dstreg2;
7967
7968 PC = cia;
7969 srcreg1 = translate_rreg (SD_, RM1);
7970 dstreg1 = translate_rreg (SD_, RN1);
7971 dstreg2 = translate_rreg (SD_, RN2);
7972
7973 if (State.regs[srcreg1] >= 0x7fff)
7974 State.regs[dstreg1] = 0x7fff;
7975 else if (State.regs[srcreg1] <= 0xffff8000)
7976 State.regs[dstreg1] = 0xffff8000;
7977 else
7978 State.regs[dstreg1] = State.regs[srcreg1];
7979
7980 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7981 }
7982
7983 // 1111 0111 0110 1101 Rm1 Rn1 Rm2 Rn2; sat16_mov Rm1, Rn1, Rm2, Rn2
7984 8.0xf7+8.0x6d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_mov
7985 "sat16_mov"
7986 *am33
7987 {
7988 int srcreg1, srcreg2, dstreg1, dstreg2;
7989
7990 PC = cia;
7991 srcreg1 = translate_rreg (SD_, RM1);
7992 srcreg2 = translate_rreg (SD_, RM2);
7993 dstreg1 = translate_rreg (SD_, RN1);
7994 dstreg2 = translate_rreg (SD_, RN2);
7995
7996 if (State.regs[srcreg1] >= 0x7fff)
7997 State.regs[dstreg1] = 0x7fff;
7998 else if (State.regs[srcreg1] <= 0xffff8000)
7999 State.regs[dstreg1] = 0xffff8000;
8000 else
8001 State.regs[dstreg1] = State.regs[srcreg1];
8002
8003 State.regs[dstreg2] = State.regs[srcreg2];
8004 }
8005
8006 // 1111 0111 0111 1101 Rm1 Rn1 imm4 Rn2; sat16_mov Rm1, Rn1, imm4, Rn2
8007 8.0xf7+8.0x7d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_mov
8008 "sat16_mov"
8009 *am33
8010 {
8011 int srcreg1, dstreg1, dstreg2;
8012
8013 PC = cia;
8014 srcreg1 = translate_rreg (SD_, RM1);
8015 dstreg1 = translate_rreg (SD_, RN1);
8016 dstreg2 = translate_rreg (SD_, RN2);
8017
8018 if (State.regs[srcreg1] >= 0x7fff)
8019 State.regs[dstreg1] = 0x7fff;
8020 else if (State.regs[srcreg1] <= 0xffff8000)
8021 State.regs[dstreg1] = 0xffff8000;
8022 else
8023 State.regs[dstreg1] = State.regs[srcreg1];
8024
8025 State.regs[dstreg2] = EXTEND4 (IMM4);
8026 }
8027
8028 // 1111 0111 1000 1101 Rm1 Rn1 Rm2 Rn2; sat16_asr Rm1, Rn1, Rm2, Rn2
8029 8.0xf7+8.0x8d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asr
8030 "sat16_asr"
8031 *am33
8032 {
8033 int srcreg1, srcreg2, dstreg1, dstreg2;
8034 signed int temp;
8035
8036 PC = cia;
8037 srcreg1 = translate_rreg (SD_, RM1);
8038 srcreg2 = translate_rreg (SD_, RM2);
8039 dstreg1 = translate_rreg (SD_, RN1);
8040 dstreg2 = translate_rreg (SD_, RN2);
8041
8042 if (State.regs[srcreg1] >= 0x7fff)
8043 State.regs[dstreg1] = 0x7fff;
8044 else if (State.regs[srcreg1] <= 0xffff8000)
8045 State.regs[dstreg1] = 0xffff8000;
8046 else
8047 State.regs[dstreg1] = State.regs[srcreg1];
8048
8049 temp = State.regs[dstreg2];
8050 temp >>= State.regs[srcreg2];
8051 State.regs[dstreg2] = temp;
8052 }
8053
8054 // 1111 0111 1001 1101 Rm1 Rn1 imm4 Rn2; sat16_asr Rm1, Rn1, imm4, Rn2
8055 8.0xf7+8.0x9d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asr
8056 "sat16_asr"
8057 *am33
8058 {
8059 int srcreg1, dstreg1, dstreg2;
8060 signed int temp;
8061
8062 PC = cia;
8063 srcreg1 = translate_rreg (SD_, RM1);
8064 dstreg1 = translate_rreg (SD_, RN1);
8065 dstreg2 = translate_rreg (SD_, RN2);
8066
8067 if (State.regs[srcreg1] >= 0x7fff)
8068 State.regs[dstreg1] = 0x7fff;
8069 else if (State.regs[srcreg1] <= 0xffff8000)
8070 State.regs[dstreg1] = 0xffff8000;
8071 else
8072 State.regs[dstreg1] = State.regs[srcreg1];
8073
8074 temp = State.regs[dstreg2];
8075 temp >>= IMM4;
8076 State.regs[dstreg2] = temp;
8077 }
8078
8079 // 1111 0111 1010 1101 Rm1 Rn1 Rm2 Rn2; sat16_lsr Rm1, Rn1, Rm2, Rn2
8080 8.0xf7+8.0xad+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_lsr
8081 "sat16_lsr"
8082 *am33
8083 {
8084 int srcreg1, srcreg2, dstreg1, dstreg2;
8085
8086 PC = cia;
8087 srcreg1 = translate_rreg (SD_, RM1);
8088 srcreg2 = translate_rreg (SD_, RM2);
8089 dstreg1 = translate_rreg (SD_, RN1);
8090 dstreg2 = translate_rreg (SD_, RN2);
8091
8092 if (State.regs[srcreg1] >= 0x7fff)
8093 State.regs[dstreg1] = 0x7fff;
8094 else if (State.regs[srcreg1] <= 0xffff8000)
8095 State.regs[dstreg1] = 0xffff8000;
8096 else
8097 State.regs[dstreg1] = State.regs[srcreg1];
8098
8099 State.regs[dstreg2] >>= State.regs[srcreg2];
8100 }
8101
8102 // 1111 0111 1011 1101 Rm1 Rn1 imm4 Rn2; sat16_lsr Rm1, Rn1, imm4, Rn2
8103 8.0xf7+8.0xbd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_lsr
8104 "sat16_lsr"
8105 *am33
8106 {
8107 int srcreg1, dstreg1, dstreg2;
8108 signed int temp;
8109
8110 PC = cia;
8111 srcreg1 = translate_rreg (SD_, RM1);
8112 dstreg1 = translate_rreg (SD_, RN1);
8113 dstreg2 = translate_rreg (SD_, RN2);
8114
8115 if (State.regs[srcreg1] >= 0x7fff)
8116 State.regs[dstreg1] = 0x7fff;
8117 else if (State.regs[srcreg1] <= 0xffff8000)
8118 State.regs[dstreg1] = 0xffff8000;
8119 else
8120 State.regs[dstreg1] = State.regs[srcreg1];
8121
8122 State.regs[dstreg2] >>= IMM4;
8123 }
8124
8125
8126 // 1111 0111 1100 1101 Rm1 Rn1 Rm2 Rn2; sat16_asl Rm1, Rn1, Rm2, Rn2
8127 8.0xf7+8.0xcd+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asl
8128 "sat16_asl"
8129 *am33
8130 {
8131 int srcreg1, srcreg2, dstreg1, dstreg2;
8132
8133 PC = cia;
8134 srcreg1 = translate_rreg (SD_, RM1);
8135 srcreg2 = translate_rreg (SD_, RM2);
8136 dstreg1 = translate_rreg (SD_, RN1);
8137 dstreg2 = translate_rreg (SD_, RN2);
8138
8139 if (State.regs[srcreg1] >= 0x7fff)
8140 State.regs[dstreg1] = 0x7fff;
8141 else if (State.regs[srcreg1] <= 0xffff8000)
8142 State.regs[dstreg1] = 0xffff8000;
8143 else
8144 State.regs[dstreg1] = State.regs[srcreg1];
8145
8146 State.regs[dstreg2] <<= State.regs[srcreg2];
8147 }
8148
8149 // 1111 0111 1101 1101 Rm1 Rn1 imm4 Rn2; sat16_asl Rm1, Rn1, imm4, Rn2
8150 8.0xf7+8.0xdd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asl
8151 "sat16_asl"
8152 *am33
8153 {
8154 int srcreg1, dstreg1, dstreg2;
8155 signed int temp;
8156
8157 PC = cia;
8158 srcreg1 = translate_rreg (SD_, RM1);
8159 dstreg1 = translate_rreg (SD_, RN1);
8160 dstreg2 = translate_rreg (SD_, RN2);
8161
8162 if (State.regs[srcreg1] >= 0x7fff)
8163 State.regs[dstreg1] = 0x7fff;
8164 else if (State.regs[srcreg1] <= 0xffff8000)
8165 State.regs[dstreg1] = 0xffff8000;
8166 else
8167 State.regs[dstreg1] = State.regs[srcreg1];
8168
8169 State.regs[dstreg2] <<= IMM4;
8170 }
8171
8172 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0000; mov_llt (Rm+,imm4),Rn
8173 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x0:D2:::mov_llt
8174 "mov_llt"
8175 *am33
8176 {
8177 int srcreg, dstreg;
8178
8179 PC = cia;
8180 srcreg = translate_rreg (SD_, RM);
8181 dstreg = translate_rreg (SD_, RN);
8182
8183 State.regs[dstreg] = load_word (State.regs[srcreg]);
8184 State.regs[srcreg] += EXTEND4 (IMM4);
8185
8186 if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
8187 {
8188 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8189 nia = PC;
8190 }
8191 }
8192
8193 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0001; mov_lgt (Rm+,imm4),Rn
8194 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x1:D2:::mov_lgt
8195 "mov_lgt"
8196 *am33
8197 {
8198 int srcreg, dstreg;
8199
8200 PC = cia;
8201 srcreg = translate_rreg (SD_, RM);
8202 dstreg = translate_rreg (SD_, RN);
8203
8204 State.regs[dstreg] = load_word (State.regs[srcreg]);
8205 State.regs[srcreg] += EXTEND4 (IMM4);
8206
8207 if (!((PSW & PSW_Z)
8208 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
8209 {
8210 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8211 nia = PC;
8212 }
8213 }
8214
8215 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0010; mov_lge (Rm+,imm4),Rn
8216 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x2:D2:::mov_lge
8217 "mov_lge"
8218 *am33
8219 {
8220 int srcreg, dstreg;
8221
8222 PC = cia;
8223 srcreg = translate_rreg (SD_, RM);
8224 dstreg = translate_rreg (SD_, RN);
8225
8226 State.regs[dstreg] = load_word (State.regs[srcreg]);
8227 State.regs[srcreg] += EXTEND4 (IMM4);
8228
8229 if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
8230 {
8231 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8232 nia = PC;
8233 }
8234 }
8235
8236 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0011; mov_lle (Rm+,imm4),Rn
8237 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x3:D2:::mov_lle
8238 "mov_lle"
8239 *am33
8240 {
8241 int srcreg, dstreg;
8242
8243 PC = cia;
8244 srcreg = translate_rreg (SD_, RM);
8245 dstreg = translate_rreg (SD_, RN);
8246
8247 State.regs[dstreg] = load_word (State.regs[srcreg]);
8248 State.regs[srcreg] += EXTEND4 (IMM4);
8249
8250 if ((PSW & PSW_Z)
8251 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
8252 {
8253 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8254 nia = PC;
8255 }
8256 }
8257
8258 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0100; mov_lcs (Rm+,imm4),Rn
8259 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x4:D2:::mov_lcs
8260 "mov_lcs"
8261 *am33
8262 {
8263 int srcreg, dstreg;
8264
8265 PC = cia;
8266 srcreg = translate_rreg (SD_, RM);
8267 dstreg = translate_rreg (SD_, RN);
8268
8269 State.regs[dstreg] = load_word (State.regs[srcreg]);
8270 State.regs[srcreg] += EXTEND4 (IMM4);
8271
8272 if (PSW & PSW_C)
8273 {
8274 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8275 nia = PC;
8276 }
8277 }
8278
8279 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0101; mov_lhi (Rm+,imm4),Rn
8280 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x5:D2:::mov_lhi
8281 "mov_lhi"
8282 *am33
8283 {
8284 int srcreg, dstreg;
8285
8286 PC = cia;
8287 srcreg = translate_rreg (SD_, RM);
8288 dstreg = translate_rreg (SD_, RN);
8289
8290 State.regs[dstreg] = load_word (State.regs[srcreg]);
8291 State.regs[srcreg] += EXTEND4 (IMM4);
8292
8293 if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
8294 {
8295 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8296 nia = PC;
8297 }
8298 }
8299
8300 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0110; mov_lcc (Rm+,imm4),Rn
8301 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x6:D2:::mov_lcc
8302 "mov_lcc"
8303 *am33
8304 {
8305 int srcreg, dstreg;
8306
8307 PC = cia;
8308 srcreg = translate_rreg (SD_, RM);
8309 dstreg = translate_rreg (SD_, RN);
8310
8311 State.regs[dstreg] = load_word (State.regs[srcreg]);
8312 State.regs[srcreg] += EXTEND4 (IMM4);
8313
8314 if (!(PSW & PSW_C))
8315 {
8316 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8317 nia = PC;
8318 }
8319 }
8320
8321 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0111; mov_lls (Rm+,imm4),Rn
8322 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x7:D2:::mov_lls
8323 "mov_lls"
8324 *am33
8325 {
8326 int srcreg, dstreg;
8327
8328 PC = cia;
8329 srcreg = translate_rreg (SD_, RM);
8330 dstreg = translate_rreg (SD_, RN);
8331
8332 State.regs[dstreg] = load_word (State.regs[srcreg]);
8333 State.regs[srcreg] += EXTEND4 (IMM4);
8334
8335 if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
8336 {
8337 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8338 nia = PC;
8339 }
8340 }
8341
8342 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1000; mov_leq (Rm+,imm4),Rn
8343 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x8:D2:::mov_leq
8344 "mov_leq"
8345 *am33
8346 {
8347 int srcreg, dstreg;
8348
8349 PC = cia;
8350 srcreg = translate_rreg (SD_, RM);
8351 dstreg = translate_rreg (SD_, RN);
8352
8353 State.regs[dstreg] = load_word (State.regs[srcreg]);
8354 State.regs[srcreg] += EXTEND4 (IMM4);
8355
8356 if (PSW & PSW_Z)
8357 {
8358 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8359 nia = PC;
8360 }
8361 }
8362
8363 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1001; mov_lne (Rm+,imm4),Rn
8364 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x9:D2:::mov_lne
8365 "mov_lne"
8366 *am33
8367 {
8368 int srcreg, dstreg;
8369
8370 PC = cia;
8371 srcreg = translate_rreg (SD_, RM);
8372 dstreg = translate_rreg (SD_, RN);
8373
8374 State.regs[dstreg] = load_word (State.regs[srcreg]);
8375 State.regs[srcreg] += EXTEND4 (IMM4);
8376
8377 if (!(PSW & PSW_Z))
8378 {
8379 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8380 nia = PC;
8381 }
8382 }
8383
8384 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1010; mov_lra (Rm+,imm4),Rn
8385 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0xa:D2:::mov_lra
8386 "mov_lra"
8387 *am33
8388 {
8389 int srcreg, dstreg;
8390
8391 PC = cia;
8392 srcreg = translate_rreg (SD_, RM);
8393 dstreg = translate_rreg (SD_, RN);
8394
8395 State.regs[dstreg] = load_word (State.regs[srcreg]);
8396 State.regs[srcreg] += EXTEND4 (IMM4);
8397
8398 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8399 nia = PC;
8400 }
This page took 0.241543 seconds and 5 git commands to generate.