From 95848b68daf363735fb5a2c48fab5b4f809a383d Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 26 Mar 2009 12:06:08 -0700 Subject: [PATCH] neon hacking --- orc/orcrules-neon.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/orc/orcrules-neon.c b/orc/orcrules-neon.c index 02d6269..4711b36 100644 --- a/orc/orcrules-neon.c +++ b/orc/orcrules-neon.c @@ -258,14 +258,18 @@ static void \ neon_rule_ ## opcode (OrcCompiler *p, void *user, OrcInstruction *insn) \ { \ uint32_t x = code; \ - ORC_ASM_CODE(p," " insn_name " %s, %s, #%d\n", \ - neon_reg_name (p->vars[insn->dest_args[0]].alloc), \ - neon_reg_name (p->vars[insn->src_args[0]].alloc), \ - p->vars[insn->src_args[1]].value); \ - x |= (p->vars[insn->dest_args[0]].alloc&0xf)<<12; \ - x |= (p->vars[insn->src_args[0]].alloc&0xf)<<0; \ - x |= p->vars[insn->src_args[1]].value << 16; \ - arm_emit (p, x); \ + if (p->vars[insn->src_args[1]].vartype == ORC_VAR_TYPE_CONST) { \ + ORC_ASM_CODE(p," " insn_name " %s, %s, #%d\n", \ + neon_reg_name (p->vars[insn->dest_args[0]].alloc), \ + neon_reg_name (p->vars[insn->src_args[0]].alloc), \ + p->vars[insn->src_args[1]].value); \ + x |= (p->vars[insn->dest_args[0]].alloc&0xf)<<12; \ + x |= (p->vars[insn->src_args[0]].alloc&0xf)<<0; \ + x |= p->vars[insn->src_args[1]].value << 16; \ + arm_emit (p, x); \ + } else { \ + ORC_PROGRAM_ERROR(p,"shift rule only works with constants"); \ + } \ } #define RSHIFT(opcode,insn_name,code,n) \ @@ -273,14 +277,18 @@ static void \ neon_rule_ ## opcode (OrcCompiler *p, void *user, OrcInstruction *insn) \ { \ uint32_t x = code; \ - ORC_ASM_CODE(p," " insn_name " %s, %s, #%d\n", \ - neon_reg_name (p->vars[insn->dest_args[0]].alloc), \ - neon_reg_name (p->vars[insn->src_args[0]].alloc), \ - p->vars[insn->src_args[1]].value); \ - x |= (p->vars[insn->dest_args[0]].alloc&0xf)<<12; \ - x |= (p->vars[insn->src_args[0]].alloc&0xf)<<0; \ - x |= ((n - p->vars[insn->src_args[1]].value)&(n-1))<<16; \ - arm_emit (p, x); \ + if (p->vars[insn->src_args[1]].vartype == ORC_VAR_TYPE_CONST) { \ + ORC_ASM_CODE(p," " insn_name " %s, %s, #%d\n", \ + neon_reg_name (p->vars[insn->dest_args[0]].alloc), \ + neon_reg_name (p->vars[insn->src_args[0]].alloc), \ + p->vars[insn->src_args[1]].value); \ + x |= (p->vars[insn->dest_args[0]].alloc&0xf)<<12; \ + x |= (p->vars[insn->src_args[0]].alloc&0xf)<<0; \ + x |= ((n - p->vars[insn->src_args[1]].value)&(n-1))<<16; \ + arm_emit (p, x); \ + } else { \ + ORC_PROGRAM_ERROR(p,"shift rule only works with constants"); \ + } \ } -- 2.7.4