Add int64 and double parameters
authorDavid Schleef <ds@schleef.org>
Thu, 26 Aug 2010 22:02:53 +0000 (15:02 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 26 Aug 2010 22:02:53 +0000 (15:02 -0700)
orc-test/orctest.c
orc/orcexecutor.c
orc/orcprogram-c.c
orc/orcprogram.c
orc/orcprogram.h
testsuite/show_parse.c
tools/orcc.c

index f4a66dc..b38f590 100644 (file)
@@ -568,10 +568,19 @@ orc_test_compare_output_full (OrcProgram *program, int flags)
       orc_array_set_pattern (dest_emul[i], ORC_OOB_VALUE);
       misalignment++;
     } else if (program->vars[i].vartype == ORC_VAR_TYPE_PARAM) {
-      if (program->vars[i].is_float_param) {
-        orc_executor_set_param_float (ex, i, 2.0);
-      } else {
-        orc_executor_set_param (ex, i, 2);
+      switch (program->vars[i].param_type) {
+        case ORC_PARAM_TYPE_INT:
+          orc_executor_set_param (ex, i, 2);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          orc_executor_set_param_float (ex, i, 2.0);
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          orc_executor_set_param_int64 (ex, i, 2);
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          orc_executor_set_param_double (ex, i, 2.0);
+          break;
       }
     }
   }
index fef9e67..3184b4a 100644 (file)
@@ -109,6 +109,24 @@ orc_executor_set_param_float (OrcExecutor *ex, int var, float value)
 }
 
 void
