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]);
}
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;
}
/**
+ * 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
int aligned_data;
int sampling_type;
int load_dest;
+ double float_value;
+ int is_float_param;
};
/**
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);
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;
}
}
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]);
}
}
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");
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]);
}
}