summaryrefslogtreecommitdiff
path: root/orc/orcrules-sse.c
diff options
context:
space:
mode:
Diffstat (limited to 'orc/orcrules-sse.c')
-rw-r--r--orc/orcrules-sse.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/orc/orcrules-sse.c b/orc/orcrules-sse.c
index c2c13d5..25d439b 100644
--- a/orc/orcrules-sse.c
+++ b/orc/orcrules-sse.c
@@ -1244,6 +1244,26 @@ sse_rule_splatw3q (OrcCompiler *p, void *user, OrcInstruction *insn)
}
static void
+sse_rule_mulas4wl (OrcCompiler *p, void *user, OrcInstruction *insn)
+{
+ int dest = p->vars[insn->dest_args[0]].alloc;
+ int src = p->vars[insn->src_args[1]].alloc;
+
+#ifndef MMX
+ orc_sse_emit_pmaddwd (p, src, dest);
+ orc_sse_emit_phaddd (p, dest, dest);
+#else
+ {
+ int tmp = orc_compiler_get_temp_reg (p);
+ orc_mmx_emit_pmaddwd (p, src, dest);
+ orc_mmx_emit_movq (p, src, tmp);
+ orc_mmx_emit_psrlq_imm (compiler, 32, tmp);
+ orc_mmx_emit_paddd (p, tmp, dest);
+ }
+#endif
+}
+
+static void
sse_rule_splatbw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int dest = p->vars[insn->dest_args[0]].alloc;
@@ -2958,6 +2978,8 @@ orc_compiler_sse_register_rules (OrcTarget *target)
orc_rule_register (rule_set, "div255w", sse_rule_div255w, NULL);
orc_rule_register (rule_set, "divluw", sse_rule_divluw, NULL);
+ orc_rule_register (rule_set, "mulas4wl", sse_rule_mulas4wl, NULL);
+
/* SSE 3 -- no rules */
/* SSSE 3 */