summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--orc/orccompiler.c2
-rw-r--r--orc/orcparse.c15
-rw-r--r--orc/orcprogram.c3
3 files changed, 15 insertions, 5 deletions
diff --git a/orc/orccompiler.c b/orc/orccompiler.c
index 3618f5b..352ec6e 100644
--- a/orc/orccompiler.c
+++ b/orc/orccompiler.c
@@ -565,7 +565,7 @@ orc_compiler_rewrite_insns (OrcCompiler *compiler)
if (var->vartype == ORC_VAR_TYPE_SRC ||
var->vartype == ORC_VAR_TYPE_DEST) {
OrcInstruction *cinsn;
-
+
cinsn = compiler->insns + compiler->n_insns;
compiler->n_insns++;
diff --git a/orc/orcparse.c b/orc/orcparse.c
index f4d0a28..8d6be4c 100644
--- a/orc/orcparse.c
+++ b/orc/orcparse.c
@@ -307,13 +307,22 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
for(i=offset+1,j=0;i<n_tokens;i++,j++){
char *end;
double unused ORC_GNUC_UNUSED;
+ char varname[20];
+
+ args[j] = token[i];
unused = strtod (token[i], &end);
if (end != token[i]) {
- orc_program_add_constant_str (parser->program, opcode_arg_size(o, j),
- token[i], token[i]);
+ int id;
+
+ /* make a unique name based on value and size */
+ sprintf (varname, "_%d.%s", opcode_arg_size(o, j), token[i]);
+ id = orc_program_add_constant_str (parser->program, opcode_arg_size(o, j),
+ token[i], varname);
+ /* it's possible we reused an existing variable, get its name so
+ * that we can refer to it in the opcode */
+ args[j] = parser->program->vars[id].name;
}
- args[j] = token[i];
}
orc_program_append_str_2 (parser->program, token[offset], flags,
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 1d749c0..c8e3d47 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -585,7 +585,8 @@ orc_program_add_constant_str (OrcProgram *program, int size,
}
for(j=0;j<program->n_const_vars;j++){
- if (program->vars[ORC_VAR_C1 + j].value.i == program->vars[i].value.i) {
+ if (program->vars[ORC_VAR_C1 + j].value.i == program->vars[i].value.i &&
+ program->vars[ORC_VAR_C1 + j].size == size) {
return ORC_VAR_C1 + j;
}
}