summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-06-12 12:36:35 +0200
committerDavid Schleef <ds@schleef.org>2010-06-13 12:29:25 -0700
commit140fd0e1e374dc2b5fa155e195a1f97d57ecf3c4 (patch)
tree93743073b9f4ffd8f141fd0d7372ca861519da5c
parent53be5515994699c5e7badb9b0606dced1ab18868 (diff)
downloadorc-140fd0e1e374dc2b5fa155e195a1f97d57ecf3c4.tar.gz
Add SSE implementation of muluwl
-rw-r--r--orc/orcrules-sse.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c
index 1e6b5ad..4fd8b19 100644
--- a/orc/orcrules-sse.c
+++ b/orc/orcrules-sse.c
@@ -479,6 +479,20 @@ sse_rule_mulubw (OrcCompiler *p, void *user, OrcInstruction *insn)
}
static void
+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_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);
+}
+
+static void
sse_rule_mulswl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int src = p->vars[insn->src_args[1]].alloc;
@@ -1143,6 +1157,7 @@ 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 */