2 * $Id: sh4x86.c,v 1.2 2007-08-28 08:46:14 nkeynes Exp $
4 * SH4 => x86 translation. This version does no real optimization, it just
5 * outputs straight-line x86 code - it mainly exists to provide a baseline
6 * to test the optimizing versions against.
8 * Copyright (c) 2007 Nathan Keynes.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
26 * Emit an instruction to load an SH4 reg into a real register
28 static inline void load_reg( int x86reg, int sh4reg )
32 OP(0x45 + (x86reg<<3));
33 OP(REG_OFFSET(r[sh4reg]));
36 static inline void load_spreg( int x86reg, int regoffset )
40 OP(0x45 + (x86reg<<3));
45 * Emit an instruction to load an immediate value into a register
47 static inline void load_imm32( int x86reg, uint32_t value ) {
54 * Emit an instruction to store an SH4 reg (RN)
56 void static inline store_reg( int x86reg, int sh4reg ) {
59 OP(0x45 + (x86reg<<3));
60 OP(REG_OFFSET(r[sh4reg]));
62 void static inline store_spreg( int x86reg, int regoffset ) {
65 OP(0x45 + (x86reg<<3));
70 * Note: clobbers EAX to make the indirect call - this isn't usually
71 * a problem since the callee will usually clobber it anyway.
73 static inline void call_func0( void *ptr )
75 load_imm32(R_EAX, (uint32_t)ptr);
77 MODRM_rm32_r32(R_EAX, 2);
80 static inline void call_func1( void *ptr, int arg1 )
84 ADD_imm8s_r32( -4, R_ESP );
87 static inline void call_func2( void *ptr, int arg1, int arg2 )
92 ADD_imm8s_r32( -4, R_ESP );
96 #define MEM_RESULT(value_reg) if(value_reg != R_EAX) { MOV_r32_r32(R_EAX,value_reg); }
97 #define MEM_READ_BYTE( addr_reg, value_reg ) call_func1(sh4_read_byte, addr_reg ); MEM_RESULT(value_reg)
98 #define MEM_READ_WORD( addr_reg, value_reg ) call_func1(sh4_read_word, addr_reg ); MEM_RESULT(value_reg)
99 #define MEM_READ_LONG( addr_reg, value_reg ) call_func1(sh4_read_long, addr_reg ); MEM_RESULT(value_reg)
100 #define MEM_WRITE_BYTE( addr_reg, value_reg ) call_func2(sh4_write_byte, addr_reg, value_reg)
101 #define MEM_WRITE_WORD( addr_reg, value_reg ) call_func2(sh4_write_word, addr_reg, value_reg)
102 #define MEM_WRITE_LONG( addr_reg, value_reg ) call_func2(sh4_write_long, addr_reg, value_reg)
106 * Emit the 'start of block' assembly. Sets up the stack frame and save
109 void sh4_translate_begin_block() {
111 *xlat_output++ = 0x50 + R_EBP;
114 load_imm32( R_EBP, (uint32_t)&sh4r );
116 /* load carry from SR */
120 * Flush any open regs back to memory, restore SI/DI/, update PC, etc
122 void sh4_translate_end_block( sh4addr_t pc ) {
124 *xlat_output++ = 0x58 + R_EBP;
127 *xlat_output++ = 0xC3;
131 * Translate a single instruction. Delayed branches are handled specially
132 * by translating both branch and delayed instruction as a single unit (as
135 * @return true if the instruction marks the end of a basic block
138 uint32_t sh4_x86_translate_instruction( uint32_t pc )
140 uint16_t ir = sh4_read_word( pc );
142 switch( (ir&0xF000) >> 12 ) {
146 switch( (ir&0x80) >> 7 ) {
148 switch( (ir&0x70) >> 4 ) {
151 uint32_t Rn = ((ir>>8)&0xF);
157 uint32_t Rn = ((ir>>8)&0xF);
158 load_spreg( R_EAX, R_GBR );
159 store_reg( R_EAX, Rn );
164 uint32_t Rn = ((ir>>8)&0xF);
165 load_spreg( R_EAX, R_VBR );
166 store_reg( R_EAX, Rn );
171 uint32_t Rn = ((ir>>8)&0xF);
172 load_spreg( R_EAX, R_SSR );
173 store_reg( R_EAX, Rn );
178 uint32_t Rn = ((ir>>8)&0xF);
179 load_spreg( R_EAX, R_SPC );
180 store_reg( R_EAX, Rn );
189 { /* STC Rm_BANK, Rn */
190 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
197 switch( (ir&0xF0) >> 4 ) {
200 uint32_t Rn = ((ir>>8)&0xF);
205 uint32_t Rn = ((ir>>8)&0xF);
210 uint32_t Rn = ((ir>>8)&0xF);
215 uint32_t Rn = ((ir>>8)&0xF);
220 uint32_t Rn = ((ir>>8)&0xF);
225 uint32_t Rn = ((ir>>8)&0xF);
229 { /* MOVCA.L R0, @Rn */
230 uint32_t Rn = ((ir>>8)&0xF);
231 load_reg( R_EAX, 0 );
232 load_reg( R_ECX, Rn );
233 MEM_WRITE_LONG( R_ECX, R_EAX );
242 { /* MOV.B Rm, @(R0, Rn) */
243 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
244 load_reg( R_EAX, 0 );
245 load_reg( R_ECX, Rn );
246 ADD_r32_r32( R_EAX, R_ECX );
247 load_reg( R_EAX, Rm );
248 MEM_WRITE_BYTE( R_ECX, R_EAX );
252 { /* MOV.W Rm, @(R0, Rn) */
253 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
254 load_reg( R_EAX, 0 );
255 load_reg( R_ECX, Rn );
256 ADD_r32_r32( R_EAX, R_ECX );
257 load_reg( R_EAX, Rm );
258 MEM_WRITE_WORD( R_ECX, R_EAX );
262 { /* MOV.L Rm, @(R0, Rn) */
263 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
264 load_reg( R_EAX, 0 );
265 load_reg( R_ECX, Rn );
266 ADD_r32_r32( R_EAX, R_ECX );
267 load_reg( R_EAX, Rm );
268 MEM_WRITE_LONG( R_ECX, R_EAX );
273 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
274 load_reg( R_EAX, Rm );
275 load_reg( R_ECX, Rn );
277 store_spreg( R_EAX, R_MACL );
281 switch( (ir&0xFF0) >> 4 ) {
312 switch( (ir&0xF0) >> 4 ) {
315 /* Do nothing. Well, we could emit an 0x90, but what would really be the point? */
320 XOR_r32_r32( R_EAX, R_EAX );
321 store_spreg( R_EAX, R_Q );
322 store_spreg( R_EAX, R_M );
323 store_spreg( R_EAX, R_T );
328 uint32_t Rn = ((ir>>8)&0xF);
329 load_spreg( R_EAX, R_T );
330 store_reg( R_EAX, Rn );
339 switch( (ir&0xF0) >> 4 ) {
342 uint32_t Rn = ((ir>>8)&0xF);
343 load_spreg( R_EAX, R_MACH );
344 store_reg( R_EAX, Rn );
349 uint32_t Rn = ((ir>>8)&0xF);
350 load_spreg( R_EAX, R_MACL );
351 store_reg( R_EAX, Rn );
356 uint32_t Rn = ((ir>>8)&0xF);
357 load_spreg( R_EAX, R_PR );
358 store_reg( R_EAX, Rn );
363 uint32_t Rn = ((ir>>8)&0xF);
364 load_spreg( R_EAX, R_SGR );
365 store_reg( R_EAX, Rn );
370 uint32_t Rn = ((ir>>8)&0xF);
371 load_spreg( R_EAX, R_FPUL );
372 store_reg( R_EAX, Rn );
376 { /* STS FPSCR, Rn */
377 uint32_t Rn = ((ir>>8)&0xF);
378 load_spreg( R_EAX, R_FPSCR );
379 store_reg( R_EAX, Rn );
384 uint32_t Rn = ((ir>>8)&0xF);
385 load_spreg( R_EAX, R_DBR );
386 store_reg( R_EAX, Rn );
395 switch( (ir&0xFF0) >> 4 ) {
414 { /* MOV.B @(R0, Rm), Rn */
415 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
416 load_reg( R_EAX, 0 );
417 load_reg( R_ECX, Rm );
418 ADD_r32_r32( R_EAX, R_ECX );
419 MEM_READ_BYTE( R_ECX, R_EAX );
420 store_reg( R_EAX, Rn );
424 { /* MOV.W @(R0, Rm), Rn */
425 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
426 load_reg( R_EAX, 0 );
427 load_reg( R_ECX, Rm );
428 ADD_r32_r32( R_EAX, R_ECX );
429 MEM_READ_WORD( R_ECX, R_EAX );
430 store_reg( R_EAX, Rn );
434 { /* MOV.L @(R0, Rm), Rn */
435 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
436 load_reg( R_EAX, 0 );
437 load_reg( R_ECX, Rm );
438 ADD_r32_r32( R_EAX, R_ECX );
439 MEM_READ_LONG( R_ECX, R_EAX );
440 store_reg( R_EAX, Rn );
444 { /* MAC.L @Rm+, @Rn+ */
445 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
454 { /* MOV.L Rm, @(disp, Rn) */
455 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
456 load_reg( R_ECX, Rn );
457 load_reg( R_EAX, Rm );
458 ADD_imm32_r32( disp, R_ECX );
459 MEM_WRITE_LONG( R_ECX, R_EAX );
465 { /* MOV.B Rm, @Rn */
466 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
467 load_reg( R_EAX, Rm );
468 load_reg( R_ECX, Rn );
469 MEM_WRITE_BYTE( R_ECX, R_EAX );
473 { /* MOV.W Rm, @Rn */
474 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
475 load_reg( R_ECX, Rn );
476 MEM_READ_WORD( R_ECX, R_EAX );
477 store_reg( R_EAX, Rn );
481 { /* MOV.L Rm, @Rn */
482 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
483 load_reg( R_EAX, Rm );
484 load_reg( R_ECX, Rn );
485 MEM_WRITE_LONG( R_ECX, R_EAX );
489 { /* MOV.B Rm, @-Rn */
490 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
491 load_reg( R_EAX, Rm );
492 load_reg( R_ECX, Rn );
493 ADD_imm8s_r32( -1, Rn );
494 store_reg( R_ECX, Rn );
495 MEM_WRITE_BYTE( R_ECX, R_EAX );
499 { /* MOV.W Rm, @-Rn */
500 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
501 load_reg( R_ECX, Rn );
502 load_reg( R_EAX, Rm );
503 ADD_imm8s_r32( -2, R_ECX );
504 MEM_WRITE_WORD( R_ECX, R_EAX );
508 { /* MOV.L Rm, @-Rn */
509 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
510 load_reg( R_EAX, Rm );
511 load_reg( R_ECX, Rn );
512 ADD_imm8s_r32( -4, R_ECX );
513 store_reg( R_ECX, Rn );
514 MEM_WRITE_LONG( R_ECX, R_EAX );
519 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
520 load_reg( R_EAX, Rm );
521 load_reg( R_ECX, Rm );
522 SHR_imm8_r32( 31, R_EAX );
523 SHR_imm8_r32( 31, R_ECX );
524 store_spreg( R_EAX, R_M );
525 store_spreg( R_ECX, R_Q );
526 CMP_r32_r32( R_EAX, R_ECX );
532 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
533 load_reg( R_EAX, Rm );
534 load_reg( R_ECX, Rn );
535 TEST_r32_r32( R_EAX, R_ECX );
541 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
542 load_reg( R_EAX, Rm );
543 load_reg( R_ECX, Rn );
544 AND_r32_r32( R_EAX, R_ECX );
545 store_reg( R_ECX, Rn );
550 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
551 load_reg( R_EAX, Rm );
552 load_reg( R_ECX, Rn );
553 XOR_r32_r32( R_EAX, R_ECX );
554 store_reg( R_ECX, Rn );
559 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
560 load_reg( R_EAX, Rm );
561 load_reg( R_ECX, Rn );
562 OR_r32_r32( R_EAX, R_ECX );
563 store_reg( R_ECX, Rn );
567 { /* CMP/STR Rm, Rn */
568 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
573 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
574 load_reg( R_EAX, Rm );
575 MOV_r32_r32( R_EAX, R_ECX );
576 SHR_imm8_r32( 16, R_EAX );
577 SHL_imm8_r32( 16, R_ECX );
578 OR_r32_r32( R_EAX, R_ECX );
579 store_reg( R_ECX, Rn );
583 { /* MULU.W Rm, Rn */
584 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
588 { /* MULS.W Rm, Rn */
589 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
600 { /* CMP/EQ Rm, Rn */
601 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
602 load_reg( R_EAX, Rm );
603 load_reg( R_ECX, Rn );
604 CMP_r32_r32( R_EAX, R_ECX );
609 { /* CMP/HS Rm, Rn */
610 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
611 load_reg( R_EAX, Rm );
612 load_reg( R_ECX, Rn );
613 CMP_r32_r32( R_EAX, R_ECX );
618 { /* CMP/GE Rm, Rn */
619 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
620 load_reg( R_EAX, Rm );
621 load_reg( R_ECX, Rn );
622 CMP_r32_r32( R_EAX, R_ECX );
628 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
632 { /* DMULU.L Rm, Rn */
633 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
634 load_reg( R_EAX, Rm );
635 load_reg( R_ECX, Rn );
637 store_spreg( R_EDX, R_MACH );
638 store_spreg( R_EAX, R_MACL );
642 { /* CMP/HI Rm, Rn */
643 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
644 load_reg( R_EAX, Rm );
645 load_reg( R_ECX, Rn );
646 CMP_r32_r32( R_EAX, R_ECX );
651 { /* CMP/GT Rm, Rn */
652 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
653 load_reg( R_EAX, Rm );
654 load_reg( R_ECX, Rn );
655 CMP_r32_r32( R_EAX, R_ECX );
661 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
662 load_reg( R_EAX, Rm );
663 load_reg( R_ECX, Rn );
664 SUB_r32_r32( R_EAX, R_ECX );
665 store_reg( R_ECX, Rn );
670 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
671 load_reg( R_EAX, Rm );
672 load_reg( R_ECX, Rn );
674 SBB_r32_r32( R_EAX, R_ECX );
675 store_reg( R_ECX, Rn );
680 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
681 load_reg( R_EAX, Rm );
682 load_reg( R_ECX, Rn );
683 SUB_r32_r32( R_EAX, R_ECX );
684 store_reg( R_ECX, Rn );
690 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
691 load_reg( R_EAX, Rm );
692 load_reg( R_ECX, Rn );
693 ADD_r32_r32( R_EAX, R_ECX );
694 store_reg( R_ECX, Rn );
698 { /* DMULS.L Rm, Rn */
699 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
700 load_reg( R_EAX, Rm );
701 load_reg( R_ECX, Rn );
703 store_spreg( R_EDX, R_MACH );
704 store_spreg( R_EAX, R_MACL );
709 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
710 load_reg( R_EAX, Rm );
711 load_reg( R_ECX, Rn );
713 ADC_r32_r32( R_EAX, R_ECX );
714 store_reg( R_ECX, Rn );
720 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
721 load_reg( R_EAX, Rm );
722 load_reg( R_ECX, Rn );
723 ADD_r32_r32( R_EAX, R_ECX );
724 store_reg( R_ECX, Rn );
736 switch( (ir&0xF0) >> 4 ) {
739 uint32_t Rn = ((ir>>8)&0xF);
740 load_reg( R_EAX, Rn );
742 store_reg( R_EAX, Rn );
747 uint32_t Rn = ((ir>>8)&0xF);
748 load_reg( R_EAX, Rn );
749 ADD_imm8s_r32( -1, Rn );
750 store_reg( R_EAX, Rn );
756 uint32_t Rn = ((ir>>8)&0xF);
757 load_reg( R_EAX, Rn );
759 store_reg( R_EAX, Rn );
768 switch( (ir&0xF0) >> 4 ) {
771 uint32_t Rn = ((ir>>8)&0xF);
772 load_reg( R_EAX, Rn );
774 store_reg( R_EAX, Rn );
779 uint32_t Rn = ((ir>>8)&0xF);
780 load_reg( R_EAX, Rn );
781 CMP_imm8s_r32( 0, R_EAX );
787 uint32_t Rn = ((ir>>8)&0xF);
788 load_reg( R_EAX, Rn );
790 store_reg( R_EAX, Rn );
799 switch( (ir&0xF0) >> 4 ) {
801 { /* STS.L MACH, @-Rn */
802 uint32_t Rn = ((ir>>8)&0xF);
803 load_reg( R_ECX, Rn );
804 ADD_imm8s_r32( -4, Rn );
805 store_reg( R_ECX, Rn );
806 load_spreg( R_EAX, R_MACH );
807 MEM_WRITE_LONG( R_ECX, R_EAX );
811 { /* STS.L MACL, @-Rn */
812 uint32_t Rn = ((ir>>8)&0xF);
813 load_reg( R_ECX, Rn );
814 ADD_imm8s_r32( -4, Rn );
815 store_reg( R_ECX, Rn );
816 load_spreg( R_EAX, R_MACL );
817 MEM_WRITE_LONG( R_ECX, R_EAX );
821 { /* STS.L PR, @-Rn */
822 uint32_t Rn = ((ir>>8)&0xF);
823 load_reg( R_ECX, Rn );
824 ADD_imm8s_r32( -4, Rn );
825 store_reg( R_ECX, Rn );
826 load_spreg( R_EAX, R_PR );
827 MEM_WRITE_LONG( R_ECX, R_EAX );
831 { /* STC.L SGR, @-Rn */
832 uint32_t Rn = ((ir>>8)&0xF);
833 load_reg( R_ECX, Rn );
834 ADD_imm8s_r32( -4, Rn );
835 store_reg( R_ECX, Rn );
836 load_spreg( R_EAX, R_SGR );
837 MEM_WRITE_LONG( R_ECX, R_EAX );
841 { /* STS.L FPUL, @-Rn */
842 uint32_t Rn = ((ir>>8)&0xF);
843 load_reg( R_ECX, Rn );
844 ADD_imm8s_r32( -4, Rn );
845 store_reg( R_ECX, Rn );
846 load_spreg( R_EAX, R_FPUL );
847 MEM_WRITE_LONG( R_ECX, R_EAX );
851 { /* STS.L FPSCR, @-Rn */
852 uint32_t Rn = ((ir>>8)&0xF);
853 load_reg( R_ECX, Rn );
854 ADD_imm8s_r32( -4, Rn );
855 store_reg( R_ECX, Rn );
856 load_spreg( R_EAX, R_FPSCR );
857 MEM_WRITE_LONG( R_ECX, R_EAX );
861 { /* STC.L DBR, @-Rn */
862 uint32_t Rn = ((ir>>8)&0xF);
863 load_reg( R_ECX, Rn );
864 ADD_imm8s_r32( -4, Rn );
865 store_reg( R_ECX, Rn );
866 load_spreg( R_EAX, R_DBR );
867 MEM_WRITE_LONG( R_ECX, R_EAX );
876 switch( (ir&0x80) >> 7 ) {
878 switch( (ir&0x70) >> 4 ) {
880 { /* STC.L SR, @-Rn */
881 uint32_t Rn = ((ir>>8)&0xF);
886 { /* STC.L GBR, @-Rn */
887 uint32_t Rn = ((ir>>8)&0xF);
888 load_reg( R_ECX, Rn );
889 ADD_imm8s_r32( -4, Rn );
890 store_reg( R_ECX, Rn );
891 load_spreg( R_EAX, R_GBR );
892 MEM_WRITE_LONG( R_ECX, R_EAX );
896 { /* STC.L VBR, @-Rn */
897 uint32_t Rn = ((ir>>8)&0xF);
898 load_reg( R_ECX, Rn );
899 ADD_imm8s_r32( -4, Rn );
900 store_reg( R_ECX, Rn );
901 load_spreg( R_EAX, R_VBR );
902 MEM_WRITE_LONG( R_ECX, R_EAX );
906 { /* STC.L SSR, @-Rn */
907 uint32_t Rn = ((ir>>8)&0xF);
908 load_reg( R_ECX, Rn );
909 ADD_imm8s_r32( -4, Rn );
910 store_reg( R_ECX, Rn );
911 load_spreg( R_EAX, R_SSR );
912 MEM_WRITE_LONG( R_ECX, R_EAX );
916 { /* STC.L SPC, @-Rn */
917 uint32_t Rn = ((ir>>8)&0xF);
918 load_reg( R_ECX, Rn );
919 ADD_imm8s_r32( -4, Rn );
920 store_reg( R_ECX, Rn );
921 load_spreg( R_EAX, R_SPC );
922 MEM_WRITE_LONG( R_ECX, R_EAX );
931 { /* STC.L Rm_BANK, @-Rn */
932 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);
938 switch( (ir&0xF0) >> 4 ) {
941 uint32_t Rn = ((ir>>8)&0xF);
942 load_reg( R_EAX, Rn );
944 store_reg( R_EAX, Rn );
950 uint32_t Rn = ((ir>>8)&0xF);
951 load_reg( R_EAX, Rn );
954 store_reg( R_EAX, Rn );
964 switch( (ir&0xF0) >> 4 ) {
967 uint32_t Rn = ((ir>>8)&0xF);
968 load_reg( R_EAX, Rn );
970 store_reg( R_EAX, Rn );
976 uint32_t Rn = ((ir>>8)&0xF);
977 load_reg( R_EAX, Rn );
978 CMP_imm8s_r32( 0, R_EAX );
984 uint32_t Rn = ((ir>>8)&0xF);
985 load_reg( R_EAX, Rn );
988 store_reg( R_EAX, Rn );
998 switch( (ir&0xF0) >> 4 ) {
1000 { /* LDS.L @Rm+, MACH */
1001 uint32_t Rm = ((ir>>8)&0xF);
1002 load_reg( R_EAX, Rm );
1003 MOV_r32_r32( R_EAX, R_ECX );
1004 ADD_imm8s_r32( 4, R_EAX );
1005 store_reg( R_EAX, Rm );
1006 MEM_READ_LONG( R_ECX, R_EAX );
1007 store_spreg( R_EAX, R_MACH );
1011 { /* LDS.L @Rm+, MACL */
1012 uint32_t Rm = ((ir>>8)&0xF);
1013 load_reg( R_EAX, Rm );
1014 MOV_r32_r32( R_EAX, R_ECX );
1015 ADD_imm8s_r32( 4, R_EAX );
1016 store_reg( R_EAX, Rm );
1017 MEM_READ_LONG( R_ECX, R_EAX );
1018 store_spreg( R_EAX, R_MACL );
1022 { /* LDS.L @Rm+, PR */
1023 uint32_t Rm = ((ir>>8)&0xF);
1024 load_reg( R_EAX, Rm );
1025 MOV_r32_r32( R_EAX, R_ECX );
1026 ADD_imm8s_r32( 4, R_EAX );
1027 store_reg( R_EAX, Rm );
1028 MEM_READ_LONG( R_ECX, R_EAX );
1029 store_spreg( R_EAX, R_PR );
1033 { /* LDC.L @Rm+, SGR */
1034 uint32_t Rm = ((ir>>8)&0xF);
1035 load_reg( R_EAX, Rm );
1036 MOV_r32_r32( R_EAX, R_ECX );
1037 ADD_imm8s_r32( 4, R_EAX );
1038 store_reg( R_EAX, Rm );
1039 MEM_READ_LONG( R_ECX, R_EAX );
1040 store_spreg( R_EAX, R_SGR );
1044 { /* LDS.L @Rm+, FPUL */
1045 uint32_t Rm = ((ir>>8)&0xF);
1046 load_reg( R_EAX, Rm );
1047 MOV_r32_r32( R_EAX, R_ECX );
1048 ADD_imm8s_r32( 4, R_EAX );
1049 store_reg( R_EAX, Rm );
1050 MEM_READ_LONG( R_ECX, R_EAX );
1051 store_spreg( R_EAX, R_FPUL );
1055 { /* LDS.L @Rm+, FPSCR */
1056 uint32_t Rm = ((ir>>8)&0xF);
1057 load_reg( R_EAX, Rm );
1058 MOV_r32_r32( R_EAX, R_ECX );
1059 ADD_imm8s_r32( 4, R_EAX );
1060 store_reg( R_EAX, Rm );
1061 MEM_READ_LONG( R_ECX, R_EAX );
1062 store_spreg( R_EAX, R_FPSCR );
1066 { /* LDC.L @Rm+, DBR */
1067 uint32_t Rm = ((ir>>8)&0xF);
1068 load_reg( R_EAX, Rm );
1069 MOV_r32_r32( R_EAX, R_ECX );
1070 ADD_imm8s_r32( 4, R_EAX );
1071 store_reg( R_EAX, Rm );
1072 MEM_READ_LONG( R_ECX, R_EAX );
1073 store_spreg( R_EAX, R_DBR );
1082 switch( (ir&0x80) >> 7 ) {
1084 switch( (ir&0x70) >> 4 ) {
1086 { /* LDC.L @Rm+, SR */
1087 uint32_t Rm = ((ir>>8)&0xF);
1091 { /* LDC.L @Rm+, GBR */
1092 uint32_t Rm = ((ir>>8)&0xF);
1093 load_reg( R_EAX, Rm );
1094 MOV_r32_r32( R_EAX, R_ECX );
1095 ADD_imm8s_r32( 4, R_EAX );
1096 store_reg( R_EAX, Rm );
1097 MEM_READ_LONG( R_ECX, R_EAX );
1098 store_spreg( R_EAX, R_GBR );
1102 { /* LDC.L @Rm+, VBR */
1103 uint32_t Rm = ((ir>>8)&0xF);
1104 load_reg( R_EAX, Rm );
1105 MOV_r32_r32( R_EAX, R_ECX );
1106 ADD_imm8s_r32( 4, R_EAX );
1107 store_reg( R_EAX, Rm );
1108 MEM_READ_LONG( R_ECX, R_EAX );
1109 store_spreg( R_EAX, R_VBR );
1113 { /* LDC.L @Rm+, SSR */
1114 uint32_t Rm = ((ir>>8)&0xF);
1115 load_reg( R_EAX, Rm );
1116 MOV_r32_r32( R_EAX, R_ECX );
1117 ADD_imm8s_r32( 4, R_EAX );
1118 store_reg( R_EAX, Rm );
1119 MEM_READ_LONG( R_ECX, R_EAX );
1120 store_spreg( R_EAX, R_SSR );
1124 { /* LDC.L @Rm+, SPC */
1125 uint32_t Rm = ((ir>>8)&0xF);
1126 load_reg( R_EAX, Rm );
1127 MOV_r32_r32( R_EAX, R_ECX );
1128 ADD_imm8s_r32( 4, R_EAX );
1129 store_reg( R_EAX, Rm );
1130 MEM_READ_LONG( R_ECX, R_EAX );
1131 store_spreg( R_EAX, R_SPC );
1140 { /* LDC.L @Rm+, Rn_BANK */
1141 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
1147 switch( (ir&0xF0) >> 4 ) {
1150 uint32_t Rn = ((ir>>8)&0xF);
1151 load_reg( R_EAX, Rn );
1152 SHL_imm8_r32( 2, R_EAX );
1153 store_reg( R_EAX, Rn );
1158 uint32_t Rn = ((ir>>8)&0xF);
1159 load_reg( R_EAX, Rn );
1160 SHL_imm8_r32( 8, R_EAX );
1161 store_reg( R_EAX, Rn );
1166 uint32_t Rn = ((ir>>8)&0xF);
1167 load_reg( R_EAX, Rn );
1168 SHL_imm8_r32( 16, R_EAX );
1169 store_reg( R_EAX, Rn );
1178 switch( (ir&0xF0) >> 4 ) {
1181 uint32_t Rn = ((ir>>8)&0xF);
1182 load_reg( R_EAX, Rn );
1183 SHR_imm8_r32( 2, R_EAX );
1184 store_reg( R_EAX, Rn );
1189 uint32_t Rn = ((ir>>8)&0xF);
1190 load_reg( R_EAX, Rn );
1191 SHR_imm8_r32( 8, R_EAX );
1192 store_reg( R_EAX, Rn );
1197 uint32_t Rn = ((ir>>8)&0xF);
1198 load_reg( R_EAX, Rn );
1199 SHR_imm8_r32( 16, R_EAX );
1200 store_reg( R_EAX, Rn );
1209 switch( (ir&0xF0) >> 4 ) {
1211 { /* LDS Rm, MACH */
1212 uint32_t Rm = ((ir>>8)&0xF);
1213 load_reg( R_EAX, Rm );
1214 store_spreg( R_EAX, R_MACH );
1218 { /* LDS Rm, MACL */
1219 uint32_t Rm = ((ir>>8)&0xF);
1220 load_reg( R_EAX, Rm );
1221 store_spreg( R_EAX, R_MACL );
1226 uint32_t Rm = ((ir>>8)&0xF);
1227 load_reg( R_EAX, Rm );
1228 store_spreg( R_EAX, R_PR );
1233 uint32_t Rm = ((ir>>8)&0xF);
1234 load_reg( R_EAX, Rm );
1235 store_spreg( R_EAX, R_SGR );
1239 { /* LDS Rm, FPUL */
1240 uint32_t Rm = ((ir>>8)&0xF);
1241 load_reg( R_EAX, Rm );
1242 store_spreg( R_EAX, R_FPUL );
1246 { /* LDS Rm, FPSCR */
1247 uint32_t Rm = ((ir>>8)&0xF);
1248 load_reg( R_EAX, Rm );
1249 store_spreg( R_EAX, R_FPSCR );
1254 uint32_t Rm = ((ir>>8)&0xF);
1255 load_reg( R_EAX, Rm );
1256 store_spreg( R_EAX, R_DBR );
1265 switch( (ir&0xF0) >> 4 ) {
1268 uint32_t Rn = ((ir>>8)&0xF);
1273 uint32_t Rn = ((ir>>8)&0xF);
1274 load_reg( R_ECX, Rn );
1275 MEM_READ_BYTE( R_ECX, R_EAX );
1276 TEST_r8_r8( R_AL, R_AL );
1278 OR_imm8_r8( 0x80, R_AL );
1279 MEM_WRITE_BYTE( R_ECX, R_EAX );
1284 uint32_t Rn = ((ir>>8)&0xF);
1294 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1295 /* Annoyingly enough, not directly convertible */
1296 load_reg( R_EAX, Rn );
1297 load_reg( R_ECX, Rm );
1298 CMP_imm32_r32( 0, R_ECX );
1301 NEG_r32( R_ECX ); // 2
1302 AND_imm8_r8( 0x1F, R_CL ); // 3
1303 SAR_r32_CL( R_EAX ); // 2
1306 AND_imm8_r8( 0x1F, R_CL ); // 3
1307 SHL_r32_CL( R_EAX ); // 2
1309 store_reg( R_EAX, Rn );
1314 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1318 switch( (ir&0x80) >> 7 ) {
1320 switch( (ir&0x70) >> 4 ) {
1323 uint32_t Rm = ((ir>>8)&0xF);
1324 /* We need to be a little careful about SR */
1329 uint32_t Rm = ((ir>>8)&0xF);
1330 load_reg( R_EAX, Rm );
1331 store_spreg( R_EAX, R_GBR );
1336 uint32_t Rm = ((ir>>8)&0xF);
1337 load_reg( R_EAX, Rm );
1338 store_spreg( R_EAX, R_VBR );
1343 uint32_t Rm = ((ir>>8)&0xF);
1344 load_reg( R_EAX, Rm );
1345 store_spreg( R_EAX, R_SSR );
1350 uint32_t Rm = ((ir>>8)&0xF);
1351 load_reg( R_EAX, Rm );
1352 store_spreg( R_EAX, R_SPC );
1361 { /* LDC Rm, Rn_BANK */
1362 uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);
1368 { /* MAC.W @Rm+, @Rn+ */
1369 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1375 { /* MOV.L @(disp, Rm), Rn */
1376 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;
1377 load_reg( R_ECX, Rm );
1378 ADD_imm8s_r32( disp, R_ECX );
1379 MEM_READ_LONG( R_ECX, R_EAX );
1380 store_reg( R_EAX, Rn );
1386 { /* MOV.B @Rm, Rn */
1387 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1388 load_reg( R_ECX, Rm );
1389 MEM_READ_BYTE( R_ECX, R_EAX );
1390 store_reg( R_ECX, Rn );
1394 { /* MOV.W @Rm, Rn */
1395 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1396 load_reg( R_ECX, Rm );
1397 MEM_READ_WORD( R_ECX, R_EAX );
1398 store_reg( R_EAX, Rn );
1402 { /* MOV.L @Rm, Rn */
1403 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1404 load_reg( R_ECX, Rm );
1405 MEM_READ_LONG( R_ECX, R_EAX );
1406 store_reg( R_EAX, Rn );
1411 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1412 load_reg( R_EAX, Rm );
1413 store_reg( R_EAX, Rn );
1417 { /* MOV.B @Rm+, Rn */
1418 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1419 load_reg( R_ECX, Rm );
1420 MOV_r32_r32( R_ECX, R_EAX );
1421 ADD_imm8s_r32( 1, R_EAX );
1422 store_reg( R_EAX, Rm );
1423 MEM_READ_BYTE( R_ECX, R_EAX );
1424 store_reg( R_EAX, Rn );
1428 { /* MOV.W @Rm+, Rn */
1429 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1430 load_reg( R_EAX, Rm );
1431 MOV_r32_r32( R_EAX, R_ECX );
1432 ADD_imm8s_r32( 2, R_EAX );
1433 store_reg( R_EAX, Rm );
1434 MEM_READ_WORD( R_ECX, R_EAX );
1435 store_reg( R_EAX, Rn );
1439 { /* MOV.L @Rm+, Rn */
1440 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1441 load_reg( R_EAX, Rm );
1442 MOV_r32_r32( R_EAX, R_ECX );
1443 ADD_imm8s_r32( 4, R_EAX );
1444 store_reg( R_EAX, Rm );
1445 MEM_READ_LONG( R_ECX, R_EAX );
1446 store_reg( R_EAX, Rn );
1451 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1452 load_reg( R_EAX, Rm );
1454 store_reg( R_EAX, Rn );
1458 { /* SWAP.B Rm, Rn */
1459 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1460 load_reg( R_EAX, Rm );
1461 XCHG_r8_r8( R_AL, R_AH );
1462 store_reg( R_EAX, Rn );
1466 { /* SWAP.W Rm, Rn */
1467 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1468 load_reg( R_EAX, Rm );
1469 MOV_r32_r32( R_EAX, R_ECX );
1470 SHL_imm8_r32( 16, R_ECX );
1471 SHR_imm8_r32( 16, R_EAX );
1472 OR_r32_r32( R_EAX, R_ECX );
1473 store_reg( R_ECX, Rn );
1478 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1479 load_reg( R_EAX, Rm );
1480 XOR_r32_r32( R_ECX, R_ECX );
1482 SBB_r32_r32( R_EAX, R_ECX );
1483 store_reg( R_ECX, Rn );
1489 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1490 load_reg( R_EAX, Rm );
1492 store_reg( R_EAX, Rn );
1496 { /* EXTU.B Rm, Rn */
1497 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1498 load_reg( R_EAX, Rm );
1499 MOVZX_r8_r32( R_EAX, R_EAX );
1500 store_reg( R_EAX, Rn );
1504 { /* EXTU.W Rm, Rn */
1505 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1506 load_reg( R_EAX, Rm );
1507 MOVZX_r16_r32( R_EAX, R_EAX );
1508 store_reg( R_EAX, Rn );
1512 { /* EXTS.B Rm, Rn */
1513 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1514 load_reg( R_EAX, Rm );
1515 MOVSX_r8_r32( R_EAX, R_EAX );
1516 store_reg( R_EAX, Rn );
1520 { /* EXTS.W Rm, Rn */
1521 uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1522 load_reg( R_EAX, Rm );
1523 MOVSX_r16_r32( R_EAX, R_EAX );
1524 store_reg( R_EAX, Rn );
1530 { /* ADD #imm, Rn */
1531 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1532 load_reg( R_EAX, Rn );
1533 ADD_imm8s_r32( imm, R_EAX );
1534 store_reg( R_EAX, Rn );
1538 switch( (ir&0xF00) >> 8 ) {
1540 { /* MOV.B R0, @(disp, Rn) */
1541 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1542 load_reg( R_EAX, 0 );
1543 load_reg( R_ECX, Rn );
1544 ADD_imm32_r32( disp, R_ECX );
1545 MEM_WRITE_BYTE( R_ECX, R_EAX );
1549 { /* MOV.W R0, @(disp, Rn) */
1550 uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1551 load_reg( R_ECX, Rn );
1552 load_reg( R_EAX, 0 );
1553 ADD_imm32_r32( disp, R_ECX );
1554 MEM_WRITE_WORD( R_ECX, R_EAX );
1558 { /* MOV.B @(disp, Rm), R0 */
1559 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);
1560 load_reg( R_ECX, Rm );
1561 ADD_imm32_r32( disp, R_ECX );
1562 MEM_READ_BYTE( R_ECX, R_EAX );
1563 store_reg( R_EAX, 0 );
1567 { /* MOV.W @(disp, Rm), R0 */
1568 uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;
1569 load_reg( R_ECX, Rm );
1570 ADD_imm32_r32( disp, R_ECX );
1571 MEM_READ_WORD( R_ECX, R_EAX );
1572 store_reg( R_EAX, 0 );
1576 { /* CMP/EQ #imm, R0 */
1577 int32_t imm = SIGNEXT8(ir&0xFF);
1578 load_reg( R_EAX, 0 );
1579 CMP_imm8s_r32(imm, R_EAX);
1585 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1586 /* If true, result PC += 4 + disp. else result PC = pc+2 */
1592 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1597 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1603 int32_t disp = SIGNEXT8(ir&0xFF)<<1;
1612 { /* MOV.W @(disp, PC), Rn */
1613 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;
1614 load_imm32( R_ECX, pc + disp + 4 );
1615 MEM_READ_WORD( R_ECX, R_EAX );
1616 store_reg( R_EAX, Rn );
1621 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1626 int32_t disp = SIGNEXT12(ir&0xFFF)<<1;
1630 switch( (ir&0xF00) >> 8 ) {
1632 { /* MOV.B R0, @(disp, GBR) */
1633 uint32_t disp = (ir&0xFF);
1634 load_reg( R_EAX, 0 );
1635 load_spreg( R_ECX, R_GBR );
1636 ADD_imm32_r32( disp, R_ECX );
1637 MEM_WRITE_BYTE( R_ECX, R_EAX );
1641 { /* MOV.W R0, @(disp, GBR) */
1642 uint32_t disp = (ir&0xFF)<<1;
1643 load_spreg( R_ECX, R_GBR );
1644 load_reg( R_EAX, 0 );
1645 ADD_imm32_r32( disp, R_ECX );
1646 MEM_WRITE_WORD( R_ECX, R_EAX );
1650 { /* MOV.L R0, @(disp, GBR) */
1651 uint32_t disp = (ir&0xFF)<<2;
1652 load_spreg( R_ECX, R_GBR );
1653 load_reg( R_EAX, 0 );
1654 ADD_imm32_r32( disp, R_ECX );
1655 MEM_WRITE_LONG( R_ECX, R_EAX );
1660 uint32_t imm = (ir&0xFF);
1664 { /* MOV.B @(disp, GBR), R0 */
1665 uint32_t disp = (ir&0xFF);
1666 load_spreg( R_ECX, R_GBR );
1667 ADD_imm32_r32( disp, R_ECX );
1668 MEM_READ_BYTE( R_ECX, R_EAX );
1669 store_reg( R_EAX, 0 );
1673 { /* MOV.W @(disp, GBR), R0 */
1674 uint32_t disp = (ir&0xFF)<<1;
1675 load_spreg( R_ECX, R_GBR );
1676 ADD_imm32_r32( disp, R_ECX );
1677 MEM_READ_WORD( R_ECX, R_EAX );
1678 store_reg( R_EAX, 0 );
1682 { /* MOV.L @(disp, GBR), R0 */
1683 uint32_t disp = (ir&0xFF)<<2;
1684 load_spreg( R_ECX, R_GBR );
1685 ADD_imm32_r32( disp, R_ECX );
1686 MEM_READ_LONG( R_ECX, R_EAX );
1687 store_reg( R_EAX, 0 );
1691 { /* MOVA @(disp, PC), R0 */
1692 uint32_t disp = (ir&0xFF)<<2;
1693 load_imm32( R_ECX, (pc & 0xFFFFFFFC) + disp + 4 );
1694 store_reg( R_ECX, 0 );
1698 { /* TST #imm, R0 */
1699 uint32_t imm = (ir&0xFF);
1703 { /* AND #imm, R0 */
1704 uint32_t imm = (ir&0xFF);
1705 load_reg( R_EAX, 0 );
1706 AND_imm32_r32(imm, R_EAX);
1707 store_reg( R_EAX, 0 );
1711 { /* XOR #imm, R0 */
1712 uint32_t imm = (ir&0xFF);
1713 load_reg( R_EAX, 0 );
1714 XOR_imm32_r32( imm, R_EAX );
1715 store_reg( R_EAX, 0 );
1720 uint32_t imm = (ir&0xFF);
1721 load_reg( R_EAX, 0 );
1722 OR_imm32_r32(imm, R_EAX);
1723 store_reg( R_EAX, 0 );
1727 { /* TST.B #imm, @(R0, GBR) */
1728 uint32_t imm = (ir&0xFF);
1732 { /* AND.B #imm, @(R0, GBR) */
1733 uint32_t imm = (ir&0xFF);
1734 load_reg( R_EAX, 0 );
1735 load_spreg( R_ECX, R_GBR );
1736 ADD_r32_r32( R_EAX, R_EBX );
1737 MEM_READ_BYTE( R_ECX, R_EAX );
1738 AND_imm32_r32(imm, R_ECX );
1739 MEM_WRITE_BYTE( R_ECX, R_EAX );
1743 { /* XOR.B #imm, @(R0, GBR) */
1744 uint32_t imm = (ir&0xFF);
1745 load_reg( R_EAX, 0 );
1746 load_spreg( R_ECX, R_GBR );
1747 ADD_r32_r32( R_EAX, R_ECX );
1748 MEM_READ_BYTE( R_ECX, R_EAX );
1749 XOR_imm32_r32( imm, R_EAX );
1750 MEM_WRITE_BYTE( R_ECX, R_EAX );
1754 { /* OR.B #imm, @(R0, GBR) */
1755 uint32_t imm = (ir&0xFF);
1761 { /* MOV.L @(disp, PC), Rn */
1762 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;
1763 load_imm32( R_ECX, (pc & 0xFFFFFFFC) + disp + 4 );
1764 MEM_READ_LONG( R_ECX, R_EAX );
1765 store_reg( R_EAX, 0 );
1769 { /* MOV #imm, Rn */
1770 uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);
1771 load_imm32( R_EAX, imm );
1772 store_reg( R_EAX, Rn );
1778 { /* FADD FRm, FRn */
1779 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1783 { /* FSUB FRm, FRn */
1784 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1788 { /* FMUL FRm, FRn */
1789 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1793 { /* FDIV FRm, FRn */
1794 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1798 { /* FCMP/EQ FRm, FRn */
1799 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1803 { /* FCMP/GT FRm, FRn */
1804 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1808 { /* FMOV @(R0, Rm), FRn */
1809 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1813 { /* FMOV FRm, @(R0, Rn) */
1814 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1818 { /* FMOV @Rm, FRn */
1819 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1823 { /* FMOV @Rm+, FRn */
1824 uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);
1828 { /* FMOV FRm, @Rn */
1829 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1833 { /* FMOV FRm, @-Rn */
1834 uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1838 { /* FMOV FRm, FRn */
1839 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
1843 switch( (ir&0xF0) >> 4 ) {
1845 { /* FSTS FPUL, FRn */
1846 uint32_t FRn = ((ir>>8)&0xF);
1850 { /* FLDS FRm, FPUL */
1851 uint32_t FRm = ((ir>>8)&0xF);
1855 { /* FLOAT FPUL, FRn */
1856 uint32_t FRn = ((ir>>8)&0xF);
1860 { /* FTRC FRm, FPUL */
1861 uint32_t FRm = ((ir>>8)&0xF);
1866 uint32_t FRn = ((ir>>8)&0xF);
1871 uint32_t FRn = ((ir>>8)&0xF);
1876 uint32_t FRn = ((ir>>8)&0xF);
1881 uint32_t FRn = ((ir>>8)&0xF);
1886 uint32_t FRn = ((ir>>8)&0xF);
1891 uint32_t FRn = ((ir>>8)&0xF);
1895 { /* FCNVSD FPUL, FRn */
1896 uint32_t FRn = ((ir>>8)&0xF);
1900 { /* FCNVDS FRm, FPUL */
1901 uint32_t FRm = ((ir>>8)&0xF);
1905 { /* FIPR FVm, FVn */
1906 uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3);
1910 switch( (ir&0x100) >> 8 ) {
1912 { /* FSCA FPUL, FRn */
1913 uint32_t FRn = ((ir>>9)&0x7)<<1;
1917 switch( (ir&0x200) >> 9 ) {
1919 { /* FTRV XMTRX, FVn */
1920 uint32_t FVn = ((ir>>10)&0x3);
1924 switch( (ir&0xC00) >> 10 ) {
1952 { /* FMAC FR0, FRm, FRn */
1953 uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);
.