[Qemu-devel] [PATCH v5 11/19] target/i386: optimize cross-page direct jumps in softmmu

Richard Henderson posted 19 patches 8 years, 9 months ago
[Qemu-devel] [PATCH v5 11/19] target/i386: optimize cross-page direct jumps in softmmu
Posted by Richard Henderson 8 years, 9 months ago
From: "Emilio G. Cota" <cota@braap.org>

Instead of unconditionally exiting to the exec loop, use the
gen_jr helper to jump to the target if it is valid.

Perf impact: see next commit's log.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Message-Id: <1493263764-18657-10-git-send-email-cota@braap.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target/i386/translate.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/target/i386/translate.c b/target/i386/translate.c
index f0e48dc..ea113fe 100644
--- a/target/i386/translate.c
+++ b/target/i386/translate.c
@@ -2154,9 +2154,9 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip)
         gen_jmp_im(eip);
         tcg_gen_exit_tb((uintptr_t)s->tb + tb_num);
     } else {
-        /* jump to another page: currently not optimized */
+        /* jump to another page */
         gen_jmp_im(eip);
-        gen_eob(s);
+        gen_jr(s, cpu_tmp0);
     }
 }
 
-- 
2.9.3


Re: [Qemu-devel] [PATCH v5 11/19] target/i386: optimize cross-page direct jumps in softmmu
Posted by Alex Bennée 8 years, 9 months ago
Richard Henderson <rth@twiddle.net> writes:

> From: "Emilio G. Cota" <cota@braap.org>
>
> Instead of unconditionally exiting to the exec loop, use the
> gen_jr helper to jump to the target if it is valid.
>
> Perf impact: see next commit's log.
>
> Reviewed-by: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Emilio G. Cota <cota@braap.org>
> Message-Id: <1493263764-18657-10-git-send-email-cota@braap.org>
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
>  target/i386/translate.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target/i386/translate.c b/target/i386/translate.c
> index f0e48dc..ea113fe 100644
> --- a/target/i386/translate.c
> +++ b/target/i386/translate.c
> @@ -2154,9 +2154,9 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip)
>          gen_jmp_im(eip);
>          tcg_gen_exit_tb((uintptr_t)s->tb + tb_num);
>      } else {
> -        /* jump to another page: currently not optimized */
> +        /* jump to another page */
>          gen_jmp_im(eip);
> -        gen_eob(s);
> +        gen_jr(s, cpu_tmp0);


I had to look up what was going on with cpu_tmp0 there. Is there a
particular reason i386 has these global temps with implied setting
rules? It does seem somewhat hacky.

Given cmp_tmp0 seems to be a heavily used across i386 I guess it keeps
to the style of the translator :-/


>      }
>  }


--
Alex Bennée

Re: [Qemu-devel] [PATCH v5 11/19] target/i386: optimize cross-page direct jumps in softmmu
Posted by Richard Henderson 8 years, 9 months ago
On 04/28/2017 06:56 PM, Alex Bennée wrote:
> 
> Richard Henderson <rth@twiddle.net> writes:
> 
>> From: "Emilio G. Cota" <cota@braap.org>
>>
>> Instead of unconditionally exiting to the exec loop, use the
>> gen_jr helper to jump to the target if it is valid.
>>
>> Perf impact: see next commit's log.
>>
>> Reviewed-by: Richard Henderson <rth@twiddle.net>
>> Signed-off-by: Emilio G. Cota <cota@braap.org>
>> Message-Id: <1493263764-18657-10-git-send-email-cota@braap.org>
>> Signed-off-by: Richard Henderson <rth@twiddle.net>
>> ---
>>   target/i386/translate.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/target/i386/translate.c b/target/i386/translate.c
>> index f0e48dc..ea113fe 100644
>> --- a/target/i386/translate.c
>> +++ b/target/i386/translate.c
>> @@ -2154,9 +2154,9 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip)
>>           gen_jmp_im(eip);
>>           tcg_gen_exit_tb((uintptr_t)s->tb + tb_num);
>>       } else {
>> -        /* jump to another page: currently not optimized */
>> +        /* jump to another page */
>>           gen_jmp_im(eip);
>> -        gen_eob(s);
>> +        gen_jr(s, cpu_tmp0);
> 
> 
> I had to look up what was going on with cpu_tmp0 there. Is there a
> particular reason i386 has these global temps with implied setting
> rules? It does seem somewhat hacky.

It's mostly hysterical raisins, and that no one has rewritten it yet.

> Given cmp_tmp0 seems to be a heavily used across i386 I guess it keeps
> to the style of the translator :-/

Yeah.  :-/


r~