Revision c1942362
b/target-ppc/translate.c | ||
---|---|---|
1727 | 1727 |
|
1728 | 1728 |
/*** Branch ***/ |
1729 | 1729 |
|
1730 |
static inline void gen_jmp_tb(long tb, int n, uint32_t dest) |
|
1731 |
{ |
|
1732 |
if (n == 0) |
|
1733 |
gen_op_goto_tb0(TBPARAM(tb)); |
|
1734 |
else |
|
1735 |
gen_op_goto_tb1(TBPARAM(tb)); |
|
1736 |
gen_op_set_T1(dest); |
|
1737 |
gen_op_b_T1(); |
|
1738 |
gen_op_set_T0(tb + n); |
|
1739 |
gen_op_exit_tb(); |
|
1730 |
static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) |
|
1731 |
{ |
|
1732 |
TranslationBlock *tb; |
|
1733 |
tb = ctx->tb; |
|
1734 |
if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { |
|
1735 |
if (n == 0) |
|
1736 |
gen_op_goto_tb0(TBPARAM(tb)); |
|
1737 |
else |
|
1738 |
gen_op_goto_tb1(TBPARAM(tb)); |
|
1739 |
gen_op_set_T1(dest); |
|
1740 |
gen_op_b_T1(); |
|
1741 |
gen_op_set_T0((long)tb + n); |
|
1742 |
gen_op_exit_tb(); |
|
1743 |
} else { |
|
1744 |
gen_op_set_T1(dest); |
|
1745 |
gen_op_b_T1(); |
|
1746 |
gen_op_set_T0(0); |
|
1747 |
gen_op_exit_tb(); |
|
1748 |
} |
|
1740 | 1749 |
} |
1741 | 1750 |
|
1742 | 1751 |
/* b ba bl bla */ |
... | ... | |
1754 | 1763 |
if (LK(ctx->opcode)) { |
1755 | 1764 |
gen_op_setlr(ctx->nip); |
1756 | 1765 |
} |
1757 |
gen_jmp_tb((long)ctx->tb, 0, target);
|
|
1766 |
gen_goto_tb(ctx, 0, target);
|
|
1758 | 1767 |
ctx->exception = EXCP_BRANCH; |
1759 | 1768 |
} |
1760 | 1769 |
|
... | ... | |
1805 | 1814 |
case 4: |
1806 | 1815 |
case 6: |
1807 | 1816 |
if (type == BCOND_IM) { |
1808 |
gen_jmp_tb((long)ctx->tb, 0, target);
|
|
1817 |
gen_goto_tb(ctx, 0, target);
|
|
1809 | 1818 |
} else { |
1810 | 1819 |
gen_op_b_T1(); |
1811 | 1820 |
} |
... | ... | |
1847 | 1856 |
if (type == BCOND_IM) { |
1848 | 1857 |
int l1 = gen_new_label(); |
1849 | 1858 |
gen_op_jz_T0(l1); |
1850 |
gen_jmp_tb((long)ctx->tb, 0, target);
|
|
1859 |
gen_goto_tb(ctx, 0, target);
|
|
1851 | 1860 |
gen_set_label(l1); |
1852 |
gen_jmp_tb((long)ctx->tb, 1, ctx->nip);
|
|
1861 |
gen_goto_tb(ctx, 1, ctx->nip);
|
|
1853 | 1862 |
} else { |
1854 | 1863 |
gen_op_btest_T1(ctx->nip); |
1855 | 1864 |
} |
... | ... | |
2269 | 2278 |
} |
2270 | 2279 |
gen_op_load_gpr_T0(rS(ctx->opcode)); |
2271 | 2280 |
gen_op_store_sr(SR(ctx->opcode)); |
2281 |
RET_MTMSR(ctx); |
|
2272 | 2282 |
#endif |
2273 | 2283 |
} |
2274 | 2284 |
|
... | ... | |
2285 | 2295 |
gen_op_load_gpr_T0(rS(ctx->opcode)); |
2286 | 2296 |
gen_op_load_gpr_T1(rB(ctx->opcode)); |
2287 | 2297 |
gen_op_store_srin(); |
2298 |
RET_MTMSR(ctx); |
|
2288 | 2299 |
#endif |
2289 | 2300 |
} |
2290 | 2301 |
|
... | ... | |
2598 | 2609 |
#endif |
2599 | 2610 |
} |
2600 | 2611 |
if (ctx.exception == EXCP_NONE) { |
2601 |
gen_jmp_tb((long)ctx.tb, 0, ctx.nip);
|
|
2612 |
gen_goto_tb(&ctx, 0, ctx.nip);
|
|
2602 | 2613 |
} else if (ctx.exception != EXCP_BRANCH) { |
2603 | 2614 |
gen_op_set_T0(0); |
2604 | 2615 |
} |
Also available in: Unified diff