From 6ed3969d3d273ea36f9893f7303a118c957666c2 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 14 Jun 2010 11:36:24 -0700 Subject: [PATCH] sse: Fix leal emission on x86-64 Reported by slomo. --- orc/orcx86.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/orc/orcx86.c b/orc/orcx86.c index 31ff5d3..49eab6c 100644 --- a/orc/orcx86.c +++ b/orc/orcx86.c @@ -472,27 +472,34 @@ orc_x86_emit_add_reg_memoffset (OrcCompiler *compiler, int size, int reg1, void orc_x86_emit_add_imm_reg (OrcCompiler *compiler, int size, int value, int reg, orc_bool record) { + if (!record) { + if (size == 4 && !compiler->is_64bit) { + ORC_ASM_CODE(compiler," lea %d(%%%s), %%%s\n", value, + orc_x86_get_regname(reg), orc_x86_get_regname(reg)); + orc_x86_emit_rex(compiler, size, 0, 0, reg); + *compiler->codeptr++ = 0x8d; + orc_x86_emit_modrm_memoffset (compiler, reg, value, reg); + return; + } + if (size == 8 && compiler->is_64bit) { + ORC_ASM_CODE(compiler," lea %d(%%%s), %%%s\n", value, + orc_x86_get_regname_64(reg), orc_x86_get_regname_64(reg)); + orc_x86_emit_rex(compiler, size, reg, 0, reg); + *compiler->codeptr++ = 0x8d; + orc_x86_emit_modrm_memoffset (compiler, reg, value, reg); + return; + } + } + if (size == 2) { ORC_ASM_CODE(compiler," addw $%d, %%%s\n", value, orc_x86_get_regname_16(reg)); *compiler->codeptr++ = 0x66; } else if (size == 4) { - if (record) { - ORC_ASM_CODE(compiler," addl $%d, %%%s\n", value, orc_x86_get_regname(reg)); - } else { - ORC_ASM_CODE(compiler," leal %d(%%%s), %%%s\n", value, - orc_x86_get_regname(reg), orc_x86_get_regname(reg)); - } + ORC_ASM_CODE(compiler," addl $%d, %%%s\n", value, orc_x86_get_regname(reg)); } else { ORC_ASM_CODE(compiler," add $%d, %%%s\n", value, orc_x86_get_regname_64(reg)); } - if (!record) { - orc_x86_emit_rex(compiler, size, 0, 0, reg); - *compiler->codeptr++ = 0x8d; - orc_x86_emit_modrm_memoffset (compiler, reg, value, reg); - return; - } - orc_x86_emit_rex(compiler, size, 0, 0, reg); if (value >= -128 && value < 128) { *compiler->codeptr++ = 0x83; -- 2.7.4