ARM64 fixes - mask off immediate data in UOP_MOV_IMM to the destination size, and add UOP_MOVZX_REG_PTR_16 to uop list.

This commit is contained in:
SarahW 2019-04-14 17:03:07 +01:00
commit d527736d21

View file

@ -1246,16 +1246,16 @@ static int codegen_MOV_IMM(codeblock_t *block, uop_t *uop)
} }
else if (REG_IS_W(dest_size)) else if (REG_IS_W(dest_size))
{ {
host_arm64_MOVK_IMM(block, dest_reg, uop->imm_data); host_arm64_MOVK_IMM(block, dest_reg, uop->imm_data & 0xffff);
} }
else if (REG_IS_B(dest_size)) else if (REG_IS_B(dest_size))
{ {
host_arm64_MOVZ_IMM(block, REG_TEMP, uop->imm_data); host_arm64_MOVZ_IMM(block, REG_TEMP, uop->imm_data & 0xff);
host_arm64_BFI(block, dest_reg, REG_TEMP, 0, 8); host_arm64_BFI(block, dest_reg, REG_TEMP, 0, 8);
} }
else if (REG_IS_BH(dest_size)) else if (REG_IS_BH(dest_size))
{ {
host_arm64_MOVZ_IMM(block, REG_TEMP, uop->imm_data); host_arm64_MOVZ_IMM(block, REG_TEMP, uop->imm_data & 0xff);
host_arm64_BFI(block, dest_reg, REG_TEMP, 8, 8); host_arm64_BFI(block, dest_reg, REG_TEMP, 8, 8);
} }
else else
@ -3051,6 +3051,7 @@ const uOpFn uop_handlers[UOP_MAX] =
[UOP_MOV_INT_DOUBLE_64 & UOP_MASK] = codegen_MOV_INT_DOUBLE_64, [UOP_MOV_INT_DOUBLE_64 & UOP_MASK] = codegen_MOV_INT_DOUBLE_64,
[UOP_MOV_REG_PTR & UOP_MASK] = codegen_MOV_REG_PTR, [UOP_MOV_REG_PTR & UOP_MASK] = codegen_MOV_REG_PTR,
[UOP_MOVZX_REG_PTR_8 & UOP_MASK] = codegen_MOVZX_REG_PTR_8, [UOP_MOVZX_REG_PTR_8 & UOP_MASK] = codegen_MOVZX_REG_PTR_8,
[UOP_MOVZX_REG_PTR_16 & UOP_MASK] = codegen_MOVZX_REG_PTR_16,
[UOP_ADD & UOP_MASK] = codegen_ADD, [UOP_ADD & UOP_MASK] = codegen_ADD,
[UOP_ADD_IMM & UOP_MASK] = codegen_ADD_IMM, [UOP_ADD_IMM & UOP_MASK] = codegen_ADD_IMM,