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.

Backports commit 70f897bdc4ce4101ec008317d43090f532bfb07d from qemu
This commit is contained in:
Richard Henderson 2018-02-16 15:26:22 -05:00 committed by Lioncash
parent 722c58affb
commit 13ad21a21f
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -1840,12 +1840,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
if (USE_REG_RA) { if (USE_REG_RA) {
ptrdiff_t disp = tcg_pcrel_diff(s, tb_ret_addr); ptrdiff_t disp = tcg_pcrel_diff(s, tb_ret_addr);
/* If we can use a direct branch, otherwise use the value in RA. /* Use a direct branch if we can, otherwise use the value in RA.
Note that the direct branch is always forward. If it's in Note that the direct branch is always backward, thus we need
range now, it'll still be in range after the movi. Don't to account for the possibility of 5 insns from the movi. */
bother about the 20 bytes where the test here fails but it if (!in_range_b(disp - 20)) {
would succeed below. */
if (!in_range_b(disp)) {
tcg_out32(s, MTSPR | RS(TCG_REG_RA) | CTR); tcg_out32(s, MTSPR | RS(TCG_REG_RA) | CTR);
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R3, args[0]); tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R3, args[0]);
tcg_out32(s, BCCTR | BO_ALWAYS); tcg_out32(s, BCCTR | BO_ALWAYS);