Revert reuse constants
authorWim Taymans <wtaymans@redhat.com>
Fri, 19 Sep 2014 20:57:03 +0000 (22:57 +0200)
committerWim Taymans <wtaymans@redhat.com>
Fri, 19 Sep 2014 21:00:59 +0000 (23:00 +0200)
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.

orc/orccompiler.c
orc/orcexecutor.c
orc/orcparse.c
orc/orcprogram.c

index 575775b..1b403f5 100644 (file)
@@ -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];
+
         }
       }
     }
index 9007f3e..6fe296d 100644 (file)
@@ -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 */
index e4d2c12..23c4dd1 100644 (file)
@@ -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,
index 040fb72..9251b97 100644 (file)
@@ -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;
     }
   }