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;
}
}
}
}
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;
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) {
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++;
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++;
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,
int ptr_offset;
int mask_alloc;
int aligned_data;
- int is_float_param;
+ int param_type;
int load_dest;
};
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);
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);
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);
}
}
}
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;
}
}
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);
}
}
}
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++){
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++){