From fa5b04a8d990e169ab15d50d440e341a4dd02248 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 5 Aug 2010 14:20:58 -0700 Subject: [PATCH] sse: implement mulhul --- orc/orcrules-sse.c | 17 ++++++++--------- orc/orcsse.h | 1 + 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c index afbc9d2..328a564 100644 --- a/orc/orcrules-sse.c +++ b/orc/orcrules-sse.c @@ -611,28 +611,27 @@ sse_rule_mulubw (OrcCompiler *p, void *user, OrcInstruction *insn) } 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); } @@ -1351,6 +1350,7 @@ orc_compiler_sse_register_rules (OrcTarget *target) 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); @@ -1429,7 +1429,6 @@ orc_compiler_sse_register_rules (OrcTarget *target) 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 */ diff --git a/orc/orcsse.h b/orc/orcsse.h index 3ea7fee..a32ab13 100644 --- a/orc/orcsse.h +++ b/orc/orcsse.h @@ -125,6 +125,7 @@ unsigned int orc_sse_get_cpu_flags (void); #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) -- 2.7.4