OrcVariable *dest = compiler->vars + insn->dest_args[0];
int tmp = orc_compiler_get_temp_reg (compiler);
int tmp2 = orc_compiler_get_temp_reg (compiler);
+ int regsize = compiler->is_64bit ? 8 : 4;
int i;
if (compiler->loop_shift == 0) {
(int)ORC_STRUCT_OFFSET(OrcExecutor, params[increment_var]),
compiler->exec_reg, src->ptr_offset);
} else {
- orc_x86_emit_add_imm_reg (compiler, 4,
+ orc_x86_emit_add_imm_reg (compiler, regsize,
compiler->vars[increment_var].value.i,
src->ptr_offset, FALSE);
}
orc_x86_emit_mov_reg_reg (compiler, 4, src->ptr_offset, compiler->gp_tmpreg);
orc_x86_emit_sar_imm_reg (compiler, 4, 16, compiler->gp_tmpreg);
- orc_x86_emit_add_reg_reg_shift (compiler, 4, compiler->gp_tmpreg,
+ orc_x86_emit_add_reg_reg_shift (compiler, regsize, compiler->gp_tmpreg,
src->ptr_register, 2);
orc_x86_emit_and_imm_reg (compiler, 4, 0xffff, src->ptr_offset);
} else {
orc_x86_emit_mov_reg_reg (compiler, 4, src->ptr_offset, compiler->gp_tmpreg);
orc_x86_emit_sar_imm_reg (compiler, 4, 16, compiler->gp_tmpreg);
- orc_x86_emit_add_reg_reg_shift (compiler, 4, compiler->gp_tmpreg,
+ orc_x86_emit_add_reg_reg_shift (compiler, 8, compiler->gp_tmpreg,
src->ptr_register, 2);
orc_x86_emit_and_imm_reg (compiler, 4, 0xffff, src->ptr_offset);
}
orc_x86_get_regname_ptr(compiler, reg2));
break;
case 8:
- ORC_ASM_CODE(compiler," mov %%%s, %d(%%%s)\n", orc_x86_get_regname(reg1), offset,
+ ORC_ASM_CODE(compiler," mov %%%s, %d(%%%s)\n", orc_x86_get_regname_64(reg1), offset,
orc_x86_get_regname_ptr(compiler, reg2));
break;
default:
{
if (size == 2) {
ORC_ASM_CODE(compiler," movw $%d, %%%s\n", value, orc_x86_get_regname_16(reg1));
- orc_x86_emit_rex(compiler, size, reg1, 0, 0);
+ orc_x86_emit_rex(compiler, size, 0, 0, reg1);
*compiler->codeptr++ = 0x66;
- *compiler->codeptr++ = 0xb8 + orc_x86_get_regnum(reg1);
+ *compiler->codeptr++ = 0xb8 + (orc_x86_get_regnum(reg1) & 0x7);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
} else if (size == 4) {
ORC_ASM_CODE(compiler," movl $%d, %%%s\n", value, orc_x86_get_regname(reg1));
- orc_x86_emit_rex(compiler, size, reg1, 0, 0);
- *compiler->codeptr++ = 0xb8 + orc_x86_get_regnum(reg1);
+ orc_x86_emit_rex(compiler, size, 0, 0, reg1);
+ *compiler->codeptr++ = 0xb8 + (orc_x86_get_regnum(reg1) & 0x7);
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
*compiler->codeptr++ = ((value>>16) & 0xff);
orc_x86_get_regname_64(reg2));
}
- orc_x86_emit_rex(compiler, size, reg2, 0, reg1);
+ orc_x86_emit_rex(compiler, size, reg1, 0, reg2);
*compiler->codeptr++ = 0x89;
orc_x86_emit_modrm_reg (compiler, reg2, reg1);
}
orc_x86_emit_modrm_reg (compiler, reg, 4);
*compiler->codeptr++ = (value & 0xff);
} else {
- *compiler->codeptr++ = 0x81;
- orc_x86_emit_modrm_reg (compiler, reg, 4);
+ if (reg == X86_EAX) {
+ *compiler->codeptr++ = 0x25;
+ } else {
+ *compiler->codeptr++ = 0x81;
+ orc_x86_emit_modrm_reg (compiler, reg, 4);
+ }
*compiler->codeptr++ = (value & 0xff);
*compiler->codeptr++ = ((value>>8) & 0xff);
if (size == 4) {
orc_x86_get_regname_ptr(compiler, reg));
}
- orc_x86_emit_rex(compiler, size, 0, 0, reg);
+ orc_x86_emit_rex(compiler, size, reg1, 0, reg);
*compiler->codeptr++ = 0x01;
orc_x86_emit_modrm_memoffset (compiler, reg1, offset, reg);
}
orc_x86_get_regname(reg2));
} else {
ORC_ASM_CODE(compiler," leaq (%%%s, %%%s, %d), %%%s\n",
- orc_x86_get_regname(reg2),
- orc_x86_get_regname(reg1), 1<<shift,
- orc_x86_get_regname(reg2));
+ orc_x86_get_regname_ptr(compiler, reg2),
+ orc_x86_get_regname_ptr(compiler, reg1), 1<<shift,
+ orc_x86_get_regname_ptr(compiler, reg2));
}
- orc_x86_emit_rex(compiler, size, reg2, 0, reg1);
+ orc_x86_emit_rex(compiler, size, reg2, reg1, reg2);
*compiler->codeptr++ = 0x8d;
orc_x86_emit_modrm_memindex (compiler, reg2, 0, reg2, reg1, shift);
}
orc_x86_get_regname_64(destreg));
}
- orc_x86_emit_rex(compiler, size, 0, 0, reg);
+ orc_x86_emit_rex(compiler, size, destreg, 0, reg);
*compiler->codeptr++ = 0x03;
orc_x86_emit_modrm_memoffset (compiler, destreg, offset, reg);
}