neon hacking
authorDavid Schleef <ds@schleef.org>
Thu, 26 Mar 2009 19:06:08 +0000 (12:06 -0700)
committerDavid Schleef <ds@schleef.org>
Tue, 26 May 2009 23:55:42 +0000 (16:55 -0700)
orc/orcrules-neon.c

index 02d6269..4711b36 100644 (file)
@@ -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"); \
+  } \
 }