summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Emont <guijemont@igalia.com>2012-12-13 18:04:11 +0100
committerGuillaume Emont <guijemont@igalia.com>2012-12-28 15:23:39 +0100
commitefdc4d1b4be18f1cbe66eb5e8b0ef307fadb31c9 (patch)
tree93dc137bec3b9b16a26927296e29737260b2c822
parent52b226aa2d2e9c3e0c09b7996e1b65c34f72fb87 (diff)
mips: mulswl: sign extend words before multiplying
-rw-r--r--orc/orcrules-mips.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c
index 8a8b5d4..a776a5c 100644
--- a/orc/orcrules-mips.c
+++ b/orc/orcrules-mips.c
@@ -188,13 +188,17 @@ mips_rule_copyb (OrcCompiler *compiler, void *user, OrcInstruction *insn)
}
void
-mips_rule_mul (OrcCompiler *compiler, void *user, OrcInstruction *insn)
+mips_rule_mulswl (OrcCompiler *compiler, void *user, OrcInstruction *insn)
{
int src1 = ORC_SRC_ARG (compiler, insn, 0);
int src2 = ORC_SRC_ARG (compiler, insn, 1);
int dest = ORC_DEST_ARG (compiler, insn, 0);
+ OrcMipsRegister tmp0 = ORC_MIPS_T3;
+ OrcMipsRegister tmp1 = ORC_MIPS_T4;
- orc_mips_emit_mul (compiler, dest, src1, src2);
+ orc_mips_emit_seh (compiler, tmp0, src1);
+ orc_mips_emit_seh (compiler, tmp1, src2);
+ orc_mips_emit_mul (compiler, dest, tmp0, tmp1);
}
void
@@ -588,7 +592,7 @@ orc_compiler_orc_mips_register_rules (OrcTarget *target)
orc_rule_register (rule_set, "copyl", mips_rule_copyl, NULL);
orc_rule_register (rule_set, "copyw", mips_rule_copyw, NULL);
orc_rule_register (rule_set, "copyb", mips_rule_copyb, NULL);
- orc_rule_register (rule_set, "mulswl", mips_rule_mul, NULL);
+ orc_rule_register (rule_set, "mulswl", mips_rule_mulswl, NULL);
orc_rule_register (rule_set, "mullw", mips_rule_mullw, NULL);
orc_rule_register (rule_set, "shrsl", mips_rule_shrs, NULL);
orc_rule_register (rule_set, "convssslw", mips_rule_convssslw, NULL);