summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Emont <guijemont@igalia.com>2012-12-05 19:21:17 +0100
committerGuillaume Emont <guijemont@igalia.com>2012-12-28 15:17:46 +0100
commite2689b3df261d20ba070e7b8550514c0e751b97c (patch)
tree316cfaaabec79c00c711e8d9f9f21f6f6a599736
parent3095e3a1f0aed49b7b5cfb653656a12eb3dbd016 (diff)
downloadorc-e2689b3df261d20ba070e7b8550514c0e751b97c.tar.gz
mips: handle various update types for vars
-rw-r--r--orc/orcprogram-mips.c24
-rw-r--r--orc/orcrules-mips.c3
2 files changed, 19 insertions, 8 deletions
diff --git a/orc/orcprogram-mips.c b/orc/orcprogram-mips.c
index f5d8cb9..88d5245 100644
--- a/orc/orcprogram-mips.c
+++ b/orc/orcprogram-mips.c
@@ -297,14 +297,24 @@ orc_mips_emit_loop (OrcCompiler *compiler)
}
for (j=0; j<ORC_N_COMPILER_VARIABLES; j++) {
- if (compiler->vars[j].name == NULL) continue;
- if (compiler->vars[j].vartype == ORC_VAR_TYPE_SRC ||
- compiler->vars[j].vartype == ORC_VAR_TYPE_DEST) {
- if (compiler->vars[j].ptr_register) {
+ OrcVariable *var = compiler->vars + j;
+
+ if (var->name == NULL) continue;
+ if (var->vartype == ORC_VAR_TYPE_SRC ||
+ var->vartype == ORC_VAR_TYPE_DEST) {
+ int offset;
+ if (var->update_type == 0) {
+ offset = 0;
+ } else if (var->update_type == 1) {
+ offset = (var->size << compiler->loop_shift) >> 1;
+ } else {
+ offset = var->size << compiler->loop_shift;
+ }
+ if (offset !=0 && var->ptr_register) {
orc_mips_emit_addiu (compiler,
- compiler->vars[j].ptr_register,
- compiler->vars[j].ptr_register,
- compiler->vars[j].size << compiler->loop_shift);
+ var->ptr_register,
+ var->ptr_register,
+ offset);
}
}
}
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c
index 105b851..295a0a7 100644
--- a/orc/orcrules-mips.c
+++ b/orc/orcrules-mips.c
@@ -48,7 +48,7 @@ mips_rule_load (OrcCompiler *compiler, void *user, OrcInstruction *insn)
default:
ORC_PROGRAM_ERROR(compiler, "Don't know how to handle that shift");
}
-
+ compiler->vars[insn->src_args[0]].update_type = 2;
}
void
@@ -87,6 +87,7 @@ mips_rule_store (OrcCompiler *compiler, void *user, OrcInstruction *insn)
default:
ORC_PROGRAM_ERROR(compiler, "Don't know how to handle that shift");
}
+ compiler->vars[insn->dest_args[0]].update_type = 2;
}