}
static void
-sse_rule_muluwl (OrcCompiler *p, void *user, OrcInstruction *insn)
+sse_rule_mulswl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int src = p->vars[insn->src_args[1]].alloc;
int dest = p->vars[insn->dest_args[0]].alloc;
int tmp = p->tmpreg;
- orc_sse_emit_punpcklwd (p, src, tmp);
- orc_sse_emit_psrld (p, 16, tmp);
- orc_sse_emit_punpcklwd (p, dest, dest);
- orc_sse_emit_psrld (p, 16, dest);
- orc_sse_emit_pmulld (p, tmp, dest);
+ orc_sse_emit_movdqa (p, dest, tmp);
+ orc_sse_emit_pmulhw (p, src, tmp);
+ orc_sse_emit_pmullw (p, src, dest);
+ orc_sse_emit_punpcklwd (p, tmp, dest);
}
static void
-sse_rule_mulswl (OrcCompiler *p, void *user, OrcInstruction *insn)
+sse_rule_muluwl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int src = p->vars[insn->src_args[1]].alloc;
int dest = p->vars[insn->dest_args[0]].alloc;
int tmp = p->tmpreg;
orc_sse_emit_movdqa (p, dest, tmp);
- orc_sse_emit_pmulhw (p, src, tmp);
+ orc_sse_emit_pmulhuw (p, src, tmp);
orc_sse_emit_pmullw (p, src, dest);
orc_sse_emit_punpcklwd (p, tmp, dest);
}
orc_rule_register (rule_set, "mulsbw", sse_rule_mulsbw, NULL);
orc_rule_register (rule_set, "mulubw", sse_rule_mulubw, NULL);
orc_rule_register (rule_set, "mulswl", sse_rule_mulswl, NULL);
+ orc_rule_register (rule_set, "muluwl", sse_rule_muluwl, NULL);
orc_rule_register (rule_set, "accw", sse_rule_accw, NULL);
orc_rule_register (rule_set, "accl", sse_rule_accl, NULL);
REG(minul);
REG(mulll);
orc_rule_register (rule_set, "convsuslw", sse_rule_convsuslw, NULL);
- orc_rule_register (rule_set, "muluwl", sse_rule_muluwl, NULL);
/* SSE 4.2 -- no rules */
#define orc_sse_emit_pavgb(p,a,b) orc_sse_emit_660f (p, "pavgb", 0xe0, a, b)
#define orc_sse_emit_pavgw(p,a,b) orc_sse_emit_660f (p, "pavgw", 0xe3, a, b)
+#define orc_sse_emit_pmulhuw(p,a,b) orc_sse_emit_660f (p, "pmulhuw", 0xe4, a, b)
#define orc_sse_emit_pmulhw(p,a,b) orc_sse_emit_660f (p, "pmulhw", 0xe5, a, b)
#define orc_sse_emit_psubsb(p,a,b) orc_sse_emit_660f (p, "psubsb", 0xe8, a, b)