arm/neon: use subs for loop counter
authorDavid Schleef <ds@schleef.org>
Wed, 7 Jul 2010 02:06:37 +0000 (19:06 -0700)
committerDavid Schleef <ds@schleef.org>
Fri, 9 Jul 2010 23:57:18 +0000 (16:57 -0700)
orc/orcarm.c
orc/orcarm.h
orc/orcprogram-arm.c
orc/orcprogram-neon.c

index a3eae37..cec205f 100644 (file)
@@ -361,9 +361,10 @@ orc_arm_emit_sub (OrcCompiler *compiler, int dest, int src1, int src2)
 }
 
 void
-orc_arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value)
+orc_arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value,
+    int record)
 {
-  orc_arm_emit_sub_i (compiler, ORC_ARM_COND_AL, 0, dest, src1, value);
+  orc_arm_emit_sub_i (compiler, ORC_ARM_COND_AL, record, dest, src1, value);
 }
 
 void
index f776dea..5af8c0a 100644 (file)
@@ -80,7 +80,7 @@ void orc_arm_emit_add (OrcCompiler *compiler, int dest, int src1, int src2);
 void orc_arm_emit_sub (OrcCompiler *compiler, int dest, int src1, int src2);
 void orc_arm_emit_add_imm (OrcCompiler *compiler, int dest, int src1, int value);
 void orc_arm_emit_and_imm (OrcCompiler *compiler, int dest, int src1, int value);
-void orc_arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value);
+void orc_arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value, int record);
 void orc_arm_emit_asr_imm (OrcCompiler *compiler, int dest, int src1, int value);
 void orc_arm_emit_lsl_imm (OrcCompiler *compiler, int dest, int src1, int value);
 void orc_arm_emit_cmp_imm (OrcCompiler *compiler, int src1, int value);
index 16c0ab8..6518a54 100644 (file)
@@ -317,10 +317,9 @@ orc_compiler_orc_arm_assemble (OrcCompiler *compiler)
 
     orc_arm_emit_load_reg (compiler, ORC_ARM_A3, compiler->exec_reg,
         (int)ORC_STRUCT_OFFSET(OrcExecutor, params[ORC_VAR_A2]));
-    orc_arm_emit_sub_imm (compiler, ORC_ARM_A3, ORC_ARM_A3, 1);
+    orc_arm_emit_sub_imm (compiler, ORC_ARM_A3, ORC_ARM_A3, 1, TRUE);
     orc_arm_emit_store_reg (compiler, ORC_ARM_A3, compiler->exec_reg,
         (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A2]));
-    orc_arm_emit_cmp_imm (compiler, ORC_ARM_A3, 0);
     orc_arm_emit_branch (compiler, ORC_ARM_COND_NE, 8);
   }
 
index 4cb12d5..2cc4b55 100644 (file)
@@ -447,7 +447,7 @@ orc_neon_restore_unalignment (OrcCompiler *compiler)
           orc_arm_emit_add (compiler, var->ptr_register, var->ptr_register,
               var->ptr_offset);
           orc_arm_emit_sub_imm (compiler, var->ptr_register, var->ptr_register,
-              size);
+              size, FALSE);
         }
         break;
       case ORC_VAR_TYPE_DEST:
@@ -657,8 +657,7 @@ orc_compiler_neon_assemble (OrcCompiler *compiler)
 
     orc_arm_emit_label (compiler, 0);
     orc_neon_emit_loop (compiler);
-    orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1);
-    orc_arm_emit_cmp_imm (compiler, ORC_ARM_IP, 0);
+    orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1, TRUE);
     orc_arm_emit_branch (compiler, ORC_ARM_COND_NE, 0);
     orc_arm_emit_label (compiler, 1);
 
@@ -684,11 +683,10 @@ orc_compiler_neon_assemble (OrcCompiler *compiler)
   }
 
   orc_arm_emit_label (compiler, 2);
-  orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1);
+  orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1, TRUE);
   for(i=0;i<(1<<compiler->unroll_shift);i++){
     orc_neon_emit_loop (compiler);
   }
-  orc_arm_emit_cmp_imm (compiler, ORC_ARM_IP, 0);
   orc_arm_emit_branch (compiler, ORC_ARM_COND_NE, 2);
 
   if (0) {
@@ -713,8 +711,7 @@ orc_compiler_neon_assemble (OrcCompiler *compiler)
 
     orc_arm_emit_label (compiler, 4);
     orc_neon_emit_loop (compiler);
-    orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1);
-    orc_arm_emit_cmp_imm (compiler, ORC_ARM_IP, 0);
+    orc_arm_emit_sub_imm (compiler, ORC_ARM_IP, ORC_ARM_IP, 1, TRUE);
     orc_arm_emit_branch (compiler, ORC_ARM_COND_NE, 4);
     orc_arm_emit_label (compiler, 5);
 
@@ -726,10 +723,9 @@ orc_compiler_neon_assemble (OrcCompiler *compiler)
 
     orc_arm_emit_load_reg (compiler, ORC_ARM_A3, compiler->exec_reg,
         (int)ORC_STRUCT_OFFSET(OrcExecutor, params[ORC_VAR_A2]));
-    orc_arm_emit_sub_imm (compiler, ORC_ARM_A3, ORC_ARM_A3, 1);
+    orc_arm_emit_sub_imm (compiler, ORC_ARM_A3, ORC_ARM_A3, 1, TRUE);
     orc_arm_emit_store_reg (compiler, ORC_ARM_A3, compiler->exec_reg,
         (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A2]));
-    orc_arm_emit_cmp_imm (compiler, ORC_ARM_A3, 0);
     orc_arm_emit_branch (compiler, ORC_ARM_COND_NE, 8);
   }