Fixed handling of DMF IMG images;
Fixed 3.5" 2ED XDF structure; Applied mainline PCem big recompiler speedup (up to 20% seen) commit; Added support for floppy drive swapping with the Winbond W3877F Super I/O chip.
This commit is contained in:
@@ -666,50 +666,9 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV ESI, EDX*/
|
||||
addbyte(0xd6);
|
||||
addbyte(0x01); /*ADDL EDX, EAX*/
|
||||
addbyte(0xc2);
|
||||
addbyte(0x89); /*MOV EDI, EDX*/
|
||||
addbyte(0xd7);
|
||||
addbyte(0xc1); /*SHR EDX, 12*/
|
||||
addbyte(0xea);
|
||||
addbyte(12);
|
||||
addbyte(0x8b); /*MOV EDX, readlookup2[EDX*4]*/
|
||||
addbyte(0x14);
|
||||
addbyte(0x95);
|
||||
addlong((uint32_t)readlookup2);
|
||||
addbyte(0x83); /*CMP EDX, -1*/
|
||||
addbyte(0xfa);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(4+2);
|
||||
addbyte(0x0f); /*MOVZX EAX, B[EDX+EDI]*/
|
||||
addbyte(0xb6);
|
||||
addbyte(0x04);
|
||||
addbyte(0x3a);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+3+5+4+6+3);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0x89); /*MOV [ESP], ESI*/
|
||||
addbyte(0x34);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL readmemb386l*/
|
||||
addlong((uint32_t)readmemb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f); /*JNE end*/
|
||||
addbyte(0x85);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addbyte(0x0f); /*MOVZX EAX, AL*/
|
||||
addbyte(0xb6);
|
||||
addbyte(0xc0);
|
||||
/*done:*/
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_b*/
|
||||
addlong(mem_load_addr_ea_b - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
host_reg_mapping[0] = 8;
|
||||
}
|
||||
static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
|
||||
@@ -717,57 +676,9 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV ESI, EDX*/
|
||||
addbyte(0xd6);
|
||||
addbyte(0x01); /*ADDL EDX, EAX*/
|
||||
addbyte(0xc2);
|
||||
addbyte(0x8d); /*LEA EDI, 1[EDX]*/
|
||||
addbyte(0x7a);
|
||||
addbyte(0x01);
|
||||
addbyte(0xc1); /*SHR EDX, 12*/
|
||||
addbyte(0xea);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xfff*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xfff);
|
||||
addbyte(0x8b); /*MOV EDX, readlookup2[EDX*4]*/
|
||||
addbyte(0x14);
|
||||
addbyte(0x95);
|
||||
addlong((uint32_t)readlookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+5+2);
|
||||
addbyte(0x83); /*CMP EDX, -1*/
|
||||
addbyte(0xfa);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(5+2);
|
||||
addbyte(0x0f); /*MOVZX EAX, -1[EDX+EDI]W*/
|
||||
addbyte(0xb7);
|
||||
addbyte(0x44);
|
||||
addbyte(0x3a);
|
||||
addbyte(-1);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+3+5+4+6+3);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0x89); /*MOV [ESP], ESI*/
|
||||
addbyte(0x34);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL readmemwl*/
|
||||
addlong((uint32_t)readmemwl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x85); /*JNE end*/
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
addbyte(0x0f); /*MOVZX EAX, AX*/
|
||||
addbyte(0xb7);
|
||||
addbyte(0xc0);
|
||||
/*done:*/
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_w*/
|
||||
addlong(mem_load_addr_ea_w - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
host_reg_mapping[0] = 8;
|
||||
}
|
||||
static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
||||
@@ -775,53 +686,10 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV ESI, EDX*/
|
||||
addbyte(0xd6);
|
||||
addbyte(0x01); /*ADDL EDX, EAX*/
|
||||
addbyte(0xc2);
|
||||
addbyte(0x8d); /*LEA EDI, 3[EDX]*/
|
||||
addbyte(0x7a);
|
||||
addbyte(0x03);
|
||||
addbyte(0xc1); /*SHR EDX, 12*/
|
||||
addbyte(0xea);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xffc*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xffc);
|
||||
addbyte(0x8b); /*MOV EDX, readlookup2[EDX*4]*/
|
||||
addbyte(0x14);
|
||||
addbyte(0x95);
|
||||
addlong((uint32_t)readlookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+4+2);
|
||||
addbyte(0x83); /*CMP EDX, -1*/
|
||||
addbyte(0xfa);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(4+2);
|
||||
addbyte(0x8b); /*MOV EAX, -3[EDX+EDI]*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x3a);
|
||||
addbyte(-3);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0x89); /*MOV [ESP], ESI*/
|
||||
addbyte(0x34);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL readmemll*/
|
||||
addlong((uint32_t)readmemll - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x85); /*JNE end*/
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_l*/
|
||||
addlong(mem_load_addr_ea_l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
|
||||
host_reg_mapping[0] = 8;
|
||||
}
|
||||
|
||||
@@ -830,57 +698,9 @@ static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV ESI, EDX*/
|
||||
addbyte(0xd6);
|
||||
addbyte(0x01); /*ADDL EDX, EAX*/
|
||||
addbyte(0xc2);
|
||||
addbyte(0x8d); /*LEA EDI, 7[EDX]*/
|
||||
addbyte(0x7a);
|
||||
addbyte(0x07);
|
||||
addbyte(0xc1); /*SHR EDX, 12*/
|
||||
addbyte(0xea);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xff8*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xff8);
|
||||
addbyte(0x8b); /*MOV EDX, readlookup2[EDX*4]*/
|
||||
addbyte(0x14);
|
||||
addbyte(0x95);
|
||||
addlong((uint32_t)readlookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+4+4+2);
|
||||
addbyte(0x83); /*CMP EDX, -1*/
|
||||
addbyte(0xfa);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(4+4+2);
|
||||
addbyte(0x8b); /*MOV EAX, [EDX+EDI]*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x3a);
|
||||
addbyte(-7);
|
||||
addbyte(0x8b); /*MOV EDX, [EDX+EDI+4]*/
|
||||
addbyte(0x54);
|
||||
addbyte(0x3a);
|
||||
addbyte(-7+4);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0x89); /*MOV [ESP], ESI*/
|
||||
addbyte(0x34);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL readmemql*/
|
||||
addlong((uint32_t)readmemql - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x85); /*JNE end*/
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_q*/
|
||||
addlong(mem_load_addr_ea_q - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
host_reg_mapping[0] = 8;
|
||||
}
|
||||
|
||||
@@ -908,230 +728,57 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x01); /*ADDL ESI, EAX*/
|
||||
addbyte(0xc0 | (REG_EAX << 3) | REG_ESI);
|
||||
addbyte(0x89); /*MOV EDI, ESI*/
|
||||
addbyte(0xc0 | (REG_ESI << 3) | REG_EDI);
|
||||
addbyte(0xc1); /*SHR ESI, 12*/
|
||||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(12);
|
||||
addbyte(0x8b); /*MOV ESI, readlookup2[ESI*4]*/
|
||||
addbyte(0x04 | (REG_ESI << 3));
|
||||
addbyte(0x85 | (REG_ESI << 3));
|
||||
addlong((uint32_t)writelookup2);
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xf8 | REG_ESI);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2);
|
||||
addbyte(0x88); /*MOV [EDI+ESI],host_reg*/
|
||||
addbyte(0x04 | (host_reg << 3));
|
||||
addbyte(REG_EDI | (REG_ESI << 3));
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+5+4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0xa1); /*MOV EAX, seg->base*/
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV [ESP+8], host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(0x24);
|
||||
addbyte(0x08);
|
||||
addbyte(0x89); /*MOV [ESP], EAX*/
|
||||
addbyte(0x04);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL writememb386l*/
|
||||
addlong((uint32_t)writememb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f); /*JNE end*/
|
||||
addbyte(0x85);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
addbyte(0xc0 | REG_ECX | (host_reg << 3));
|
||||
}
|
||||
addbyte(0xe8); /*CALL mem_store_addr_ea_b*/
|
||||
addlong(mem_store_addr_ea_b - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x01); /*ADDL ESI, EAX*/
|
||||
addbyte(0xc0 | (REG_EAX << 3) | REG_ESI);
|
||||
addbyte(0x8d); /*LEA EDI, 1[ESI]*/
|
||||
addbyte(0x7e);
|
||||
addbyte(0x01);
|
||||
addbyte(0xc1); /*SHR ESI, 12*/
|
||||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xfff*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xfff);
|
||||
addbyte(0x8b); /*MOV ESI, readlookup2[ESI*4]*/
|
||||
addbyte(0x04 | (REG_ESI << 3));
|
||||
addbyte(0x85 | (REG_ESI << 3));
|
||||
addlong((uint32_t)writelookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+5+2);
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xf8 | REG_ESI);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(5+2);
|
||||
addbyte(0x66); /*MOV -1[EDI+ESI],host_reg*/
|
||||
addbyte(0x89);
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(REG_EDI | (REG_ESI << 3));
|
||||
addbyte(-1);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+5+4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0xa1); /*MOV EAX, seg->base*/
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV [ESP+8], host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(0x24);
|
||||
addbyte(0x08);
|
||||
addbyte(0x89); /*MOV [ESP], EAX*/
|
||||
addbyte(0x04);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL writememwl*/
|
||||
addlong((uint32_t)writememwl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f); /*JNE end*/
|
||||
addbyte(0x85);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
addbyte(0xc0 | REG_ECX | (host_reg << 3));
|
||||
}
|
||||
addbyte(0xe8); /*CALL mem_store_addr_ea_w*/
|
||||
addlong(mem_store_addr_ea_w - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x01); /*ADDL ESI, EAX*/
|
||||
addbyte(0xc0 | (REG_EAX << 3) | REG_ESI);
|
||||
addbyte(0x8d); /*LEA EDI, 3[ESI]*/
|
||||
addbyte(0x7e);
|
||||
addbyte(0x03);
|
||||
addbyte(0xc1); /*SHR ESI, 12*/
|
||||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xffc*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xffc);
|
||||
addbyte(0x8b); /*MOV ESI, readlookup2[ESI*4]*/
|
||||
addbyte(0x04 | (REG_ESI << 3));
|
||||
addbyte(0x85 | (REG_ESI << 3));
|
||||
addlong((uint32_t)writelookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+4+2);
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xf8 | REG_ESI);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(4+2);
|
||||
addbyte(0x89); /*MOV -3[EDI+ESI],host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(REG_EDI | (REG_ESI << 3));
|
||||
addbyte(-3);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+5+4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0xa1); /*MOV EAX, seg->base*/
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV [ESP+8], host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(0x24);
|
||||
addbyte(0x08);
|
||||
addbyte(0x89); /*MOV [ESP], EAX*/
|
||||
addbyte(0x04);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL writememll*/
|
||||
addlong((uint32_t)writememll - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f); /*JNE end*/
|
||||
addbyte(0x85);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
addbyte(0xc0 | REG_ECX | (host_reg << 3));
|
||||
}
|
||||
addbyte(0xe8); /*CALL mem_store_addr_ea_l*/
|
||||
addlong(mem_store_addr_ea_l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
|
||||
{
|
||||
if (host_reg != REG_EBX)
|
||||
{
|
||||
addbyte(0x89); /*MOV EBX, host_reg*/
|
||||
addbyte(0xc0 | REG_EBX | (host_reg << 3));
|
||||
}
|
||||
if (host_reg2 != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg2*/
|
||||
addbyte(0xc0 | REG_ECX | (host_reg2 << 3));
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x01); /*ADDL ESI, EAX*/
|
||||
addbyte(0xc0 | (REG_EAX << 3) | REG_ESI);
|
||||
addbyte(0x8d); /*LEA EDI, 7[ESI]*/
|
||||
addbyte(0x7e);
|
||||
addbyte(0x07);
|
||||
addbyte(0xc1); /*SHR ESI, 12*/
|
||||
addbyte(0xe8 | REG_ESI);
|
||||
addbyte(12);
|
||||
addbyte(0xf7); /*TEST EDI, 0xff8*/
|
||||
addbyte(0xc7);
|
||||
addlong(0xff8);
|
||||
addbyte(0x8b); /*MOV ESI, readlookup2[ESI*4]*/
|
||||
addbyte(0x04 | (REG_ESI << 3));
|
||||
addbyte(0x85 | (REG_ESI << 3));
|
||||
addlong((uint32_t)writelookup2);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(3+2+4+4+2);
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xf8 | REG_ESI);
|
||||
addbyte(-1);
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
addbyte(4+4+2);
|
||||
addbyte(0x89); /*MOV [EDI+ESI],host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(REG_EDI | (REG_ESI << 3));
|
||||
addbyte(-7);
|
||||
addbyte(0x89); /*MOV [EDI+ESI+4],host_reg2*/
|
||||
addbyte(0x44 | (host_reg2 << 3));
|
||||
addbyte(REG_EDI | (REG_ESI << 3));
|
||||
addbyte(-7+0x04);
|
||||
addbyte(0xeb); /*JMP done*/
|
||||
addbyte(4+5+4+4+3+5+4+6);
|
||||
addbyte(0x89); /*slowpath: MOV [ESP+4], EAX*/
|
||||
addbyte(0x44);
|
||||
addbyte(0x24);
|
||||
addbyte(0x04);
|
||||
addbyte(0xa1); /*MOV EAX, seg->base*/
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x89); /*MOV [ESP+8], host_reg*/
|
||||
addbyte(0x44 | (host_reg << 3));
|
||||
addbyte(0x24);
|
||||
addbyte(0x08);
|
||||
addbyte(0x89); /*MOV [ESP+12], host_reg2*/
|
||||
addbyte(0x44 | (host_reg2 << 3));
|
||||
addbyte(0x24);
|
||||
addbyte(0x0c);
|
||||
addbyte(0x89); /*MOV [ESP], EAX*/
|
||||
addbyte(0x04);
|
||||
addbyte(0x24);
|
||||
addbyte(0xe8); /*CALL writememql*/
|
||||
addlong((uint32_t)writememql - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte(cpu_state_offset(abrt));
|
||||
addbyte(0);
|
||||
addbyte(0x0f); /*JNE end*/
|
||||
addbyte(0x85);
|
||||
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
|
||||
/*done:*/
|
||||
addbyte(0xe8); /*CALL mem_store_addr_ea_q*/
|
||||
addlong(mem_store_addr_ea_q - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
}
|
||||
|
||||
static void MEM_STORE_ADDR_IMM_B(x86seg *seg, uint32_t addr, int host_reg)
|
||||
|
||||
Reference in New Issue
Block a user