summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Emont <guijemont@igalia.com>2012-12-13 17:46:59 +0100
committerGuillaume Emont <guijemont@igalia.com>2012-12-28 15:23:38 +0100
commit5ff42a85f583f872433550aedea8e527a3e896d1 (patch)
tree65f61937b526727f4023778312dd3e1d9837735d
parent17141dfe3ab4f2b87f1087b59124b7038bd933fe (diff)
downloadorc-5ff42a85f583f872433550aedea8e527a3e896d1.tar.gz
mips: convsbw: spread bytes when we have an instruction shift
-rw-r--r--orc/orcrules-mips.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c
index 65ec982..143b23d 100644
--- a/orc/orcrules-mips.c
+++ b/orc/orcrules-mips.c
@@ -281,8 +281,14 @@ mips_rule_convsbw (OrcCompiler *compiler, void *user, OrcInstruction *insn)
/* left shift 8 bits, then right shift signed 8 bits, so that the sign bit
* gets replicated in the upper 8 bits */
- orc_mips_emit_shll_ph (compiler, dest, src, 8);
- orc_mips_emit_shra_ph (compiler, dest, dest, 8);
+ if (compiler->insn_shift > 0) {
+ orc_mips_emit_preceu_ph_qbr (compiler, dest, src);
+ orc_mips_emit_shll_ph (compiler, dest, dest, 8);
+ orc_mips_emit_shra_ph (compiler, dest, dest, 8);
+ } else {
+ orc_mips_emit_shll_ph (compiler, dest, src, 8);
+ orc_mips_emit_shra_ph (compiler, dest, dest, 8);
+ }
}
void