+orc_executor_set_param_int64 (OrcExecutor *ex, int var, orc_int64 value)
+{
+  orc_union64 u;
+  u.i = value;
+  ex->params[var] = u.x2[0];
+  ex->params[var + (ORC_VAR_T1-ORC_VAR_P1)] = u.x2[1];
+}
+
+void
+orc_executor_set_param_double (OrcExecutor *ex, int var, double value)
+{
+  orc_union64 u;
+  u.f = value;
+  ex->params[var] = u.x2[0];
+  ex->params[var + (ORC_VAR_T1-ORC_VAR_P1)] = u.x2[1];
+}
+
+void
 orc_executor_set_param_str (OrcExecutor *ex, const char *name, int value)
 {
   int var;
index 9c0c084..c57b682 100644 (file)
@@ -401,18 +401,44 @@ c_get_name_int (char *name, OrcCompiler *p, OrcInstruction *insn, int var)
     if (p->target_flags & ORC_TARGET_C_NOEXEC) {
       sprintf(name,"%s", varnames[var]);
     } else if (p->target_flags & ORC_TARGET_C_OPCODE) {
-      if (p->vars[var].is_float_param) {
-        sprintf(name,"((orc_union32 *)(ex->src_ptrs[%d]))->f",
-            var - ORC_VAR_P1 + p->program->n_src_vars);
-      } else {
-        sprintf(name,"((orc_union32 *)(ex->src_ptrs[%d]))->i",
-            var - ORC_VAR_P1 + p->program->n_src_vars);
+      switch (p->vars[var].param_type) {
+        case ORC_PARAM_TYPE_INT:
+          sprintf(name,"((orc_union32 *)(ex->src_ptrs[%d]))->i",
+              var - ORC_VAR_P1 + p->program->n_src_vars);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          sprintf(name,"((orc_union32 *)(ex->src_ptrs[%d]))->f",
+              var - ORC_VAR_P1 + p->program->n_src_vars);
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          sprintf(name,"((orc_union64 *)(ex->src_ptrs[%d]))->i",
+              var - ORC_VAR_P1 + p->program->n_src_vars);
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          sprintf(name,"((orc_union64 *)(ex->src_ptrs[%d]))->f",
+              var - ORC_VAR_P1 + p->program->n_src_vars);
+          break;
+        default:
+          ORC_ASSERT(0);
       }
     } else {
-      if (p->vars[var].is_float_param) {
-        sprintf(name,"((orc_union32 *)(ex->params+%d))->f", var);
-      } else {
-        sprintf(name,"ex->params[%d]", var);
+      switch (p->vars[var].param_type) {
+        case ORC_PARAM_TYPE_INT:
+          sprintf(name,"ex->params[%d]", var);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          sprintf(name,"((orc_union32 *)(ex->params+%d))->f", var);
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          /* FIXME */
+          sprintf(name,"((orc_union32 *)(ex->params+%d))->i", var);
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          /* FIXME */
+          sprintf(name,"((orc_union32 *)(ex->params+%d))->f", var);
+          break;
+        default:
+          ORC_ASSERT(0);
       }
     }
   } else if (p->vars[var].vartype == ORC_VAR_TYPE_CONST) {
index fa3cae3..fe27db5 100644 (file)
@@ -373,6 +373,7 @@ orc_program_add_parameter (OrcProgram *program, int size, const char *name)
   int i = ORC_VAR_P1 + program->n_param_vars;
 
   program->vars[i].vartype = ORC_VAR_TYPE_PARAM;
+  program->vars[i].param_type = ORC_PARAM_TYPE_INT;
   program->vars[i].size = size;
   program->vars[i].name = strdup(name);
   program->n_param_vars++;
@@ -396,7 +397,37 @@ orc_program_add_parameter_float (OrcProgram *program, int size, const char *name
   int i = ORC_VAR_P1 + program->n_param_vars;
 
   program->vars[i].vartype = ORC_VAR_TYPE_PARAM;
-  program->vars[i].is_float_param = TRUE;
+  program->vars[i].param_type = ORC_PARAM_TYPE_FLOAT;
+  program->vars[i].size = size;
+  program->vars[i].name = strdup(name);
+  program->n_param_vars++;
+
+  return i;
+}
+
+int
+orc_program_add_parameter_double (OrcProgram *program, int size,
+    const char *name)
+{
+  int i = ORC_VAR_P1 + program->n_param_vars;
+
+  program->vars[i].vartype = ORC_VAR_TYPE_PARAM;
+  program->vars[i].param_type = ORC_PARAM_TYPE_DOUBLE;
+  program->vars[i].size = size;
+  program->vars[i].name = strdup(name);
+  program->n_param_vars++;
+
+  return i;
+}
+
+int
+orc_program_add_parameter_in64 (OrcProgram *program, int size,
+    const char *name)
+{
+  int i = ORC_VAR_P1 + program->n_param_vars;
+
+  program->vars[i].vartype = ORC_VAR_TYPE_PARAM;
+  program->vars[i].param_type = ORC_PARAM_TYPE_INT64;
   program->vars[i].size = size;
   program->vars[i].name = strdup(name);
   program->n_param_vars++;
index 6cbe43b..11d5f84 100644 (file)
@@ -177,6 +177,13 @@ enum {
   ORC_SAMPLE_FOUR_TAP
 };
 
+enum {
+  ORC_PARAM_TYPE_INT = 0,
+  ORC_PARAM_TYPE_FLOAT,
+  ORC_PARAM_TYPE_INT64,
+  ORC_PARAM_TYPE_DOUBLE
+};
+
 typedef enum {
   ORC_COMPILE_RESULT_OK = 0,
 
@@ -222,7 +229,7 @@ struct _OrcVariable {
   int ptr_offset;
   int mask_alloc;
   int aligned_data;
-  int is_float_param;
+  int param_type;
   int load_dest;
 };
 
@@ -628,6 +635,8 @@ int orc_program_add_destination (OrcProgram *program, int size, const char *name
 int orc_program_add_constant (OrcProgram *program, int size, int value, const char *name);
 int orc_program_add_parameter (OrcProgram *program, int size, const char *name);
 int orc_program_add_parameter_float (OrcProgram *program, int size, const char *name);
+int orc_program_add_parameter_double (OrcProgram *program, int size, const char *name);
+int orc_program_add_parameter_in64 (OrcProgram *program, int size, const char *name);
 int orc_program_add_accumulator (OrcProgram *program, int size, const char *name);
 void orc_program_set_type_name (OrcProgram *program, int var, const char *type_name);
 void orc_program_set_sampling_type (OrcProgram *program, int var, int sampling_type);
@@ -641,6 +650,8 @@ void orc_executor_set_array_str (OrcExecutor *ex, const char *name, void *ptr);
 void orc_executor_set_param (OrcExecutor *ex, int var, int value);
 void orc_executor_set_param_str (OrcExecutor *ex, const char *name, int value);
 void orc_executor_set_param_float (OrcExecutor *ex, int var, float value);
+void orc_executor_set_param_int64 (OrcExecutor *ex, int var, orc_int64 value);
+void orc_executor_set_param_double (OrcExecutor *ex, int var, double value);
 int orc_executor_get_accumulator (OrcExecutor *ex, int var);
 int orc_executor_get_accumulator_str (OrcExecutor *ex, const char *name);
 void orc_executor_set_n (OrcExecutor *ex, int n);
index b932691..f96fd5b 100644 (file)
@@ -285,10 +285,21 @@ show (OrcProgram *program)
       dest[i-ORC_VAR_D1] = orc_array_new (n, m, program->vars[i].size, 0);
       orc_array_set_pattern (dest[i], ORC_OOB_VALUE);
     } else if (program->vars[i].vartype == ORC_VAR_TYPE_PARAM) {
-      if (program->vars[i].is_float_param) {
-        orc_executor_set_param_float (ex, i, 2.0);
-      } else {
-        orc_executor_set_param (ex, i, 2);
+      switch (program->vars[i].param_type) {
+        case ORC_PARAM_TYPE_INT:
+          orc_executor_set_param (ex, i, 2);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          orc_executor_set_param_float (ex, i, 2.0);
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          orc_executor_set_param_int64 (ex, i, 2);
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          orc_executor_set_param_double (ex, i, 2.0);
+          break;
+        default:
+          ORC_ASSERT(0);
       }
     }
   }
index 1a42d2a..ac7964a 100644 (file)
@@ -535,12 +535,25 @@ output_prototype (OrcProgram *p, FILE *output)
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
       if (need_comma) fprintf(output, ", ");
-      if (var->is_float_param) {
-        REQUIRE(0,4,5,1);
+      switch (var->param_type) {
+        case ORC_PARAM_TYPE_INT:
+          fprintf(output, "int %s", varnames[ORC_VAR_P1 + i]);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          REQUIRE(0,4,5,1);
+          fprintf(output, "float %s", varnames[ORC_VAR_P1 + i]);
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          REQUIRE(0,4,7,1);
+          fprintf(output, "orc_int64 %s", varnames[ORC_VAR_P1 + i]);
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          REQUIRE(0,4,7,1);
+          fprintf(output, "double %s", varnames[ORC_VAR_P1 + i]);
+          break;
+        default:
+          ORC_ASSERT(0);
       }
-      fprintf(output, "%s %s",
-          var->is_float_param ? "float" : "int",
-          varnames[ORC_VAR_P1 + i]);
       need_comma = TRUE;
     }
   }
@@ -717,17 +730,44 @@ output_code_execute (OrcProgram *p, FILE *output, int is_inline)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      if (var->is_float_param) {
-        REQUIRE(0,4,5,1);
-        fprintf(output, "  {\n");
-        fprintf(output, "    orc_union32 tmp;\n");
-        fprintf(output, "    tmp.f = %s;\n", varnames[ORC_VAR_P1 + i]);
-        fprintf(output, "    ex->params[%s] = tmp.i;\n",
-            enumnames[ORC_VAR_P1 + i]);
-        fprintf(output, "  }\n");
-      } else {
-        fprintf(output, "  ex->params[%s] = %s;\n",
-            enumnames[ORC_VAR_P1 + i], varnames[ORC_VAR_P1 + i]);
+      switch (var->param_type) {
+        case ORC_PARAM_TYPE_INT:
+          fprintf(output, "  ex->params[%s] = %s;\n",
+              enumnames[ORC_VAR_P1 + i], varnames[ORC_VAR_P1 + i]);
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          REQUIRE(0,4,5,1);
+          fprintf(output, "  {\n");
+          fprintf(output, "    orc_union32 tmp;\n");
+          fprintf(output, "    tmp.f = %s;\n", varnames[ORC_VAR_P1 + i]);
+          fprintf(output, "    ex->params[%s] = tmp.i;\n",
+              enumnames[ORC_VAR_P1 + i]);
+          fprintf(output, "  }\n");
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          REQUIRE(0,4,7,1);
+          fprintf(output, "  {\n");
+          fprintf(output, "    orc_union64 tmp;\n");
+          fprintf(output, "    tmp.i = %s;\n", varnames[ORC_VAR_P1 + i]);
+          fprintf(output, "    ex->params[%s] = tmp.x2[0];\n",
+              enumnames[ORC_VAR_P1 + i]);
+          fprintf(output, "    ex->params[%s] = tmp.x2[1];\n",
+              enumnames[ORC_VAR_T1 + i]);
+          fprintf(output, "  }\n");
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          REQUIRE(0,4,5,1);
+          fprintf(output, "  {\n");
+          fprintf(output, "    orc_union64 tmp;\n");
+          fprintf(output, "    tmp.f = %s;\n", varnames[ORC_VAR_P1 + i]);
+          fprintf(output, "    ex->params[%s] = tmp.x2[0];\n",
+              enumnames[ORC_VAR_P1 + i]);
+          fprintf(output, "    ex->params[%s] = tmp.x2[1];\n",
+              enumnames[ORC_VAR_T1 + i]);
+          fprintf(output, "  }\n");
+          break;
+        default:
+          ORC_ASSERT(0);
       }
     }
   }
@@ -799,12 +839,28 @@ output_program_generation (OrcProgram *p, FILE *output, int is_inline)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      if (var->is_float_param) {
-        REQUIRE(0,4,5,1);
+      const char *suffix = NULL;
+      switch (var->param_type) {
+        case ORC_PARAM_TYPE_INT:
+          suffix="";
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          REQUIRE(0,4,5,1);
+          suffix="_float";
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          REQUIRE(0,4,7,1);
+          suffix="_int64";
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          REQUIRE(0,4,7,1);
+          suffix="_double";
+          break;
+        default:
+          ORC_ASSERT(0);
       }
       fprintf(output, "      orc_program_add_parameter%s (p, %d, \"%s\");\n",
-          var->is_float_param ? "_float" : "",
-          var->size, varnames[ORC_VAR_P1 + i]);
+          suffix, var->size, varnames[ORC_VAR_P1 + i]);
     }
   }
   for(i=0;i<16;i++){
@@ -952,12 +1008,28 @@ output_code_test (OrcProgram *p, FILE *output)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      if (var->is_float_param) {
-        REQUIRE(0,4,5,1);
+      const char *suffix = NULL;
+      switch (var->param_type) {
+        case ORC_PARAM_TYPE_INT:
+          suffix="";
+          break;
+        case ORC_PARAM_TYPE_FLOAT:
+          REQUIRE(0,4,5,1);
+          suffix="_float";
+          break;
+        case ORC_PARAM_TYPE_INT64:
+          REQUIRE(0,4,7,1);
+          suffix="_int64";
+          break;
+        case ORC_PARAM_TYPE_DOUBLE:
+          REQUIRE(0,4,7,1);
+          suffix="_double";
+          break;
+        default:
+          ORC_ASSERT(0);
       }
       fprintf(output, "    orc_program_add_parameter%s (p, %d, \"%s\");\n",
-          var->is_float_param ? "_float" : "",
-          var->size, varnames[ORC_VAR_P1 + i]);
+          suffix, var->size, varnames[ORC_VAR_P1 + i]);
     }
   }
   for(i=0;i<16;i++){