#include <orc/orcdebug.h>
static const char *c_get_type_name (int size);
+static void c_get_name (char *name, OrcCompiler *p, int var);
void orc_c_init (void);
ORC_ASM_CODE(compiler," %s var%d;\n", c_get_type_name(var->size), i);
break;
case ORC_VAR_TYPE_SRC:
- ORC_ASM_CODE(compiler," const %s *%s var%d;\n",
+ ORC_ASM_CODE(compiler," %s var%d;\n", c_get_type_name(var->size), i);
+ ORC_ASM_CODE(compiler," const %s *%s ptr%d;\n",
c_get_type_name (var->size),
(compiler->target_flags & ORC_TARGET_C_C99) ? "restrict " : "",
i);
break;
case ORC_VAR_TYPE_DEST:
- ORC_ASM_CODE(compiler," %s *%s var%d;\n",
+ ORC_ASM_CODE(compiler," %s var%d;\n", c_get_type_name(var->size), i);
+ ORC_ASM_CODE(compiler," %s *%s ptr%d;\n",
c_get_type_name (var->size),
(compiler->target_flags & ORC_TARGET_C_C99) ? "restrict " : "",
i);
switch (var->sampling_type) {
case ORC_SAMPLE_REGULAR:
ORC_ASM_CODE(compiler,
- " var%d = ORC_PTR_OFFSET(%s, %s * j);\n",
+ " ptr%d = ORC_PTR_OFFSET(%s, %s * j);\n",
i, s1, s2);
break;
case ORC_SAMPLE_TRANSPOSED:
ORC_ASM_CODE(compiler,
- " var%d = ORC_PTR_OFFSET(%s, %d * j);\n",
+ " ptr%d = ORC_PTR_OFFSET(%s, %d * j);\n",
i, s1, var->size);
break;
case ORC_SAMPLE_NEAREST:
case ORC_SAMPLE_BILINEAR:
case ORC_SAMPLE_FOUR_TAP:
ORC_ASM_CODE(compiler,
- " var%d = ORC_PTR_OFFSET(%s, %s * j);\n",
+ " ptr%d = ORC_PTR_OFFSET(%s, %s * j);\n",
i, s1, s2);
break;
default:
get_varname(s1, compiler, i),
get_varname_stride(s2, compiler, i),
ORC_ASM_CODE(compiler,
- " var%d = ORC_PTR_OFFSET(%s, %s * j);\n",
+ " ptr%d = ORC_PTR_OFFSET(%s, %s * j);\n",
i, s1, s2);
}
break;
get_varname(s, compiler, i);
switch (var->vartype) {
case ORC_VAR_TYPE_SRC:
- ORC_ASM_CODE(compiler," var%d = %s;\n", i, s);
+ ORC_ASM_CODE(compiler," ptr%d = %s;\n", i, s);
break;
case ORC_VAR_TYPE_DEST:
- ORC_ASM_CODE(compiler," var%d = %s;\n", i, s);
+ ORC_ASM_CODE(compiler," ptr%d = %s;\n", i, s);
break;
default:
break;
compiler->program->constant_n);
}
+ /* Load from source (and maybe destination) arrays */
+ for(i=0;i<ORC_N_VARIABLES;i++){
+ OrcVariable *var = compiler->vars + i;
+ char s[20];
+ if (var->name == NULL) continue;
+ c_get_name(s, compiler, i);
+ if (var->vartype == ORC_VAR_TYPE_SRC) {
+ ORC_ASM_CODE (compiler, "%*s %s = *ptr%d;\n", prefix, "", s, i);
+ ORC_ASM_CODE (compiler, "%*s ptr%d++;\n", prefix, "", i);
+ }
+ if (var->vartype == ORC_VAR_TYPE_SRC && var->load_dest) {
+ ORC_ASM_CODE (compiler, "%*s %s = *ptr%d;\n", prefix, "", s, i);
+ }
+ }
+ /* Emit instructions */
for(j=0;j<compiler->n_insns;j++){
insn = compiler->insns + j;
opcode = insn->opcode;
compiler->error = TRUE;
}
}
+ /* Store to destination arrays */
+ for(i=0;i<ORC_N_VARIABLES;i++){
+ OrcVariable *var = compiler->vars + i;
+ char s[20];
+ if (var->name == NULL) continue;
+ c_get_name(s, compiler, i);
+ if (var->vartype == ORC_VAR_TYPE_DEST) {
+ ORC_ASM_CODE (compiler, "%*s *ptr%d = %s;\n", prefix, "", i, s);
+ ORC_ASM_CODE (compiler, "%*s ptr%d++;\n", prefix, "", i);
+ }
+ }
ORC_ASM_CODE(compiler,"%*s }\n", prefix, "");
if (compiler->program->is_2d) {
ORC_ASM_CODE(compiler," }\n");
case ORC_VAR_TYPE_PARAM:
case ORC_VAR_TYPE_TEMP:
case ORC_VAR_TYPE_ACCUMULATOR:
- sprintf(name, "var%d", var);
- break;
case ORC_VAR_TYPE_SRC:
- switch(p->vars[var].sampling_type) {
- case ORC_SAMPLE_REGULAR:
- sprintf(name, "var%d[i]", var);
- break;
- case ORC_SAMPLE_TRANSPOSED:
- {
- char s2[20];
- get_varname_stride(s2, p, var);
- sprintf(name, "ORC_PTR_OFFSET(var%d, %s * i)", var, s2);
- }
- break;
- case ORC_SAMPLE_NEAREST:
- case ORC_SAMPLE_BILINEAR:
- case ORC_SAMPLE_FOUR_TAP:
- sprintf(name, "var%d[i]", var);
- break;
- default:
- ORC_COMPILER_ERROR(p, "eeek");
- break;
- }
- break;
case ORC_VAR_TYPE_DEST:
- sprintf(name, "var%d[i]", var);
+ sprintf(name, "var%d", var);
break;
default:
ORC_COMPILER_ERROR(p, "bad vartype");