On 2017-05-02 12:22, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
> target/s390x/translate.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/target/s390x/translate.c b/target/s390x/translate.c
> index 01c6217..f7c2123 100644
> --- a/target/s390x/translate.c
> +++ b/target/s390x/translate.c
> @@ -608,11 +608,16 @@ static void gen_op_calc_cc(DisasContext *s)
> set_cc_static(s);
> }
>
> -static int use_goto_tb(DisasContext *s, uint64_t dest)
> +static bool use_exit_tb(DisasContext *s)
> {
> - if (unlikely(s->singlestep_enabled) ||
> - (s->tb->cflags & CF_LAST_IO) ||
> - (s->tb->flags & FLAG_MASK_PER)) {
> + return (s->singlestep_enabled ||
> + (s->tb->cflags & CF_LAST_IO) ||
> + (s->tb->flags & FLAG_MASK_PER));
> +}
> +
> +static bool use_goto_tb(DisasContext *s, uint64_t dest)
> +{
> + if (unlikely(use_exit_tb(s))) {
> return false;
> }
> #ifndef CONFIG_USER_ONLY
> @@ -5426,8 +5431,10 @@ void gen_intermediate_code(CPUS390XState *env, struct TranslationBlock *tb)
> /* Exit the TB, either by raising a debug exception or by return. */
> if (do_debug) {
> gen_exception(EXCP_DEBUG);
> - } else {
> + } else if (use_exit_tb(&dc)) {
> tcg_gen_exit_tb(0);
> + } else {
> + tcg_gen_lookup_and_goto_ptr(psw_addr);
> }
> break;
> default:
Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
Tested-by: Aurelien Jarno <aurelien@aurel32.net>
--
Aurelien Jarno GPG: 4096R/1DDD8C9B
aurelien@aurel32.net http://www.aurel32.net