summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2014-09-19 15:39:22 +0200
committerWim Taymans <wtaymans@redhat.com>2014-09-19 15:39:22 +0200
commit2ece711c615d327be1e74bec4844186ced58b0ef (patch)
treec0edd2f429f29f877e7ef9db45ac5288224b86ad
parent93a40b2e4ec17796f5f6d14f19081be5a2ad80f2 (diff)
downloadorc-2ece711c615d327be1e74bec4844186ced58b0ef.tar.gz
parse: make contants per size
When we automatically create constants from the opcode arguments, make different constants per size and rewrite the program to use the newly created constant.
-rw-r--r--orc/orcparse.c32
-rw-r--r--orc/orcprogram.c3
2 files changed, 21 insertions, 14 deletions
diff --git a/orc/orcparse.c b/orc/orcparse.c
index 23c4dd1..e4d2c12 100644
--- a/orc/orcparse.c
+++ b/orc/orcparse.c
@@ -288,6 +288,7 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
if (o) {
int n_args = opcode_n_args (o);
int i, j;
+ char *args[4] = { 0 };
if (n_tokens != 1 + offset + n_args) {
orc_parse_log (parser, "error: line %d: too %s arguments for %s (expected %d)\n",
@@ -301,21 +302,26 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
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]);
+ char *varname;
+ int opsize = opcode_arg_size(o, j), cvar;
+
+ ORC_DEBUG ("arg size %d %d, flags %d", j, opsize, flags);
+ opsize *= (flags & ORC_INSTRUCTION_FLAG_X2 ? 2 : 1);
+ opsize *= (flags & ORC_INSTRUCTION_FLAG_X4 ? 4 : 1);
+
+ varname = malloc (strlen(token[i]) + 10);
+ sprintf(varname, "%s.%d", token[i], opsize);
+ cvar = orc_program_add_constant_str (parser->program, opsize,
+ token[i], varname);
+ free(varname);
+ /* use name of variable, it could be reused */
+ args[j] = parser->program->vars[cvar].name;
+ } else {
+ args[j] = token[i];
}
}
-
- if (n_tokens - offset == 5) {
- orc_program_append_str_2 (parser->program, token[offset], flags,
- token[offset+1], token[offset+2], token[offset+3], token[offset+4]);
- } else if (n_tokens - offset == 4) {
- orc_program_append_str_2 (parser->program, token[offset], flags,
- token[offset+1], token[offset+2], token[offset+3], NULL);
- } else {
- orc_program_append_str_2 (parser->program, token[offset], flags,
- token[offset+1], token[offset+2], NULL, NULL);
- }
+ orc_program_append_str_2 (parser->program, token[offset], flags,
+ args[0], args[1], args[2], args[3]);
} else {
orc_parse_log (parser, "error: line %d: unknown opcode: %s\n",
parser->line_number,
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 9251b97..040fb72 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -568,7 +568,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;
}
}