summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Emont <guijemont@igalia.com>2012-10-24 19:24:26 +0200
committerGuillaume Emont <guijemont@igalia.com>2012-12-28 15:17:45 +0100
commitf37376b48e330fda2f4fcc737067bb02c8624fd5 (patch)
tree50581e46fc8843036732a295c26da845cae8d498
parenta8172b5800046aa17dcef78394840520f8d12e36 (diff)
downloadorc-f37376b48e330fda2f4fcc737067bb02c8624fd5.tar.gz
mips: fix mips_rule_addw() for the SIMD case
-rw-r--r--orc/orcmips.c11
-rw-r--r--orc/orcmips.h1
-rw-r--r--orc/orcrules-mips.c13
3 files changed, 23 insertions, 2 deletions
diff --git a/orc/orcmips.c b/orc/orcmips.c
index 1d265af..e264094 100644
--- a/orc/orcmips.c
+++ b/orc/orcmips.c
@@ -171,6 +171,17 @@ orc_mips_emit_addu_qb (OrcCompiler *compiler,
}
void
+orc_mips_emit_addu_ph (OrcCompiler *compiler,
+ OrcMipsRegister dest,
+ OrcMipsRegister source1, OrcMipsRegister source2)
+{
+ ORC_ASM_CODE (compiler, " addu.ph %s, %s, %s\n",
+ orc_mips_reg_name (dest),
+ orc_mips_reg_name (source1),
+ orc_mips_reg_name (source2));
+}
+
+void
orc_mips_emit_move (OrcCompiler *compiler,
OrcMipsRegister dest, OrcMipsRegister source)
{
diff --git a/orc/orcmips.h b/orc/orcmips.h
index 216b0de..9e196e4 100644
--- a/orc/orcmips.h
+++ b/orc/orcmips.h
@@ -70,6 +70,7 @@ void orc_mips_emit_addi (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsReg
void orc_mips_emit_add (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
void orc_mips_emit_addu (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
void orc_mips_emit_addu_qb (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
+void orc_mips_emit_addu_ph (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
void orc_mips_emit_move (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source);
void orc_mips_emit_sub (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source1, OrcMipsRegister source2);
void orc_mips_emit_srl (OrcCompiler *compiler, OrcMipsRegister dest, OrcMipsRegister source, int value);
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c
index d89c5d2..195b61d 100644
--- a/orc/orcrules-mips.c
+++ b/orc/orcrules-mips.c
@@ -61,7 +61,7 @@ mips_rule_addl (OrcCompiler *compiler, void *user, OrcInstruction *insn)
int src2 = ORC_SRC_ARG (compiler, insn, 1);
int dest = ORC_DEST_ARG (compiler, insn, 0);
- orc_mips_emit_add (compiler, dest, src1, src2);
+ orc_mips_emit_addu (compiler, dest, src1, src2);
}
void
@@ -71,7 +71,16 @@ mips_rule_addw (OrcCompiler *compiler, void *user, OrcInstruction *insn)
int src2 = ORC_SRC_ARG (compiler, insn, 1);
int dest = ORC_DEST_ARG (compiler, insn, 0);
- orc_mips_emit_add (compiler, dest, src1, src2);
+ switch (compiler->insn_shift) {
+ case 0:
+ orc_mips_emit_addu (compiler, dest, src1, src2);
+ break;
+ case 1:
+ orc_mips_emit_addu_ph (compiler, dest, src1, src2);
+ break;
+ default:
+ ORC_PROGRAM_ERROR (compiler, "Don't know how to handle that insn_shift");
+ }
}
void