diff options
author | Richard Henderson <rth@twiddle.net> | 2015-10-02 21:09:54 +0000 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2015-10-19 11:04:37 -1000 |
commit | 70f897bdc4ce4101ec008317d43090f532bfb07d (patch) | |
tree | fbe0a1e0f06b427415803753405128d4569f57e5 | |
parent | 26c7be842637ee65a79cd77f96a99c23ddcd90ad (diff) | |
download | qemu-70f897bdc4ce4101ec008317d43090f532bfb07d.zip |
tcg/ppc: Adjust exit_tb for change in prologue placement
Changing the prologue to the beginning of the code_gen_buffer
changes the direction of the "return" branch. Need to change
the logic to match.
Signed-off-by: Richard Henderson <rth@twiddle.net>
-rw-r--r-- | tcg/ppc/tcg-target.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c index 92ef719e40..fd7a3e0425 100644 --- a/tcg/ppc/tcg-target.c +++ b/tcg/ppc/tcg-target.c @@ -1855,12 +1855,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, if (USE_REG_RA) { ptrdiff_t disp = tcg_pcrel_diff(s, tb_ret_addr); - /* If we can use a direct branch, otherwise use the value in RA. - Note that the direct branch is always forward. If it's in - range now, it'll still be in range after the movi. Don't - bother about the 20 bytes where the test here fails but it - would succeed below. */ - if (!in_range_b(disp)) { + /* Use a direct branch if we can, otherwise use the value in RA. + Note that the direct branch is always backward, thus we need + to account for the possibility of 5 insns from the movi. */ + if (!in_range_b(disp - 20)) { tcg_out32(s, MTSPR | RS(TCG_REG_RA) | CTR); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R3, args[0]); tcg_out32(s, BCCTR | BO_ALWAYS); |