[Qemu-devel] [PATCH 20/22] target/openrisc: Optimize l.jal to next

Richard Henderson posted 22 patches 9 years ago
[Qemu-devel] [PATCH 20/22] target/openrisc: Optimize l.jal to next
Posted by Richard Henderson 9 years ago
This allows the tcg optimizer to see, and fold, all of the
constants involved in a GOT base register load sequence.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 target/openrisc/translate.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
index 66064e1..cda84b6 100644
--- a/target/openrisc/translate.c
+++ b/target/openrisc/translate.c
@@ -198,7 +198,11 @@ static void gen_jump(DisasContext *dc, int32_t n26, uint32_t reg, uint32_t op0)
         tcg_gen_movi_tl(jmp_pc, tmp_pc);
         break;
     case 0x01:     /* l.jal */
-        tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
+        tcg_gen_movi_tl(cpu_R[9], dc->pc + 8);
+        /* Optimize jal being used to load the PC for PIC.  */
+        if (tmp_pc == dc->pc + 8) {
+            return;
+        }
         tcg_gen_movi_tl(jmp_pc, tmp_pc);
         break;
     case 0x03:     /* l.bnf */
-- 
2.9.3


Re: [Qemu-devel] [PATCH 20/22] target/openrisc: Optimize l.jal to next
Posted by Philippe Mathieu-Daudé 9 years ago

On 02/09/2017 01:51 AM, Richard Henderson wrote:
> This allows the tcg optimizer to see, and fold, all of the
> constants involved in a GOT base register load sequence.
>
> Signed-off-by: Richard Henderson <rth@twiddle.net>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  target/openrisc/translate.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
> index 66064e1..cda84b6 100644
> --- a/target/openrisc/translate.c
> +++ b/target/openrisc/translate.c
> @@ -198,7 +198,11 @@ static void gen_jump(DisasContext *dc, int32_t n26, uint32_t reg, uint32_t op0)
>          tcg_gen_movi_tl(jmp_pc, tmp_pc);
>          break;
>      case 0x01:     /* l.jal */
> -        tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8));
> +        tcg_gen_movi_tl(cpu_R[9], dc->pc + 8);
> +        /* Optimize jal being used to load the PC for PIC.  */
> +        if (tmp_pc == dc->pc + 8) {
> +            return;
> +        }
>          tcg_gen_movi_tl(jmp_pc, tmp_pc);
>          break;
>      case 0x03:     /* l.bnf */
>