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.
30 #include "sh4/xltcache.h"
31 #include "sh4/sh4core.h"
32 #include "sh4/sh4trans.h"
33 #include "sh4/sh4stat.h"
34 #include "sh4/sh4mmio.h"
35 #include "sh4/x86op.h"
38 #define DEFAULT_BACKPATCH_SIZE 4096
40 struct backpatch_record {
41 uint32_t fixup_offset;
42 uint32_t fixup_icount;
51 * Struct to manage internal translation state. This state is not saved -
52 * it is only valid between calls to sh4_translate_begin_block() and
53 * sh4_translate_end_block()
55 struct sh4_x86_state {
57 gboolean priv_checked; /* true if we've already checked the cpu mode. */
58 gboolean fpuen_checked; /* true if we've already checked fpu enabled. */
59 gboolean branch_taken; /* true if we branched unconditionally */
60 gboolean double_prec; /* true if FPU is in double-precision mode */
61 gboolean double_size; /* true if FPU is in double-size mode */
62 gboolean sse3_enabled; /* true if host supports SSE3 instructions */
63 uint32_t block_start_pc;
64 uint32_t stack_posn; /* Trace stack height for alignment purposes */
68 gboolean tlb_on; /* True if tlb translation is active */
70 /* Allocated memory for the (block-wide) back-patch list */
71 struct backpatch_record *backpatch_list;
72 uint32_t backpatch_posn;
73 uint32_t backpatch_size;
76 #define TSTATE_NONE -1
86 #ifdef ENABLE_SH4STATS
87 #define COUNT_INST(id) load_imm32(R_EAX,id); call_func1(sh4_stats_add, R_EAX); sh4_x86.tstate = TSTATE_NONE
89 #define COUNT_INST(id)
92 /** Branch if T is set (either in the current cflags, or in sh4r.t) */
93 #define JT_rel8(label) if( sh4_x86.tstate == TSTATE_NONE ) { \
94 CMP_imm8s_sh4r( 1, R_T ); sh4_x86.tstate = TSTATE_E; } \
95 OP(0x70+sh4_x86.tstate); MARK_JMP8(label); OP(-1)
97 /** Branch if T is clear (either in the current cflags or in sh4r.t) */
98 #define JF_rel8(label) if( sh4_x86.tstate == TSTATE_NONE ) { \
99 CMP_imm8s_sh4r( 1, R_T ); sh4_x86.tstate = TSTATE_E; } \
100 OP(0x70+ (sh4_x86.tstate^1)); MARK_JMP8(label); OP(-1)
102 static struct sh4_x86_state sh4_x86;
104 static uint32_t max_int = 0x7FFFFFFF;
105 static uint32_t min_int = 0x80000000;
106 static uint32_t save_fcw; /* save value for fpu control word */
107 static uint32_t trunc_fcw = 0x0F7F; /* fcw value for truncation mode */
109 gboolean is_sse3_supported()
113 __asm__ __volatile__(
114 "mov $0x01, %%eax\n\t"
115 "cpuid\n\t" : "=c" (features) : : "eax", "edx", "ebx");
116 return (features & 1) ? TRUE : FALSE;
119 void sh4_translate_init(void)
121 sh4_x86.backpatch_list = malloc(DEFAULT_BACKPATCH_SIZE);
122 sh4_x86.backpatch_size = DEFAULT_BACKPATCH_SIZE / sizeof(struct backpatch_record);
123 sh4_x86.sse3_enabled = is_sse3_supported();
127 static void sh4_x86_add_backpatch( uint8_t *fixup_addr, uint32_t fixup_pc, uint32_t exc_code )
129 if( sh4_x86.backpatch_posn == sh4_x86.backpatch_size ) {
130 sh4_x86.backpatch_size <<= 1;
131 sh4_x86.backpatch_list = realloc( sh4_x86.backpatch_list,
132 sh4_x86.backpatch_size * sizeof(struct backpatch_record));
133 assert( sh4_x86.backpatch_list != NULL );
135 if( sh4_x86.in_delay_slot ) {
138 sh4_x86.backpatch_list[sh4_x86.backpatch_posn].fixup_offset =
139 ((uint8_t *)fixup_addr) - ((uint8_t *)xlat_current_block->code);
140 sh4_x86.backpatch_list[sh4_x86.backpatch_posn].fixup_icount = (fixup_pc - sh4_x86.block_start_pc)>>1;
141 sh4_x86.backpatch_list[sh4_x86.backpatch_posn].exc_code = exc_code;
142 sh4_x86.backpatch_posn++;
146 * Emit an instruction to load an SH4 reg into a real register
148 static inline void load_reg( int x86reg, int sh4reg )
150 /* mov [bp+n], reg */
152 OP(0x45 + (x86reg<<3));
153 OP(REG_OFFSET(r[sh4reg]));
156 static inline void load_reg16s( int x86reg, int sh4reg )
160 MODRM_r32_sh4r(x86reg, REG_OFFSET(r[sh4reg]));
163 static inline void load_reg16u( int x86reg, int sh4reg )
167 MODRM_r32_sh4r(x86reg, REG_OFFSET(r[sh4reg]));
171 #define load_spreg( x86reg, regoff ) MOV_sh4r_r32( regoff, x86reg )
172 #define store_spreg( x86reg, regoff ) MOV_r32_sh4r( x86reg, regoff )
174 * Emit an instruction to load an immediate value into a register
176 static inline void load_imm32( int x86reg, uint32_t value ) {
177 /* mov #value, reg */
183 * Load an immediate 64-bit quantity (note: x86-64 only)
185 static inline void load_imm64( int x86reg, uint64_t value ) {
186 /* mov #value, reg */
193 * Emit an instruction to store an SH4 reg (RN)
195 void static inline store_reg( int x86reg, int sh4reg ) {
196 /* mov reg, [bp+n] */
198 OP(0x45 + (x86reg<<3));
199 OP(REG_OFFSET(r[sh4reg]));
203 * Load an FR register (single-precision floating point) into an integer x86
204 * register (eg for register-to-register moves)
206 #define load_fr(reg,frm) OP(0x8B); MODRM_r32_ebp32(reg, REG_OFFSET(fr[0][(frm)^1]) )
207 #define load_xf(reg,frm) OP(0x8B); MODRM_r32_ebp32(reg, REG_OFFSET(fr[1][(frm)^1]) )
210 * Load the low half of a DR register (DR or XD) into an integer x86 register
212 #define load_dr0(reg,frm) OP(0x8B); MODRM_r32_ebp32(reg, REG_OFFSET(fr[frm&1][frm|0x01]) )
213 #define load_dr1(reg,frm) OP(0x8B); MODRM_r32_ebp32(reg, REG_OFFSET(fr[frm&1][frm&0x0E]) )
216 * Store an FR register (single-precision floating point) from an integer x86+
217 * register (eg for register-to-register moves)
219 #define store_fr(reg,frm) OP(0x89); MODRM_r32_ebp32( reg, REG_OFFSET(fr[0][(frm)^1]) )
220 #define store_xf(reg,frm) OP(0x89); MODRM_r32_ebp32( reg, REG_OFFSET(fr[1][(frm)^1]) )
222 #define store_dr0(reg,frm) OP(0x89); MODRM_r32_ebp32( reg, REG_OFFSET(fr[frm&1][frm|0x01]) )
223 #define store_dr1(reg,frm) OP(0x89); MODRM_r32_ebp32( reg, REG_OFFSET(fr[frm&1][frm&0x0E]) )
226 #define push_fpul() FLDF_sh4r(R_FPUL)
227 #define pop_fpul() FSTPF_sh4r(R_FPUL)
228 #define push_fr(frm) FLDF_sh4r( REG_OFFSET(fr[0][(frm)^1]) )
229 #define pop_fr(frm) FSTPF_sh4r( REG_OFFSET(fr[0][(frm)^1]) )
230 #define push_xf(frm) FLDF_sh4r( REG_OFFSET(fr[1][(frm)^1]) )
231 #define pop_xf(frm) FSTPF_sh4r( REG_OFFSET(fr[1][(frm)^1]) )
232 #define push_dr(frm) FLDD_sh4r( REG_OFFSET(fr[0][(frm)&0x0E]) )
233 #define pop_dr(frm) FSTPD_sh4r( REG_OFFSET(fr[0][(frm)&0x0E]) )
234 #define push_xdr(frm) FLDD_sh4r( REG_OFFSET(fr[1][(frm)&0x0E]) )
235 #define pop_xdr(frm) FSTPD_sh4r( REG_OFFSET(fr[1][(frm)&0x0E]) )
239 /* Exception checks - Note that all exception checks will clobber EAX */
241 #define check_priv( ) \
242 if( !sh4_x86.priv_checked ) { \
243 sh4_x86.priv_checked = TRUE;\
244 load_spreg( R_EAX, R_SR );\
245 AND_imm32_r32( SR_MD, R_EAX );\
246 if( sh4_x86.in_delay_slot ) {\
247 JE_exc( EXC_SLOT_ILLEGAL );\
249 JE_exc( EXC_ILLEGAL );\
251 sh4_x86.tstate = TSTATE_NONE; \
254 #define check_fpuen( ) \
255 if( !sh4_x86.fpuen_checked ) {\
256 sh4_x86.fpuen_checked = TRUE;\
257 load_spreg( R_EAX, R_SR );\
258 AND_imm32_r32( SR_FD, R_EAX );\
259 if( sh4_x86.in_delay_slot ) {\
260 JNE_exc(EXC_SLOT_FPU_DISABLED);\
262 JNE_exc(EXC_FPU_DISABLED);\
264 sh4_x86.tstate = TSTATE_NONE; \
267 #define check_ralign16( x86reg ) \
268 TEST_imm32_r32( 0x00000001, x86reg ); \
269 JNE_exc(EXC_DATA_ADDR_READ)
271 #define check_walign16( x86reg ) \
272 TEST_imm32_r32( 0x00000001, x86reg ); \
273 JNE_exc(EXC_DATA_ADDR_WRITE);
275 #define check_ralign32( x86reg ) \
276 TEST_imm32_r32( 0x00000003, x86reg ); \
277 JNE_exc(EXC_DATA_ADDR_READ)
279 #define check_walign32( x86reg ) \
280 TEST_imm32_r32( 0x00000003, x86reg ); \
281 JNE_exc(EXC_DATA_ADDR_WRITE);
283 #define check_ralign64( x86reg ) \
284 TEST_imm32_r32( 0x00000007, x86reg ); \
285 JNE_exc(EXC_DATA_ADDR_READ)
287 #define check_walign64( x86reg ) \
288 TEST_imm32_r32( 0x00000007, x86reg ); \
289 JNE_exc(EXC_DATA_ADDR_WRITE);
292 #define MEM_RESULT(value_reg) if(value_reg != R_EAX) { MOV_r32_r32(R_EAX,value_reg); }
293 #define MEM_READ_BYTE( addr_reg, value_reg ) call_func1(sh4_read_byte, addr_reg ); MEM_RESULT(value_reg)
294 #define MEM_READ_WORD( addr_reg, value_reg ) call_func1(sh4_read_word, addr_reg ); MEM_RESULT(value_reg)
295 #define MEM_READ_LONG( addr_reg, value_reg ) call_func1(sh4_read_long, addr_reg ); MEM_RESULT(value_reg)
296 #define MEM_WRITE_BYTE( addr_reg, value_reg ) call_func2(sh4_write_byte, addr_reg, value_reg)
297 #define MEM_WRITE_WORD( addr_reg, value_reg ) call_func2(sh4_write_word, addr_reg, value_reg)
298 #define MEM_WRITE_LONG( addr_reg, value_reg ) call_func2(sh4_write_long, addr_reg, value_reg)
300 #ifdef HAVE_FRAME_ADDRESS
302 * Perform MMU translation on the address in addr_reg for a read operation, iff the TLB is turned
303 * on, otherwise do nothing. Clobbers EAX, ECX and EDX. May raise a TLB exception or address error.
305 #define MMU_TRANSLATE_READ( addr_reg ) if( sh4_x86.tlb_on ) { call_func1_exc(mmu_vma_to_phys_read, addr_reg, pc); MEM_RESULT(addr_reg); }
308 * Perform MMU translation on the address in addr_reg for a write operation, iff the TLB is turned
309 * on, otherwise do nothing. Clobbers EAX, ECX and EDX. May raise a TLB exception or address error.
311 #define MMU_TRANSLATE_WRITE( addr_reg ) if( sh4_x86.tlb_on ) { call_func1_exc(mmu_vma_to_phys_write, addr_reg, pc); MEM_RESULT(addr_reg); }
313 #define MMU_TRANSLATE_READ( addr_reg ) if( sh4_x86.tlb_on ) { call_func1(mmu_vma_to_phys_read, addr_reg); CMP_imm32_r32(MMU_VMA_ERROR, R_EAX); JE_exc(-1); MEM_RESULT(addr_reg); }
314 #define MMU_TRANSLATE_WRITE( addr_reg ) if( sh4_x86.tlb_on ) { call_func1(mmu_vma_to_phys_write, addr_reg); CMP_imm32_r32(MMU_VMA_ERROR, R_EAX); JE_exc(-1); MEM_RESULT(addr_reg); }
317 #define SLOTILLEGAL() JMP_exc(EXC_SLOT_ILLEGAL); sh4_x86.in_delay_slot = DELAY_NONE; return 1;
319 /****** Import appropriate calling conventions ******/
320 #if SIZEOF_VOID_P == 8
321 #include "sh4/ia64abi.h"
322 #else /* 32-bit system */
323 #include "sh4/ia32abi.h"
326 #define MEM_REGION_PTR(name) offsetof( struct mem_region_fn, name )
329 * Given an address in addr_reg and a cache entry, test if the cache is valid
330 * and decode otherwise.
331 * At conclusion of this:
332 * R_EBX will contain the address
333 * R_ECX will contain the memory region vtable
334 * R_EAX, R_EDX (and any other volatiles) are clobbered
336 static inline void MEM_DECODE_ADDRESS( int addr_reg, int rm )
338 MOV_r32_r32( addr_reg, R_EBX );
339 AND_sh4r_r32( REG_OFFSET(pointer_cache[rm].page_mask), addr_reg );
340 CMP_sh4r_r32( REG_OFFSET(pointer_cache[rm].page_vma), addr_reg );
341 EXPJE_rel8(uptodate);
342 store_spreg( addr_reg, REG_OFFSET(pointer_cache[rm].page_vma) );
343 call_func1( sh7750_decode_address, addr_reg );
344 store_spreg( R_EAX, REG_OFFSET(pointer_cache[rm].page_fn) );
345 JMP_TARGET(uptodate);
346 load_spreg( R_ECX, REG_OFFSET(pointer_cache[rm].page_fn) );
349 static inline void MEM_READ_LONG_CACHED( int addr_reg, int value_reg, int rm )
351 MEM_DECODE_ADDRESS( addr_reg, rm );
352 call_func1_r32ind( R_ECX, MEM_REGION_PTR(read_long), R_EBX );
353 MEM_RESULT(value_reg);
356 static inline void MEM_READ_WORD_CACHED( int addr_reg, int value_reg, int rm )
358 MEM_DECODE_ADDRESS( addr_reg, rm );
359 call_func1_r32ind( R_ECX, MEM_REGION_PTR(read_word), R_EBX );
360 MEM_RESULT(value_reg);
363 static inline void MEM_READ_BYTE_CACHED( int addr_reg, int value_reg, int rm )
365 MEM_DECODE_ADDRESS( addr_reg, rm );
366 call_func1_r32ind( R_ECX, MEM_REGION_PTR(read_byte), R_EBX );
367 MEM_RESULT(value_reg);
370 static inline void MEM_WRITE_LONG_CACHED_SP( int addr_reg, int ebpdisp, int rn )
372 MEM_DECODE_ADDRESS( addr_reg, rn );
373 MOV_sh4r_r32( ebpdisp, R_EDX );
374 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_long), R_EBX, R_EDX );
377 #define MEM_WRITE_LONG_CACHED( addr_reg, value_rm, rn ) MEM_WRITE_LONG_CACHED_SP( addr_reg, REG_OFFSET(r[value_rm]), rn )
379 static inline void MEM_WRITE_WORD_CACHED( int addr_reg, int value_rm, int rn )
381 MEM_DECODE_ADDRESS( addr_reg, rn );
382 MOVZX_sh4r16_r32( REG_OFFSET(r[value_rm]), R_EDX );
383 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_word), R_EBX, R_EDX );
386 static inline void MEM_WRITE_BYTE_CACHED( int addr_reg, int value_rm, int rn )
388 MEM_DECODE_ADDRESS( addr_reg, rn );
389 MOVZX_sh4r8_r32( REG_OFFSET(r[value_rm]), R_EDX );
390 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_byte), R_EBX, R_EDX );
393 static inline void MEM_WRITE_BYTE_UNCHECKED( int addr_reg, int value_reg, int rn )
395 load_spreg( R_ECX, REG_OFFSET(pointer_cache[rn].page_fn) );
396 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_byte), addr_reg, R_EDX );
399 static inline void MEM_WRITE_FLOAT_CACHED( int addr_reg, int value_frm, int rn )
401 MEM_DECODE_ADDRESS( addr_reg, rn );
402 load_fr( R_EDX, value_frm );
403 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_long), R_EBX, R_EDX );
406 static inline void MEM_READ_DOUBLE_CACHED( int addr_reg, int value_reg1, int value_reg2, int rm )
408 MEM_DECODE_ADDRESS( addr_reg, rm );
409 call_func1_r32ind( R_ECX, MEM_REGION_PTR(read_long), R_EBX );
410 MOV_r32_esp8( R_EAX, 0 );
411 load_spreg( R_ECX, REG_OFFSET(pointer_cache[rm].page_fn) );
412 LEA_r32disp8_r32( R_EBX, 4, R_EBX );
413 call_func1_r32ind( R_ECX, MEM_REGION_PTR(read_long), R_EBX );
414 MEM_RESULT(value_reg2);
415 MOV_esp8_r32( 0, value_reg1 );
418 static inline void MEM_WRITE_DOUBLE_CACHED( int addr_reg, int value_frm, int rn )
420 MEM_DECODE_ADDRESS( addr_reg, rn );
421 load_dr0( R_EDX, value_frm );
422 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_long), R_EBX, R_EDX );
423 LEA_r32disp8_r32( R_EBX, 4, R_EBX );
424 load_spreg( R_ECX, REG_OFFSET(pointer_cache[rn].page_fn) );
425 load_dr1( R_EDX, value_frm );
426 call_func2_r32ind( R_ECX, MEM_REGION_PTR(write_long), R_EBX, R_EDX );
431 void sh4_translate_begin_block( sh4addr_t pc )
434 sh4_x86.in_delay_slot = FALSE;
435 sh4_x86.priv_checked = FALSE;
436 sh4_x86.fpuen_checked = FALSE;
437 sh4_x86.branch_taken = FALSE;
438 sh4_x86.backpatch_posn = 0;
439 sh4_x86.block_start_pc = pc;
440 sh4_x86.tlb_on = IS_MMU_ENABLED();
441 sh4_x86.tstate = TSTATE_NONE;
442 sh4_x86.double_prec = sh4r.fpscr & FPSCR_PR;
443 sh4_x86.double_size = sh4r.fpscr & FPSCR_SZ;
447 uint32_t sh4_translate_end_block_size()
449 if( sh4_x86.backpatch_posn <= 3 ) {
450 return EPILOGUE_SIZE + (sh4_x86.backpatch_posn*12);
452 return EPILOGUE_SIZE + 48 + (sh4_x86.backpatch_posn-3)*15;
458 * Embed a breakpoint into the generated code
460 void sh4_translate_emit_breakpoint( sh4vma_t pc )
462 load_imm32( R_EAX, pc );
463 call_func1( sh4_translate_breakpoint_hit, R_EAX );
464 sh4_x86.tstate = TSTATE_NONE;
468 #define UNTRANSLATABLE(pc) !IS_IN_ICACHE(pc)
471 * Embed a call to sh4_execute_instruction for situations that we
472 * can't translate (just page-crossing delay slots at the moment).
473 * Caller is responsible for setting new_pc before calling this function.
477 * Set sh4r.in_delay_slot = sh4_x86.in_delay_slot
478 * Update slice_cycle for endpc+2 (single step doesn't update slice_cycle)
479 * Call sh4_execute_instruction
480 * Call xlat_get_code_by_vma / xlat_get_code as for normal exit
482 void exit_block_emu( sh4vma_t endpc )
484 load_imm32( R_ECX, endpc - sh4_x86.block_start_pc ); // 5
485 ADD_r32_sh4r( R_ECX, R_PC );
487 load_imm32( R_ECX, (((endpc - sh4_x86.block_start_pc)>>1)+1)*sh4_cpu_period ); // 5
488 ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 6
489 load_imm32( R_ECX, sh4_x86.in_delay_slot ? 1 : 0 );
490 store_spreg( R_ECX, REG_OFFSET(in_delay_slot) );
492 call_func0( sh4_execute_instruction );
493 load_spreg( R_EAX, R_PC );
494 if( sh4_x86.tlb_on ) {
495 call_func1(xlat_get_code_by_vma,R_EAX);
497 call_func1(xlat_get_code,R_EAX);
503 * Translate a single instruction. Delayed branches are handled specially
504 * by translating both branch and delayed instruction as a single unit (as
506 * The instruction MUST be in the icache (assert check)
508 * @return true if the instruction marks the end of a basic block
511 uint32_t sh4_translate_instruction( sh4vma_t pc )
514 /* Read instruction from icache */
515 assert( IS_IN_ICACHE(pc) );
516 ir = *(uint16_t *)GET_ICACHE_PTR(pc);
518 if( !sh4_x86.in_delay_slot ) {
519 sh4_translate_add_recovery( (pc - sh4_x86.block_start_pc)>>1 );
525 load_reg( R_EAX, Rm );
526 load_reg( R_ECX, Rn );
527 ADD_r32_r32( R_EAX, R_ECX );
528 store_reg( R_ECX, Rn );
529 sh4_x86.tstate = TSTATE_NONE;
533 load_reg( R_EAX, Rn );
534 ADD_imm8s_r32( imm, R_EAX );
535 store_reg( R_EAX, Rn );
536 sh4_x86.tstate = TSTATE_NONE;
540 if( sh4_x86.tstate != TSTATE_C ) {
543 load_reg( R_EAX, Rm );
544 load_reg( R_ECX, Rn );
545 ADC_r32_r32( R_EAX, R_ECX );
546 store_reg( R_ECX, Rn );
548 sh4_x86.tstate = TSTATE_C;
552 load_reg( R_EAX, Rm );
553 load_reg( R_ECX, Rn );
554 ADD_r32_r32( R_EAX, R_ECX );
555 store_reg( R_ECX, Rn );
557 sh4_x86.tstate = TSTATE_O;
561 load_reg( R_EAX, Rm );
562 load_reg( R_ECX, Rn );
563 AND_r32_r32( R_EAX, R_ECX );
564 store_reg( R_ECX, Rn );
565 sh4_x86.tstate = TSTATE_NONE;
569 load_reg( R_EAX, 0 );
570 AND_imm32_r32(imm, R_EAX);
571 store_reg( R_EAX, 0 );
572 sh4_x86.tstate = TSTATE_NONE;
574 AND.B #imm, @(R0, GBR) {:
576 load_reg( R_EAX, 0 );
577 load_spreg( R_ECX, R_GBR );
578 ADD_r32_r32( R_ECX, R_EAX );
579 MMU_TRANSLATE_WRITE( R_EAX );
580 MEM_READ_BYTE_CACHED( R_EAX, R_EDX, 16 );
581 AND_imm32_r32(imm, R_EDX );
582 MEM_WRITE_BYTE_UNCHECKED( R_EBX, R_EDX, 16 );
583 sh4_x86.tstate = TSTATE_NONE;
587 load_reg( R_EAX, Rm );
588 load_reg( R_ECX, Rn );
589 CMP_r32_r32( R_EAX, R_ECX );
591 sh4_x86.tstate = TSTATE_E;
594 COUNT_INST(I_CMPEQI);
595 load_reg( R_EAX, 0 );
596 CMP_imm8s_r32(imm, R_EAX);
598 sh4_x86.tstate = TSTATE_E;
602 load_reg( R_EAX, Rm );
603 load_reg( R_ECX, Rn );
604 CMP_r32_r32( R_EAX, R_ECX );
606 sh4_x86.tstate = TSTATE_GE;
610 load_reg( R_EAX, Rm );
611 load_reg( R_ECX, Rn );
612 CMP_r32_r32( R_EAX, R_ECX );
614 sh4_x86.tstate = TSTATE_G;
618 load_reg( R_EAX, Rm );
619 load_reg( R_ECX, Rn );
620 CMP_r32_r32( R_EAX, R_ECX );
622 sh4_x86.tstate = TSTATE_A;
626 load_reg( R_EAX, Rm );
627 load_reg( R_ECX, Rn );
628 CMP_r32_r32( R_EAX, R_ECX );
630 sh4_x86.tstate = TSTATE_AE;
634 load_reg( R_EAX, Rn );
635 CMP_imm8s_r32( 0, R_EAX );
637 sh4_x86.tstate = TSTATE_G;
641 load_reg( R_EAX, Rn );
642 CMP_imm8s_r32( 0, R_EAX );
644 sh4_x86.tstate = TSTATE_GE;
647 COUNT_INST(I_CMPSTR);
648 load_reg( R_EAX, Rm );
649 load_reg( R_ECX, Rn );
650 XOR_r32_r32( R_ECX, R_EAX );
651 TEST_r8_r8( R_AL, R_AL );
653 TEST_r8_r8( R_AH, R_AH );
655 SHR_imm8_r32( 16, R_EAX );
656 TEST_r8_r8( R_AL, R_AL );
658 TEST_r8_r8( R_AH, R_AH );
663 sh4_x86.tstate = TSTATE_E;
667 load_reg( R_EAX, Rm );
668 load_reg( R_ECX, Rn );
669 SHR_imm8_r32( 31, R_EAX );
670 SHR_imm8_r32( 31, R_ECX );
671 store_spreg( R_EAX, R_M );
672 store_spreg( R_ECX, R_Q );
673 CMP_r32_r32( R_EAX, R_ECX );
675 sh4_x86.tstate = TSTATE_NE;
679 XOR_r32_r32( R_EAX, R_EAX );
680 store_spreg( R_EAX, R_Q );
681 store_spreg( R_EAX, R_M );
682 store_spreg( R_EAX, R_T );
683 sh4_x86.tstate = TSTATE_C; // works for DIV1
687 load_spreg( R_ECX, R_M );
688 load_reg( R_EAX, Rn );
689 if( sh4_x86.tstate != TSTATE_C ) {
693 SETC_r8( R_DL ); // Q'
694 CMP_sh4r_r32( R_Q, R_ECX );
696 ADD_sh4r_r32( REG_OFFSET(r[Rm]), R_EAX );
699 SUB_sh4r_r32( REG_OFFSET(r[Rm]), R_EAX );
701 store_reg( R_EAX, Rn ); // Done with Rn now
702 SETC_r8(R_AL); // tmp1
703 XOR_r8_r8( R_DL, R_AL ); // Q' = Q ^ tmp1
704 XOR_r8_r8( R_AL, R_CL ); // Q'' = Q' ^ M
705 store_spreg( R_ECX, R_Q );
706 XOR_imm8s_r32( 1, R_AL ); // T = !Q'
707 MOVZX_r8_r32( R_AL, R_EAX );
708 store_spreg( R_EAX, R_T );
709 sh4_x86.tstate = TSTATE_NONE;
713 load_reg( R_EAX, Rm );
714 load_reg( R_ECX, Rn );
716 store_spreg( R_EDX, R_MACH );
717 store_spreg( R_EAX, R_MACL );
718 sh4_x86.tstate = TSTATE_NONE;
722 load_reg( R_EAX, Rm );
723 load_reg( R_ECX, Rn );
725 store_spreg( R_EDX, R_MACH );
726 store_spreg( R_EAX, R_MACL );
727 sh4_x86.tstate = TSTATE_NONE;
731 load_reg( R_EAX, Rn );
732 ADD_imm8s_r32( -1, R_EAX );
733 store_reg( R_EAX, Rn );
735 sh4_x86.tstate = TSTATE_E;
739 load_reg( R_EAX, Rm );
740 MOVSX_r8_r32( R_EAX, R_EAX );
741 store_reg( R_EAX, Rn );
745 load_reg( R_EAX, Rm );
746 MOVSX_r16_r32( R_EAX, R_EAX );
747 store_reg( R_EAX, Rn );
751 load_reg( R_EAX, Rm );
752 MOVZX_r8_r32( R_EAX, R_EAX );
753 store_reg( R_EAX, Rn );
757 load_reg( R_EAX, Rm );
758 MOVZX_r16_r32( R_EAX, R_EAX );
759 store_reg( R_EAX, Rn );
764 load_reg( R_EAX, Rm );
765 check_ralign32( R_EAX );
766 MMU_TRANSLATE_READ( R_EAX );
767 MOV_r32_esp8(R_EAX, 0);
768 load_reg( R_EAX, Rn );
769 ADD_imm8s_r32( 4, R_EAX );
770 MMU_TRANSLATE_READ( R_EAX );
771 ADD_imm8s_sh4r( 8, REG_OFFSET(r[Rn]) );
772 // Note translate twice in case of page boundaries. Maybe worth
773 // adding a page-boundary check to skip the second translation
775 load_reg( R_EAX, Rm );
776 check_ralign32( R_EAX );
777 MMU_TRANSLATE_READ( R_EAX );
778 MOV_r32_esp8( R_EAX, 0 );
779 load_reg( R_EAX, Rn );
780 check_ralign32( R_EAX );
781 MMU_TRANSLATE_READ( R_EAX );
782 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rn]) );
783 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
785 MEM_READ_LONG( R_EAX, R_EAX );
786 MOV_r32_r32( R_EAX, R_EBX );
787 MOV_esp8_r32( 0, R_EAX );
788 MEM_READ_LONG( R_EAX, R_EAX );
789 MOV_r32_r32( R_EBX, R_ECX );
792 ADD_r32_sh4r( R_EAX, R_MACL );
793 ADC_r32_sh4r( R_EDX, R_MACH );
795 load_spreg( R_ECX, R_S );
796 TEST_r32_r32(R_ECX, R_ECX);
798 call_func0( signsat48 );
800 sh4_x86.tstate = TSTATE_NONE;
805 load_reg( R_EAX, Rm );
806 check_ralign16( R_EAX );
807 MMU_TRANSLATE_READ( R_EAX );
808 MOV_r32_esp8( R_EAX, 0 );
809 load_reg( R_EAX, Rn );
810 ADD_imm8s_r32( 2, R_EAX );
811 MMU_TRANSLATE_READ( R_EAX );
812 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rn]) );
813 // Note translate twice in case of page boundaries. Maybe worth
814 // adding a page-boundary check to skip the second translation
816 load_reg( R_EAX, Rm );
817 check_ralign16( R_EAX );
818 MMU_TRANSLATE_READ( R_EAX );
819 MOV_r32_esp8( R_EAX, 0 );
820 load_reg( R_EAX, Rn );
821 check_ralign16( R_EAX );
822 MMU_TRANSLATE_READ( R_EAX );
823 ADD_imm8s_sh4r( 2, REG_OFFSET(r[Rn]) );
824 ADD_imm8s_sh4r( 2, REG_OFFSET(r[Rm]) );
826 MEM_READ_WORD( R_EAX, R_EAX );
827 MOV_r32_r32( R_EAX, R_EBX );
828 MOV_esp8_r32( 0, R_EAX );
829 MEM_READ_WORD( R_EAX, R_EAX );
830 MOV_r32_r32( R_EBX, R_ECX );
833 load_spreg( R_ECX, R_S );
834 TEST_r32_r32( R_ECX, R_ECX );
837 ADD_r32_sh4r( R_EAX, R_MACL ); // 6
838 JNO_rel8( end ); // 2
839 load_imm32( R_EDX, 1 ); // 5
840 store_spreg( R_EDX, R_MACH ); // 6
841 JS_rel8( positive ); // 2
842 load_imm32( R_EAX, 0x80000000 );// 5
843 store_spreg( R_EAX, R_MACL ); // 6
846 JMP_TARGET(positive);
847 load_imm32( R_EAX, 0x7FFFFFFF );// 5
848 store_spreg( R_EAX, R_MACL ); // 6
852 ADD_r32_sh4r( R_EAX, R_MACL ); // 6
853 ADC_r32_sh4r( R_EDX, R_MACH ); // 6
857 sh4_x86.tstate = TSTATE_NONE;
861 load_spreg( R_EAX, R_T );
862 store_reg( R_EAX, Rn );
866 load_reg( R_EAX, Rm );
867 load_reg( R_ECX, Rn );
869 store_spreg( R_EAX, R_MACL );
870 sh4_x86.tstate = TSTATE_NONE;
874 load_reg16s( R_EAX, Rm );
875 load_reg16s( R_ECX, Rn );
877 store_spreg( R_EAX, R_MACL );
878 sh4_x86.tstate = TSTATE_NONE;
882 load_reg16u( R_EAX, Rm );
883 load_reg16u( R_ECX, Rn );
885 store_spreg( R_EAX, R_MACL );
886 sh4_x86.tstate = TSTATE_NONE;
890 load_reg( R_EAX, Rm );
892 store_reg( R_EAX, Rn );
893 sh4_x86.tstate = TSTATE_NONE;
897 load_reg( R_EAX, Rm );
898 XOR_r32_r32( R_ECX, R_ECX );
900 SBB_r32_r32( R_EAX, R_ECX );
901 store_reg( R_ECX, Rn );
903 sh4_x86.tstate = TSTATE_C;
907 load_reg( R_EAX, Rm );
909 store_reg( R_EAX, Rn );
910 sh4_x86.tstate = TSTATE_NONE;
914 load_reg( R_EAX, Rm );
915 load_reg( R_ECX, Rn );
916 OR_r32_r32( R_EAX, R_ECX );
917 store_reg( R_ECX, Rn );
918 sh4_x86.tstate = TSTATE_NONE;
922 load_reg( R_EAX, 0 );
923 OR_imm32_r32(imm, R_EAX);
924 store_reg( R_EAX, 0 );
925 sh4_x86.tstate = TSTATE_NONE;
927 OR.B #imm, @(R0, GBR) {:
929 load_reg( R_EAX, 0 );
930 load_spreg( R_ECX, R_GBR );
931 ADD_r32_r32( R_ECX, R_EAX );
932 MMU_TRANSLATE_WRITE( R_EAX );
933 MEM_READ_BYTE_CACHED( R_EAX, R_EDX, 16 );
934 OR_imm32_r32(imm, R_EDX );
935 MEM_WRITE_BYTE_UNCHECKED( R_EBX, R_EDX, 16 );
936 sh4_x86.tstate = TSTATE_NONE;
940 load_reg( R_EAX, Rn );
941 if( sh4_x86.tstate != TSTATE_C ) {
945 store_reg( R_EAX, Rn );
947 sh4_x86.tstate = TSTATE_C;
951 load_reg( R_EAX, Rn );
952 if( sh4_x86.tstate != TSTATE_C ) {
956 store_reg( R_EAX, Rn );
958 sh4_x86.tstate = TSTATE_C;
962 load_reg( R_EAX, Rn );
964 store_reg( R_EAX, Rn );
966 sh4_x86.tstate = TSTATE_C;
970 load_reg( R_EAX, Rn );
972 store_reg( R_EAX, Rn );
974 sh4_x86.tstate = TSTATE_C;
978 /* Annoyingly enough, not directly convertible */
979 load_reg( R_EAX, Rn );
980 load_reg( R_ECX, Rm );
981 CMP_imm32_r32( 0, R_ECX );
984 NEG_r32( R_ECX ); // 2
985 AND_imm8_r8( 0x1F, R_CL ); // 3
986 JE_rel8(emptysar); // 2
987 SAR_r32_CL( R_EAX ); // 2
990 JMP_TARGET(emptysar);
991 SAR_imm8_r32(31, R_EAX ); // 3
995 AND_imm8_r8( 0x1F, R_CL ); // 3
996 SHL_r32_CL( R_EAX ); // 2
999 store_reg( R_EAX, Rn );
1000 sh4_x86.tstate = TSTATE_NONE;
1004 load_reg( R_EAX, Rn );
1005 load_reg( R_ECX, Rm );
1006 CMP_imm32_r32( 0, R_ECX );
1009 NEG_r32( R_ECX ); // 2
1010 AND_imm8_r8( 0x1F, R_CL ); // 3
1012 SHR_r32_CL( R_EAX ); // 2
1015 JMP_TARGET(emptyshr);
1016 XOR_r32_r32( R_EAX, R_EAX );
1020 AND_imm8_r8( 0x1F, R_CL ); // 3
1021 SHL_r32_CL( R_EAX ); // 2
1024 store_reg( R_EAX, Rn );
1025 sh4_x86.tstate = TSTATE_NONE;
1029 load_reg( R_EAX, Rn );
1032 store_reg( R_EAX, Rn );
1033 sh4_x86.tstate = TSTATE_C;
1037 load_reg( R_EAX, Rn );
1040 store_reg( R_EAX, Rn );
1041 sh4_x86.tstate = TSTATE_C;
1045 load_reg( R_EAX, Rn );
1048 store_reg( R_EAX, Rn );
1049 sh4_x86.tstate = TSTATE_C;
1053 load_reg( R_EAX, Rn );
1054 SHL_imm8_r32( 2, R_EAX );
1055 store_reg( R_EAX, Rn );
1056 sh4_x86.tstate = TSTATE_NONE;
1060 load_reg( R_EAX, Rn );
1061 SHL_imm8_r32( 8, R_EAX );
1062 store_reg( R_EAX, Rn );
1063 sh4_x86.tstate = TSTATE_NONE;
1067 load_reg( R_EAX, Rn );
1068 SHL_imm8_r32( 16, R_EAX );
1069 store_reg( R_EAX, Rn );
1070 sh4_x86.tstate = TSTATE_NONE;
1074 load_reg( R_EAX, Rn );
1077 store_reg( R_EAX, Rn );
1078 sh4_x86.tstate = TSTATE_C;
1082 load_reg( R_EAX, Rn );
1083 SHR_imm8_r32( 2, R_EAX );
1084 store_reg( R_EAX, Rn );
1085 sh4_x86.tstate = TSTATE_NONE;
1089 load_reg( R_EAX, Rn );
1090 SHR_imm8_r32( 8, R_EAX );
1091 store_reg( R_EAX, Rn );
1092 sh4_x86.tstate = TSTATE_NONE;
1096 load_reg( R_EAX, Rn );
1097 SHR_imm8_r32( 16, R_EAX );
1098 store_reg( R_EAX, Rn );
1099 sh4_x86.tstate = TSTATE_NONE;
1103 load_reg( R_EAX, Rm );
1104 load_reg( R_ECX, Rn );
1105 SUB_r32_r32( R_EAX, R_ECX );
1106 store_reg( R_ECX, Rn );
1107 sh4_x86.tstate = TSTATE_NONE;
1111 load_reg( R_EAX, Rm );
1112 load_reg( R_ECX, Rn );
1113 if( sh4_x86.tstate != TSTATE_C ) {
1116 SBB_r32_r32( R_EAX, R_ECX );
1117 store_reg( R_ECX, Rn );
1119 sh4_x86.tstate = TSTATE_C;
1123 load_reg( R_EAX, Rm );
1124 load_reg( R_ECX, Rn );
1125 SUB_r32_r32( R_EAX, R_ECX );
1126 store_reg( R_ECX, Rn );
1128 sh4_x86.tstate = TSTATE_O;
1131 COUNT_INST(I_SWAPB);
1132 load_reg( R_EAX, Rm );
1133 XCHG_r8_r8( R_AL, R_AH ); // NB: does not touch EFLAGS
1134 store_reg( R_EAX, Rn );
1137 COUNT_INST(I_SWAPB);
1138 load_reg( R_EAX, Rm );
1139 MOV_r32_r32( R_EAX, R_ECX );
1140 SHL_imm8_r32( 16, R_ECX );
1141 SHR_imm8_r32( 16, R_EAX );
1142 OR_r32_r32( R_EAX, R_ECX );
1143 store_reg( R_ECX, Rn );
1144 sh4_x86.tstate = TSTATE_NONE;
1148 load_reg( R_EAX, Rn );
1149 MMU_TRANSLATE_WRITE( R_EAX );
1150 MEM_READ_BYTE_CACHED( R_EAX, R_EDX, 16 );
1151 TEST_r8_r8( R_DL, R_DL );
1153 OR_imm8_r8( 0x80, R_DL );
1154 MEM_WRITE_BYTE_UNCHECKED( R_EBX, R_EDX, 16 );
1155 sh4_x86.tstate = TSTATE_NONE;
1159 load_reg( R_EAX, Rm );
1160 load_reg( R_ECX, Rn );
1161 TEST_r32_r32( R_EAX, R_ECX );
1163 sh4_x86.tstate = TSTATE_E;
1167 load_reg( R_EAX, 0 );
1168 TEST_imm32_r32( imm, R_EAX );
1170 sh4_x86.tstate = TSTATE_E;
1172 TST.B #imm, @(R0, GBR) {:
1174 load_reg( R_EAX, 0);
1175 load_reg( R_ECX, R_GBR);
1176 ADD_r32_r32( R_ECX, R_EAX );
1177 MMU_TRANSLATE_READ( R_EAX );
1178 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, 16 );
1179 TEST_imm8_r8( imm, R_AL );
1181 sh4_x86.tstate = TSTATE_E;
1185 load_reg( R_EAX, Rm );
1186 load_reg( R_ECX, Rn );
1187 XOR_r32_r32( R_EAX, R_ECX );
1188 store_reg( R_ECX, Rn );
1189 sh4_x86.tstate = TSTATE_NONE;
1193 load_reg( R_EAX, 0 );
1194 XOR_imm32_r32( imm, R_EAX );
1195 store_reg( R_EAX, 0 );
1196 sh4_x86.tstate = TSTATE_NONE;
1198 XOR.B #imm, @(R0, GBR) {:
1200 load_reg( R_EAX, 0 );
1201 load_spreg( R_ECX, R_GBR );
1202 ADD_r32_r32( R_ECX, R_EAX );
1203 MMU_TRANSLATE_WRITE( R_EAX );
1204 MEM_READ_BYTE_CACHED(R_EAX, R_EDX, 16);
1205 XOR_imm32_r32( imm, R_EDX );
1206 MEM_WRITE_BYTE_UNCHECKED( R_EBX, R_EDX, 16 );
1207 sh4_x86.tstate = TSTATE_NONE;
1210 COUNT_INST(I_XTRCT);
1211 load_reg( R_EAX, Rm );
1212 load_reg( R_ECX, Rn );
1213 SHL_imm8_r32( 16, R_EAX );
1214 SHR_imm8_r32( 16, R_ECX );
1215 OR_r32_r32( R_EAX, R_ECX );
1216 store_reg( R_ECX, Rn );
1217 sh4_x86.tstate = TSTATE_NONE;
1220 /* Data move instructions */
1223 load_reg( R_EAX, Rm );
1224 store_reg( R_EAX, Rn );
1228 load_imm32( R_EAX, imm );
1229 store_reg( R_EAX, Rn );
1233 load_reg( R_EAX, Rn );
1234 MMU_TRANSLATE_WRITE( R_EAX );
1235 MEM_WRITE_BYTE_CACHED( R_EAX, Rm, Rn );
1236 sh4_x86.tstate = TSTATE_NONE;
1240 load_reg( R_EAX, Rn );
1241 ADD_imm8s_r32( -1, R_EAX );
1242 MMU_TRANSLATE_WRITE( R_EAX );
1243 ADD_imm8s_sh4r( -1, REG_OFFSET(r[Rn]) );
1244 MEM_WRITE_BYTE_CACHED( R_EAX, Rm, Rn );
1245 sh4_x86.tstate = TSTATE_NONE;
1247 MOV.B Rm, @(R0, Rn) {:
1249 load_reg( R_EAX, 0 );
1250 load_reg( R_ECX, Rn );
1251 ADD_r32_r32( R_ECX, R_EAX );
1252 MMU_TRANSLATE_WRITE( R_EAX );
1253 MEM_WRITE_BYTE_CACHED( R_EAX, Rm, 0 );
1254 sh4_x86.tstate = TSTATE_NONE;
1256 MOV.B R0, @(disp, GBR) {:
1258 load_spreg( R_EAX, R_GBR );
1259 ADD_imm32_r32( disp, R_EAX );
1260 MMU_TRANSLATE_WRITE( R_EAX );
1261 MEM_WRITE_BYTE_CACHED( R_EAX, 0, 16 );
1262 sh4_x86.tstate = TSTATE_NONE;
1264 MOV.B R0, @(disp, Rn) {:
1266 load_reg( R_EAX, Rn );
1267 ADD_imm32_r32( disp, R_EAX );
1268 MMU_TRANSLATE_WRITE( R_EAX );
1269 MEM_WRITE_BYTE_CACHED( R_EAX, 0, Rn );
1270 sh4_x86.tstate = TSTATE_NONE;
1274 load_reg( R_EAX, Rm );
1275 MMU_TRANSLATE_READ( R_EAX );
1276 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, Rm );
1277 store_reg( R_EAX, Rn );
1278 sh4_x86.tstate = TSTATE_NONE;
1282 load_reg( R_EAX, Rm );
1283 MMU_TRANSLATE_READ( R_EAX );
1284 ADD_imm8s_sh4r( 1, REG_OFFSET(r[Rm]) );
1285 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, Rm );
1286 store_reg( R_EAX, Rn );
1287 sh4_x86.tstate = TSTATE_NONE;
1289 MOV.B @(R0, Rm), Rn {:
1291 load_reg( R_EAX, 0 );
1292 load_reg( R_ECX, Rm );
1293 ADD_r32_r32( R_ECX, R_EAX );
1294 MMU_TRANSLATE_READ( R_EAX )
1295 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, 0 );
1296 store_reg( R_EAX, Rn );
1297 sh4_x86.tstate = TSTATE_NONE;
1299 MOV.B @(disp, GBR), R0 {:
1301 load_spreg( R_EAX, R_GBR );
1302 ADD_imm32_r32( disp, R_EAX );
1303 MMU_TRANSLATE_READ( R_EAX );
1304 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, 16 );
1305 store_reg( R_EAX, 0 );
1306 sh4_x86.tstate = TSTATE_NONE;
1308 MOV.B @(disp, Rm), R0 {:
1310 load_reg( R_EAX, Rm );
1311 ADD_imm32_r32( disp, R_EAX );
1312 MMU_TRANSLATE_READ( R_EAX );
1313 MEM_READ_BYTE_CACHED( R_EAX, R_EAX, Rm );
1314 store_reg( R_EAX, 0 );
1315 sh4_x86.tstate = TSTATE_NONE;
1319 load_reg( R_EAX, Rn );
1320 check_walign32(R_EAX);
1321 MMU_TRANSLATE_WRITE( R_EAX );
1322 MEM_WRITE_LONG_CACHED( R_EAX, Rm, Rn );
1323 sh4_x86.tstate = TSTATE_NONE;
1327 load_reg( R_EAX, Rn );
1328 ADD_imm8s_r32( -4, R_EAX );
1329 check_walign32( R_EAX );
1330 MMU_TRANSLATE_WRITE( R_EAX );
1331 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
1332 MEM_WRITE_LONG_CACHED( R_EAX, Rm, Rn );
1333 sh4_x86.tstate = TSTATE_NONE;
1335 MOV.L Rm, @(R0, Rn) {:
1337 load_reg( R_EAX, 0 );
1338 load_reg( R_ECX, Rn );
1339 ADD_r32_r32( R_ECX, R_EAX );
1340 check_walign32( R_EAX );
1341 MMU_TRANSLATE_WRITE( R_EAX );
1342 MEM_WRITE_LONG_CACHED( R_EAX, Rm, 0 );
1343 sh4_x86.tstate = TSTATE_NONE;
1345 MOV.L R0, @(disp, GBR) {:
1347 load_spreg( R_EAX, R_GBR );
1348 ADD_imm32_r32( disp, R_EAX );
1349 check_walign32( R_EAX );
1350 MMU_TRANSLATE_WRITE( R_EAX );
1351 MEM_WRITE_LONG_CACHED( R_EAX, 0, 16 );
1352 sh4_x86.tstate = TSTATE_NONE;
1354 MOV.L Rm, @(disp, Rn) {:
1356 load_reg( R_EAX, Rn );
1357 ADD_imm32_r32( disp, R_EAX );
1358 check_walign32( R_EAX );
1359 MMU_TRANSLATE_WRITE( R_EAX );
1360 MEM_WRITE_LONG_CACHED( R_EAX, Rm, Rn );
1361 sh4_x86.tstate = TSTATE_NONE;
1365 load_reg( R_EAX, Rm );
1366 check_ralign32( R_EAX );
1367 MMU_TRANSLATE_READ( R_EAX );
1368 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
1369 store_reg( R_EAX, Rn );
1370 sh4_x86.tstate = TSTATE_NONE;
1374 load_reg( R_EAX, Rm );
1375 check_ralign32( R_EAX );
1376 MMU_TRANSLATE_READ( R_EAX );
1377 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
1378 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
1379 store_reg( R_EAX, Rn );
1380 sh4_x86.tstate = TSTATE_NONE;
1382 MOV.L @(R0, Rm), Rn {:
1384 load_reg( R_EAX, 0 );
1385 load_reg( R_ECX, Rm );
1386 ADD_r32_r32( R_ECX, R_EAX );
1387 check_ralign32( R_EAX );
1388 MMU_TRANSLATE_READ( R_EAX );
1389 MEM_READ_LONG_CACHED( R_EAX, R_EAX, 0 );
1390 store_reg( R_EAX, Rn );
1391 sh4_x86.tstate = TSTATE_NONE;
1393 MOV.L @(disp, GBR), R0 {:
1395 load_spreg( R_EAX, R_GBR );
1396 ADD_imm32_r32( disp, R_EAX );
1397 check_ralign32( R_EAX );
1398 MMU_TRANSLATE_READ( R_EAX );
1399 MEM_READ_LONG_CACHED( R_EAX, R_EAX, 16 );
1400 store_reg( R_EAX, 0 );
1401 sh4_x86.tstate = TSTATE_NONE;
1403 MOV.L @(disp, PC), Rn {:
1404 COUNT_INST(I_MOVLPC);
1405 if( sh4_x86.in_delay_slot ) {
1408 uint32_t target = (pc & 0xFFFFFFFC) + disp + 4;
1409 if( IS_IN_ICACHE(target) ) {
1410 // If the target address is in the same page as the code, it's
1411 // pretty safe to just ref it directly and circumvent the whole
1412 // memory subsystem. (this is a big performance win)
1414 // FIXME: There's a corner-case that's not handled here when
1415 // the current code-page is in the ITLB but not in the UTLB.
1416 // (should generate a TLB miss although need to test SH4
1417 // behaviour to confirm) Unlikely to be anyone depending on this
1418 // behaviour though.
1419 sh4ptr_t ptr = GET_ICACHE_PTR(target);
1420 MOV_moff32_EAX( ptr );
1422 // Note: we use sh4r.pc for the calc as we could be running at a
1423 // different virtual address than the translation was done with,
1424 // but we can safely assume that the low bits are the same.
1425 load_imm32( R_EAX, (pc-sh4_x86.block_start_pc) + disp + 4 - (pc&0x03) );
1426 ADD_sh4r_r32( R_PC, R_EAX );
1427 MMU_TRANSLATE_READ( R_EAX );
1428 MEM_READ_LONG_CACHED( R_EAX, R_EAX, 16 );
1429 sh4_x86.tstate = TSTATE_NONE;
1431 store_reg( R_EAX, Rn );
1434 MOV.L @(disp, Rm), Rn {:
1436 load_reg( R_EAX, Rm );
1437 ADD_imm8s_r32( disp, R_EAX );
1438 check_ralign32( R_EAX );
1439 MMU_TRANSLATE_READ( R_EAX );
1440 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
1441 store_reg( R_EAX, Rn );
1442 sh4_x86.tstate = TSTATE_NONE;
1446 load_reg( R_EAX, Rn );
1447 check_walign16( R_EAX );
1448 MMU_TRANSLATE_WRITE( R_EAX )
1449 MEM_WRITE_WORD_CACHED( R_EAX, Rm, Rn );
1450 sh4_x86.tstate = TSTATE_NONE;
1454 load_reg( R_EAX, Rn );
1455 ADD_imm8s_r32( -2, R_EAX );
1456 check_walign16( R_EAX );
1457 MMU_TRANSLATE_WRITE( R_EAX );
1458 ADD_imm8s_sh4r( -2, REG_OFFSET(r[Rn]) );
1459 MEM_WRITE_WORD_CACHED( R_EAX, Rm, Rn );
1460 sh4_x86.tstate = TSTATE_NONE;
1462 MOV.W Rm, @(R0, Rn) {:
1464 load_reg( R_EAX, 0 );
1465 load_reg( R_ECX, Rn );
1466 ADD_r32_r32( R_ECX, R_EAX );
1467 check_walign16( R_EAX );
1468 MMU_TRANSLATE_WRITE( R_EAX );
1469 MEM_WRITE_WORD_CACHED( R_EAX, Rm, 0 );
1470 sh4_x86.tstate = TSTATE_NONE;
1472 MOV.W R0, @(disp, GBR) {:
1474 load_spreg( R_EAX, R_GBR );
1475 ADD_imm32_r32( disp, R_EAX );
1476 check_walign16( R_EAX );
1477 MMU_TRANSLATE_WRITE( R_EAX );
1478 MEM_WRITE_WORD_CACHED( R_EAX, 0, 16 );
1479 sh4_x86.tstate = TSTATE_NONE;
1481 MOV.W R0, @(disp, Rn) {:
1483 load_reg( R_EAX, Rn );
1484 ADD_imm32_r32( disp, R_EAX );
1485 check_walign16( R_EAX );
1486 MMU_TRANSLATE_WRITE( R_EAX );
1487 MEM_WRITE_WORD_CACHED( R_EAX, 0, Rn );
1488 sh4_x86.tstate = TSTATE_NONE;
1492 load_reg( R_EAX, Rm );
1493 check_ralign16( R_EAX );
1494 MMU_TRANSLATE_READ( R_EAX );
1495 MEM_READ_WORD_CACHED( R_EAX, R_EAX, Rm );
1496 store_reg( R_EAX, Rn );
1497 sh4_x86.tstate = TSTATE_NONE;
1501 load_reg( R_EAX, Rm );
1502 check_ralign16( R_EAX );
1503 MMU_TRANSLATE_READ( R_EAX );
1504 ADD_imm8s_sh4r( 2, REG_OFFSET(r[Rm]) );
1505 MEM_READ_WORD_CACHED( R_EAX, R_EAX, Rm );
1506 store_reg( R_EAX, Rn );
1507 sh4_x86.tstate = TSTATE_NONE;
1509 MOV.W @(R0, Rm), Rn {:
1511 load_reg( R_EAX, 0 );
1512 load_reg( R_ECX, Rm );
1513 ADD_r32_r32( R_ECX, R_EAX );
1514 check_ralign16( R_EAX );
1515 MMU_TRANSLATE_READ( R_EAX );
1516 MEM_READ_WORD_CACHED( R_EAX, R_EAX, 0 );
1517 store_reg( R_EAX, Rn );
1518 sh4_x86.tstate = TSTATE_NONE;
1520 MOV.W @(disp, GBR), R0 {:
1522 load_spreg( R_EAX, R_GBR );
1523 ADD_imm32_r32( disp, R_EAX );
1524 check_ralign16( R_EAX );
1525 MMU_TRANSLATE_READ( R_EAX );
1526 MEM_READ_WORD_CACHED( R_EAX, R_EAX, 16 );
1527 store_reg( R_EAX, 0 );
1528 sh4_x86.tstate = TSTATE_NONE;
1530 MOV.W @(disp, PC), Rn {:
1532 if( sh4_x86.in_delay_slot ) {
1535 // See comments for MOV.L @(disp, PC), Rn
1536 uint32_t target = pc + disp + 4;
1537 if( IS_IN_ICACHE(target) ) {
1538 sh4ptr_t ptr = GET_ICACHE_PTR(target);
1539 MOV_moff32_EAX( ptr );
1540 MOVSX_r16_r32( R_EAX, R_EAX );
1542 load_imm32( R_EAX, (pc - sh4_x86.block_start_pc) + disp + 4 );
1543 ADD_sh4r_r32( R_PC, R_EAX );
1544 MMU_TRANSLATE_READ( R_EAX );
1545 MEM_READ_WORD( R_EAX, R_EAX );
1546 sh4_x86.tstate = TSTATE_NONE;
1548 store_reg( R_EAX, Rn );
1551 MOV.W @(disp, Rm), R0 {:
1553 load_reg( R_EAX, Rm );
1554 ADD_imm32_r32( disp, R_EAX );
1555 check_ralign16( R_EAX );
1556 MMU_TRANSLATE_READ( R_EAX );
1557 MEM_READ_WORD_CACHED( R_EAX, R_EAX, Rm );
1558 store_reg( R_EAX, 0 );
1559 sh4_x86.tstate = TSTATE_NONE;
1561 MOVA @(disp, PC), R0 {:
1563 if( sh4_x86.in_delay_slot ) {
1566 load_imm32( R_ECX, (pc - sh4_x86.block_start_pc) + disp + 4 - (pc&0x03) );
1567 ADD_sh4r_r32( R_PC, R_ECX );
1568 store_reg( R_ECX, 0 );
1569 sh4_x86.tstate = TSTATE_NONE;
1573 COUNT_INST(I_MOVCA);
1574 load_reg( R_EAX, Rn );
1575 check_walign32( R_EAX );
1576 MMU_TRANSLATE_WRITE( R_EAX );
1577 MEM_WRITE_LONG_CACHED( R_EAX, 0, Rn );
1578 sh4_x86.tstate = TSTATE_NONE;
1581 /* Control transfer instructions */
1584 if( sh4_x86.in_delay_slot ) {
1587 sh4vma_t target = disp + pc + 4;
1588 JT_rel8( nottaken );
1589 exit_block_rel(target, pc+2 );
1590 JMP_TARGET(nottaken);
1596 if( sh4_x86.in_delay_slot ) {
1599 sh4_x86.in_delay_slot = DELAY_PC;
1600 if( UNTRANSLATABLE(pc+2) ) {
1601 load_imm32( R_EAX, pc + 4 - sh4_x86.block_start_pc );
1603 ADD_imm32_r32( disp, R_EAX );
1604 JMP_TARGET(nottaken);
1605 ADD_sh4r_r32( R_PC, R_EAX );
1606 store_spreg( R_EAX, R_NEW_PC );
1607 exit_block_emu(pc+2);
1608 sh4_x86.branch_taken = TRUE;
1611 if( sh4_x86.tstate == TSTATE_NONE ) {
1612 CMP_imm8s_sh4r( 1, R_T );
1613 sh4_x86.tstate = TSTATE_E;
1615 sh4vma_t target = disp + pc + 4;
1616 OP(0x0F); OP(0x80+sh4_x86.tstate); uint32_t *patch = (uint32_t *)xlat_output; OP32(0); // JT rel32
1617 int save_tstate = sh4_x86.tstate;
1618 sh4_translate_instruction(pc+2);
1619 exit_block_rel( target, pc+4 );
1622 *patch = (xlat_output - ((uint8_t *)patch)) - 4;
1623 sh4_x86.tstate = save_tstate;
1624 sh4_translate_instruction(pc+2);
1631 if( sh4_x86.in_delay_slot ) {
1634 sh4_x86.in_delay_slot = DELAY_PC;
1635 sh4_x86.branch_taken = TRUE;
1636 if( UNTRANSLATABLE(pc+2) ) {
1637 load_spreg( R_EAX, R_PC );
1638 ADD_imm32_r32( pc + disp + 4 - sh4_x86.block_start_pc, R_EAX );
1639 store_spreg( R_EAX, R_NEW_PC );
1640 exit_block_emu(pc+2);
1643 sh4_translate_instruction( pc + 2 );
1644 exit_block_rel( disp + pc + 4, pc+4 );
1651 if( sh4_x86.in_delay_slot ) {
1654 load_spreg( R_EAX, R_PC );
1655 ADD_imm32_r32( pc + 4 - sh4_x86.block_start_pc, R_EAX );
1656 ADD_sh4r_r32( REG_OFFSET(r[Rn]), R_EAX );
1657 store_spreg( R_EAX, R_NEW_PC );
1658 sh4_x86.in_delay_slot = DELAY_PC;
1659 sh4_x86.tstate = TSTATE_NONE;
1660 sh4_x86.branch_taken = TRUE;
1661 if( UNTRANSLATABLE(pc+2) ) {
1662 exit_block_emu(pc+2);
1665 sh4_translate_instruction( pc + 2 );
1666 exit_block_newpcset(pc+2);
1673 if( sh4_x86.in_delay_slot ) {
1676 load_spreg( R_EAX, R_PC );
1677 ADD_imm32_r32( pc + 4 - sh4_x86.block_start_pc, R_EAX );
1678 store_spreg( R_EAX, R_PR );
1679 sh4_x86.in_delay_slot = DELAY_PC;
1680 sh4_x86.branch_taken = TRUE;
1681 sh4_x86.tstate = TSTATE_NONE;
1682 if( UNTRANSLATABLE(pc+2) ) {
1683 ADD_imm32_r32( disp, R_EAX );
1684 store_spreg( R_EAX, R_NEW_PC );
1685 exit_block_emu(pc+2);
1688 sh4_translate_instruction( pc + 2 );
1689 exit_block_rel( disp + pc + 4, pc+4 );
1696 if( sh4_x86.in_delay_slot ) {
1699 load_spreg( R_EAX, R_PC );
1700 ADD_imm32_r32( pc + 4 - sh4_x86.block_start_pc, R_EAX );
1701 store_spreg( R_EAX, R_PR );
1702 ADD_sh4r_r32( REG_OFFSET(r[Rn]), R_EAX );
1703 store_spreg( R_EAX, R_NEW_PC );
1705 sh4_x86.in_delay_slot = DELAY_PC;
1706 sh4_x86.tstate = TSTATE_NONE;
1707 sh4_x86.branch_taken = TRUE;
1708 if( UNTRANSLATABLE(pc+2) ) {
1709 exit_block_emu(pc+2);
1712 sh4_translate_instruction( pc + 2 );
1713 exit_block_newpcset(pc+2);
1720 if( sh4_x86.in_delay_slot ) {
1723 sh4vma_t target = disp + pc + 4;
1724 JF_rel8( nottaken );
1725 exit_block_rel(target, pc+2 );
1726 JMP_TARGET(nottaken);
1732 if( sh4_x86.in_delay_slot ) {
1735 sh4_x86.in_delay_slot = DELAY_PC;
1736 if( UNTRANSLATABLE(pc+2) ) {
1737 load_imm32( R_EAX, pc + 4 - sh4_x86.block_start_pc );
1739 ADD_imm32_r32( disp, R_EAX );
1740 JMP_TARGET(nottaken);
1741 ADD_sh4r_r32( R_PC, R_EAX );
1742 store_spreg( R_EAX, R_NEW_PC );
1743 exit_block_emu(pc+2);
1744 sh4_x86.branch_taken = TRUE;
1747 if( sh4_x86.tstate == TSTATE_NONE ) {
1748 CMP_imm8s_sh4r( 1, R_T );
1749 sh4_x86.tstate = TSTATE_E;
1751 OP(0x0F); OP(0x80+(sh4_x86.tstate^1)); uint32_t *patch = (uint32_t *)xlat_output; OP32(0); // JF rel32
1752 int save_tstate = sh4_x86.tstate;
1753 sh4_translate_instruction(pc+2);
1754 exit_block_rel( disp + pc + 4, pc+4 );
1756 *patch = (xlat_output - ((uint8_t *)patch)) - 4;
1757 sh4_x86.tstate = save_tstate;
1758 sh4_translate_instruction(pc+2);
1765 if( sh4_x86.in_delay_slot ) {
1768 load_reg( R_ECX, Rn );
1769 store_spreg( R_ECX, R_NEW_PC );
1770 sh4_x86.in_delay_slot = DELAY_PC;
1771 sh4_x86.branch_taken = TRUE;
1772 if( UNTRANSLATABLE(pc+2) ) {
1773 exit_block_emu(pc+2);
1776 sh4_translate_instruction(pc+2);
1777 exit_block_newpcset(pc+2);
1784 if( sh4_x86.in_delay_slot ) {
1787 load_spreg( R_EAX, R_PC );
1788 ADD_imm32_r32( pc + 4 - sh4_x86.block_start_pc, R_EAX );
1789 store_spreg( R_EAX, R_PR );
1790 load_reg( R_ECX, Rn );
1791 store_spreg( R_ECX, R_NEW_PC );
1792 sh4_x86.in_delay_slot = DELAY_PC;
1793 sh4_x86.branch_taken = TRUE;
1794 sh4_x86.tstate = TSTATE_NONE;
1795 if( UNTRANSLATABLE(pc+2) ) {
1796 exit_block_emu(pc+2);
1799 sh4_translate_instruction(pc+2);
1800 exit_block_newpcset(pc+2);
1807 if( sh4_x86.in_delay_slot ) {
1811 load_spreg( R_ECX, R_SPC );
1812 store_spreg( R_ECX, R_NEW_PC );
1813 load_spreg( R_EAX, R_SSR );
1814 call_func1( sh4_write_sr, R_EAX );
1815 sh4_x86.in_delay_slot = DELAY_PC;
1816 sh4_x86.priv_checked = FALSE;
1817 sh4_x86.fpuen_checked = FALSE;
1818 sh4_x86.tstate = TSTATE_NONE;
1819 sh4_x86.branch_taken = TRUE;
1820 if( UNTRANSLATABLE(pc+2) ) {
1821 exit_block_emu(pc+2);
1824 sh4_translate_instruction(pc+2);
1825 exit_block_newpcset(pc+2);
1832 if( sh4_x86.in_delay_slot ) {
1835 load_spreg( R_ECX, R_PR );
1836 store_spreg( R_ECX, R_NEW_PC );
1837 sh4_x86.in_delay_slot = DELAY_PC;
1838 sh4_x86.branch_taken = TRUE;
1839 if( UNTRANSLATABLE(pc+2) ) {
1840 exit_block_emu(pc+2);
1843 sh4_translate_instruction(pc+2);
1844 exit_block_newpcset(pc+2);
1850 COUNT_INST(I_TRAPA);
1851 if( sh4_x86.in_delay_slot ) {
1854 load_imm32( R_ECX, pc+2 - sh4_x86.block_start_pc ); // 5
1855 ADD_r32_sh4r( R_ECX, R_PC );
1856 load_imm32( R_EAX, imm );
1857 call_func1( sh4_raise_trap, R_EAX );
1858 sh4_x86.tstate = TSTATE_NONE;
1859 exit_block_pcset(pc);
1860 sh4_x86.branch_taken = TRUE;
1865 COUNT_INST(I_UNDEF);
1866 if( sh4_x86.in_delay_slot ) {
1869 JMP_exc(EXC_ILLEGAL);
1875 COUNT_INST(I_CLRMAC);
1876 XOR_r32_r32(R_EAX, R_EAX);
1877 store_spreg( R_EAX, R_MACL );
1878 store_spreg( R_EAX, R_MACH );
1879 sh4_x86.tstate = TSTATE_NONE;
1885 sh4_x86.tstate = TSTATE_NONE;
1891 sh4_x86.tstate = TSTATE_C;
1897 sh4_x86.tstate = TSTATE_NONE;
1903 sh4_x86.tstate = TSTATE_C;
1906 /* Floating point moves */
1908 COUNT_INST(I_FMOV1);
1910 if( sh4_x86.double_size ) {
1911 load_dr0( R_EAX, FRm );
1912 load_dr1( R_ECX, FRm );
1913 store_dr0( R_EAX, FRn );
1914 store_dr1( R_ECX, FRn );
1916 load_fr( R_EAX, FRm ); // SZ=0 branch
1917 store_fr( R_EAX, FRn );
1921 COUNT_INST(I_FMOV2);
1923 load_reg( R_EAX, Rn );
1924 if( sh4_x86.double_size ) {
1925 check_walign64( R_EAX );
1926 MMU_TRANSLATE_WRITE( R_EAX );
1927 MEM_WRITE_DOUBLE_CACHED( R_EAX, FRm, Rn );
1929 check_walign32( R_EAX );
1930 MMU_TRANSLATE_WRITE( R_EAX );
1931 MEM_WRITE_FLOAT_CACHED( R_EAX, FRm, Rn );
1933 sh4_x86.tstate = TSTATE_NONE;
1936 COUNT_INST(I_FMOV5);
1938 load_reg( R_EAX, Rm );
1939 if( sh4_x86.double_size ) {
1940 check_ralign64( R_EAX );
1941 MMU_TRANSLATE_READ( R_EAX );
1942 MEM_READ_DOUBLE_CACHED( R_EAX, R_EDX, R_EAX, Rm );
1943 store_dr0( R_EDX, FRn );
1944 store_dr1( R_EAX, FRn );
1946 check_ralign32( R_EAX );
1947 MMU_TRANSLATE_READ( R_EAX );
1948 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
1949 store_fr( R_EAX, FRn );
1951 sh4_x86.tstate = TSTATE_NONE;
1954 COUNT_INST(I_FMOV3);
1956 load_reg( R_EAX, Rn );
1957 if( sh4_x86.double_size ) {
1958 check_walign64( R_EAX );
1959 LEA_r32disp8_r32( R_EAX, -8, R_EAX );
1960 MMU_TRANSLATE_WRITE( R_EAX );
1961 ADD_imm8s_sh4r(-8,REG_OFFSET(r[Rn]));
1962 MEM_WRITE_DOUBLE_CACHED( R_EAX, FRm, Rn );
1964 check_walign32( R_EAX );
1965 LEA_r32disp8_r32( R_EAX, -4, R_EAX );
1966 MMU_TRANSLATE_WRITE( R_EAX );
1967 ADD_imm8s_sh4r(-4,REG_OFFSET(r[Rn]));
1968 MEM_WRITE_FLOAT_CACHED( R_EAX, FRm, Rn );
1970 sh4_x86.tstate = TSTATE_NONE;
1973 COUNT_INST(I_FMOV6);
1975 load_reg( R_EAX, Rm );
1976 if( sh4_x86.double_size ) {
1977 check_ralign64( R_EAX );
1978 MMU_TRANSLATE_READ( R_EAX );
1979 ADD_imm8s_sh4r( 8, REG_OFFSET(r[Rm]) );
1980 MEM_READ_DOUBLE_CACHED( R_EAX, R_EDX, R_EAX, Rm );
1981 store_dr0( R_EDX, FRn );
1982 store_dr1( R_EAX, FRn );
1984 check_ralign32( R_EAX );
1985 MMU_TRANSLATE_READ( R_EAX );
1986 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
1987 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
1988 store_fr( R_EAX, FRn );
1990 sh4_x86.tstate = TSTATE_NONE;
1992 FMOV FRm, @(R0, Rn) {:
1993 COUNT_INST(I_FMOV4);
1995 load_reg( R_EAX, Rn );
1996 ADD_sh4r_r32( REG_OFFSET(r[0]), R_EAX );
1997 if( sh4_x86.double_size ) {
1998 check_walign64( R_EAX );
1999 MMU_TRANSLATE_WRITE( R_EAX );
2000 MEM_WRITE_DOUBLE_CACHED( R_EAX, FRm, 0 );
2002 check_walign32( R_EAX );
2003 MMU_TRANSLATE_WRITE( R_EAX );
2004 MEM_WRITE_FLOAT_CACHED( R_EAX, FRm, 0 );
2006 sh4_x86.tstate = TSTATE_NONE;
2008 FMOV @(R0, Rm), FRn {:
2009 COUNT_INST(I_FMOV7);
2011 load_reg( R_EAX, Rm );
2012 ADD_sh4r_r32( REG_OFFSET(r[0]), R_EAX );
2013 if( sh4_x86.double_size ) {
2014 check_ralign64( R_EAX );
2015 MMU_TRANSLATE_READ( R_EAX );
2016 MEM_READ_DOUBLE_CACHED( R_EAX, R_ECX, R_EAX, 0 );
2017 store_dr0( R_ECX, FRn );
2018 store_dr1( R_EAX, FRn );
2020 check_ralign32( R_EAX );
2021 MMU_TRANSLATE_READ( R_EAX );
2022 MEM_READ_LONG_CACHED( R_EAX, R_EAX, 0 );
2023 store_fr( R_EAX, FRn );
2025 sh4_x86.tstate = TSTATE_NONE;
2027 FLDI0 FRn {: /* IFF PR=0 */
2028 COUNT_INST(I_FLDI0);
2030 if( sh4_x86.double_prec == 0 ) {
2031 XOR_r32_r32( R_EAX, R_EAX );
2032 store_fr( R_EAX, FRn );
2034 sh4_x86.tstate = TSTATE_NONE;
2036 FLDI1 FRn {: /* IFF PR=0 */
2037 COUNT_INST(I_FLDI1);
2039 if( sh4_x86.double_prec == 0 ) {
2040 load_imm32(R_EAX, 0x3F800000);
2041 store_fr( R_EAX, FRn );
2046 COUNT_INST(I_FLOAT);
2049 if( sh4_x86.double_prec ) {
2058 if( sh4_x86.double_prec ) {
2063 load_ptr( R_ECX, &max_int );
2064 FILD_r32ind( R_ECX );
2067 load_ptr( R_ECX, &min_int ); // 5
2068 FILD_r32ind( R_ECX ); // 2
2070 JAE_rel8( sat2 ); // 2
2071 load_ptr( R_EAX, &save_fcw );
2072 FNSTCW_r32ind( R_EAX );
2073 load_ptr( R_EDX, &trunc_fcw );
2074 FLDCW_r32ind( R_EDX );
2075 FISTP_sh4r(R_FPUL); // 3
2076 FLDCW_r32ind( R_EAX );
2081 MOV_r32ind_r32( R_ECX, R_ECX ); // 2
2082 store_spreg( R_ECX, R_FPUL );
2085 sh4_x86.tstate = TSTATE_NONE;
2090 load_fr( R_EAX, FRm );
2091 store_spreg( R_EAX, R_FPUL );
2096 load_spreg( R_EAX, R_FPUL );
2097 store_fr( R_EAX, FRn );
2100 COUNT_INST(I_FCNVDS);
2102 if( sh4_x86.double_prec ) {
2108 COUNT_INST(I_FCNVSD);
2110 if( sh4_x86.double_prec ) {
2116 /* Floating point instructions */
2120 if( sh4_x86.double_prec ) {
2133 if( sh4_x86.double_prec ) {
2148 if( sh4_x86.double_prec ) {
2160 FMAC FR0, FRm, FRn {:
2163 if( sh4_x86.double_prec ) {
2183 if( sh4_x86.double_prec ) {
2198 if( sh4_x86.double_prec ) {
2209 COUNT_INST(I_FSRRA);
2211 if( sh4_x86.double_prec == 0 ) {
2220 COUNT_INST(I_FSQRT);
2222 if( sh4_x86.double_prec ) {
2235 if( sh4_x86.double_prec ) {
2249 COUNT_INST(I_FCMPEQ);
2251 if( sh4_x86.double_prec ) {
2261 sh4_x86.tstate = TSTATE_E;
2264 COUNT_INST(I_FCMPGT);
2266 if( sh4_x86.double_prec ) {
2276 sh4_x86.tstate = TSTATE_A;
2282 if( sh4_x86.double_prec == 0 ) {
2283 LEA_sh4r_rptr( REG_OFFSET(fr[0][FRn&0x0E]), R_EDX );
2284 load_spreg( R_EAX, R_FPUL );
2285 call_func2( sh4_fsca, R_EAX, R_EDX );
2287 sh4_x86.tstate = TSTATE_NONE;
2292 if( sh4_x86.double_prec == 0 ) {
2293 if( sh4_x86.sse3_enabled ) {
2294 MOVAPS_sh4r_xmm( REG_OFFSET(fr[0][FVm<<2]), 4 );
2295 MULPS_sh4r_xmm( REG_OFFSET(fr[0][FVn<<2]), 4 );
2296 HADDPS_xmm_xmm( 4, 4 );
2297 HADDPS_xmm_xmm( 4, 4 );
2298 MOVSS_xmm_sh4r( 4, REG_OFFSET(fr[0][(FVn<<2)+2]) );
2303 push_fr( (FVm<<2)+1);
2304 push_fr( (FVn<<2)+1);
2307 push_fr( (FVm<<2)+2);
2308 push_fr( (FVn<<2)+2);
2311 push_fr( (FVm<<2)+3);
2312 push_fr( (FVn<<2)+3);
2315 pop_fr( (FVn<<2)+3);
2322 if( sh4_x86.double_prec == 0 ) {
2323 if( sh4_x86.sse3_enabled ) {
2324 MOVAPS_sh4r_xmm( REG_OFFSET(fr[1][0]), 1 ); // M1 M0 M3 M2
2325 MOVAPS_sh4r_xmm( REG_OFFSET(fr[1][4]), 0 ); // M5 M4 M7 M6
2326 MOVAPS_sh4r_xmm( REG_OFFSET(fr[1][8]), 3 ); // M9 M8 M11 M10
2327 MOVAPS_sh4r_xmm( REG_OFFSET(fr[1][12]), 2 );// M13 M12 M15 M14
2329 MOVSLDUP_sh4r_xmm( REG_OFFSET(fr[0][FVn<<2]), 4 ); // V1 V1 V3 V3
2330 MOVSHDUP_sh4r_xmm( REG_OFFSET(fr[0][FVn<<2]), 5 ); // V0 V0 V2 V2
2331 MOVAPS_xmm_xmm( 4, 6 );
2332 MOVAPS_xmm_xmm( 5, 7 );
2333 MOVLHPS_xmm_xmm( 4, 4 ); // V1 V1 V1 V1
2334 MOVHLPS_xmm_xmm( 6, 6 ); // V3 V3 V3 V3
2335 MOVLHPS_xmm_xmm( 5, 5 ); // V0 V0 V0 V0
2336 MOVHLPS_xmm_xmm( 7, 7 ); // V2 V2 V2 V2
2337 MULPS_xmm_xmm( 0, 4 );
2338 MULPS_xmm_xmm( 1, 5 );
2339 MULPS_xmm_xmm( 2, 6 );
2340 MULPS_xmm_xmm( 3, 7 );
2341 ADDPS_xmm_xmm( 5, 4 );
2342 ADDPS_xmm_xmm( 7, 6 );
2343 ADDPS_xmm_xmm( 6, 4 );
2344 MOVAPS_xmm_sh4r( 4, REG_OFFSET(fr[0][FVn<<2]) );
2346 LEA_sh4r_rptr( REG_OFFSET(fr[0][FVn<<2]), R_EAX );
2347 call_func1( sh4_ftrv, R_EAX );
2350 sh4_x86.tstate = TSTATE_NONE;
2354 COUNT_INST(I_FRCHG);
2356 load_spreg( R_ECX, R_FPSCR );
2357 XOR_imm32_r32( FPSCR_FR, R_ECX );
2358 store_spreg( R_ECX, R_FPSCR );
2359 call_func0( sh4_switch_fr_banks );
2360 sh4_x86.tstate = TSTATE_NONE;
2363 COUNT_INST(I_FSCHG);
2365 load_spreg( R_ECX, R_FPSCR );
2366 XOR_imm32_r32( FPSCR_SZ, R_ECX );
2367 store_spreg( R_ECX, R_FPSCR );
2368 sh4_x86.tstate = TSTATE_NONE;
2369 sh4_x86.double_size = !sh4_x86.double_size;
2372 /* Processor control instructions */
2374 COUNT_INST(I_LDCSR);
2375 if( sh4_x86.in_delay_slot ) {
2379 load_reg( R_EAX, Rm );
2380 call_func1( sh4_write_sr, R_EAX );
2381 sh4_x86.priv_checked = FALSE;
2382 sh4_x86.fpuen_checked = FALSE;
2383 sh4_x86.tstate = TSTATE_NONE;
2388 load_reg( R_EAX, Rm );
2389 store_spreg( R_EAX, R_GBR );
2394 load_reg( R_EAX, Rm );
2395 store_spreg( R_EAX, R_VBR );
2396 sh4_x86.tstate = TSTATE_NONE;
2401 load_reg( R_EAX, Rm );
2402 store_spreg( R_EAX, R_SSR );
2403 sh4_x86.tstate = TSTATE_NONE;
2408 load_reg( R_EAX, Rm );
2409 store_spreg( R_EAX, R_SGR );
2410 sh4_x86.tstate = TSTATE_NONE;
2415 load_reg( R_EAX, Rm );
2416 store_spreg( R_EAX, R_SPC );
2417 sh4_x86.tstate = TSTATE_NONE;
2422 load_reg( R_EAX, Rm );
2423 store_spreg( R_EAX, R_DBR );
2424 sh4_x86.tstate = TSTATE_NONE;
2429 load_reg( R_EAX, Rm );
2430 store_spreg( R_EAX, REG_OFFSET(r_bank[Rn_BANK]) );
2431 sh4_x86.tstate = TSTATE_NONE;
2435 load_reg( R_EAX, Rm );
2436 check_ralign32( R_EAX );
2437 MMU_TRANSLATE_READ( R_EAX );
2438 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2439 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2440 store_spreg( R_EAX, R_GBR );
2441 sh4_x86.tstate = TSTATE_NONE;
2444 COUNT_INST(I_LDCSRM);
2445 if( sh4_x86.in_delay_slot ) {
2449 load_reg( R_EAX, Rm );
2450 check_ralign32( R_EAX );
2451 MMU_TRANSLATE_READ( R_EAX );
2452 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2453 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2454 call_func1( sh4_write_sr, R_EAX );
2455 sh4_x86.priv_checked = FALSE;
2456 sh4_x86.fpuen_checked = FALSE;
2457 sh4_x86.tstate = TSTATE_NONE;
2463 load_reg( R_EAX, Rm );
2464 check_ralign32( R_EAX );
2465 MMU_TRANSLATE_READ( R_EAX );
2466 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2467 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2468 store_spreg( R_EAX, R_VBR );
2469 sh4_x86.tstate = TSTATE_NONE;
2474 load_reg( R_EAX, Rm );
2475 check_ralign32( R_EAX );
2476 MMU_TRANSLATE_READ( R_EAX );
2477 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2478 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2479 store_spreg( R_EAX, R_SSR );
2480 sh4_x86.tstate = TSTATE_NONE;
2485 load_reg( R_EAX, Rm );
2486 check_ralign32( R_EAX );
2487 MMU_TRANSLATE_READ( R_EAX );
2488 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2489 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2490 store_spreg( R_EAX, R_SGR );
2491 sh4_x86.tstate = TSTATE_NONE;
2496 load_reg( R_EAX, Rm );
2497 check_ralign32( R_EAX );
2498 MMU_TRANSLATE_READ( R_EAX );
2499 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2500 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2501 store_spreg( R_EAX, R_SPC );
2502 sh4_x86.tstate = TSTATE_NONE;
2507 load_reg( R_EAX, Rm );
2508 check_ralign32( R_EAX );
2509 MMU_TRANSLATE_READ( R_EAX );
2510 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2511 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2512 store_spreg( R_EAX, R_DBR );
2513 sh4_x86.tstate = TSTATE_NONE;
2515 LDC.L @Rm+, Rn_BANK {:
2518 load_reg( R_EAX, Rm );
2519 check_ralign32( R_EAX );
2520 MMU_TRANSLATE_READ( R_EAX );
2521 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2522 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2523 store_spreg( R_EAX, REG_OFFSET(r_bank[Rn_BANK]) );
2524 sh4_x86.tstate = TSTATE_NONE;
2527 COUNT_INST(I_LDSFPSCR);
2529 load_reg( R_EAX, Rm );
2530 call_func1( sh4_write_fpscr, R_EAX );
2531 sh4_x86.tstate = TSTATE_NONE;
2534 LDS.L @Rm+, FPSCR {:
2535 COUNT_INST(I_LDSFPSCRM);
2537 load_reg( R_EAX, Rm );
2538 check_ralign32( R_EAX );
2539 MMU_TRANSLATE_READ( R_EAX );
2540 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2541 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2542 call_func1( sh4_write_fpscr, R_EAX );
2543 sh4_x86.tstate = TSTATE_NONE;
2549 load_reg( R_EAX, Rm );
2550 store_spreg( R_EAX, R_FPUL );
2555 load_reg( R_EAX, Rm );
2556 check_ralign32( R_EAX );
2557 MMU_TRANSLATE_READ( R_EAX );
2558 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2559 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2560 store_spreg( R_EAX, R_FPUL );
2561 sh4_x86.tstate = TSTATE_NONE;
2565 load_reg( R_EAX, Rm );
2566 store_spreg( R_EAX, R_MACH );
2570 load_reg( R_EAX, Rm );
2571 check_ralign32( R_EAX );
2572 MMU_TRANSLATE_READ( R_EAX );
2573 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2574 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2575 store_spreg( R_EAX, R_MACH );
2576 sh4_x86.tstate = TSTATE_NONE;
2580 load_reg( R_EAX, Rm );
2581 store_spreg( R_EAX, R_MACL );
2585 load_reg( R_EAX, Rm );
2586 check_ralign32( R_EAX );
2587 MMU_TRANSLATE_READ( R_EAX );
2588 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2589 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2590 store_spreg( R_EAX, R_MACL );
2591 sh4_x86.tstate = TSTATE_NONE;
2595 load_reg( R_EAX, Rm );
2596 store_spreg( R_EAX, R_PR );
2600 load_reg( R_EAX, Rm );
2601 check_ralign32( R_EAX );
2602 MMU_TRANSLATE_READ( R_EAX );
2603 ADD_imm8s_sh4r( 4, REG_OFFSET(r[Rm]) );
2604 MEM_READ_LONG_CACHED( R_EAX, R_EAX, Rm );
2605 store_spreg( R_EAX, R_PR );
2606 sh4_x86.tstate = TSTATE_NONE;
2609 COUNT_INST(I_LDTLB);
2610 call_func0( MMU_ldtlb );
2611 sh4_x86.tstate = TSTATE_NONE;
2620 COUNT_INST(I_OCBWB);
2624 load_reg( R_EAX, Rn );
2625 MOV_r32_r32( R_EAX, R_ECX );
2626 AND_imm32_r32( 0xFC000000, R_ECX );
2627 CMP_imm32_r32( 0xE0000000, R_ECX );
2629 if( sh4_x86.tlb_on ) {
2630 call_func1( sh4_flush_store_queue_mmu, R_EAX );
2631 TEST_r32_r32( R_EAX, R_EAX );
2634 call_func1( sh4_flush_store_queue, R_EAX );
2637 sh4_x86.tstate = TSTATE_NONE;
2640 COUNT_INST(I_SLEEP);
2642 call_func0( sh4_sleep );
2643 sh4_x86.tstate = TSTATE_NONE;
2644 sh4_x86.in_delay_slot = DELAY_NONE;
2648 COUNT_INST(I_STCSR);
2650 call_func0(sh4_read_sr);
2651 store_reg( R_EAX, Rn );
2652 sh4_x86.tstate = TSTATE_NONE;
2656 load_spreg( R_EAX, R_GBR );
2657 store_reg( R_EAX, Rn );
2662 load_spreg( R_EAX, R_VBR );
2663 store_reg( R_EAX, Rn );
2664 sh4_x86.tstate = TSTATE_NONE;
2669 load_spreg( R_EAX, R_SSR );
2670 store_reg( R_EAX, Rn );
2671 sh4_x86.tstate = TSTATE_NONE;
2676 load_spreg( R_EAX, R_SPC );
2677 store_reg( R_EAX, Rn );
2678 sh4_x86.tstate = TSTATE_NONE;
2683 load_spreg( R_EAX, R_SGR );
2684 store_reg( R_EAX, Rn );
2685 sh4_x86.tstate = TSTATE_NONE;
2690 load_spreg( R_EAX, R_DBR );
2691 store_reg( R_EAX, Rn );
2692 sh4_x86.tstate = TSTATE_NONE;
2697 load_spreg( R_EAX, REG_OFFSET(r_bank[Rm_BANK]) );
2698 store_reg( R_EAX, Rn );
2699 sh4_x86.tstate = TSTATE_NONE;
2702 COUNT_INST(I_STCSRM);
2704 load_reg( R_EAX, Rn );
2705 check_walign32( R_EAX );
2706 ADD_imm8s_r32( -4, R_EAX );
2707 MMU_TRANSLATE_WRITE( R_EAX );
2708 MOV_r32_r32( R_EAX, R_EBX );
2709 call_func0( sh4_read_sr );
2710 MOV_r32_r32( R_EAX, R_EDX );
2711 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2712 MEM_WRITE_LONG( R_EBX, R_EDX );
2713 sh4_x86.tstate = TSTATE_NONE;
2718 load_reg( R_EAX, Rn );
2719 check_walign32( R_EAX );
2720 ADD_imm8s_r32( -4, R_EAX );
2721 MMU_TRANSLATE_WRITE( R_EAX );
2722 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2723 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_VBR, Rn );
2724 sh4_x86.tstate = TSTATE_NONE;
2729 load_reg( R_EAX, Rn );
2730 check_walign32( R_EAX );
2731 ADD_imm8s_r32( -4, R_EAX );
2732 MMU_TRANSLATE_WRITE( R_EAX );
2733 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2734 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_SSR, Rn );
2735 sh4_x86.tstate = TSTATE_NONE;
2740 load_reg( R_EAX, Rn );
2741 check_walign32( R_EAX );
2742 ADD_imm8s_r32( -4, R_EAX );
2743 MMU_TRANSLATE_WRITE( R_EAX );
2744 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2745 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_SPC, Rn );
2746 sh4_x86.tstate = TSTATE_NONE;
2751 load_reg( R_EAX, Rn );
2752 check_walign32( R_EAX );
2753 ADD_imm8s_r32( -4, R_EAX );
2754 MMU_TRANSLATE_WRITE( R_EAX );
2755 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2756 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_SGR, Rn );
2757 sh4_x86.tstate = TSTATE_NONE;
2762 load_reg( R_EAX, Rn );
2763 check_walign32( R_EAX );
2764 ADD_imm8s_r32( -4, R_EAX );
2765 MMU_TRANSLATE_WRITE( R_EAX );
2766 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2767 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_DBR, Rn );
2768 sh4_x86.tstate = TSTATE_NONE;
2770 STC.L Rm_BANK, @-Rn {:
2773 load_reg( R_EAX, Rn );
2774 check_walign32( R_EAX );
2775 ADD_imm8s_r32( -4, R_EAX );
2776 MMU_TRANSLATE_WRITE( R_EAX );
2777 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2778 MEM_WRITE_LONG_CACHED_SP( R_EAX, REG_OFFSET(r_bank[Rm_BANK]), Rn );
2779 sh4_x86.tstate = TSTATE_NONE;
2783 load_reg( R_EAX, Rn );
2784 check_walign32( R_EAX );
2785 ADD_imm8s_r32( -4, R_EAX );
2786 MMU_TRANSLATE_WRITE( R_EAX );
2787 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2788 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_GBR, Rn );
2789 sh4_x86.tstate = TSTATE_NONE;
2792 COUNT_INST(I_STSFPSCR);
2794 load_spreg( R_EAX, R_FPSCR );
2795 store_reg( R_EAX, Rn );
2797 STS.L FPSCR, @-Rn {:
2798 COUNT_INST(I_STSFPSCRM);
2800 load_reg( R_EAX, Rn );
2801 check_walign32( R_EAX );
2802 ADD_imm8s_r32( -4, R_EAX );
2803 MMU_TRANSLATE_WRITE( R_EAX );
2804 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2805 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_FPSCR, Rn );
2806 sh4_x86.tstate = TSTATE_NONE;
2811 load_spreg( R_EAX, R_FPUL );
2812 store_reg( R_EAX, Rn );
2817 load_reg( R_EAX, Rn );
2818 check_walign32( R_EAX );
2819 ADD_imm8s_r32( -4, R_EAX );
2820 MMU_TRANSLATE_WRITE( R_EAX );
2821 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2822 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_FPUL, Rn );
2823 sh4_x86.tstate = TSTATE_NONE;
2827 load_spreg( R_EAX, R_MACH );
2828 store_reg( R_EAX, Rn );
2832 load_reg( R_EAX, Rn );
2833 check_walign32( R_EAX );
2834 ADD_imm8s_r32( -4, R_EAX );
2835 MMU_TRANSLATE_WRITE( R_EAX );
2836 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2837 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_MACH, Rn );
2838 sh4_x86.tstate = TSTATE_NONE;
2842 load_spreg( R_EAX, R_MACL );
2843 store_reg( R_EAX, Rn );
2847 load_reg( R_EAX, Rn );
2848 check_walign32( R_EAX );
2849 ADD_imm8s_r32( -4, R_EAX );
2850 MMU_TRANSLATE_WRITE( R_EAX );
2851 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2852 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_MACL, Rn );
2853 sh4_x86.tstate = TSTATE_NONE;
2857 load_spreg( R_EAX, R_PR );
2858 store_reg( R_EAX, Rn );
2862 load_reg( R_EAX, Rn );
2863 check_walign32( R_EAX );
2864 ADD_imm8s_r32( -4, R_EAX );
2865 MMU_TRANSLATE_WRITE( R_EAX );
2866 ADD_imm8s_sh4r( -4, REG_OFFSET(r[Rn]) );
2867 MEM_WRITE_LONG_CACHED_SP( R_EAX, R_PR, Rn );
2868 sh4_x86.tstate = TSTATE_NONE;
2873 /* Do nothing. Well, we could emit an 0x90, but what would really be the point? */
2876 sh4_x86.in_delay_slot = DELAY_NONE;
.