summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2014-09-19 22:57:03 +0200
committerWim Taymans <wtaymans@redhat.com>2014-09-19 23:00:59 +0200
commitc368c336b6e618c0edead4023401033d94847e9e (patch)
tree1b4a27308508ea6c952c597a24ed6f3709be6c44
parent2ece711c615d327be1e74bec4844186ced58b0ef (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.c12
-rw-r--r--orc/orcexecutor.c9
-rw-r--r--orc/orcparse.c32
-rw-r--r--orc/orcprogram.c3
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;
}
}