From: David Schleef Date: Mon, 14 Jun 2010 18:37:29 +0000 (-0700) Subject: Add float parameters X-Git-Tag: orc-0.4.6~65 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5bfde389c78155e77d9f9bfc7dcfec86f31f7078;p=platform%2Fupstream%2Forc.git Add float parameters --- diff --git a/orc/orcparse.c b/orc/orcparse.c index 3819635..a6eef1b 100644 --- a/orc/orcparse.c +++ b/orc/orcparse.c @@ -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]); } diff --git a/orc/orcprogram-c.c b/orc/orcprogram-c.c index b44f7cf..0ec73ba 100644 --- a/orc/orcprogram-c.c +++ b/orc/orcprogram-c.c @@ -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; diff --git a/orc/orcprogram.c b/orc/orcprogram.c index 4ac62a5..a8bd9d4 100644 --- a/orc/orcprogram.c +++ b/orc/orcprogram.c @@ -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 diff --git a/orc/orcprogram.h b/orc/orcprogram.h index c2220b7..73cdf73 100644 --- a/orc/orcprogram.h +++ b/orc/orcprogram.h @@ -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); diff --git a/tools/orcc.c b/tools/orcc.c index 60b6bcb..17fc7ee 100644 --- a/tools/orcc.c +++ b/tools/orcc.c @@ -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]); } }