aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2010-04-09 21:49:00 +0200
committerAurelien Jarno <aurelien@aurel32.net>2010-04-26 20:06:17 +0200
commit2d097a83e223d3e06de5047e95eeadf1f919ac56 (patch)
tree8d77c9bd6989e1e0bb86d71f72fa62179264034c
parent739734cb5cf90c3e692d41b51fa095240b49ddd7 (diff)
tcg-hppa: Fix branch offset during retranslation.
Branch offsets should only be overwritten during relocation, to support partial retranslation. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--tcg/hppa/tcg-target.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c
index 6941e22a59..6536a429f4 100644
--- a/tcg/hppa/tcg-target.c
+++ b/tcg/hppa/tcg-target.c
@@ -723,8 +723,11 @@ static void tcg_out_branch(TCGContext *s, int label_index, int nul)
tcg_out32(s, op | reassemble_17(val));
} else {
+ /* We need to keep the offset unchanged for retranslation. */
+ uint32_t old_insn = *(uint32_t *)s->code_ptr;
+
tcg_out_reloc(s, s->code_ptr, R_PARISC_PCREL17F, label_index, 0);
- tcg_out32(s, op);
+ tcg_out32(s, op | (old_insn & 0x1f1ffdu));
}
}
@@ -777,11 +780,14 @@ static void tcg_out_brcond(TCGContext *s, int cond, TCGArg c1,
tcg_out32(s, op | reassemble_12(val));
tcg_out_nop(s);
} else {
+ /* We need to keep the offset unchanged for retranslation. */
+ uint32_t old_insn = *(uint32_t *)s->code_ptr;
+
tcg_out_reloc(s, s->code_ptr, R_PARISC_PCREL12F, label_index, 0);
/* ??? Assume that all branches to undefined labels are forward.
Which means that if the nul bit is set, the delay slot is
not executed if the branch is taken, which is what we want. */
- tcg_out32(s, op | 2);
+ tcg_out32(s, op | 2 | (old_insn & 0x1ffdu));
}
}