diff options
author | Wim Taymans <wtaymans@redhat.com> | 2014-09-19 15:39:22 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2014-09-19 15:39:22 +0200 |
commit | 2ece711c615d327be1e74bec4844186ced58b0ef (patch) | |
tree | c0edd2f429f29f877e7ef9db45ac5288224b86ad | |
parent | 93a40b2e4ec17796f5f6d14f19081be5a2ad80f2 (diff) |
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.c | 32 | ||||
-rw-r--r-- | orc/orcprogram.c | 3 |
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; } } |