diff options
author | Guillaume Emont <guijemont@igalia.com> | 2012-10-24 19:24:26 +0200 |
---|---|---|
committer | Guillaume Emont <guijemont@igalia.com> | 2012-12-28 15:17:45 +0100 |
commit | f37376b48e330fda2f4fcc737067bb02c8624fd5 (patch) | |
tree | 50581e46fc8843036732a295c26da845cae8d498 | |
parent | a8172b5800046aa17dcef78394840520f8d12e36 (diff) | |
download | orc-f37376b48e330fda2f4fcc737067bb02c8624fd5.tar.gz |
mips: fix mips_rule_addw() for the SIMD case
-rw-r--r-- | orc/orcmips.c | 11 | ||||
-rw-r--r-- | orc/orcmips.h | 1 | ||||
-rw-r--r-- | orc/orcrules-mips.c | 13 |
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 |