Add float parameters
authorDavid Schleef <ds@schleef.org>
Mon, 14 Jun 2010 18:37:29 +0000 (11:37 -0700)
committerDavid Schleef <ds@schleef.org>
Mon, 14 Jun 2010 18:48:44 +0000 (11:48 -0700)
orc/orcparse.c
orc/orcprogram-c.c
orc/orcprogram.c
orc/orcprogram.h
tools/orcc.c

index 3819635..a6eef1b 100644 (file)
@@ -159,6 +159,9 @@ orc_parse (const char *code, OrcProgram ***programs)
         int size = strtol (token[1], NULL, 0);
         int value = strtoul (token[3], NULL, 0);
         orc_program_add_constant (parser->program, size, value, token[2]);
+      } else if (strcmp (token[0], ".floatparam") == 0) {
+        int size = strtol (token[1], NULL, 0);
+        orc_program_add_parameter_float (parser->program, size, token[2]);
       } else {
         ORC_ERROR("ERROR: unknown directive: %s", token[0]);
       }
index b44f7cf..0ec73ba 100644 (file)
@@ -242,10 +242,16 @@ orc_compiler_c_assemble (OrcCompiler *compiler)
       case ORC_VAR_TYPE_PARAM:
         c_get_name (varname, compiler, i);
         if (!(compiler->target_flags & ORC_TARGET_C_NOEXEC)) {
-          ORC_ASM_CODE(compiler,"  const int %s = ex->params[%d];\n",
-              varname, i);
+          if (var->is_float_param) {
+            ORC_ASM_CODE(compiler,"  const float %s = ((orc_union32 *)(ex->params+%d))->f;\n",
+                varname, i);
+          } else {
+            ORC_ASM_CODE(compiler,"  const float %s = ((orc_union32 *)(ex->params+%d))->i;\n",
+                varname, i);
+          }
         } else {
-          ORC_ASM_CODE(compiler,"  const int %s = %s;\n",
+          ORC_ASM_CODE(compiler,"  const %s %s = %s;\n",
+              var->is_float_param ? "float" : "int",
               varname, varnames[i]);
         }
         break;
index 4ac62a5..a8bd9d4 100644 (file)
@@ -374,6 +374,30 @@ orc_program_add_parameter (OrcProgram *program, int size, const char *name)
 }
 
 /**
+ * orc_program_add_parameter_float:
+ * @program: a pointer to an OrcProgram structure
+ * @size: size of data value
+ * @name: name of variable
+ *
+ * Creates a new variable representing a scalar parameter.
+ *
+ * Returns: the index of the new variable
+ */
+int
+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].size = size;
+  program->vars[i].name = strdup(name);
+  program->n_param_vars++;
+
+  return i;
+}
+
+/**
  * orc_program_add_accumulator:
  * @program: a pointer to an OrcProgram structure
  * @size: size of data value
index c2220b7..73cdf73 100644 (file)
@@ -207,6 +207,8 @@ struct _OrcVariable {
   int aligned_data;
   int sampling_type;
   int load_dest;
+  double float_value;
+  int is_float_param;
 };
 
 /**
@@ -534,6 +536,7 @@ int orc_program_add_source (OrcProgram *program, int size, const char *name);
 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_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);
index 60b6bcb..17fc7ee 100644 (file)
@@ -409,7 +409,9 @@ output_prototype (OrcProgram *p, FILE *output)
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
       if (need_comma) fprintf(output, ", ");
-      fprintf(output, "int %s", varnames[ORC_VAR_P1 + i]);
+      fprintf(output, "%s %s",
+          var->is_float_param ? "float" : "int",
+          varnames[ORC_VAR_P1 + i]);
       need_comma = TRUE;
     }
   }
@@ -558,7 +560,8 @@ output_code (OrcProgram *p, FILE *output)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      fprintf(output, "      orc_program_add_parameter (p, %d, \"%s\");\n",
+      fprintf(output, "      orc_program_add_parameter%s (p, %d, \"%s\");\n",
+          var->is_float_param ? "_float" : "",
           var->size, varnames[ORC_VAR_P1 + i]);
     }
   }
@@ -629,8 +632,17 @@ output_code (OrcProgram *p, FILE *output)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      fprintf(output, "  ex->params[%s] = %s;\n",
-          enumnames[ORC_VAR_P1 + i], varnames[ORC_VAR_P1 + i]);
+      if (var->is_float_param) {
+        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]);
+      }
     }
   }
   fprintf(output, "\n");
@@ -712,7 +724,8 @@ output_code_test (OrcProgram *p, FILE *output)
   for(i=0;i<8;i++){
     var = &p->vars[ORC_VAR_P1 + i];
     if (var->size) {
-      fprintf(output, "    orc_program_add_parameter (p, %d, \"%s\");\n",
+      fprintf(output, "    orc_program_add_parameter%s (p, %d, \"%s\");\n",
+          var->is_float_param ? "_float" : "",
           var->size, varnames[ORC_VAR_P1 + i]);
     }
   }