diff options
author | Wim Taymans <wtaymans@redhat.com> | 2014-09-19 22:57:03 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2014-09-19 23:00:59 +0200 |
commit | c368c336b6e618c0edead4023401033d94847e9e (patch) | |
tree | 1b4a27308508ea6c952c597a24ed6f3709be6c44 | |
parent | 2ece711c615d327be1e74bec4844186ced58b0ef (diff) |
Revert reuse constants
This reverts commit 2ece711c615d327be1e74bec4844186ced58b0ef.
This reverts commit 2ae41b98a35405dbfd35209e7d68428be77a2e62.
This reverts commit 106dacc2620126dedb99d2b981ba2e5a7d4591f9.
This reverts commit f6697e30681f46f6f3f632ddbbcab98107eec7e0.
These commits are more complicated than needed. A more simple solution
is possible by tracking the registers that hold a certain constant and
simply reusing that register when we can. We can then load the same
constant in different registers of different sizes if needed.
-rw-r--r-- | orc/orccompiler.c | 12 | ||||
-rw-r--r-- | orc/orcexecutor.c | 9 | ||||
-rw-r--r-- | orc/orcparse.c | 32 | ||||
-rw-r--r-- | orc/orcprogram.c | 3 |
4 files changed, 16 insertions, 40 deletions
diff --git a/orc/orccompiler.c b/orc/orccompiler.c index 575775b..1b403f5 100644 --- a/orc/orccompiler.c +++ b/orc/orccompiler.c @@ -582,13 +582,6 @@ orc_compiler_rewrite_insns (OrcCompiler *compiler) OrcInstruction *cinsn; int multiplier; - if (var->vartype == ORC_VAR_TYPE_CONST) { - if (var->replaced) { - insn.src_args[i] = var->replacement; - continue; - } - } - cinsn = compiler->insns + compiler->n_insns; compiler->n_insns++; @@ -605,16 +598,13 @@ orc_compiler_rewrite_insns (OrcCompiler *compiler) cinsn->opcode = get_loadp_opcode_for_size (opcode->src_size[i]); cinsn->dest_args[0] = orc_compiler_new_temporary (compiler, opcode->src_size[i] * multiplier); - if (var->vartype == ORC_VAR_TYPE_CONST) { - var->replaced = TRUE; - var->replacement = cinsn->dest_args[0]; - compiler->vars[cinsn->dest_args[0]].flags |= ORC_VAR_FLAG_VOLATILE_WORKAROUND; } cinsn->src_args[0] = insn.src_args[i]; insn.src_args[i] = cinsn->dest_args[0]; + } } } diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c index 9007f3e..6fe296d 100644 --- a/orc/orcexecutor.c +++ b/orc/orcexecutor.c @@ -285,20 +285,13 @@ orc_executor_emulate (OrcExecutor *ex) for(k=0;k<ORC_STATIC_OPCODE_N_SRC;k++) { OrcCodeVariable *var = code->vars + insn->src_args[k]; - int src_size = opcode->src_size[k]; - if (src_size == 0) continue; + if (opcode->src_size[k] == 0) continue; if (var->vartype == ORC_VAR_TYPE_CONST) { opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]]; /* FIXME hack */ load_constant (tmpspace[insn->src_args[k]], 8, var->value.i); - if (src_size == 1) - opcode_ex[j].shift = 3; - else if (src_size == 2) - opcode_ex[j].shift = 2; - else if (src_size == 4) - opcode_ex[j].shift = 1; } else if (var->vartype == ORC_VAR_TYPE_PARAM) { opcode_ex[j].src_ptrs[k] = tmpspace[insn->src_args[k]]; /* FIXME hack */ diff --git a/orc/orcparse.c b/orc/orcparse.c index e4d2c12..23c4dd1 100644 --- a/orc/orcparse.c +++ b/orc/orcparse.c @@ -288,7 +288,6 @@ 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", @@ -302,26 +301,21 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) unused = strtod (token[i], &end); if (end != 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]; + orc_program_add_constant_str (parser->program, opcode_arg_size(o, j), + token[i], token[i]); } } - orc_program_append_str_2 (parser->program, token[offset], flags, - args[0], args[1], args[2], args[3]); + + 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); + } } 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 040fb72..9251b97 100644 --- a/orc/orcprogram.c +++ b/orc/orcprogram.c @@ -568,8 +568,7 @@ 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 && - program->vars[ORC_VAR_C1 + j].size == size) { + if (program->vars[ORC_VAR_C1 + j].value.i == program->vars[i].value.i) { return ORC_VAR_C1 + j; } } |