diff options
Diffstat (limited to 'orc/orcrules-sse.c')
-rw-r--r-- | orc/orcrules-sse.c | 22 |
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 */ |