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