From 9060f4552f7629ee106645447edb3db0fa41f693 Mon Sep 17 00:00:00 2001 From: SarahW Date: Mon, 28 Jan 2019 21:56:57 +0000 Subject: [PATCH] Remove fake 3-operand instructions in x86-64 backend. --- src/codegen_backend_x86-64.c | 22 ++-- src/codegen_backend_x86-64_ops.c | 210 +++++++++++++++--------------- src/codegen_backend_x86-64_ops.h | 60 ++++----- src/codegen_backend_x86-64_uops.c | 119 +++++++++-------- 4 files changed, 209 insertions(+), 202 deletions(-) diff --git a/src/codegen_backend_x86-64.c b/src/codegen_backend_x86-64.c index 2c1d970..01eec22 100644 --- a/src/codegen_backend_x86-64.c +++ b/src/codegen_backend_x86-64.c @@ -100,7 +100,7 @@ static void build_load_routine(codeblock_t *block, int size, int is_float) host_x86_MOVQ_XREG_BASE_INDEX(block, REG_XMM_TEMP, REG_RSI, REG_RCX); else fatal("build_load_routine: size=%i\n", size); - host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI, REG_ESI); + host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI); host_x86_RET(block); *branch_offset = (uint8_t)((uintptr_t)&block_write_data[block_pos] - (uintptr_t)branch_offset) - 1; @@ -198,7 +198,7 @@ static void build_store_routine(codeblock_t *block, int size, int is_float) host_x86_MOVQ_BASE_INDEX_XREG(block, REG_RSI, REG_RDI, REG_XMM_TEMP); else fatal("build_store_routine: size=%i\n", size); - host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI, REG_ESI); + host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI); host_x86_RET(block); *branch_offset = (uint8_t)((uintptr_t)&block_write_data[block_pos] - (uintptr_t)branch_offset) - 1; @@ -305,15 +305,15 @@ void codegen_backend_init() codegen_gpf_rout = &codeblock[block_current].data[block_pos]; #if WIN64 - host_x86_XOR32_REG_REG(block, REG_ECX, REG_ECX, REG_ECX); - host_x86_XOR32_REG_REG(block, REG_EDX, REG_EDX, REG_EDX); + host_x86_XOR32_REG_REG(block, REG_ECX, REG_ECX); + host_x86_XOR32_REG_REG(block, REG_EDX, REG_EDX); #else - host_x86_XOR32_REG_REG(block, REG_EDI, REG_EDI, REG_EDI); - host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI, REG_ESI); + host_x86_XOR32_REG_REG(block, REG_EDI, REG_EDI); + host_x86_XOR32_REG_REG(block, REG_ESI, REG_ESI); #endif host_x86_CALL(block, (uintptr_t)x86gpf); codegen_exit_rout = &codeblock[block_current].data[block_pos]; - host_x86_ADD32_REG_IMM(block, REG_ESP, REG_ESP, 0x38); + host_x86_ADD64_REG_IMM(block, REG_RSP, 0x38); host_x86_POP(block, REG_R15); host_x86_POP(block, REG_R14); host_x86_POP(block, REG_R13); @@ -349,19 +349,19 @@ void codegen_backend_prologue(codeblock_t *block) host_x86_PUSH(block, REG_R13); host_x86_PUSH(block, REG_R14); host_x86_PUSH(block, REG_R15); - host_x86_SUB32_REG_IMM(block, REG_ESP, REG_ESP, 0x38); + host_x86_SUB64_REG_IMM(block, REG_RSP, 0x38); host_x86_MOV64_REG_IMM(block, REG_RBP, ((uintptr_t)&cpu_state) + 128); if (block->flags & CODEBLOCK_HAS_FPU) { host_x86_MOV32_REG_ABS(block, REG_EAX, &cpu_state.TOP); - host_x86_SUB32_REG_IMM(block, REG_EAX, REG_EAX, block->TOP); - host_x86_MOV32_BASE_OFFSET_REG(block, REG_ESP, IREG_TOP_diff_stack_offset, REG_EAX); + host_x86_SUB32_REG_IMM(block, REG_EAX, block->TOP); + host_x86_MOV32_BASE_OFFSET_REG(block, REG_RSP, IREG_TOP_diff_stack_offset, REG_EAX); } } void codegen_backend_epilogue(codeblock_t *block) { - host_x86_ADD32_REG_IMM(block, REG_ESP, REG_ESP, 0x38); + host_x86_ADD64_REG_IMM(block, REG_RSP, 0x38); host_x86_POP(block, REG_R15); host_x86_POP(block, REG_R14); host_x86_POP(block, REG_R13); diff --git a/src/codegen_backend_x86-64_ops.c b/src/codegen_backend_x86-64_ops.c index 90700fe..9e9928d 100644 --- a/src/codegen_backend_x86-64_ops.c +++ b/src/codegen_backend_x86-64_ops.c @@ -163,10 +163,10 @@ static inline void jmp(codeblock_t *block, uintptr_t func) } } -void host_x86_ADD8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data) +void host_x86_ADD8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_ADD8_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_ADD8_REG_IMM - dst_reg & 8\n"); if (dst_reg == REG_EAX) { @@ -179,10 +179,10 @@ void host_x86_ADD8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t codegen_addbyte3(block, 0x80, 0xc0 | RM_OP_ADD | (dst_reg & 7), imm_data); /*ADD dst_reg, imm_data*/ } } -void host_x86_ADD16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data) +void host_x86_ADD16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_ADD32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_ADD16_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -202,10 +202,10 @@ void host_x86_ADD16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16 codegen_addword(block, imm_data); } } -void host_x86_ADD32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data) +void host_x86_ADD32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_ADD32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_ADD32_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -238,29 +238,29 @@ void host_x86_ADD64_REG_IMM(codeblock_t *block, int dst_reg, uint64_t imm_data) else fatal("ADD64_REG_IMM !is_imm8 %016llx\n", imm_data); } -void host_x86_ADD8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_ADD8_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_ADD8_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_ADD8_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x00, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*ADD dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x00, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*ADD dst_reg, src_reg*/ } -void host_x86_ADD16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_ADD16_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_ADD16_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_ADD16_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 3); - codegen_addbyte3(block, 0x66, 0x01, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*ADD dst_reg, src_reg_b*/ + codegen_addbyte3(block, 0x66, 0x01, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*ADD dst_reg, src_reg*/ } -void host_x86_ADD32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_ADD32_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_ADD32_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_ADD32_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x01, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*ADD dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x01, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*ADD dst_reg, src_reg*/ } void host_x86_ADDPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) @@ -274,10 +274,10 @@ void host_x86_ADDSD_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) codegen_addbyte4(block, 0xf2, 0x0f, 0x58, 0xc0 | src_reg | (dst_reg << 3)); } -void host_x86_AND8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data) +void host_x86_AND8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_AND8_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_AND8_REG_IMM - dst_reg & 8\n"); if (dst_reg == REG_EAX) { @@ -290,10 +290,10 @@ void host_x86_AND8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t codegen_addbyte3(block, 0x80, 0xc0 | RM_OP_AND | (dst_reg & 7), imm_data); /*AND dst_reg, imm_data*/ } } -void host_x86_AND16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data) +void host_x86_AND16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_AND32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_AND16_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -313,10 +313,10 @@ void host_x86_AND16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16 codegen_addword(block, imm_data); } } -void host_x86_AND32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data) +void host_x86_AND32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_AND32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_AND32_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -336,29 +336,29 @@ void host_x86_AND32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32 codegen_addlong(block, imm_data); } } -void host_x86_AND8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_AND8_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_AND8_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_AND8_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x20, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*AND dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x20, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*AND dst_reg, src_reg*/ } -void host_x86_AND16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_AND16_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_AND16_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_AND16_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 3); - codegen_addbyte3(block, 0x66, 0x21, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*AND dst_reg, src_reg_b*/ + codegen_addbyte3(block, 0x66, 0x21, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*AND dst_reg, src_reg*/ } -void host_x86_AND32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_AND32_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_AND32_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_AND32_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x21, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*AND dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x21, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*AND dst_reg, src_reg*/ } void host_x86_CALL(codeblock_t *block, void *p) @@ -1512,10 +1512,10 @@ void host_x86_NOP(codeblock_t *block) codegen_addbyte(block, 0x90); /*NOP*/ } -void host_x86_OR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data) +void host_x86_OR8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_OR8_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_OR8_REG_IMM - dst_reg & 8\n"); if (dst_reg == REG_EAX) { @@ -1528,10 +1528,10 @@ void host_x86_OR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t codegen_addbyte3(block, 0x80, 0xc0 | RM_OP_OR | (dst_reg & 7), imm_data); /*OR dst_reg, imm_data*/ } } -void host_x86_OR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data) +void host_x86_OR16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_OR16_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_OR16_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -1551,10 +1551,10 @@ void host_x86_OR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_ codegen_addword(block, imm_data); } } -void host_x86_OR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data) +void host_x86_OR32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_OR32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_OR32_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -1574,29 +1574,29 @@ void host_x86_OR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_ codegen_addlong(block, imm_data); } } -void host_x86_OR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_OR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_OR8_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_OR8_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x08, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*OR dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x08, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*OR dst_reg, src_reg*/ } -void host_x86_OR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_OR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_OR16_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_OR16_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 3); - codegen_addbyte3(block, 0x66, 0x09, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*OR dst_reg, src_reg_b*/ + codegen_addbyte3(block, 0x66, 0x09, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*OR dst_reg, src_reg*/ } -void host_x86_OR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_OR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_OR32_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_OR32_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x09, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*OR dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x09, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*OR dst_reg, src_reg*/ } void host_x86_PACKSSWB_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) @@ -2046,10 +2046,10 @@ void host_x86_SQRTSS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) codegen_addbyte4(block, 0xf3, 0x0f, 0x51, 0xc0 | src_reg | (dst_reg << 3)); /*SQRTSS dst_reg, src_reg*/ } -void host_x86_SUB8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data) +void host_x86_SUB8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_SUB8_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_SUB8_REG_IMM - dst_reg & 8\n"); if (dst_reg == REG_EAX) { @@ -2062,10 +2062,10 @@ void host_x86_SUB8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t codegen_addbyte3(block, 0x80, 0xc0 | RM_OP_SUB | (dst_reg & 7), imm_data); /*SUB dst_reg, imm_data*/ } } -void host_x86_SUB16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data) +void host_x86_SUB16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_SUB16_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_SUB16_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -2085,10 +2085,10 @@ void host_x86_SUB16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16 codegen_addword(block, imm_data); } } -void host_x86_SUB32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data) +void host_x86_SUB32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_SUB32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_SUB32_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -2121,29 +2121,29 @@ void host_x86_SUB64_REG_IMM(codeblock_t *block, int dst_reg, uint64_t imm_data) else fatal("SUB64_REG_IMM !is_imm8 %016llx\n", imm_data); } -void host_x86_SUB8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_SUB8_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_SUB8_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_SUB8_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x28, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*SUB dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x28, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*SUB dst_reg, src_reg*/ } -void host_x86_SUB16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_SUB16_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_SUB16_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_SUB16_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 3); - codegen_addbyte3(block, 0x66, 0x29, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*SUB dst_reg, src_reg_b*/ + codegen_addbyte3(block, 0x66, 0x29, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*SUB dst_reg, src_reg*/ } -void host_x86_SUB32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_SUB32_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_SUB32_REG_REG - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_SUB32_REG_REG - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x29, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*SUB dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x29, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*SUB dst_reg, src_reg*/ } void host_x86_SUBPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) @@ -2201,10 +2201,10 @@ void host_x86_UNPCKLPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg) codegen_addbyte3(block, 0x0f, 0x14, 0xc0 | src_reg | (dst_reg << 3)); } -void host_x86_XOR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data) +void host_x86_XOR8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_XOR8_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_XOR8_REG_IMM - dst_reg & 8\n"); if (dst_reg == REG_EAX) { @@ -2217,10 +2217,10 @@ void host_x86_XOR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t codegen_addbyte3(block, 0x80, 0xc0 | RM_OP_XOR | (dst_reg & 7), imm_data); /*XOR dst_reg, imm_data*/ } } -void host_x86_XOR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data) +void host_x86_XOR16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_XOR16_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_XOR16_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -2240,10 +2240,10 @@ void host_x86_XOR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16 codegen_addword(block, imm_data); } } -void host_x86_XOR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data) +void host_x86_XOR32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) { - if (dst_reg != src_reg || (dst_reg & 8) || (src_reg & 8)) - fatal("host_x86_XOR32_REG_IMM - dst_reg != src_reg\n"); + if (dst_reg & 8) + fatal("host_x86_XOR32_REG_IMM - dst_reg & 8\n"); if (is_imm8(imm_data)) { @@ -2263,29 +2263,29 @@ void host_x86_XOR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32 codegen_addlong(block, imm_data); } } -void host_x86_XOR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_XOR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_XOR8_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_XOR8_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x30, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*XOR dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x30, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*XOR dst_reg, src_reg*/ } -void host_x86_XOR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_XOR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_XOR16_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_XOR16_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 3); - codegen_addbyte3(block, 0x66, 0x31, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*XOR dst_reg, src_reg_b*/ + codegen_addbyte3(block, 0x66, 0x31, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*XOR dst_reg, src_reg*/ } -void host_x86_XOR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b) +void host_x86_XOR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg) { - if (dst_reg != src_reg_a || (dst_reg & 8) || (src_reg_b & 8)) - fatal("host_x86_XOR32_REG_IMM - dst_reg != src_reg_a\n"); + if ((dst_reg & 8) || (src_reg & 8)) + fatal("host_x86_XOR32_REG_IMM - dst_reg & 8\n"); codegen_alloc_bytes(block, 2); - codegen_addbyte2(block, 0x31, 0xc0 | (dst_reg & 7) | ((src_reg_b & 7) << 3)); /*XOR dst_reg, src_reg_b*/ + codegen_addbyte2(block, 0x31, 0xc0 | (dst_reg & 7) | ((src_reg & 7) << 3)); /*XOR dst_reg, src_reg*/ } #endif diff --git a/src/codegen_backend_x86-64_ops.h b/src/codegen_backend_x86-64_ops.h index 0f99fe9..aa7e0c7 100644 --- a/src/codegen_backend_x86-64_ops.h +++ b/src/codegen_backend_x86-64_ops.h @@ -1,22 +1,22 @@ -void host_x86_ADD8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data); -void host_x86_ADD16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data); -void host_x86_ADD32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data); +void host_x86_ADD8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data); +void host_x86_ADD16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data); +void host_x86_ADD32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data); void host_x86_ADD64_REG_IMM(codeblock_t *block, int dst_reg, uint64_t imm_data); -void host_x86_ADD8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_ADD16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_ADD32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); +void host_x86_ADD8_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_ADD16_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_ADD32_REG_REG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_ADDPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_ADDSD_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); -void host_x86_AND8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data); -void host_x86_AND16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data); -void host_x86_AND32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data); +void host_x86_AND8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data); +void host_x86_AND16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data); +void host_x86_AND32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data); -void host_x86_AND8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_AND16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_AND32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); +void host_x86_AND8_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_AND16_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_AND32_REG_REG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_CALL(codeblock_t *block, void *p); @@ -168,13 +168,13 @@ void host_x86_MULSS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_NOP(codeblock_t *block); -void host_x86_OR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data); -void host_x86_OR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data); -void host_x86_OR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data); +void host_x86_OR8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data); +void host_x86_OR16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data); +void host_x86_OR32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data); -void host_x86_OR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_OR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_OR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); +void host_x86_OR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_OR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_OR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_PACKSSWB_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_PACKSSDW_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); @@ -262,14 +262,14 @@ void host_x86_SHR32_IMM(codeblock_t *block, int dst_reg, int shift); void host_x86_SQRTSD_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_SQRTSS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); -void host_x86_SUB8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data); -void host_x86_SUB16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data); -void host_x86_SUB32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data); +void host_x86_SUB8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data); +void host_x86_SUB16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data); +void host_x86_SUB32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data); void host_x86_SUB64_REG_IMM(codeblock_t *block, int dst_reg, uint64_t imm_data); -void host_x86_SUB8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_SUB16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_SUB32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); +void host_x86_SUB8_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_SUB16_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_SUB32_REG_REG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_SUBPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); void host_x86_SUBSD_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); @@ -281,10 +281,10 @@ void host_x86_TEST32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data) void host_x86_UNPCKLPS_XREG_XREG(codeblock_t *block, int dst_reg, int src_reg); -void host_x86_XOR8_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint8_t imm_data); -void host_x86_XOR16_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint16_t imm_data); -void host_x86_XOR32_REG_IMM(codeblock_t *block, int dst_reg, int src_reg, uint32_t imm_data); +void host_x86_XOR8_REG_IMM(codeblock_t *block, int dst_reg, uint8_t imm_data); +void host_x86_XOR16_REG_IMM(codeblock_t *block, int dst_reg, uint16_t imm_data); +void host_x86_XOR32_REG_IMM(codeblock_t *block, int dst_reg, uint32_t imm_data); -void host_x86_XOR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_XOR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); -void host_x86_XOR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg_a, int src_reg_b); +void host_x86_XOR8_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_XOR16_REG_REG(codeblock_t *block, int dst_reg, int src_reg); +void host_x86_XOR32_REG_REG(codeblock_t *block, int dst_reg, int src_reg); diff --git a/src/codegen_backend_x86-64_uops.c b/src/codegen_backend_x86-64_uops.c index 7b475bf..e17ad0e 100644 --- a/src/codegen_backend_x86-64_uops.c +++ b/src/codegen_backend_x86-64_uops.c @@ -34,19 +34,19 @@ static int codegen_ADD(codeblock_t *block, uop_t *uop) if (dest_reg != src_reg_a) host_x86_LEA_REG_REG(block, dest_reg, src_reg_a, src_reg_b); else - host_x86_ADD32_REG_REG(block, dest_reg, src_reg_a, src_reg_b); + host_x86_ADD32_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV16_REG_REG(block, dest_reg, src_reg_a); - host_x86_ADD16_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_ADD16_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV8_REG_REG(block, dest_reg, src_reg_a); - host_x86_ADD8_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_ADD8_REG_REG(block, dest_reg, src_reg_b); } #ifdef RECOMPILER_DEBUG else @@ -65,19 +65,19 @@ static int codegen_ADD_IMM(codeblock_t *block, uop_t *uop) if (dest_reg != src_reg) host_x86_LEA_REG_IMM(block, dest_reg, src_reg, uop->imm_data); else - host_x86_ADD32_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_ADD32_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size)) { if (dest_reg != src_reg) host_x86_MOV16_REG_REG(block, dest_reg, src_reg); - host_x86_ADD16_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_ADD16_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size)) { if (dest_reg != src_reg) host_x86_MOV8_REG_REG(block, dest_reg, src_reg); - host_x86_ADD8_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_ADD8_REG_IMM(block, dest_reg, uop->imm_data); } #ifdef RECOMPILER_DEBUG else @@ -89,7 +89,12 @@ static int codegen_ADD_IMM(codeblock_t *block, uop_t *uop) static int codegen_ADD_LSHIFT(codeblock_t *block, uop_t *uop) { if (!uop->imm_data) - host_x86_ADD32_REG_REG(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real); + { + if (uop->dest_reg_a_real == uop->src_reg_a_real) + host_x86_ADD32_REG_REG(block, uop->dest_reg_a_real, uop->src_reg_b_real); + else + host_x86_LEA_REG_REG(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real); + } else if (uop->imm_data < 4) host_x86_LEA_REG_REG_SHIFT(block, uop->dest_reg_a_real, uop->src_reg_a_real, uop->src_reg_b_real, uop->imm_data); #ifdef RECOMPILER_DEBUG @@ -112,19 +117,19 @@ static int codegen_AND(codeblock_t *block, uop_t *uop) { if (dest_reg != src_reg_a) host_x86_MOV32_REG_REG(block, dest_reg, src_reg_a); - host_x86_AND32_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_AND32_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV16_REG_REG(block, dest_reg, src_reg_a); - host_x86_AND16_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_AND16_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV8_REG_REG(block, dest_reg, src_reg_a); - host_x86_AND8_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_AND8_REG_REG(block, dest_reg, src_reg_b); } #ifdef RECOMPILER_DEBUG else @@ -142,19 +147,19 @@ static int codegen_AND_IMM(codeblock_t *block, uop_t *uop) { if (dest_reg != src_reg) host_x86_MOV32_REG_REG(block, dest_reg, src_reg); - host_x86_AND32_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_AND32_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size)) { if (dest_reg != src_reg) host_x86_MOV16_REG_REG(block, dest_reg, src_reg); - host_x86_AND16_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_AND16_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size)) { if (dest_reg != src_reg) host_x86_MOV8_REG_REG(block, dest_reg, src_reg); - host_x86_AND8_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_AND8_REG_IMM(block, dest_reg, uop->imm_data); } #ifdef RECOMPILER_DEBUG else @@ -631,10 +636,10 @@ static int codegen_FTST(codeblock_t *block, uop_t *uop) host_x86_PXOR_XREG_XREG(block, REG_XMM_TEMP, REG_XMM_TEMP); if (dest_reg != REG_EAX) host_x86_MOV32_REG_REG(block, REG_ECX, REG_EAX); - host_x86_XOR32_REG_REG(block, REG_EAX, REG_EAX, REG_EAX); + host_x86_XOR32_REG_REG(block, REG_EAX, REG_EAX); host_x86_COMISD_XREG_XREG(block, src_reg_a, REG_XMM_TEMP); host_x86_LAHF(block); - host_x86_AND16_REG_IMM(block, REG_EAX, REG_EAX, C0|C2|C3); + host_x86_AND16_REG_IMM(block, REG_EAX, C0|C2|C3); if (dest_reg != REG_EAX) { host_x86_MOV16_REG_REG(block, dest_reg, REG_EAX); @@ -672,10 +677,10 @@ static int codegen_FCOM(codeblock_t *block, uop_t *uop) { if (dest_reg != REG_EAX) host_x86_MOV32_REG_REG(block, REG_ECX, REG_EAX); - host_x86_XOR32_REG_REG(block, REG_EAX, REG_EAX, REG_EAX); + host_x86_XOR32_REG_REG(block, REG_EAX, REG_EAX); host_x86_COMISD_XREG_XREG(block, src_reg_a, src_reg_b); host_x86_LAHF(block); - host_x86_AND16_REG_IMM(block, REG_EAX, REG_EAX, C0|C2|C3); + host_x86_AND16_REG_IMM(block, REG_EAX, C0|C2|C3); if (dest_reg != REG_EAX) { host_x86_MOV16_REG_REG(block, dest_reg, REG_EAX); @@ -939,7 +944,7 @@ static int codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); if (REG_IS_B(dest_size)) { host_x86_CALL(block, codegen_mem_load_byte); @@ -992,7 +997,7 @@ static int codegen_MEM_LOAD_SINGLE(codeblock_t *block, uop_t *uop) #endif host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); host_x86_CALL(block, codegen_mem_load_single); host_x86_TEST32_REG(block, REG_ESI, REG_ESI); host_x86_JNZ(block, codegen_exit_rout); @@ -1011,7 +1016,7 @@ static int codegen_MEM_LOAD_DOUBLE(codeblock_t *block, uop_t *uop) #endif host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); host_x86_CALL(block, codegen_mem_load_double); host_x86_TEST32_REG(block, REG_ESI, REG_ESI); host_x86_JNZ(block, codegen_exit_rout); @@ -1095,7 +1100,7 @@ static int codegen_MEM_STORE_REG(codeblock_t *block, uop_t *uop) host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); if (REG_IS_B(src_size)) { host_x86_MOV8_REG_REG(block, REG_ECX, src_reg); @@ -1137,7 +1142,7 @@ static int codegen_MEM_STORE_SINGLE(codeblock_t *block, uop_t *uop) #endif host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); host_x86_CVTSD2SS_XREG_XREG(block, REG_XMM_TEMP, src_reg); host_x86_CALL(block, codegen_mem_store_single); host_x86_TEST32_REG(block, REG_ESI, REG_ESI); @@ -1156,7 +1161,7 @@ static int codegen_MEM_STORE_DOUBLE(codeblock_t *block, uop_t *uop) #endif host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, REG_ESI, uop->imm_data); + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); host_x86_MOVQ_XREG_XREG(block, REG_XMM_TEMP, src_reg); host_x86_CALL(block, codegen_mem_store_double); host_x86_TEST32_REG(block, REG_ESI, REG_ESI); @@ -1369,17 +1374,19 @@ static int codegen_OR(codeblock_t *block, uop_t *uop) { if (dest_reg != src_reg_a) host_x86_MOV32_REG_REG(block, dest_reg, src_reg_a); - host_x86_OR32_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_OR32_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV16_REG_REG(block, dest_reg, src_reg_a); - host_x86_OR16_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_OR16_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b)) { - host_x86_OR8_REG_REG(block, dest_reg, src_reg_a, src_reg_b); + if (dest_reg != src_reg_a) + host_x86_MOV8_REG_REG(block, dest_reg, src_reg_a); + host_x86_OR8_REG_REG(block, dest_reg, src_reg_b); } #ifdef RECOMPILER_DEBUG else @@ -1394,15 +1401,15 @@ static int codegen_OR_IMM(codeblock_t *block, uop_t *uop) if (REG_IS_L(dest_size) && REG_IS_L(src_size)) { - host_x86_OR32_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_OR32_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size)) { - host_x86_OR16_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_OR16_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size)) { - host_x86_OR8_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_OR8_REG_IMM(block, dest_reg, uop->imm_data); } #ifdef RECOMPILER_DEBUG else @@ -2438,19 +2445,19 @@ static int codegen_SUB(codeblock_t *block, uop_t *uop) { if (dest_reg != src_reg_a) host_x86_MOV32_REG_REG(block, dest_reg, src_reg_a); - host_x86_SUB32_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_SUB32_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV16_REG_REG(block, dest_reg, src_reg_a); - host_x86_SUB16_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_SUB16_REG_REG(block, dest_reg, src_reg_b); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b)) { if (dest_reg != src_reg_a) host_x86_MOV8_REG_REG(block, dest_reg, src_reg_a); - host_x86_SUB8_REG_REG(block, dest_reg, dest_reg, src_reg_b); + host_x86_SUB8_REG_REG(block, dest_reg, src_reg_b); } #ifdef RECOMPILER_DEBUG else @@ -2467,19 +2474,19 @@ static int codegen_SUB_IMM(codeblock_t *block, uop_t *uop) { if (dest_reg != src_reg) host_x86_MOV32_REG_REG(block, dest_reg, src_reg); - host_x86_SUB32_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_SUB32_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size)) { if (dest_reg != src_reg) host_x86_MOV16_REG_REG(block, dest_reg, src_reg); - host_x86_SUB16_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_SUB16_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size)) { if (dest_reg != src_reg) host_x86_MOV8_REG_REG(block, dest_reg, src_reg); - host_x86_SUB8_REG_IMM(block, dest_reg, dest_reg, uop->imm_data); + host_x86_SUB8_REG_IMM(block, dest_reg, uop->imm_data); } #ifdef RECOMPILER_DEBUG else @@ -2548,17 +2555,17 @@ static int codegen_XOR(codeblock_t *block, uop_t *uop) { host_x86_PXOR_XREG_XREG(block, dest_reg, src_reg_b); } - else if (REG_IS_L(dest_size) && REG_IS_L(src_size_a) && REG_IS_L(src_size_b)) + else if (REG_IS_L(dest_size) && REG_IS_L(src_size_a) && REG_IS_L(src_size_b) && uop->dest_reg_a_real == uop->src_reg_a_real) { - host_x86_XOR32_REG_REG(block, dest_reg, src_reg_a, src_reg_b); + host_x86_XOR32_REG_REG(block, dest_reg, src_reg_b); } - else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b)) + else if (REG_IS_W(dest_size) && REG_IS_W(src_size_a) && REG_IS_W(src_size_b) && uop->dest_reg_a_real == uop->src_reg_a_real) { - host_x86_XOR16_REG_REG(block, dest_reg, src_reg_a, src_reg_b); + host_x86_XOR16_REG_REG(block, dest_reg, src_reg_b); } - else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b)) + else if (REG_IS_B(dest_size) && REG_IS_B(src_size_a) && REG_IS_B(src_size_b) && uop->dest_reg_a_real == uop->src_reg_a_real) { - host_x86_XOR8_REG_REG(block, dest_reg, src_reg_a, src_reg_b); + host_x86_XOR8_REG_REG(block, dest_reg, src_reg_b); } #ifdef RECOMPILER_DEBUG else @@ -2573,15 +2580,15 @@ static int codegen_XOR_IMM(codeblock_t *block, uop_t *uop) if (REG_IS_L(dest_size) && REG_IS_L(src_size)) { - host_x86_XOR32_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_XOR32_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_W(dest_size) && REG_IS_W(src_size)) { - host_x86_XOR16_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_XOR16_REG_IMM(block, dest_reg, uop->imm_data); } else if (REG_IS_B(dest_size) && REG_IS_B(src_size)) { - host_x86_XOR8_REG_IMM(block, dest_reg, src_reg, uop->imm_data); + host_x86_XOR8_REG_IMM(block, dest_reg, uop->imm_data); } #ifdef RECOMPILER_DEBUG else @@ -2781,8 +2788,8 @@ void codegen_direct_read_st_8(codeblock_t *block, int host_reg, void *base, int int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOV8_REG_ABS_REG_REG_SHIFT(block, host_reg, offset, REG_RBP, REG_ECX, 0); } void codegen_direct_read_st_64(codeblock_t *block, int host_reg, void *base, int reg_idx) @@ -2790,8 +2797,8 @@ void codegen_direct_read_st_64(codeblock_t *block, int host_reg, void *base, int int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOVQ_XREG_ABS_REG_REG_SHIFT(block, host_reg, offset, REG_RBP, REG_ECX, 3); } void codegen_direct_read_st_double(codeblock_t *block, int host_reg, void *base, int reg_idx) @@ -2799,8 +2806,8 @@ void codegen_direct_read_st_double(codeblock_t *block, int host_reg, void *base, int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOVQ_XREG_ABS_REG_REG_SHIFT(block, host_reg, offset, REG_RBP, REG_ECX, 3); } @@ -2833,8 +2840,8 @@ void codegen_direct_write_st_8(codeblock_t *block, void *base, int reg_idx, int int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOV8_ABS_REG_REG_SHIFT_REG(block, offset, REG_RBP, REG_ECX, 0, host_reg); } void codegen_direct_write_st_64(codeblock_t *block, void *base, int reg_idx, int host_reg) @@ -2842,8 +2849,8 @@ void codegen_direct_write_st_64(codeblock_t *block, void *base, int reg_idx, int int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOVQ_ABS_REG_REG_SHIFT_XREG(block, offset, REG_RBP, REG_ECX, 3, host_reg); } void codegen_direct_write_st_double(codeblock_t *block, void *base, int reg_idx, int host_reg) @@ -2851,8 +2858,8 @@ void codegen_direct_write_st_double(codeblock_t *block, void *base, int reg_idx, int offset = (uintptr_t)base - (((uintptr_t)&cpu_state) + 128); host_x86_MOV32_REG_BASE_OFFSET(block, REG_ECX, REG_RSP, IREG_TOP_diff_stack_offset); - host_x86_ADD32_REG_IMM(block, REG_ECX, REG_ECX, reg_idx); - host_x86_AND32_REG_IMM(block, REG_ECX, REG_ECX, 7); + host_x86_ADD32_REG_IMM(block, REG_ECX, reg_idx); + host_x86_AND32_REG_IMM(block, REG_ECX, 7); host_x86_MOVQ_ABS_REG_REG_SHIFT_XREG(block, offset, REG_RBP, REG_ECX, 3, host_reg); }