summaryrefslogtreecommitdiff
path: root/orc
diff options
context:
space:
mode:
authorGuillaume Emont <guijemont@igalia.com>2012-12-11 14:47:13 +0100
committerGuillaume Emont <guijemont@igalia.com>2012-12-28 15:23:38 +0100
commit56d5b2680ed0384afa8c7578359a00c05c1cfbf1 (patch)
tree7b9f0f0c9f0116026fe8ea4db0b3e44b3b6842a4 /orc
parent5581d995ea3e572a9448518c3a42ed5acd55bc5b (diff)
mips: loadp: load as quad bytes or paired halfword for values of (resp) 1 or 2 bytes
Diffstat (limited to 'orc')
-rw-r--r--orc/orcrules-mips.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/orc/orcrules-mips.c b/orc/orcrules-mips.c
index 909b1ba..02f7498 100644
--- a/orc/orcrules-mips.c
+++ b/orc/orcrules-mips.c
@@ -456,6 +456,10 @@ mips_rule_loadp (OrcCompiler *compiler, void *user, OrcInstruction *insn)
if (src->vartype == ORC_VAR_TYPE_CONST) {
if (size == 1 || size == 2) {
orc_mips_emit_ori (compiler, dest->alloc, ORC_MIPS_ZERO, src->value.i);
+ if (size == 1)
+ orc_mips_emit_replv_qb (compiler, dest->alloc, dest->alloc);
+ else if (size == 2)
+ orc_mips_emit_replv_ph (compiler, dest->alloc, dest->alloc);
} else if (size == 4) {
orc_int16 high_bits;
high_bits = ((src->value.i >> 16) & 0xffff);
@@ -472,9 +476,11 @@ mips_rule_loadp (OrcCompiler *compiler, void *user, OrcInstruction *insn)
if (size == 1) {
orc_mips_emit_lb (compiler, dest->alloc, compiler->exec_reg,
ORC_MIPS_EXECUTOR_OFFSET_PARAMS(insn->src_args[0]));
+ orc_mips_emit_replv_qb (compiler, dest->alloc, dest->alloc);
} else if (size == 2) {
orc_mips_emit_lh (compiler, dest->alloc, compiler->exec_reg,
ORC_MIPS_EXECUTOR_OFFSET_PARAMS(insn->src_args[0]));
+ orc_mips_emit_replv_ph (compiler, dest->alloc, dest->alloc);
} else if (size == 4) {
orc_mips_emit_lw (compiler, dest->alloc, compiler->exec_reg,
ORC_MIPS_EXECUTOR_OFFSET_PARAMS(insn->src_args[0]));