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) \
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"); \
+ } \
}