Path: blob/master/libmupen64plus/mupen64plus-core/src/r4300/x86/gr4300.c
2 views
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1* Mupen64plus - gr4300.c *2* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *3* Copyright (C) 2002 Hacktarux *4* *5* This program is free software; you can redistribute it and/or modify *6* it under the terms of the GNU General Public License as published by *7* the Free Software Foundation; either version 2 of the License, or *8* (at your option) any later version. *9* *10* This program is distributed in the hope that it will be useful, *11* but WITHOUT ANY WARRANTY; without even the implied warranty of *12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *13* GNU General Public License for more details. *14* *15* You should have received a copy of the GNU General Public License *16* along with this program; if not, write to the *17* Free Software Foundation, Inc., *18* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *19* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */2021#include "assemble.h"22#include "interpret.h"23#include "regcache.h"2425#include "api/debugger.h"2627#include "r4300/r4300.h"28#include "r4300/macros.h"29#include "r4300/interupt.h"30#include "r4300/ops.h"31#include "r4300/recomph.h"32#include "r4300/exception.h"3334#include "memory/memory.h"3536extern unsigned int op;3738static precomp_instr fake_instr;39#ifdef COMPARE_CORE40static int eax, ebx, ecx, edx, esp, ebp, esi, edi;41#endif4243int branch_taken;4445/* static functions */4647static void genupdate_count(unsigned int addr)48{49#ifndef COMPARE_CORE50#ifndef DBG51mov_reg32_imm32(EAX, addr);52sub_reg32_m32(EAX, (unsigned int*)(&last_addr));53shr_reg32_imm8(EAX, 1);54add_m32_reg32((unsigned int*)(&Count), EAX);55#else56mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));57mov_reg32_imm32(EAX, (unsigned int)update_count);58call_reg32(EAX);59#endif60#else61mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));62mov_reg32_imm32(EAX, (unsigned int)update_count);63call_reg32(EAX);64#endif65}6667static void gencheck_interupt(unsigned int instr_structure)68{69mov_eax_memoffs32(&next_interupt);70cmp_reg32_m32(EAX, &Count);71ja_rj(17);72mov_m32_imm32((unsigned int*)(&PC), instr_structure); // 1073mov_reg32_imm32(EAX, (unsigned int)gen_interupt); // 574call_reg32(EAX); // 275}7677static void gencheck_interupt_out(unsigned int addr)78{79mov_eax_memoffs32(&next_interupt);80cmp_reg32_m32(EAX, &Count);81ja_rj(27);82mov_m32_imm32((unsigned int*)(&fake_instr.addr), addr);83mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(&fake_instr));84mov_reg32_imm32(EAX, (unsigned int)gen_interupt);85call_reg32(EAX);86}8788static void genbeq_test(void)89{90int rs_64bit = is64((unsigned int *)dst->f.i.rs);91int rt_64bit = is64((unsigned int *)dst->f.i.rt);9293if (!rs_64bit && !rt_64bit)94{95int rs = allocate_register((unsigned int *)dst->f.i.rs);96int rt = allocate_register((unsigned int *)dst->f.i.rt);9798cmp_reg32_reg32(rs, rt);99jne_rj(12);100mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10101jmp_imm_short(10); // 2102mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10103}104else if (rs_64bit == -1)105{106int rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);107int rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);108109cmp_reg32_m32(rt1, (unsigned int *)dst->f.i.rs);110jne_rj(20);111cmp_reg32_m32(rt2, ((unsigned int *)dst->f.i.rs)+1); // 6112jne_rj(12); // 2113mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10114jmp_imm_short(10); // 2115mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10116}117else if (rt_64bit == -1)118{119int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);120int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);121122cmp_reg32_m32(rs1, (unsigned int *)dst->f.i.rt);123jne_rj(20);124cmp_reg32_m32(rs2, ((unsigned int *)dst->f.i.rt)+1); // 6125jne_rj(12); // 2126mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10127jmp_imm_short(10); // 2128mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10129}130else131{132int rs1, rs2, rt1, rt2;133if (!rs_64bit)134{135rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);136rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);137rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);138rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);139}140else141{142rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);143rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);144rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);145rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);146}147cmp_reg32_reg32(rs1, rt1);148jne_rj(16);149cmp_reg32_reg32(rs2, rt2); // 2150jne_rj(12); // 2151mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10152jmp_imm_short(10); // 2153mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10154}155}156157static void genbne_test(void)158{159int rs_64bit = is64((unsigned int *)dst->f.i.rs);160int rt_64bit = is64((unsigned int *)dst->f.i.rt);161162if (!rs_64bit && !rt_64bit)163{164int rs = allocate_register((unsigned int *)dst->f.i.rs);165int rt = allocate_register((unsigned int *)dst->f.i.rt);166167cmp_reg32_reg32(rs, rt);168je_rj(12);169mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10170jmp_imm_short(10); // 2171mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10172}173else if (rs_64bit == -1)174{175int rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);176int rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);177178cmp_reg32_m32(rt1, (unsigned int *)dst->f.i.rs);179jne_rj(20);180cmp_reg32_m32(rt2, ((unsigned int *)dst->f.i.rs)+1); // 6181jne_rj(12); // 2182mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10183jmp_imm_short(10); // 2184mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10185}186else if (rt_64bit == -1)187{188int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);189int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);190191cmp_reg32_m32(rs1, (unsigned int *)dst->f.i.rt);192jne_rj(20);193cmp_reg32_m32(rs2, ((unsigned int *)dst->f.i.rt)+1); // 6194jne_rj(12); // 2195mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10196jmp_imm_short(10); // 2197mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10198}199else200{201int rs1, rs2, rt1, rt2;202if (!rs_64bit)203{204rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);205rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);206rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);207rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);208}209else210{211rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);212rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);213rt1 = allocate_64_register1((unsigned int *)dst->f.i.rt);214rt2 = allocate_64_register2((unsigned int *)dst->f.i.rt);215}216cmp_reg32_reg32(rs1, rt1);217jne_rj(16);218cmp_reg32_reg32(rs2, rt2); // 2219jne_rj(12); // 2220mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10221jmp_imm_short(10); // 2222mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10223}224}225226static void genblez_test(void)227{228int rs_64bit = is64((unsigned int *)dst->f.i.rs);229230if (!rs_64bit)231{232int rs = allocate_register((unsigned int *)dst->f.i.rs);233234cmp_reg32_imm32(rs, 0);235jg_rj(12);236mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10237jmp_imm_short(10); // 2238mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10239}240else if (rs_64bit == -1)241{242cmp_m32_imm32(((unsigned int *)dst->f.i.rs)+1, 0);243jg_rj(14);244jne_rj(24); // 2245cmp_m32_imm32((unsigned int *)dst->f.i.rs, 0); // 10246je_rj(12); // 2247mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10248jmp_imm_short(10); // 2249mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10250}251else252{253int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);254int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);255256cmp_reg32_imm32(rs2, 0);257jg_rj(10);258jne_rj(20); // 2259cmp_reg32_imm32(rs1, 0); // 6260je_rj(12); // 2261mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10262jmp_imm_short(10); // 2263mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10264}265}266267static void genbgtz_test(void)268{269int rs_64bit = is64((unsigned int *)dst->f.i.rs);270271if (!rs_64bit)272{273int rs = allocate_register((unsigned int *)dst->f.i.rs);274275cmp_reg32_imm32(rs, 0);276jle_rj(12);277mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10278jmp_imm_short(10); // 2279mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10280}281else if (rs_64bit == -1)282{283cmp_m32_imm32(((unsigned int *)dst->f.i.rs)+1, 0);284jl_rj(14);285jne_rj(24); // 2286cmp_m32_imm32((unsigned int *)dst->f.i.rs, 0); // 10287jne_rj(12); // 2288mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10289jmp_imm_short(10); // 2290mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10291}292else293{294int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);295int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);296297cmp_reg32_imm32(rs2, 0);298jl_rj(10);299jne_rj(20); // 2300cmp_reg32_imm32(rs1, 0); // 6301jne_rj(12); // 2302mov_m32_imm32((unsigned int *)(&branch_taken), 0); // 10303jmp_imm_short(10); // 2304mov_m32_imm32((unsigned int *)(&branch_taken), 1); // 10305}306}307308309/* global functions */310311void gennotcompiled(void)312{313free_all_registers();314simplify_access();315316mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst));317mov_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED);318call_reg32(EAX);319}320321void genlink_subblock(void)322{323free_all_registers();324jmp(dst->addr+4);325}326327#ifdef COMPARE_CORE328void gendebug(void)329{330free_all_registers();331mov_m32_reg32((unsigned int*)&eax, EAX);332mov_m32_reg32((unsigned int*)&ebx, EBX);333mov_m32_reg32((unsigned int*)&ecx, ECX);334mov_m32_reg32((unsigned int*)&edx, EDX);335mov_m32_reg32((unsigned int*)&esp, ESP);336mov_m32_reg32((unsigned int*)&ebp, EBP);337mov_m32_reg32((unsigned int*)&esi, ESI);338mov_m32_reg32((unsigned int*)&edi, EDI);339340mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst));341mov_m32_imm32((unsigned int*)(&op), (unsigned int)(src));342mov_reg32_imm32(EAX, (unsigned int) CoreCompareCallback);343call_reg32(EAX);344345mov_reg32_m32(EAX, (unsigned int*)&eax);346mov_reg32_m32(EBX, (unsigned int*)&ebx);347mov_reg32_m32(ECX, (unsigned int*)&ecx);348mov_reg32_m32(EDX, (unsigned int*)&edx);349mov_reg32_m32(ESP, (unsigned int*)&esp);350mov_reg32_m32(EBP, (unsigned int*)&ebp);351mov_reg32_m32(ESI, (unsigned int*)&esi);352mov_reg32_m32(EDI, (unsigned int*)&edi);353}354#endif355356void gencallinterp(unsigned long addr, int jump)357{358free_all_registers();359simplify_access();360if (jump)361mov_m32_imm32((unsigned int*)(&dyna_interp), 1);362mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst));363mov_reg32_imm32(EAX, addr);364call_reg32(EAX);365if (jump)366{367mov_m32_imm32((unsigned int*)(&dyna_interp), 0);368mov_reg32_imm32(EAX, (unsigned int)dyna_jump);369call_reg32(EAX);370}371}372373void gendelayslot(void)374{375mov_m32_imm32(&delay_slot, 1);376recompile_opcode();377378free_all_registers();379genupdate_count(dst->addr+4);380381mov_m32_imm32(&delay_slot, 0);382}383384void genni(void)385{386gencallinterp((unsigned int)cached_interpreter_table.NI, 0);387}388389void genreserved(void)390{391gencallinterp((unsigned int)cached_interpreter_table.RESERVED, 0);392}393394void genfin_block(void)395{396gencallinterp((unsigned int)cached_interpreter_table.FIN_BLOCK, 0);397}398399void gencheck_interupt_reg(void) // addr is in EAX400{401mov_reg32_m32(EBX, &next_interupt);402cmp_reg32_m32(EBX, &Count);403ja_rj(22);404mov_memoffs32_eax((unsigned int*)(&fake_instr.addr)); // 5405mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(&fake_instr)); // 10406mov_reg32_imm32(EAX, (unsigned int)gen_interupt); // 5407call_reg32(EAX); // 2408}409410void gennop(void)411{412}413414void genj(void)415{416#ifdef INTERPRET_J417gencallinterp((unsigned int)cached_interpreter_table.J, 1);418#else419unsigned int naddr;420421if (((dst->addr & 0xFFF) == 0xFFC &&422(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)423{424gencallinterp((unsigned int)cached_interpreter_table.J, 1);425return;426}427428gendelayslot();429naddr = ((dst-1)->f.j.inst_index<<2) | (dst->addr & 0xF0000000);430431mov_m32_imm32(&last_addr, naddr);432gencheck_interupt((unsigned int)&actual->block[(naddr-actual->start)/4]);433jmp(naddr);434#endif435}436437void genj_out(void)438{439#ifdef INTERPRET_J_OUT440gencallinterp((unsigned int)cached_interpreter_table.J_OUT, 1);441#else442unsigned int naddr;443444if (((dst->addr & 0xFFF) == 0xFFC &&445(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)446{447gencallinterp((unsigned int)cached_interpreter_table.J_OUT, 1);448return;449}450451gendelayslot();452naddr = ((dst-1)->f.j.inst_index<<2) | (dst->addr & 0xF0000000);453454mov_m32_imm32(&last_addr, naddr);455gencheck_interupt_out(naddr);456mov_m32_imm32(&jump_to_address, naddr);457mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));458mov_reg32_imm32(EAX, (unsigned int)jump_to_func);459call_reg32(EAX);460#endif461}462463void genj_idle(void)464{465#ifdef INTERPRET_J_IDLE466gencallinterp((unsigned int)cached_interpreter_table.J_IDLE, 1);467#else468if (((dst->addr & 0xFFF) == 0xFFC &&469(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)470{471gencallinterp((unsigned int)cached_interpreter_table.J_IDLE, 1);472return;473}474475mov_eax_memoffs32((unsigned int *)(&next_interupt));476sub_reg32_m32(EAX, (unsigned int *)(&Count));477cmp_reg32_imm8(EAX, 3);478jbe_rj(11);479480and_eax_imm32(0xFFFFFFFC); // 5481add_m32_reg32((unsigned int *)(&Count), EAX); // 6482483genj();484#endif485}486487void genjal(void)488{489#ifdef INTERPRET_JAL490gencallinterp((unsigned int)cached_interpreter_table.JAL, 1);491#else492unsigned int naddr;493494if (((dst->addr & 0xFFF) == 0xFFC &&495(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)496{497gencallinterp((unsigned int)cached_interpreter_table.JAL, 1);498return;499}500501gendelayslot();502503mov_m32_imm32((unsigned int *)(reg + 31), dst->addr + 4);504if (((dst->addr + 4) & 0x80000000))505mov_m32_imm32((unsigned int *)(®[31])+1, 0xFFFFFFFF);506else507mov_m32_imm32((unsigned int *)(®[31])+1, 0);508509naddr = ((dst-1)->f.j.inst_index<<2) | (dst->addr & 0xF0000000);510511mov_m32_imm32(&last_addr, naddr);512gencheck_interupt((unsigned int)&actual->block[(naddr-actual->start)/4]);513jmp(naddr);514#endif515}516517void genjal_out(void)518{519#ifdef INTERPRET_JAL_OUT520gencallinterp((unsigned int)cached_interpreter_table.JAL_OUT, 1);521#else522unsigned int naddr;523524if (((dst->addr & 0xFFF) == 0xFFC &&525(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)526{527gencallinterp((unsigned int)cached_interpreter_table.JAL_OUT, 1);528return;529}530531gendelayslot();532533mov_m32_imm32((unsigned int *)(reg + 31), dst->addr + 4);534if (((dst->addr + 4) & 0x80000000))535mov_m32_imm32((unsigned int *)(®[31])+1, 0xFFFFFFFF);536else537mov_m32_imm32((unsigned int *)(®[31])+1, 0);538539naddr = ((dst-1)->f.j.inst_index<<2) | (dst->addr & 0xF0000000);540541mov_m32_imm32(&last_addr, naddr);542gencheck_interupt_out(naddr);543mov_m32_imm32(&jump_to_address, naddr);544mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));545mov_reg32_imm32(EAX, (unsigned int)jump_to_func);546call_reg32(EAX);547#endif548}549550void genjal_idle(void)551{552#ifdef INTERPRET_JAL_IDLE553gencallinterp((unsigned int)cached_interpreter_table.JAL_IDLE, 1);554#else555if (((dst->addr & 0xFFF) == 0xFFC &&556(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)557{558gencallinterp((unsigned int)cached_interpreter_table.JAL_IDLE, 1);559return;560}561562mov_eax_memoffs32((unsigned int *)(&next_interupt));563sub_reg32_m32(EAX, (unsigned int *)(&Count));564cmp_reg32_imm8(EAX, 3);565jbe_rj(11);566567and_eax_imm32(0xFFFFFFFC);568add_m32_reg32((unsigned int *)(&Count), EAX);569570genjal();571#endif572}573574void gentest(void)575{576cmp_m32_imm32((unsigned int *)(&branch_taken), 0);577je_near_rj(0);578579jump_start_rel32();580581mov_m32_imm32(&last_addr, dst->addr + (dst-1)->f.i.immediate*4);582gencheck_interupt((unsigned int)(dst + (dst-1)->f.i.immediate));583jmp(dst->addr + (dst-1)->f.i.immediate*4);584585jump_end_rel32();586587mov_m32_imm32(&last_addr, dst->addr + 4);588gencheck_interupt((unsigned int)(dst + 1));589jmp(dst->addr + 4);590}591592void genbeq(void)593{594#ifdef INTERPRET_BEQ595gencallinterp((unsigned int)cached_interpreter_table.BEQ, 1);596#else597if (((dst->addr & 0xFFF) == 0xFFC &&598(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)599{600gencallinterp((unsigned int)cached_interpreter_table.BEQ, 1);601return;602}603604genbeq_test();605gendelayslot();606gentest();607#endif608}609610void gentest_out(void)611{612cmp_m32_imm32((unsigned int *)(&branch_taken), 0);613je_near_rj(0);614615jump_start_rel32();616617mov_m32_imm32(&last_addr, dst->addr + (dst-1)->f.i.immediate*4);618gencheck_interupt_out(dst->addr + (dst-1)->f.i.immediate*4);619mov_m32_imm32(&jump_to_address, dst->addr + (dst-1)->f.i.immediate*4);620mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));621mov_reg32_imm32(EAX, (unsigned int)jump_to_func);622call_reg32(EAX);623624jump_end_rel32();625626mov_m32_imm32(&last_addr, dst->addr + 4);627gencheck_interupt((unsigned int)(dst + 1));628jmp(dst->addr + 4);629}630631void genbeq_out(void)632{633#ifdef INTERPRET_BEQ_OUT634gencallinterp((unsigned int)cached_interpreter_table.BEQ_OUT, 1);635#else636if (((dst->addr & 0xFFF) == 0xFFC &&637(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)638{639gencallinterp((unsigned int)cached_interpreter_table.BEQ_OUT, 1);640return;641}642643genbeq_test();644gendelayslot();645gentest_out();646#endif647}648649void gentest_idle(void)650{651int reg;652653reg = lru_register();654free_register(reg);655656cmp_m32_imm32((unsigned int *)(&branch_taken), 0);657je_near_rj(0);658659jump_start_rel32();660661mov_reg32_m32(reg, (unsigned int *)(&next_interupt));662sub_reg32_m32(reg, (unsigned int *)(&Count));663cmp_reg32_imm8(reg, 5);664jbe_rj(18);665666sub_reg32_imm32(reg, 2); // 6667and_reg32_imm32(reg, 0xFFFFFFFC); // 6668add_m32_reg32((unsigned int *)(&Count), reg); // 6669670jump_end_rel32();671}672673void genbeq_idle(void)674{675#ifdef INTERPRET_BEQ_IDLE676gencallinterp((unsigned int)cached_interpreter_table.BEQ_IDLE, 1);677#else678if (((dst->addr & 0xFFF) == 0xFFC &&679(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)680{681gencallinterp((unsigned int)cached_interpreter_table.BEQ_IDLE, 1);682return;683}684685genbeq_test();686gentest_idle();687genbeq();688#endif689}690691void genbne(void)692{693#ifdef INTERPRET_BNE694gencallinterp((unsigned int)cached_interpreter_table.BNE, 1);695#else696if (((dst->addr & 0xFFF) == 0xFFC &&697(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)698{699gencallinterp((unsigned int)cached_interpreter_table.BNE, 1);700return;701}702703genbne_test();704gendelayslot();705gentest();706#endif707}708709void genbne_out(void)710{711#ifdef INTERPRET_BNE_OUT712gencallinterp((unsigned int)cached_interpreter_table.BNE_OUT, 1);713#else714if (((dst->addr & 0xFFF) == 0xFFC &&715(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)716{717gencallinterp((unsigned int)cached_interpreter_table.BNE_OUT, 1);718return;719}720721genbne_test();722gendelayslot();723gentest_out();724#endif725}726727void genbne_idle(void)728{729#ifdef INTERPRET_BNE_IDLE730gencallinterp((unsigned int)cached_interpreter_table.BNE_IDLE, 1);731#else732if (((dst->addr & 0xFFF) == 0xFFC &&733(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)734{735gencallinterp((unsigned int)cached_interpreter_table.BNE_IDLE, 1);736return;737}738739genbne_test();740gentest_idle();741genbne();742#endif743}744745void genblez(void)746{747#ifdef INTERPRET_BLEZ748gencallinterp((unsigned int)cached_interpreter_table.BLEZ, 1);749#else750if (((dst->addr & 0xFFF) == 0xFFC &&751(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)752{753gencallinterp((unsigned int)cached_interpreter_table.BLEZ, 1);754return;755}756757genblez_test();758gendelayslot();759gentest();760#endif761}762763void genblez_out(void)764{765#ifdef INTERPRET_BLEZ_OUT766gencallinterp((unsigned int)cached_interpreter_table.BLEZ_OUT, 1);767#else768if (((dst->addr & 0xFFF) == 0xFFC &&769(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)770{771gencallinterp((unsigned int)cached_interpreter_table.BLEZ_OUT, 1);772return;773}774775genblez_test();776gendelayslot();777gentest_out();778#endif779}780781void genblez_idle(void)782{783#ifdef INTERPRET_BLEZ_IDLE784gencallinterp((unsigned int)cached_interpreter_table.BLEZ_IDLE, 1);785#else786if (((dst->addr & 0xFFF) == 0xFFC &&787(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)788{789gencallinterp((unsigned int)cached_interpreter_table.BLEZ_IDLE, 1);790return;791}792793genblez_test();794gentest_idle();795genblez();796#endif797}798799void genbgtz(void)800{801#ifdef INTERPRET_BGTZ802gencallinterp((unsigned int)cached_interpreter_table.BGTZ, 1);803#else804if (((dst->addr & 0xFFF) == 0xFFC &&805(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)806{807gencallinterp((unsigned int)cached_interpreter_table.BGTZ, 1);808return;809}810811genbgtz_test();812gendelayslot();813gentest();814#endif815}816817void genbgtz_out(void)818{819#ifdef INTERPRET_BGTZ_OUT820gencallinterp((unsigned int)cached_interpreter_table.BGTZ_OUT, 1);821#else822if (((dst->addr & 0xFFF) == 0xFFC &&823(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)824{825gencallinterp((unsigned int)cached_interpreter_table.BGTZ_OUT, 1);826return;827}828829genbgtz_test();830gendelayslot();831gentest_out();832#endif833}834835void genbgtz_idle(void)836{837#ifdef INTERPRET_BGTZ_IDLE838gencallinterp((unsigned int)cached_interpreter_table.BGTZ_IDLE, 1);839#else840if (((dst->addr & 0xFFF) == 0xFFC &&841(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)842{843gencallinterp((unsigned int)cached_interpreter_table.BGTZ_IDLE, 1);844return;845}846847genbgtz_test();848gentest_idle();849genbgtz();850#endif851}852853void genaddi(void)854{855#ifdef INTERPRET_ADDI856gencallinterp((unsigned int)cached_interpreter_table.ADDI, 0);857#else858int rs = allocate_register((unsigned int *)dst->f.i.rs);859int rt = allocate_register_w((unsigned int *)dst->f.i.rt);860861mov_reg32_reg32(rt, rs);862add_reg32_imm32(rt,(int)dst->f.i.immediate);863#endif864}865866void genaddiu(void)867{868#ifdef INTERPRET_ADDIU869gencallinterp((unsigned int)cached_interpreter_table.ADDIU, 0);870#else871int rs = allocate_register((unsigned int *)dst->f.i.rs);872int rt = allocate_register_w((unsigned int *)dst->f.i.rt);873874mov_reg32_reg32(rt, rs);875add_reg32_imm32(rt,(int)dst->f.i.immediate);876#endif877}878879void genslti(void)880{881#ifdef INTERPRET_SLTI882gencallinterp((unsigned int)cached_interpreter_table.SLTI, 0);883#else884int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);885int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);886int rt = allocate_register_w((unsigned int *)dst->f.i.rt);887long long imm = (long long)dst->f.i.immediate;888889cmp_reg32_imm32(rs2, (unsigned int)(imm >> 32));890jl_rj(17);891jne_rj(8); // 2892cmp_reg32_imm32(rs1, (unsigned int)imm); // 6893jl_rj(7); // 2894mov_reg32_imm32(rt, 0); // 5895jmp_imm_short(5); // 2896mov_reg32_imm32(rt, 1); // 5897#endif898}899900void gensltiu(void)901{902#ifdef INTERPRET_SLTIU903gencallinterp((unsigned int)cached_interpreter_table.SLTIU, 0);904#else905int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);906int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);907int rt = allocate_register_w((unsigned int *)dst->f.i.rt);908long long imm = (long long)dst->f.i.immediate;909910cmp_reg32_imm32(rs2, (unsigned int)(imm >> 32));911jb_rj(17);912jne_rj(8); // 2913cmp_reg32_imm32(rs1, (unsigned int)imm); // 6914jb_rj(7); // 2915mov_reg32_imm32(rt, 0); // 5916jmp_imm_short(5); // 2917mov_reg32_imm32(rt, 1); // 5918#endif919}920921void genandi(void)922{923#ifdef INTERPRET_ANDI924gencallinterp((unsigned int)cached_interpreter_table.ANDI, 0);925#else926int rs = allocate_register((unsigned int *)dst->f.i.rs);927int rt = allocate_register_w((unsigned int *)dst->f.i.rt);928929mov_reg32_reg32(rt, rs);930and_reg32_imm32(rt, (unsigned short)dst->f.i.immediate);931#endif932}933934void genori(void)935{936#ifdef INTERPRET_ORI937gencallinterp((unsigned int)cached_interpreter_table.ORI, 0);938#else939int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);940int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);941int rt1 = allocate_64_register1_w((unsigned int *)dst->f.i.rt);942int rt2 = allocate_64_register2_w((unsigned int *)dst->f.i.rt);943944mov_reg32_reg32(rt1, rs1);945mov_reg32_reg32(rt2, rs2);946or_reg32_imm32(rt1, (unsigned short)dst->f.i.immediate);947#endif948}949950void genxori(void)951{952#ifdef INTERPRET_XORI953gencallinterp((unsigned int)cached_interpreter_table.XORI, 0);954#else955int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);956int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);957int rt1 = allocate_64_register1_w((unsigned int *)dst->f.i.rt);958int rt2 = allocate_64_register2_w((unsigned int *)dst->f.i.rt);959960mov_reg32_reg32(rt1, rs1);961mov_reg32_reg32(rt2, rs2);962xor_reg32_imm32(rt1, (unsigned short)dst->f.i.immediate);963#endif964}965966void genlui(void)967{968#ifdef INTERPRET_LUI969gencallinterp((unsigned int)cached_interpreter_table.LUI, 0);970#else971int rt = allocate_register_w((unsigned int *)dst->f.i.rt);972973mov_reg32_imm32(rt, (unsigned int)dst->f.i.immediate << 16);974#endif975}976977void gentestl(void)978{979cmp_m32_imm32((unsigned int *)(&branch_taken), 0);980je_near_rj(0);981982jump_start_rel32();983984gendelayslot();985mov_m32_imm32(&last_addr, dst->addr + (dst-1)->f.i.immediate*4);986gencheck_interupt((unsigned int)(dst + (dst-1)->f.i.immediate));987jmp(dst->addr + (dst-1)->f.i.immediate*4);988989jump_end_rel32();990991genupdate_count(dst->addr+4);992mov_m32_imm32(&last_addr, dst->addr + 4);993gencheck_interupt((unsigned int)(dst + 1));994jmp(dst->addr + 4);995}996997void genbeql(void)998{999#ifdef INTERPRET_BEQL1000gencallinterp((unsigned int)cached_interpreter_table.BEQL, 1);1001#else1002if (((dst->addr & 0xFFF) == 0xFFC &&1003(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1004{1005gencallinterp((unsigned int)cached_interpreter_table.BEQL, 1);1006return;1007}10081009genbeq_test();1010free_all_registers();1011gentestl();1012#endif1013}10141015void gentestl_out(void)1016{1017cmp_m32_imm32((unsigned int *)(&branch_taken), 0);1018je_near_rj(0);10191020jump_start_rel32();10211022gendelayslot();1023mov_m32_imm32(&last_addr, dst->addr + (dst-1)->f.i.immediate*4);1024gencheck_interupt_out(dst->addr + (dst-1)->f.i.immediate*4);1025mov_m32_imm32(&jump_to_address, dst->addr + (dst-1)->f.i.immediate*4);1026mov_m32_imm32((unsigned int*)(&PC), (unsigned int)(dst+1));1027mov_reg32_imm32(EAX, (unsigned int)jump_to_func);1028call_reg32(EAX);10291030jump_end_rel32();10311032genupdate_count(dst->addr+4);1033mov_m32_imm32(&last_addr, dst->addr + 4);1034gencheck_interupt((unsigned int)(dst + 1));1035jmp(dst->addr + 4);1036}10371038void genbeql_out(void)1039{1040#ifdef INTERPRET_BEQL_OUT1041gencallinterp((unsigned int)cached_interpreter_table.BEQL_OUT, 1);1042#else1043if (((dst->addr & 0xFFF) == 0xFFC &&1044(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1045{1046gencallinterp((unsigned int)cached_interpreter_table.BEQL_OUT, 1);1047return;1048}10491050genbeq_test();1051free_all_registers();1052gentestl_out();1053#endif1054}10551056void genbeql_idle(void)1057{1058#ifdef INTERPRET_BEQL_IDLE1059gencallinterp((unsigned int)cached_interpreter_table.BEQL_IDLE, 1);1060#else1061if (((dst->addr & 0xFFF) == 0xFFC &&1062(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1063{1064gencallinterp((unsigned int)cached_interpreter_table.BEQL_IDLE, 1);1065return;1066}10671068genbeq_test();1069gentest_idle();1070genbeql();1071#endif1072}10731074void genbnel(void)1075{1076#ifdef INTERPRET_BNEL1077gencallinterp((unsigned int)cached_interpreter_table.BNEL, 1);1078#else1079if (((dst->addr & 0xFFF) == 0xFFC &&1080(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1081{1082gencallinterp((unsigned int)cached_interpreter_table.BNEL, 1);1083return;1084}10851086genbne_test();1087free_all_registers();1088gentestl();1089#endif1090}10911092void genbnel_out(void)1093{1094#ifdef INTERPRET_BNEL_OUT1095gencallinterp((unsigned int)cached_interpreter_table.BNEL_OUT, 1);1096#else1097if (((dst->addr & 0xFFF) == 0xFFC &&1098(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1099{1100gencallinterp((unsigned int)cached_interpreter_table.BNEL_OUT, 1);1101return;1102}11031104genbne_test();1105free_all_registers();1106gentestl_out();1107#endif1108}11091110void genbnel_idle(void)1111{1112#ifdef INTERPRET_BNEL_IDLE1113gencallinterp((unsigned int)cached_interpreter_table.BNEL_IDLE, 1);1114#else1115if (((dst->addr & 0xFFF) == 0xFFC &&1116(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1117{1118gencallinterp((unsigned int)cached_interpreter_table.BNEL_IDLE, 1);1119return;1120}11211122genbne_test();1123gentest_idle();1124genbnel();1125#endif1126}11271128void genblezl(void)1129{1130#ifdef INTERPRET_BLEZL1131gencallinterp((unsigned int)cached_interpreter_table.BLEZL, 1);1132#else1133if (((dst->addr & 0xFFF) == 0xFFC &&1134(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1135{1136gencallinterp((unsigned int)cached_interpreter_table.BLEZL, 1);1137return;1138}11391140genblez_test();1141free_all_registers();1142gentestl();1143#endif1144}11451146void genblezl_out(void)1147{1148#ifdef INTERPRET_BLEZL_OUT1149gencallinterp((unsigned int)cached_interpreter_table.BLEZL_OUT, 1);1150#else1151if (((dst->addr & 0xFFF) == 0xFFC &&1152(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1153{1154gencallinterp((unsigned int)cached_interpreter_table.BLEZL_OUT, 1);1155return;1156}11571158genblez_test();1159free_all_registers();1160gentestl_out();1161#endif1162}11631164void genblezl_idle(void)1165{1166#ifdef INTERPRET_BLEZL_IDLE1167gencallinterp((unsigned int)cached_interpreter_table.BLEZL_IDLE, 1);1168#else1169if (((dst->addr & 0xFFF) == 0xFFC &&1170(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1171{1172gencallinterp((unsigned int)cached_interpreter_table.BLEZL_IDLE, 1);1173return;1174}11751176genblez_test();1177gentest_idle();1178genblezl();1179#endif1180}11811182void genbgtzl(void)1183{1184#ifdef INTERPRET_BGTZL1185gencallinterp((unsigned int)cached_interpreter_table.BGTZL, 1);1186#else1187if (((dst->addr & 0xFFF) == 0xFFC &&1188(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1189{1190gencallinterp((unsigned int)cached_interpreter_table.BGTZL, 1);1191return;1192}11931194genbgtz_test();1195free_all_registers();1196gentestl();1197#endif1198}11991200void genbgtzl_out(void)1201{1202#ifdef INTERPRET_BGTZL_OUT1203gencallinterp((unsigned int)cached_interpreter_table.BGTZL_OUT, 1);1204#else1205if (((dst->addr & 0xFFF) == 0xFFC &&1206(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1207{1208gencallinterp((unsigned int)cached_interpreter_table.BGTZL_OUT, 1);1209return;1210}12111212genbgtz_test();1213free_all_registers();1214gentestl_out();1215#endif1216}12171218void genbgtzl_idle(void)1219{1220#ifdef INTERPRET_BGTZL_IDLE1221gencallinterp((unsigned int)cached_interpreter_table.BGTZL_IDLE, 1);1222#else1223if (((dst->addr & 0xFFF) == 0xFFC &&1224(dst->addr < 0x80000000 || dst->addr >= 0xC0000000))||no_compiled_jump)1225{1226gencallinterp((unsigned int)cached_interpreter_table.BGTZL_IDLE, 1);1227return;1228}12291230genbgtz_test();1231gentest_idle();1232genbgtzl();1233#endif1234}12351236void gendaddi(void)1237{1238#ifdef INTERPRET_DADDI1239gencallinterp((unsigned int)cached_interpreter_table.DADDI, 0);1240#else1241int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);1242int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);1243int rt1 = allocate_64_register1_w((unsigned int *)dst->f.i.rt);1244int rt2 = allocate_64_register2_w((unsigned int *)dst->f.i.rt);12451246mov_reg32_reg32(rt1, rs1);1247mov_reg32_reg32(rt2, rs2);1248add_reg32_imm32(rt1, dst->f.i.immediate);1249adc_reg32_imm32(rt2, (int)dst->f.i.immediate>>31);1250#endif1251}12521253void gendaddiu(void)1254{1255#ifdef INTERPRET_DADDIU1256gencallinterp((unsigned int)cached_interpreter_table.DADDIU, 0);1257#else1258int rs1 = allocate_64_register1((unsigned int *)dst->f.i.rs);1259int rs2 = allocate_64_register2((unsigned int *)dst->f.i.rs);1260int rt1 = allocate_64_register1_w((unsigned int *)dst->f.i.rt);1261int rt2 = allocate_64_register2_w((unsigned int *)dst->f.i.rt);12621263mov_reg32_reg32(rt1, rs1);1264mov_reg32_reg32(rt2, rs2);1265add_reg32_imm32(rt1, dst->f.i.immediate);1266adc_reg32_imm32(rt2, (int)dst->f.i.immediate>>31);1267#endif1268}12691270void genldl(void)1271{1272gencallinterp((unsigned int)cached_interpreter_table.LDL, 0);1273}12741275void genldr(void)1276{1277gencallinterp((unsigned int)cached_interpreter_table.LDR, 0);1278}12791280void genlb(void)1281{1282#ifdef INTERPRET_LB1283gencallinterp((unsigned int)cached_interpreter_table.LB, 0);1284#else1285free_all_registers();1286simplify_access();1287mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1288add_eax_imm32((int)dst->f.i.immediate);1289mov_reg32_reg32(EBX, EAX);1290if(fast_memory)1291{1292and_eax_imm32(0xDF800000);1293cmp_eax_imm32(0x80000000);1294}1295else1296{1297shr_reg32_imm8(EAX, 16);1298mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemb);1299cmp_reg32_imm32(EAX, (unsigned int)read_rdramb);1300}1301je_rj(47);13021303mov_m32_imm32((unsigned int *)&PC, (unsigned int)(dst+1)); // 101304mov_m32_reg32((unsigned int *)(&address), EBX); // 61305mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101306shr_reg32_imm8(EBX, 16); // 31307mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemb); // 71308call_reg32(EBX); // 21309movsx_reg32_m8(EAX, (unsigned char *)dst->f.i.rt); // 71310jmp_imm_short(16); // 213111312and_reg32_imm32(EBX, 0x7FFFFF); // 61313xor_reg8_imm8(BL, 3); // 31314movsx_reg32_8preg32pimm32(EAX, EBX, (unsigned int)rdram); // 713151316set_register_state(EAX, (unsigned int*)dst->f.i.rt, 1);1317#endif1318}13191320void genlh(void)1321{1322#ifdef INTERPRET_LH1323gencallinterp((unsigned int)cached_interpreter_table.LH, 0);1324#else1325free_all_registers();1326simplify_access();1327mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1328add_eax_imm32((int)dst->f.i.immediate);1329mov_reg32_reg32(EBX, EAX);1330if(fast_memory)1331{1332and_eax_imm32(0xDF800000);1333cmp_eax_imm32(0x80000000);1334}1335else1336{1337shr_reg32_imm8(EAX, 16);1338mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemh);1339cmp_reg32_imm32(EAX, (unsigned int)read_rdramh);1340}1341je_rj(47);13421343mov_m32_imm32((unsigned int *)&PC, (unsigned int)(dst+1)); // 101344mov_m32_reg32((unsigned int *)(&address), EBX); // 61345mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101346shr_reg32_imm8(EBX, 16); // 31347mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemh); // 71348call_reg32(EBX); // 21349movsx_reg32_m16(EAX, (unsigned short *)dst->f.i.rt); // 71350jmp_imm_short(16); // 213511352and_reg32_imm32(EBX, 0x7FFFFF); // 61353xor_reg8_imm8(BL, 2); // 31354movsx_reg32_16preg32pimm32(EAX, EBX, (unsigned int)rdram); // 713551356set_register_state(EAX, (unsigned int*)dst->f.i.rt, 1);1357#endif1358}13591360void genlwl(void)1361{1362gencallinterp((unsigned int)cached_interpreter_table.LWL, 0);1363}13641365void genlw(void)1366{1367#ifdef INTERPRET_LW1368gencallinterp((unsigned int)cached_interpreter_table.LW, 0);1369#else1370free_all_registers();1371simplify_access();1372mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1373add_eax_imm32((int)dst->f.i.immediate);1374mov_reg32_reg32(EBX, EAX);1375if(fast_memory)1376{1377and_eax_imm32(0xDF800000);1378cmp_eax_imm32(0x80000000);1379}1380else1381{1382shr_reg32_imm8(EAX, 16);1383mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmem);1384cmp_reg32_imm32(EAX, (unsigned int)read_rdram);1385}1386je_rj(45);13871388mov_m32_imm32((unsigned int *)&PC, (unsigned int)(dst+1)); // 101389mov_m32_reg32((unsigned int *)(&address), EBX); // 61390mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101391shr_reg32_imm8(EBX, 16); // 31392mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmem); // 71393call_reg32(EBX); // 21394mov_eax_memoffs32((unsigned int *)(dst->f.i.rt)); // 51395jmp_imm_short(12); // 213961397and_reg32_imm32(EBX, 0x7FFFFF); // 61398mov_reg32_preg32pimm32(EAX, EBX, (unsigned int)rdram); // 613991400set_register_state(EAX, (unsigned int*)dst->f.i.rt, 1);1401#endif1402}14031404void genlbu(void)1405{1406#ifdef INTERPRET_LBU1407gencallinterp((unsigned int)cached_interpreter_table.LBU, 0);1408#else1409free_all_registers();1410simplify_access();1411mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1412add_eax_imm32((int)dst->f.i.immediate);1413mov_reg32_reg32(EBX, EAX);1414if(fast_memory)1415{1416and_eax_imm32(0xDF800000);1417cmp_eax_imm32(0x80000000);1418}1419else1420{1421shr_reg32_imm8(EAX, 16);1422mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemb);1423cmp_reg32_imm32(EAX, (unsigned int)read_rdramb);1424}1425je_rj(46);14261427mov_m32_imm32((unsigned int *)&PC, (unsigned int)(dst+1)); // 101428mov_m32_reg32((unsigned int *)(&address), EBX); // 61429mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101430shr_reg32_imm8(EBX, 16); // 31431mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemb); // 71432call_reg32(EBX); // 21433mov_reg32_m32(EAX, (unsigned int *)dst->f.i.rt); // 61434jmp_imm_short(15); // 214351436and_reg32_imm32(EBX, 0x7FFFFF); // 61437xor_reg8_imm8(BL, 3); // 31438mov_reg32_preg32pimm32(EAX, EBX, (unsigned int)rdram); // 614391440and_eax_imm32(0xFF);14411442set_register_state(EAX, (unsigned int*)dst->f.i.rt, 1);1443#endif1444}14451446void genlhu(void)1447{1448#ifdef INTERPRET_LHU1449gencallinterp((unsigned int)cached_interpreter_table.LHU, 0);1450#else1451free_all_registers();1452simplify_access();1453mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1454add_eax_imm32((int)dst->f.i.immediate);1455mov_reg32_reg32(EBX, EAX);1456if(fast_memory)1457{1458and_eax_imm32(0xDF800000);1459cmp_eax_imm32(0x80000000);1460}1461else1462{1463shr_reg32_imm8(EAX, 16);1464mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemh);1465cmp_reg32_imm32(EAX, (unsigned int)read_rdramh);1466}1467je_rj(46);14681469mov_m32_imm32((unsigned int *)&PC, (unsigned int)(dst+1)); // 101470mov_m32_reg32((unsigned int *)(&address), EBX); // 61471mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101472shr_reg32_imm8(EBX, 16); // 31473mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemh); // 71474call_reg32(EBX); // 21475mov_reg32_m32(EAX, (unsigned int *)dst->f.i.rt); // 61476jmp_imm_short(15); // 214771478and_reg32_imm32(EBX, 0x7FFFFF); // 61479xor_reg8_imm8(BL, 2); // 31480mov_reg32_preg32pimm32(EAX, EBX, (unsigned int)rdram); // 614811482and_eax_imm32(0xFFFF);14831484set_register_state(EAX, (unsigned int*)dst->f.i.rt, 1);1485#endif1486}14871488void genlwr(void)1489{1490gencallinterp((unsigned int)cached_interpreter_table.LWR, 0);1491}14921493void genlwu(void)1494{1495#ifdef INTERPRET_LWU1496gencallinterp((unsigned int)cached_interpreter_table.LWU, 0);1497#else1498free_all_registers();1499simplify_access();1500mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1501add_eax_imm32((int)dst->f.i.immediate);1502mov_reg32_reg32(EBX, EAX);1503if(fast_memory)1504{1505and_eax_imm32(0xDF800000);1506cmp_eax_imm32(0x80000000);1507}1508else1509{1510shr_reg32_imm8(EAX, 16);1511mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmem);1512cmp_reg32_imm32(EAX, (unsigned int)read_rdram);1513}1514je_rj(45);15151516mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101517mov_m32_reg32((unsigned int *)(&address), EBX); // 61518mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101519shr_reg32_imm8(EBX, 16); // 31520mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmem); // 71521call_reg32(EBX); // 21522mov_eax_memoffs32((unsigned int *)(dst->f.i.rt)); // 51523jmp_imm_short(12); // 215241525and_reg32_imm32(EBX, 0x7FFFFF); // 61526mov_reg32_preg32pimm32(EAX, EBX, (unsigned int)rdram); // 615271528xor_reg32_reg32(EBX, EBX);15291530set_64_register_state(EAX, EBX, (unsigned int*)dst->f.i.rt, 1);1531#endif1532}15331534void gensb(void)1535{1536#ifdef INTERPRET_SB1537gencallinterp((unsigned int)cached_interpreter_table.SB, 0);1538#else1539free_all_registers();1540simplify_access();1541mov_reg8_m8(CL, (unsigned char *)dst->f.i.rt);1542mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1543add_eax_imm32((int)dst->f.i.immediate);1544mov_reg32_reg32(EBX, EAX);1545if(fast_memory)1546{1547and_eax_imm32(0xDF800000);1548cmp_eax_imm32(0x80000000);1549}1550else1551{1552shr_reg32_imm8(EAX, 16);1553mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writememb);1554cmp_reg32_imm32(EAX, (unsigned int)write_rdramb);1555}1556je_rj(41);15571558mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101559mov_m32_reg32((unsigned int *)(&address), EBX); // 61560mov_m8_reg8((unsigned char *)(&cpu_byte), CL); // 61561shr_reg32_imm8(EBX, 16); // 31562mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writememb); // 71563call_reg32(EBX); // 21564mov_eax_memoffs32((unsigned int *)(&address)); // 51565jmp_imm_short(17); // 215661567mov_reg32_reg32(EAX, EBX); // 21568and_reg32_imm32(EBX, 0x7FFFFF); // 61569xor_reg8_imm8(BL, 3); // 31570mov_preg32pimm32_reg8(EBX, (unsigned int)rdram, CL); // 615711572mov_reg32_reg32(EBX, EAX);1573shr_reg32_imm8(EBX, 12);1574cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);1575jne_rj(54);1576mov_reg32_reg32(ECX, EBX); // 21577shl_reg32_imm8(EBX, 2); // 31578mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 61579mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 61580and_eax_imm32(0xFFF); // 51581shr_reg32_imm8(EAX, 2); // 31582mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 51583mul_reg32(EDX); // 21584mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 71585cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 61586je_rj(7); // 21587mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 71588#endif1589}15901591void gensh(void)1592{1593#ifdef INTERPRET_SH1594gencallinterp((unsigned int)cached_interpreter_table.SH, 0);1595#else1596free_all_registers();1597simplify_access();1598mov_reg16_m16(CX, (unsigned short *)dst->f.i.rt);1599mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1600add_eax_imm32((int)dst->f.i.immediate);1601mov_reg32_reg32(EBX, EAX);1602if(fast_memory)1603{1604and_eax_imm32(0xDF800000);1605cmp_eax_imm32(0x80000000);1606}1607else1608{1609shr_reg32_imm8(EAX, 16);1610mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writememh);1611cmp_reg32_imm32(EAX, (unsigned int)write_rdramh);1612}1613je_rj(42);16141615mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101616mov_m32_reg32((unsigned int *)(&address), EBX); // 61617mov_m16_reg16((unsigned short *)(&hword), CX); // 71618shr_reg32_imm8(EBX, 16); // 31619mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writememh); // 71620call_reg32(EBX); // 21621mov_eax_memoffs32((unsigned int *)(&address)); // 51622jmp_imm_short(18); // 216231624mov_reg32_reg32(EAX, EBX); // 21625and_reg32_imm32(EBX, 0x7FFFFF); // 61626xor_reg8_imm8(BL, 2); // 31627mov_preg32pimm32_reg16(EBX, (unsigned int)rdram, CX); // 716281629mov_reg32_reg32(EBX, EAX);1630shr_reg32_imm8(EBX, 12);1631cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);1632jne_rj(54);1633mov_reg32_reg32(ECX, EBX); // 21634shl_reg32_imm8(EBX, 2); // 31635mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 61636mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 61637and_eax_imm32(0xFFF); // 51638shr_reg32_imm8(EAX, 2); // 31639mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 51640mul_reg32(EDX); // 21641mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 71642cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 61643je_rj(7); // 21644mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 71645#endif1646}16471648void genswl(void)1649{1650gencallinterp((unsigned int)cached_interpreter_table.SWL, 0);1651}16521653void gensw(void)1654{1655#ifdef INTERPRET_SW1656gencallinterp((unsigned int)cached_interpreter_table.SW, 0);1657#else1658free_all_registers();1659simplify_access();1660mov_reg32_m32(ECX, (unsigned int *)dst->f.i.rt);1661mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1662add_eax_imm32((int)dst->f.i.immediate);1663mov_reg32_reg32(EBX, EAX);1664if(fast_memory)1665{1666and_eax_imm32(0xDF800000);1667cmp_eax_imm32(0x80000000);1668}1669else1670{1671shr_reg32_imm8(EAX, 16);1672mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writemem);1673cmp_reg32_imm32(EAX, (unsigned int)write_rdram);1674}1675je_rj(41);16761677mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101678mov_m32_reg32((unsigned int *)(&address), EBX); // 61679mov_m32_reg32((unsigned int *)(&word), ECX); // 61680shr_reg32_imm8(EBX, 16); // 31681mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writemem); // 71682call_reg32(EBX); // 21683mov_eax_memoffs32((unsigned int *)(&address)); // 51684jmp_imm_short(14); // 216851686mov_reg32_reg32(EAX, EBX); // 21687and_reg32_imm32(EBX, 0x7FFFFF); // 61688mov_preg32pimm32_reg32(EBX, (unsigned int)rdram, ECX); // 616891690mov_reg32_reg32(EBX, EAX);1691shr_reg32_imm8(EBX, 12);1692cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);1693jne_rj(54);1694mov_reg32_reg32(ECX, EBX); // 21695shl_reg32_imm8(EBX, 2); // 31696mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 61697mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 61698and_eax_imm32(0xFFF); // 51699shr_reg32_imm8(EAX, 2); // 31700mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 51701mul_reg32(EDX); // 21702mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 71703cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 61704je_rj(7); // 21705mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 71706#endif1707}17081709void gensdl(void)1710{1711gencallinterp((unsigned int)cached_interpreter_table.SDL, 0);1712}17131714void gensdr(void)1715{1716gencallinterp((unsigned int)cached_interpreter_table.SDR, 0);1717}17181719void genswr(void)1720{1721gencallinterp((unsigned int)cached_interpreter_table.SWR, 0);1722}17231724void gencheck_cop1_unusable(void)1725{1726free_all_registers();1727simplify_access();1728test_m32_imm32((unsigned int*)&Status, 0x20000000);1729jne_rj(0);17301731jump_start_rel8();17321733gencallinterp((unsigned int)check_cop1_unusable, 0);17341735jump_end_rel8();1736}17371738void genlwc1(void)1739{1740#ifdef INTERPRET_LWC11741gencallinterp((unsigned int)cached_interpreter_table.LWC1, 0);1742#else1743gencheck_cop1_unusable();17441745mov_eax_memoffs32((unsigned int *)(®[dst->f.lf.base]));1746add_eax_imm32((int)dst->f.lf.offset);1747mov_reg32_reg32(EBX, EAX);1748if(fast_memory)1749{1750and_eax_imm32(0xDF800000);1751cmp_eax_imm32(0x80000000);1752}1753else1754{1755shr_reg32_imm8(EAX, 16);1756mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmem);1757cmp_reg32_imm32(EAX, (unsigned int)read_rdram);1758}1759je_rj(42);17601761mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101762mov_m32_reg32((unsigned int *)(&address), EBX); // 61763mov_reg32_m32(EDX, (unsigned int*)(®_cop1_simple[dst->f.lf.ft])); // 61764mov_m32_reg32((unsigned int *)(&rdword), EDX); // 61765shr_reg32_imm8(EBX, 16); // 31766mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmem); // 71767call_reg32(EBX); // 21768jmp_imm_short(20); // 217691770and_reg32_imm32(EBX, 0x7FFFFF); // 61771mov_reg32_preg32pimm32(EAX, EBX, (unsigned int)rdram); // 61772mov_reg32_m32(EBX, (unsigned int*)(®_cop1_simple[dst->f.lf.ft])); // 61773mov_preg32_reg32(EBX, EAX); // 21774#endif1775}17761777void genldc1(void)1778{1779#ifdef INTERPRET_LDC11780gencallinterp((unsigned int)cached_interpreter_table.LDC1, 0);1781#else1782gencheck_cop1_unusable();17831784mov_eax_memoffs32((unsigned int *)(®[dst->f.lf.base]));1785add_eax_imm32((int)dst->f.lf.offset);1786mov_reg32_reg32(EBX, EAX);1787if(fast_memory)1788{1789and_eax_imm32(0xDF800000);1790cmp_eax_imm32(0x80000000);1791}1792else1793{1794shr_reg32_imm8(EAX, 16);1795mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemd);1796cmp_reg32_imm32(EAX, (unsigned int)read_rdramd);1797}1798je_rj(42);17991800mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101801mov_m32_reg32((unsigned int *)(&address), EBX); // 61802mov_reg32_m32(EDX, (unsigned int*)(®_cop1_double[dst->f.lf.ft])); // 61803mov_m32_reg32((unsigned int *)(&rdword), EDX); // 61804shr_reg32_imm8(EBX, 16); // 31805mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemd); // 71806call_reg32(EBX); // 21807jmp_imm_short(32); // 218081809and_reg32_imm32(EBX, 0x7FFFFF); // 61810mov_reg32_preg32pimm32(EAX, EBX, ((unsigned int)rdram)+4); // 61811mov_reg32_preg32pimm32(ECX, EBX, ((unsigned int)rdram)); // 61812mov_reg32_m32(EBX, (unsigned int*)(®_cop1_double[dst->f.lf.ft])); // 61813mov_preg32_reg32(EBX, EAX); // 21814mov_preg32pimm32_reg32(EBX, 4, ECX); // 61815#endif1816}18171818void gencache(void)1819{1820}18211822void genld(void)1823{1824#ifdef INTERPRET_LD1825gencallinterp((unsigned int)cached_interpreter_table.LD, 0);1826#else1827free_all_registers();1828simplify_access();1829mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1830add_eax_imm32((int)dst->f.i.immediate);1831mov_reg32_reg32(EBX, EAX);1832if(fast_memory)1833{1834and_eax_imm32(0xDF800000);1835cmp_eax_imm32(0x80000000);1836}1837else1838{1839shr_reg32_imm8(EAX, 16);1840mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)readmemd);1841cmp_reg32_imm32(EAX, (unsigned int)read_rdramd);1842}1843je_rj(51);18441845mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101846mov_m32_reg32((unsigned int *)(&address), EBX); // 61847mov_m32_imm32((unsigned int *)(&rdword), (unsigned int)dst->f.i.rt); // 101848shr_reg32_imm8(EBX, 16); // 31849mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)readmemd); // 71850call_reg32(EBX); // 21851mov_eax_memoffs32((unsigned int *)(dst->f.i.rt)); // 51852mov_reg32_m32(ECX, (unsigned int *)(dst->f.i.rt)+1); // 61853jmp_imm_short(18); // 218541855and_reg32_imm32(EBX, 0x7FFFFF); // 61856mov_reg32_preg32pimm32(EAX, EBX, ((unsigned int)rdram)+4); // 61857mov_reg32_preg32pimm32(ECX, EBX, ((unsigned int)rdram)); // 618581859set_64_register_state(EAX, ECX, (unsigned int*)dst->f.i.rt, 1);1860#endif1861}18621863void genswc1(void)1864{1865#ifdef INTERPRET_SWC11866gencallinterp((unsigned int)cached_interpreter_table.SWC1, 0);1867#else1868gencheck_cop1_unusable();18691870mov_reg32_m32(EDX, (unsigned int*)(®_cop1_simple[dst->f.lf.ft]));1871mov_reg32_preg32(ECX, EDX);1872mov_eax_memoffs32((unsigned int *)(®[dst->f.lf.base]));1873add_eax_imm32((int)dst->f.lf.offset);1874mov_reg32_reg32(EBX, EAX);1875if(fast_memory)1876{1877and_eax_imm32(0xDF800000);1878cmp_eax_imm32(0x80000000);1879}1880else1881{1882shr_reg32_imm8(EAX, 16);1883mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writemem);1884cmp_reg32_imm32(EAX, (unsigned int)write_rdram);1885}1886je_rj(41);18871888mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101889mov_m32_reg32((unsigned int *)(&address), EBX); // 61890mov_m32_reg32((unsigned int *)(&word), ECX); // 61891shr_reg32_imm8(EBX, 16); // 31892mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writemem); // 71893call_reg32(EBX); // 21894mov_eax_memoffs32((unsigned int *)(&address)); // 51895jmp_imm_short(14); // 218961897mov_reg32_reg32(EAX, EBX); // 21898and_reg32_imm32(EBX, 0x7FFFFF); // 61899mov_preg32pimm32_reg32(EBX, (unsigned int)rdram, ECX); // 619001901mov_reg32_reg32(EBX, EAX);1902shr_reg32_imm8(EBX, 12);1903cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);1904jne_rj(54);1905mov_reg32_reg32(ECX, EBX); // 21906shl_reg32_imm8(EBX, 2); // 31907mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 61908mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 61909and_eax_imm32(0xFFF); // 51910shr_reg32_imm8(EAX, 2); // 31911mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 51912mul_reg32(EDX); // 21913mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 71914cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 61915je_rj(7); // 21916mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 71917#endif1918}19191920void gensdc1(void)1921{1922#ifdef INTERPRET_SDC11923gencallinterp((unsigned int)cached_interpreter_table.SDC1, 0);1924#else1925gencheck_cop1_unusable();19261927mov_reg32_m32(ESI, (unsigned int*)(®_cop1_double[dst->f.lf.ft]));1928mov_reg32_preg32(ECX, ESI);1929mov_reg32_preg32pimm32(EDX, ESI, 4);1930mov_eax_memoffs32((unsigned int *)(®[dst->f.lf.base]));1931add_eax_imm32((int)dst->f.lf.offset);1932mov_reg32_reg32(EBX, EAX);1933if(fast_memory)1934{1935and_eax_imm32(0xDF800000);1936cmp_eax_imm32(0x80000000);1937}1938else1939{1940shr_reg32_imm8(EAX, 16);1941mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writememd);1942cmp_reg32_imm32(EAX, (unsigned int)write_rdramd);1943}1944je_rj(47);19451946mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 101947mov_m32_reg32((unsigned int *)(&address), EBX); // 61948mov_m32_reg32((unsigned int *)(&dword), ECX); // 61949mov_m32_reg32((unsigned int *)(&dword)+1, EDX); // 61950shr_reg32_imm8(EBX, 16); // 31951mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writememd); // 71952call_reg32(EBX); // 21953mov_eax_memoffs32((unsigned int *)(&address)); // 51954jmp_imm_short(20); // 219551956mov_reg32_reg32(EAX, EBX); // 21957and_reg32_imm32(EBX, 0x7FFFFF); // 61958mov_preg32pimm32_reg32(EBX, ((unsigned int)rdram)+4, ECX); // 61959mov_preg32pimm32_reg32(EBX, ((unsigned int)rdram)+0, EDX); // 619601961mov_reg32_reg32(EBX, EAX);1962shr_reg32_imm8(EBX, 12);1963cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);1964jne_rj(54);1965mov_reg32_reg32(ECX, EBX); // 21966shl_reg32_imm8(EBX, 2); // 31967mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 61968mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 61969and_eax_imm32(0xFFF); // 51970shr_reg32_imm8(EAX, 2); // 31971mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 51972mul_reg32(EDX); // 21973mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 71974cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 61975je_rj(7); // 21976mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 71977#endif1978}19791980void gensd(void)1981{1982#ifdef INTERPRET_SD1983gencallinterp((unsigned int)cached_interpreter_table.SD, 0);1984#else1985free_all_registers();1986simplify_access();19871988mov_reg32_m32(ECX, (unsigned int *)dst->f.i.rt);1989mov_reg32_m32(EDX, ((unsigned int *)dst->f.i.rt)+1);1990mov_eax_memoffs32((unsigned int *)dst->f.i.rs);1991add_eax_imm32((int)dst->f.i.immediate);1992mov_reg32_reg32(EBX, EAX);1993if(fast_memory)1994{1995and_eax_imm32(0xDF800000);1996cmp_eax_imm32(0x80000000);1997}1998else1999{2000shr_reg32_imm8(EAX, 16);2001mov_reg32_preg32x4pimm32(EAX, EAX, (unsigned int)writememd);2002cmp_reg32_imm32(EAX, (unsigned int)write_rdramd);2003}2004je_rj(47);20052006mov_m32_imm32((unsigned int *)(&PC), (unsigned int)(dst+1)); // 102007mov_m32_reg32((unsigned int *)(&address), EBX); // 62008mov_m32_reg32((unsigned int *)(&dword), ECX); // 62009mov_m32_reg32((unsigned int *)(&dword)+1, EDX); // 62010shr_reg32_imm8(EBX, 16); // 32011mov_reg32_preg32x4pimm32(EBX, EBX, (unsigned int)writememd); // 72012call_reg32(EBX); // 22013mov_eax_memoffs32((unsigned int *)(&address)); // 52014jmp_imm_short(20); // 220152016mov_reg32_reg32(EAX, EBX); // 22017and_reg32_imm32(EBX, 0x7FFFFF); // 62018mov_preg32pimm32_reg32(EBX, ((unsigned int)rdram)+4, ECX); // 62019mov_preg32pimm32_reg32(EBX, ((unsigned int)rdram)+0, EDX); // 620202021mov_reg32_reg32(EBX, EAX);2022shr_reg32_imm8(EBX, 12);2023cmp_preg32pimm32_imm8(EBX, (unsigned int)invalid_code, 0);2024jne_rj(54);2025mov_reg32_reg32(ECX, EBX); // 22026shl_reg32_imm8(EBX, 2); // 32027mov_reg32_preg32pimm32(EBX, EBX, (unsigned int)blocks); // 62028mov_reg32_preg32pimm32(EBX, EBX, (int)&actual->block - (int)actual); // 62029and_eax_imm32(0xFFF); // 52030shr_reg32_imm8(EAX, 2); // 32031mov_reg32_imm32(EDX, sizeof(precomp_instr)); // 52032mul_reg32(EDX); // 22033mov_reg32_preg32preg32pimm32(EAX, EAX, EBX, (int)&dst->ops - (int)dst); // 72034cmp_reg32_imm32(EAX, (unsigned int)cached_interpreter_table.NOTCOMPILED); // 62035je_rj(7); // 22036mov_preg32pimm32_imm8(ECX, (unsigned int)invalid_code, 1); // 72037#endif2038}20392040void genll(void)2041{2042gencallinterp((unsigned int)cached_interpreter_table.LL, 0);2043}20442045void gensc(void)2046{2047gencallinterp((unsigned int)cached_interpreter_table.SC, 0);2048}2049205020512052