diff options
author | David Schleef <ds@schleef.org> | 2011-10-03 05:56:50 +0400 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2011-10-03 05:57:15 +0400 |
commit | ee163ec79b8c8d83e2d182e579f5e6b570beff71 (patch) | |
tree | d9c210acdb3a4d2f10a654283309c2d4c7bd402f | |
parent | 5cda9c082a1b468657f52399c00d41b3ec362b42 (diff) |
sse: Fix mov of pointer values
Fixes Fedora bug #742534.
-rw-r--r-- | orc/orcrules-mmx.c | 8 | ||||
-rw-r--r-- | orc/orcrules-sse.c | 8 | ||||
-rw-r--r-- | orc/orcx86.c | 2 | ||||
-rw-r--r-- | orc/orcx86.h | 2 | ||||
-rw-r--r-- | orc/orcx86insn.c | 17 |
5 files changed, 28 insertions, 9 deletions
diff --git a/orc/orcrules-mmx.c b/orc/orcrules-mmx.c index 651dc53..4875410 100644 --- a/orc/orcrules-mmx.c +++ b/orc/orcrules-mmx.c @@ -1565,8 +1565,8 @@ mmx_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_mmx (p, 16, offset, p->exec_reg, p->vars[insn->dest_args[0]].alloc, FALSE); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 32, p->exec_reg, X86_EAX); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 40, p->exec_reg, X86_EDX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 32, p->exec_reg, X86_EAX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 40, p->exec_reg, X86_EDX); } #endif @@ -1629,8 +1629,8 @@ mmx_rule_mulslq_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_mmx (p, 16, offset + 16, p->exec_reg, p->vars[insn->dest_args[0]].alloc, FALSE); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 32, p->exec_reg, X86_EAX); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 40, p->exec_reg, X86_EDX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 32, p->exec_reg, X86_EAX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 40, p->exec_reg, X86_EDX); } #endif diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index c0f76b8..260a4f9 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -1565,8 +1565,8 @@ sse_rule_mulhsl_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_sse (p, 16, offset, p->exec_reg, p->vars[insn->dest_args[0]].alloc, FALSE); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 32, p->exec_reg, X86_EAX); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 40, p->exec_reg, X86_EDX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 32, p->exec_reg, X86_EAX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 40, p->exec_reg, X86_EDX); } #endif @@ -1629,8 +1629,8 @@ sse_rule_mulslq_slow (OrcCompiler *p, void *user, OrcInstruction *insn) orc_x86_emit_mov_memoffset_sse (p, 16, offset + 16, p->exec_reg, p->vars[insn->dest_args[0]].alloc, FALSE); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 32, p->exec_reg, X86_EAX); - orc_x86_emit_mov_memoffset_reg (p, 8, offset + 40, p->exec_reg, X86_EDX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 32, p->exec_reg, X86_EAX); + orc_x86_emit_mov_memoffset_reg (p, regsize, offset + 40, p->exec_reg, X86_EDX); } #endif diff --git a/orc/orcx86.c b/orc/orcx86.c index da8fb40..c3a22f1 100644 --- a/orc/orcx86.c +++ b/orc/orcx86.c @@ -297,7 +297,7 @@ orc_x86_emit_mov_reg_memoffset (OrcCompiler *compiler, int size, int reg1, int o reg1, offset, reg2); break; case 8: - orc_x86_emit_cpuinsn_reg_memoffset (compiler, ORC_X86_mov_r_rm, + orc_x86_emit_cpuinsn_reg_memoffset_8 (compiler, ORC_X86_mov_r_rm, reg1, offset, reg2); break; default: diff --git a/orc/orcx86.h b/orc/orcx86.h index 6a85bce..4716d46 100644 --- a/orc/orcx86.h +++ b/orc/orcx86.h @@ -176,6 +176,8 @@ void orc_x86_emit_cpuinsn_imm_memoffset (OrcCompiler *p, int index, int size, int imm, int offset, int dest); void orc_x86_emit_cpuinsn_reg_memoffset (OrcCompiler *p, int index, int src, int offset, int dest); +void orc_x86_emit_cpuinsn_reg_memoffset_8 (OrcCompiler *p, int index, int src, + int offset, int dest); void orc_x86_emit_cpuinsn_memoffset_reg (OrcCompiler *p, int index, int size, int offset, int src, int dest); void orc_x86_emit_cpuinsn_memoffset (OrcCompiler *p, int index, int size, diff --git a/orc/orcx86insn.c b/orc/orcx86insn.c index d8b885d..659ebc5 100644 --- a/orc/orcx86insn.c +++ b/orc/orcx86insn.c @@ -1039,6 +1039,23 @@ orc_x86_emit_cpuinsn_reg_memoffset (OrcCompiler *p, int index, int src, } void +orc_x86_emit_cpuinsn_reg_memoffset_8 (OrcCompiler *p, int index, int src, + int offset, int dest) +{ + OrcX86Insn *xinsn = orc_x86_get_output_insn (p); + const OrcSysOpcode *opcode = orc_x86_opcodes + index; + int size = 8; + + xinsn->opcode_index = index; + xinsn->opcode = opcode; + xinsn->src = src; + xinsn->dest = dest; + xinsn->type = ORC_X86_RM_MEMOFFSET; + xinsn->offset = offset; + xinsn->size = size; +} + +void orc_x86_emit_cpuinsn_memoffset_reg (OrcCompiler *p, int index, int size, int offset, int src, int dest) { |