sse: Fix mov of pointer values
authorDavid Schleef <ds@schleef.org>
Mon, 3 Oct 2011 01:56:50 +0000 (18:56 -0700)
committerDavid Schleef <ds@schleef.org>
Mon, 3 Oct 2011 01:57:15 +0000 (18:57 -0700)
Fixes Fedora bug #742534.

orc/orcrules-mmx.c
orc/orcrules-sse.c
orc/orcx86.c
orc/orcx86.h
orc/orcx86insn.c

index 651dc53..4875410 100644 (file)
@@ -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
 
index c0f76b8..260a4f9 100644 (file)
@@ -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
 
index da8fb40..c3a22f1 100644 (file)
@@ -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:
index 6a85bce..4716d46 100644 (file)
@@ -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,
index d8b885d..659ebc5 100644 (file)
@@ -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)
 {