//decoder.h //2 less total/parsed, +or,shift static void dyn_fill_blocks(void) { . . case fpu_restore: dyn_loadstate(&save_info[sct].state); gen_load_host(&dyn_dh_fpu.state_used,DREG(TMPB),4); gen_sop_word(SOP_INC,true,DREG(TMPB)); GenReg * gr1=FindDynReg(DREG(TMPB)); cache_addw(0x25dd); // FRSTOR fpu.state (fpu_restore) // cache_addb(0x25); cache_addd((Bit32u)(&(dyn_dh_fpu.state[0]))); cache_addw(0x89|(0x05|(gr1->index<<3))<<8); // mov fpu.state_used,1 // cache_addb(0x05|(gr1->index<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.state_used))); gen_releasereg(DREG(TMPB)); dyn_synchstate(&save_info[sct].state); gen_create_jump(save_info[sct].return_pos); break; // 4 less total/parsed, if needs to be less obtuse I'd just keep the unfolded in comments for reference // straight reduction, decent bit lighter for such an often used function, worth it I'd say static void dyn_read_byte(DynReg * addr,DynReg * dst,Bitu high) { dyn_read_intro(addr,false); // cache_addw(0xe8c1); // shr eax,0x0c // cache_addb(0x0c); // cache_addw(0x048b); // mov eax,paging.tlb.read[eax*TYPE Bit32u] // cache_addb(0x85); cache_addd(0x8b0ce8c1); cache_addw(0x8504); cache_addd((Bit32u)(&paging.tlb.read[0])); cache_addw(0xc085); // test eax,eax Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x048a); // mov al,[eax+ecx] cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(je_loc); cache_addw(0xe851); // push ecx // cache_addb(0xe8); cache_addd(((Bit32u)&mem_readb_checked_dcx86) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,4 // cache_addb(0x04); // cache_addw(0x012c); // sub al,1 cache_addd(0x2c04c483); cache_addb(0x01); dyn_check_bool_exception_ne(); cache_addw(0x058a); //mov al,[] cache_addd((Bit32u)(&core_dyn.readdata)); gen_fill_jump(jmp_loc); x86gen.regs[X86_REG_EAX]->notusable=true; GenReg * genreg=FindDynReg(dst); x86gen.regs[X86_REG_EAX]->notusable=false; cache_addw(0xc08a+(genreg->index<<11)+(high?0x2000:0)); dst->flags|=DYNFLG_CHANGED; } //same as dyn_read_byte static void dyn_read_byte_release(DynReg * addr,DynReg * dst,Bitu high) { dyn_read_intro(addr); // cache_addw(0xe8c1); // shr eax,0x0c // cache_addb(0x0c); // cache_addw(0x048b); // mov eax,paging.tlb.read[eax*TYPE Bit32u] // cache_addb(0x85); cache_addd(0x8b0ce8c1); cache_addw(0x8504); cache_addd((Bit32u)(&paging.tlb.read[0])); cache_addw(0xc085); // test eax,eax Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x048a); // mov al,[eax+ecx] cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(je_loc); cache_addw(0xe851); // push ecx // cache_addb(0xe8); cache_addd(((Bit32u)&mem_readb_checked_dcx86) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,4 // cache_addb(0x04); // cache_addw(0x012c); // sub al,1 cache_addd(0x2c04c483); cache_addb(0x01); dyn_check_bool_exception_ne(); cache_addw(0x058a); //mov al,[] cache_addd((Bit32u)(&core_dyn.readdata)); gen_fill_jump(jmp_loc); x86gen.regs[X86_REG_EAX]->notusable=true; GenReg * genreg=FindDynReg(dst); x86gen.regs[X86_REG_EAX]->notusable=false; cache_addw(0xc08a+(genreg->index<<11)+(high?0x2000:0)); dst->flags|=DYNFLG_CHANGED; } //same static void dyn_read_word(DynReg * addr,DynReg * dst,bool dword) { if (dword) { dyn_read_intro(addr,false); cache_addw(0xe8d1); // shr eax,0x1 Bit8u* jb_loc1=gen_create_branch(BR_B); cache_addw(0xe8d1); // shr eax,0x1 Bit8u* jb_loc2=gen_create_branch(BR_B); // cache_addw(0xe8c1); // shr eax,0x0a // cache_addb(0x0a); // cache_addw(0x048b); // mov eax,paging.tlb.read[eax*TYPE Bit32u] // cache_addb(0x85); cache_addd(0x8b0ae8c1); cache_addw(0x8504); cache_addd((Bit32u)(&paging.tlb.read[0])); cache_addw(0xc085); // test eax,eax Bit8u* je_loc=gen_create_branch(BR_Z); GenReg * genreg=FindDynReg(dst,true); cache_addw(0x048b+(genreg->index <<(8+3))); // mov dest,[eax+ecx] cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(jb_loc1); gen_fill_branch(jb_loc2); gen_fill_branch(je_loc); cache_addw(0xe851); // push ecx // cache_addb(0xe8); cache_addd(((Bit32u)&mem_readd_checked_dcx86) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,4 // cache_addb(0x04); // cache_addw(0x012c); // sub al,1 cache_addd(0x2c04c483); cache_addb(0x01); dyn_check_bool_exception_ne(); gen_mov_host(&core_dyn.readdata,dst,4); dst->flags|=DYNFLG_CHANGED; gen_fill_jump(jmp_loc); } else { gen_protectflags(); gen_call_function((void *)&mem_readw_checked,"%Dd%Id",addr,&core_dyn.readdata); dyn_check_bool_exception_al(); gen_mov_host(&core_dyn.readdata,dst,2); } } //same static void dyn_read_word_release(DynReg * addr,DynReg * dst,bool dword) { if (dword) { dyn_read_intro(addr); cache_addw(0xe8d1); // shr eax,0x1 Bit8u* jb_loc1=gen_create_branch(BR_B); cache_addw(0xe8d1); // shr eax,0x1 Bit8u* jb_loc2=gen_create_branch(BR_B); // cache_addw(0xe8c1); // shr eax,0x0a // cache_addb(0x0a); // cache_addw(0x048b); // mov eax,paging.tlb.read[eax*TYPE Bit32u] // cache_addb(0x85); cache_addd(0x8b0ae8c1); cache_addw(0x8504); cache_addd((Bit32u)(&paging.tlb.read[0])); cache_addw(0xc085); // test eax,eax Bit8u* je_loc=gen_create_branch(BR_Z); GenReg * genreg=FindDynReg(dst,true); cache_addw(0x048b+(genreg->index <<(8+3))); // mov dest,[eax+ecx] cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(jb_loc1); gen_fill_branch(jb_loc2); gen_fill_branch(je_loc); cache_addw(0xe851); // push ecx // cache_addb(0xe8); cache_addd(((Bit32u)&mem_readd_checked_dcx86) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,4 // cache_addb(0x04); // cache_addw(0x012c); // sub al,1 cache_addd(0x2c04c483); cache_addb(0x01); dyn_check_bool_exception_ne(); gen_mov_host(&core_dyn.readdata,dst,4); dst->flags|=DYNFLG_CHANGED; gen_fill_jump(jmp_loc); } else { gen_protectflags(); gen_call_function((void *)&mem_readw_checked,"%Ddr%Id",addr,&core_dyn.readdata); dyn_check_bool_exception_al(); gen_mov_host(&core_dyn.readdata,dst,2); } } // 7 less total, parsed, -mov,+,or, +mov,shift,or static void dyn_write_byte(DynReg * addr,DynReg * val,bool high) { dyn_write_intro(addr,false); GenReg * genreg=FindDynReg(val); // cache_addw(0xe9c1); // shr ecx,0x0c // cache_addb(0x0c); // cache_addw(0x0c8b); // mov ecx,paging.tlb.read[ecx*TYPE Bit32u] // cache_addb(0x8d); cache_addd(0x8b0ce9c1); cache_addw(0x8d0c); cache_addd((Bit32u)(&paging.tlb.write[0])); cache_addw(0xc985); // test ecx,ecx Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x0488+(genreg->index<<11)+(high?0x2000:0)); // mov [eax+ecx],reg cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(je_loc); // if (GCC_UNLIKELY(high)) cache_addw(0xe086+((genreg->index+(genreg->index<<3))<<8)); // cache_addb(0x52); // push edx // cache_addb(0x50+genreg->index); // cache_addb(0x50); // push eax // if (GCC_UNLIKELY(high)) cache_addw(0xe086+((genreg->index+(genreg->index<<3))<<8)); // cache_addb(0xe8); if (GCC_UNLIKELY(high)) { Bit16u index=0xe086+((genreg->index+(genreg->index<<3))<<8); cache_addd(index|0x52<<16|(0x50+genreg->index)<<24); cache_addd(0x50|index<<8|0xe8<<24); } else { cache_addd(0x52|(0x50+genreg->index)<<8|0xe850<<16); } cache_addd(((Bit32u)&mem_writeb_checked) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,8 // cache_addb(0x08); // cache_addw(0x012c); // sub al,1 // cache_addb(0x5a); // pop edx cache_addd(0x2c08c483); cache_addw(0x5a01); // Restore registers to be used again x86gen.regs[X86_REG_EAX]->notusable=false; x86gen.regs[X86_REG_ECX]->notusable=false; dyn_check_bool_exception_ne(); gen_fill_jump(jmp_loc); } //ditto static void dyn_write_byte_release(DynReg * addr,DynReg * val,bool high) { dyn_write_intro(addr); GenReg * genreg=FindDynReg(val); // cache_addw(0xe9c1); // shr ecx,0x0c // cache_addb(0x0c); // cache_addw(0x0c8b); // mov ecx,paging.tlb.read[ecx*TYPE Bit32u] // cache_addb(0x8d); cache_addd(0x8b0ce9c1); cache_addw(0x8d0c); cache_addd((Bit32u)(&paging.tlb.write[0])); cache_addw(0xc985); // test ecx,ecx Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x0488+(genreg->index<<11)+(high?0x2000:0)); // mov [eax+ecx],reg cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(je_loc); // cache_addb(0x52); // push edx // if (GCC_UNLIKELY(high)) cache_addw(0xe086+((genreg->index+(genreg->index<<3))<<8)); // cache_addb(0x50+genreg->index); // cache_addb(0x50); // push eax // if (GCC_UNLIKELY(high)) cache_addw(0xe086+((genreg->index+(genreg->index<<3))<<8)); // cache_addb(0xe8); if (GCC_UNLIKELY(high)) { Bit16u index=0xe086+((genreg->index+(genreg->index<<3))<<8); cache_addd(0x52|index<<8|(0x50+genreg->index)<<24); cache_addd(0x50|index<<8|0xe8<<24); } else { cache_addd(0x52|(0x50+genreg->index)<<8|0xe850<<16); } cache_addd(((Bit32u)&mem_writeb_checked) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,8 // cache_addb(0x08); // cache_addw(0x012c); // sub al,1 // cache_addb(0x5a); // pop edx cache_addd(0x2c08c483); cache_addw(0x5a01); // Restore registers to be used again x86gen.regs[X86_REG_EAX]->notusable=false; x86gen.regs[X86_REG_ECX]->notusable=false; dyn_check_bool_exception_ne(); gen_fill_jump(jmp_loc); } //yep static void dyn_write_word(DynReg * addr,DynReg * val,bool dword) { if (dword) { dyn_write_intro(addr,false); GenReg * genreg=FindDynReg(val); cache_addw(0xe9d1); // shr ecx,0x1 Bit8u* jb_loc1=gen_create_branch(BR_B); cache_addw(0xe9d1); // shr ecx,0x1 Bit8u* jb_loc2=gen_create_branch(BR_B); // cache_addw(0xe9c1); // shr ecx,0x0a // cache_addb(0x0a); // cache_addw(0x0c8b); // mov ecx,paging.tlb.read[ecx*TYPE Bit32u] // cache_addb(0x8d); cache_addd(0x8b0ae9c1); cache_addw(0x8d0c); cache_addd((Bit32u)(&paging.tlb.write[0])); cache_addw(0xc985); // test ecx,ecx Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x0489+(genreg->index <<(8+3))); // mov [eax+ecx],reg cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(jb_loc1); gen_fill_branch(jb_loc2); gen_fill_branch(je_loc); // cache_addb(0x52); // push edx // cache_addb(0x50+genreg->index); // cache_addb(0x50); // push eax // cache_addb(0xe8); cache_addd(0x52|(0x50+genreg->index)<<8|0xe850<<16); // push edx|index|push eax cache_addd(((Bit32u)&mem_writed_checked) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,8 // cache_addb(0x08); // cache_addw(0x012c); // sub al,1 // cache_addb(0x5a); // pop edx cache_addd(0x2c08c483); cache_addw(0x5a01); // Restore registers to be used again x86gen.regs[X86_REG_EAX]->notusable=false; x86gen.regs[X86_REG_ECX]->notusable=false; dyn_check_bool_exception_ne(); gen_fill_jump(jmp_loc); } else { gen_protectflags(); gen_call_function((void *)&mem_writew_checked,"%Dd%Dd",addr,val); dyn_check_bool_exception_al(); } } //last one static void dyn_write_word_release(DynReg * addr,DynReg * val,bool dword) { if (dword) { dyn_write_intro(addr); GenReg * genreg=FindDynReg(val); cache_addw(0xe9d1); // shr ecx,0x1 Bit8u* jb_loc1=gen_create_branch(BR_B); cache_addw(0xe9d1); // shr ecx,0x1 Bit8u* jb_loc2=gen_create_branch(BR_B); // cache_addw(0xe9c1); // shr ecx,0x0a // cache_addb(0x0a); // cache_addw(0x0c8b); // mov ecx,paging.tlb.read[ecx*TYPE Bit32u] // cache_addb(0x8d); cache_addd(0x8b0ae9c1); cache_addw(0x8d0c); cache_addd((Bit32u)(&paging.tlb.write[0])); cache_addw(0xc985); // test ecx,ecx Bit8u* je_loc=gen_create_branch(BR_Z); cache_addw(0x0489+(genreg->index <<(8+3))); // mov [eax+ecx],reg cache_addb(0x08); Bit8u* jmp_loc=gen_create_jump(); gen_fill_branch(jb_loc1); gen_fill_branch(jb_loc2); gen_fill_branch(je_loc); // cache_addb(0x52); // push edx // cache_addb(0x50+genreg->index); // cache_addb(0x50); // push eax // cache_addb(0xe8); cache_addd(0x52|(0x50+genreg->index)<<8|0xe850<<16); cache_addd(((Bit32u)&mem_writed_checked) - (Bit32u)cache.pos-4); // cache_addw(0xc483); // add esp,8 // cache_addb(0x08); // cache_addw(0x012c); // sub al,1 // cache_addb(0x5a); // pop edx cache_addd(0x2c08c483); cache_addw(0x5a01); // Restore registers to be used again x86gen.regs[X86_REG_EAX]->notusable=false; x86gen.regs[X86_REG_ECX]->notusable=false; dyn_check_bool_exception_ne(); gen_fill_jump(jmp_loc); } else { gen_protectflags(); gen_call_function((void *)&mem_writew_checked,"%Ddr%Dd",addr,val); dyn_check_bool_exception_al(); } }