From 8973dc561020ac6b7f4c8788f169ba284b442808 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 2 Aug 2010 15:23:47 -0700 Subject: [PATCH] neon: Add splitwb/splitlw --- orc/orcrules-neon.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/orc/orcrules-neon.c b/orc/orcrules-neon.c index 9239238..62b6008 100644 --- a/orc/orcrules-neon.c +++ b/orc/orcrules-neon.c @@ -1872,6 +1872,58 @@ orc_neon_rule_mulhuw (OrcCompiler *p, void *user, OrcInstruction *insn) } } +static void +orc_neon_rule_splitlw (OrcCompiler *p, void *user, OrcInstruction *insn) +{ + int dest0 = p->vars[insn->dest_args[0]].alloc; + int dest1 = p->vars[insn->dest_args[1]].alloc; + int src = p->vars[insn->src_args[0]].alloc; + + if (p->loop_shift < 2) { + if (src != dest0) { + orc_neon_emit_mov (p, dest0, src); + } + if (src != dest1) { + orc_neon_emit_mov (p, dest1, src); + } + orc_neon_emit_unary (p, "vuzp.16", 0xf3b60100, dest1, dest0); + } else { + if (src != dest0) { + orc_neon_emit_mov_quad (p, dest0, src); + } + if (src != dest1) { + orc_neon_emit_mov_quad (p, dest1, src); + } + orc_neon_emit_unary_quad (p, "vuzp.16", 0xf3b60140, dest1, dest0); + } +} + +static void +orc_neon_rule_splitwb (OrcCompiler *p, void *user, OrcInstruction *insn) +{ + int dest0 = p->vars[insn->dest_args[0]].alloc; + int dest1 = p->vars[insn->dest_args[1]].alloc; + int src = p->vars[insn->src_args[0]].alloc; + + if (p->loop_shift < 2) { + if (src != dest0) { + orc_neon_emit_mov (p, dest0, src); + } + if (src != dest1) { + orc_neon_emit_mov (p, dest1, src); + } + orc_neon_emit_unary (p, "vuzp.8", 0xf3b20100, dest1, dest0); + } else { + if (src != dest0) { + orc_neon_emit_mov_quad (p, dest0, src); + } + if (src != dest1) { + orc_neon_emit_mov_quad (p, dest1, src); + } + orc_neon_emit_unary_quad (p, "vuzp.8", 0xf3b20140, dest1, dest0); + } +} + void orc_compiler_neon_register_rules (OrcTarget *target) { @@ -1988,6 +2040,8 @@ orc_compiler_neon_register_rules (OrcTarget *target) REG(select1lw); REG(mergebw); REG(mergewl); + REG(splitlw); + REG(splitwb); REG(addf); REG(subf); -- 2.7.4