Add dynarec optimisation for UOP_MOV_IMM, to avoid register allocation
if the destination register won't be immediately used again.
This commit is contained in:
parent
0d7103368a
commit
25fe224ea9
12 changed files with 216 additions and 1 deletions
|
|
@ -2644,6 +2644,11 @@ static int codegen_STORE_PTR_IMM_8(codeblock_t *block, uop_t *uop)
|
|||
host_x86_MOV8_ABS_IMM(block, uop->p, uop->imm_data);
|
||||
return 0;
|
||||
}
|
||||
static int codegen_STORE_PTR_IMM_16(codeblock_t *block, uop_t *uop)
|
||||
{
|
||||
host_x86_MOV16_ABS_IMM(block, uop->p, uop->imm_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int codegen_SUB(codeblock_t *block, uop_t *uop)
|
||||
{
|
||||
|
|
@ -2839,6 +2844,7 @@ const uOpFn uop_handlers[UOP_MAX] =
|
|||
|
||||
[UOP_STORE_P_IMM & UOP_MASK] = codegen_STORE_PTR_IMM,
|
||||
[UOP_STORE_P_IMM_8 & UOP_MASK] = codegen_STORE_PTR_IMM_8,
|
||||
[UOP_STORE_P_IMM_16 & UOP_MASK] = codegen_STORE_PTR_IMM_16,
|
||||
|
||||
[UOP_MEM_LOAD_ABS & UOP_MASK] = codegen_MEM_LOAD_ABS,
|
||||
[UOP_MEM_LOAD_REG & UOP_MASK] = codegen_MEM_LOAD_REG,
|
||||
|
|
@ -3139,4 +3145,21 @@ void codegen_set_jump_dest(codeblock_t *block, void *p)
|
|||
*(uint32_t *)p = (uintptr_t)&block_write_data[block_pos] - ((uintptr_t)p + 4);
|
||||
}
|
||||
|
||||
void codegen_direct_write_8_imm(codeblock_t *block, void *p, uint8_t imm_data)
|
||||
{
|
||||
host_x86_MOV8_ABS_IMM(block, p, imm_data);
|
||||
}
|
||||
void codegen_direct_write_16_imm(codeblock_t *block, void *p, uint16_t imm_data)
|
||||
{
|
||||
host_x86_MOV16_ABS_IMM(block, p, imm_data);
|
||||
}
|
||||
void codegen_direct_write_32_imm(codeblock_t *block, void *p, uint32_t imm_data)
|
||||
{
|
||||
host_x86_MOV32_ABS_IMM(block, p, imm_data);
|
||||
}
|
||||
void codegen_direct_write_32_imm_stack(codeblock_t *block, int stack_offset, uint32_t imm_data)
|
||||
{
|
||||
host_x86_MOV32_BASE_OFFSET_IMM(block, REG_ESP, stack_offset, imm_data);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue