qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] convert of few alpha insn to TCG
@ 2008-09-01 11:38 Tristan Gingold
  2008-09-01 14:32 ` Thiemo Seufer
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Tristan Gingold @ 2008-09-01 11:38 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 67 bytes --]

Hi,

this patch switches a very few instructions to TCG.

Tristan.

[-- Attachment #2: q-alpha1.diff --]
[-- Type: application/octet-stream, Size: 4138 bytes --]

Index: target-alpha/op.c
===================================================================
--- target-alpha/op.c	(revision 5119)
+++ target-alpha/op.c	(working copy)
@@ -131,12 +131,6 @@
     RETURN();
 }
 
-void OPPROTO op_tb_flush (void)
-{
-    helper_tb_flush();
-    RETURN();
-}
-
 /* Load and stores */
 #define MEMSUFFIX _raw
 #include "op_mem.h"
@@ -685,27 +679,6 @@
 }
 #endif
 
-#if 0 // Qemu does not know how to do this...
-void OPPROTO op_update_pc (void)
-{
-    env->pc = PARAM(1);
-    RETURN();
-}
-#else
-void OPPROTO op_update_pc (void)
-{
-    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
-    RETURN();
-}
-#endif
-
-/* Optimization for 32 bits hosts architectures */
-void OPPROTO op_update_pc32 (void)
-{
-    env->pc = (uint64_t)PARAM(1);
-    RETURN();
-}
-
 /* IEEE floating point arithmetic */
 /* S floating (single) */
 void OPPROTO op_adds (void)
Index: target-alpha/helper.h
===================================================================
--- target-alpha/helper.h	(revision 0)
+++ target-alpha/helper.h	(revision 0)
@@ -0,0 +1,5 @@
+#ifndef DEF_HELPER
+#define DEF_HELPER(ret, name, params) ret name params;
+#endif
+
+DEF_HELPER(void, do_tb_flush, (void))
Index: target-alpha/op_helper.c
===================================================================
--- target-alpha/op_helper.c	(revision 5119)
+++ target-alpha/op_helper.c	(working copy)
@@ -45,7 +45,7 @@
 #include "op_helper_mem.h"
 #endif
 
-void helper_tb_flush (void)
+void do_tb_flush (void)
 {
     tlb_flush(env, 1);
 }
Index: target-alpha/translate.c
===================================================================
--- target-alpha/translate.c	(revision 5119)
+++ target-alpha/translate.c	(working copy)
@@ -25,6 +25,7 @@
 #include "cpu.h"
 #include "exec-all.h"
 #include "disas.h"
+#include "helper.h"
 #include "tcg-op.h"
 #include "qemu-common.h"
 
@@ -126,6 +127,22 @@
     }
 }
 
+static inline void tcg_gen_load_ir (TCGv t, int reg)
+{
+    if (reg == 31)
+        tcg_gen_movi_i64(t, 0);
+    else
+        tcg_gen_ld_i64(t, cpu_env, offsetof(CPUState, ir) +
+		       sizeof(target_ulong) * reg);
+}
+
+static inline void tcg_gen_store_ir (TCGv t, int reg)
+{
+    if (reg != 31)
+        tcg_gen_st_i64(t, cpu_env, offsetof(CPUState, ir) +
+                                  sizeof(target_ulong) * reg);
+}
+
 /* FIR moves */
 /* Special hacks for fir31 */
 #define gen_op_load_FT0_fir31 gen_op_reset_FT0
@@ -356,15 +373,9 @@
 
 static always_inline void gen_update_pc (DisasContext *ctx)
 {
-    if (!(ctx->pc >> 32)) {
-        gen_op_update_pc32(ctx->pc);
-    } else {
-#if 0 // Qemu does not know how to do this...
-        gen_op_update_pc(ctx->pc);
-#else
-        gen_op_update_pc(ctx->pc >> 32, ctx->pc);
-#endif
-    }
+    TCGv v = tcg_const_i64(ctx->pc);
+    tcg_gen_st_i64(v, cpu_env, offsetof(CPUState, pc));
+    tcg_temp_free(v);
 }
 
 static always_inline void _gen_op_bcond (DisasContext *ctx)
@@ -700,17 +711,31 @@
         goto invalid_opc;
     case 0x08:
         /* LDA */
-        gen_load_ir(ctx, rb, 0);
-        gen_set_sT1(ctx, disp16);
-        gen_op_addq();
-        gen_store_ir(ctx, ra, 0);
+        {
+	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
+	    TCGv v = tcg_const_i64(disp16);
+	    if (rb != 31) {
+		tcg_gen_load_ir(r, rb);
+		tcg_gen_add_i64(v, r, v);
+	    }
+	    tcg_gen_store_ir(v, ra);
+	    tcg_temp_free(r);
+	    tcg_temp_free(v);
+	}
         break;
     case 0x09:
         /* LDAH */
-        gen_load_ir(ctx, rb, 0);
-        gen_set_sT1(ctx, disp16 << 16);
-        gen_op_addq();
-        gen_store_ir(ctx, ra, 0);
+        {
+	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
+	    TCGv v = tcg_const_i64(disp16 << 16);
+	    if (rb != 31) {
+		tcg_gen_load_ir(r, rb);
+		tcg_gen_add_i64(v, r, v);
+	    }
+	    tcg_gen_store_ir(v, ra);
+	    tcg_temp_free(r);
+	    tcg_temp_free(v);
+	}
         break;
     case 0x0A:
         /* LDBU */
@@ -2059,7 +2084,7 @@
         gen_update_pc(&ctx);
     }
 #if defined (DO_TB_FLUSH)
-    gen_op_tb_flush();
+    tcg_gen_helper_0_0(do_tb_flush);
 #endif
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-01 11:38 [Qemu-devel] [PATCH] convert of few alpha insn to TCG Tristan Gingold
@ 2008-09-01 14:32 ` Thiemo Seufer
  2008-09-01 15:54   ` Tristan Gingold
  2008-09-03  8:07 ` Ping: " Tristan Gingold
  2008-09-03  8:46 ` Aurelien Jarno
  2 siblings, 1 reply; 14+ messages in thread
From: Thiemo Seufer @ 2008-09-01 14:32 UTC (permalink / raw)
  To: Tristan Gingold; +Cc: qemu-devel

Tristan Gingold wrote:
> Hi,
>
> this patch switches a very few instructions to TCG.

Do you have a way to test alpha changes?


Thiemo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-01 14:32 ` Thiemo Seufer
@ 2008-09-01 15:54   ` Tristan Gingold
  2008-09-03  8:32     ` Aurelien Jarno
  0 siblings, 1 reply; 14+ messages in thread
From: Tristan Gingold @ 2008-09-01 15:54 UTC (permalink / raw)
  To: Thiemo Seufer; +Cc: qemu-devel


On Sep 1, 2008, at 4:32 PM, Thiemo Seufer wrote:

> Tristan Gingold wrote:
>> Hi,
>>
>> this patch switches a very few instructions to TCG.
>
> Do you have a way to test alpha changes?

Yes, these three instructions were testing using a small linux-alpha  
program.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Ping: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-01 11:38 [Qemu-devel] [PATCH] convert of few alpha insn to TCG Tristan Gingold
  2008-09-01 14:32 ` Thiemo Seufer
@ 2008-09-03  8:07 ` Tristan Gingold
  2008-09-03  8:27   ` Aurelien Jarno
  2008-09-03  8:46 ` Aurelien Jarno
  2 siblings, 1 reply; 14+ messages in thread
From: Tristan Gingold @ 2008-09-03  8:07 UTC (permalink / raw)
  To: qemu-devel

Hi,

any comment on this patch ?  If not, could it be committed please (I  
have more pending patches to convert
alpha to tcg).

Thank you in advance,
Tristan.

On Sep 1, 2008, at 1:38 PM, Tristan Gingold wrote:

> Hi,
>
> this patch switches a very few instructions to TCG.
>
> Tristan.<q-alpha1.diff>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Ping: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-03  8:07 ` Ping: " Tristan Gingold
@ 2008-09-03  8:27   ` Aurelien Jarno
  2008-09-03  8:36     ` Tristan Gingold
  0 siblings, 1 reply; 14+ messages in thread
From: Aurelien Jarno @ 2008-09-03  8:27 UTC (permalink / raw)
  To: qemu-devel

On Wed, Sep 03, 2008 at 10:07:55AM +0200, Tristan Gingold wrote:
> Hi,
>
> any comment on this patch ?  If not, could it be committed please (I  
> have more pending patches to convert
> alpha to tcg).

My main comment about this patch is the use of a function to load/store
gpr registers. It should map all gprs registers to TCG instead as
explained by Paul Brook last week.

However, due to r31, I don't really know how to do.

> Thank you in advance,
> Tristan.
>
> On Sep 1, 2008, at 1:38 PM, Tristan Gingold wrote:
>
>> Hi,
>>
>> this patch switches a very few instructions to TCG.
>>
>> Tristan.<q-alpha1.diff>
>
>
>
>

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-01 15:54   ` Tristan Gingold
@ 2008-09-03  8:32     ` Aurelien Jarno
  2008-09-03  8:54       ` Tristan Gingold
  0 siblings, 1 reply; 14+ messages in thread
From: Aurelien Jarno @ 2008-09-03  8:32 UTC (permalink / raw)
  To: qemu-devel

On Mon, Sep 01, 2008 at 05:54:44PM +0200, Tristan Gingold wrote:
>
> On Sep 1, 2008, at 4:32 PM, Thiemo Seufer wrote:
>
>> Tristan Gingold wrote:
>>> Hi,
>>>
>>> this patch switches a very few instructions to TCG.
>>
>> Do you have a way to test alpha changes?
>
> Yes, these three instructions were testing using a small linux-alpha  
> program.

What kind of programs are you using? I am unable to get the glibc
correctly working, it segfaults as soon as a shared library is used.
Therefore I am only able to execute ld.so, probably not enough to test
regressions.

Without a proper way to test the changes, I am afraid I can't commit
them.

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Ping: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-03  8:27   ` Aurelien Jarno
@ 2008-09-03  8:36     ` Tristan Gingold
  0 siblings, 0 replies; 14+ messages in thread
From: Tristan Gingold @ 2008-09-03  8:36 UTC (permalink / raw)
  To: qemu-devel


On Sep 3, 2008, at 10:27 AM, Aurelien Jarno wrote:

> On Wed, Sep 03, 2008 at 10:07:55AM +0200, Tristan Gingold wrote:
>> Hi,
>>
>> any comment on this patch ?  If not, could it be committed please (I
>> have more pending patches to convert
>> alpha to tcg).
>
> My main comment about this patch is the use of a function to load/ 
> store
> gpr registers. It should map all gprs registers to TCG instead as
> explained by Paul Brook last week.

Ok.

> However, due to r31, I don't really know how to do.

r31 can be a special case.

Thanks for the comment,
Tristan.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-01 11:38 [Qemu-devel] [PATCH] convert of few alpha insn to TCG Tristan Gingold
  2008-09-01 14:32 ` Thiemo Seufer
  2008-09-03  8:07 ` Ping: " Tristan Gingold
@ 2008-09-03  8:46 ` Aurelien Jarno
  2008-09-03 12:44   ` [Qemu-devel] [PATCH v2] " Tristan Gingold
  2 siblings, 1 reply; 14+ messages in thread
From: Aurelien Jarno @ 2008-09-03  8:46 UTC (permalink / raw)
  To: qemu-devel

> On Mon, Sep 01, 2008 at 01:38:15PM +0200, Tristan Gingold wrote:
> > Hi,
> >
> > this patch switches a very few instructions to TCG.
> >
> > Tristan.

Please find my comments below.

> Index: target-alpha/op.c
> ===================================================================
> --- target-alpha/op.c	(revision 5119)
> +++ target-alpha/op.c	(working copy)
> @@ -131,12 +131,6 @@
>      RETURN();
>  }
>  
> -void OPPROTO op_tb_flush (void)
> -{
> -    helper_tb_flush();
> -    RETURN();
> -}
> -
>  /* Load and stores */
>  #define MEMSUFFIX _raw
>  #include "op_mem.h"
> @@ -685,27 +679,6 @@
>  }
>  #endif
>  
> -#if 0 // Qemu does not know how to do this...
> -void OPPROTO op_update_pc (void)
> -{
> -    env->pc = PARAM(1);
> -    RETURN();
> -}
> -#else
> -void OPPROTO op_update_pc (void)
> -{
> -    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
> -    RETURN();
> -}
> -#endif
> -
> -/* Optimization for 32 bits hosts architectures */
> -void OPPROTO op_update_pc32 (void)
> -{
> -    env->pc = (uint64_t)PARAM(1);
> -    RETURN();
> -}
> -
>  /* IEEE floating point arithmetic */
>  /* S floating (single) */
>  void OPPROTO op_adds (void)
> Index: target-alpha/helper.h
> ===================================================================
> --- target-alpha/helper.h	(revision 0)
> +++ target-alpha/helper.h	(revision 0)
> @@ -0,0 +1,5 @@
> +#ifndef DEF_HELPER
> +#define DEF_HELPER(ret, name, params) ret name params;
> +#endif
> +
> +DEF_HELPER(void, do_tb_flush, (void))
> Index: target-alpha/op_helper.c
> ===================================================================
> --- target-alpha/op_helper.c	(revision 5119)
> +++ target-alpha/op_helper.c	(working copy)
> @@ -45,7 +45,7 @@
>  #include "op_helper_mem.h"
>  #endif
>  
> -void helper_tb_flush (void)
> +void do_tb_flush (void)

No need to change the name of the helper...

>  {
>      tlb_flush(env, 1);
>  }
> Index: target-alpha/translate.c
> ===================================================================
> --- target-alpha/translate.c	(revision 5119)
> +++ target-alpha/translate.c	(working copy)
> @@ -25,6 +25,7 @@
>  #include "cpu.h"
>  #include "exec-all.h"
>  #include "disas.h"
> +#include "helper.h"
>  #include "tcg-op.h"
>  #include "qemu-common.h"
>  
> @@ -126,6 +127,22 @@
>      }
>  }
>  
> +static inline void tcg_gen_load_ir (TCGv t, int reg)
> +{
> +    if (reg == 31)
> +        tcg_gen_movi_i64(t, 0);
> +    else
> +        tcg_gen_ld_i64(t, cpu_env, offsetof(CPUState, ir) +
> +		       sizeof(target_ulong) * reg);
> +}
> +
> +static inline void tcg_gen_store_ir (TCGv t, int reg)
> +{
> +    if (reg != 31)
> +        tcg_gen_st_i64(t, cpu_env, offsetof(CPUState, ir) +
> +                                  sizeof(target_ulong) * reg);
> +}
> +

As said in the other mail, I have concerns about that part. TCG works
better if most (all ?) registers are mapped.

>  /* FIR moves */
>  /* Special hacks for fir31 */
>  #define gen_op_load_FT0_fir31 gen_op_reset_FT0
> @@ -356,15 +373,9 @@
>  
>  static always_inline void gen_update_pc (DisasContext *ctx)
>  {
> -    if (!(ctx->pc >> 32)) {
> -        gen_op_update_pc32(ctx->pc);
> -    } else {
> -#if 0 // Qemu does not know how to do this...
> -        gen_op_update_pc(ctx->pc);
> -#else
> -        gen_op_update_pc(ctx->pc >> 32, ctx->pc);
> -#endif
> -    }
> +    TCGv v = tcg_const_i64(ctx->pc);
> +    tcg_gen_st_i64(v, cpu_env, offsetof(CPUState, pc));
> +    tcg_temp_free(v);
>  }

pc is an often used register, it should be mapped in TCG.

>  static always_inline void _gen_op_bcond (DisasContext *ctx)
> @@ -700,17 +711,31 @@
>          goto invalid_opc;
>      case 0x08:
>          /* LDA */
> -        gen_load_ir(ctx, rb, 0);
> -        gen_set_sT1(ctx, disp16);
> -        gen_op_addq();
> -        gen_store_ir(ctx, ra, 0);
> +        {
> +	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
> +	    TCGv v = tcg_const_i64(disp16);
> +	    if (rb != 31) {
> +		tcg_gen_load_ir(r, rb);
> +		tcg_gen_add_i64(v, r, v);
> +	    }
> +	    tcg_gen_store_ir(v, ra);
> +	    tcg_temp_free(r);
> +	    tcg_temp_free(v);
> +	}
>          break;
>      case 0x09:
>          /* LDAH */
> -        gen_load_ir(ctx, rb, 0);
> -        gen_set_sT1(ctx, disp16 << 16);
> -        gen_op_addq();
> -        gen_store_ir(ctx, ra, 0);
> +        {
> +	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
> +	    TCGv v = tcg_const_i64(disp16 << 16);
> +	    if (rb != 31) {
> +		tcg_gen_load_ir(r, rb);
> +		tcg_gen_add_i64(v, r, v);
> +	    }
> +	    tcg_gen_store_ir(v, ra);
> +	    tcg_temp_free(r);
> +	    tcg_temp_free(v);
> +	}
>          break;
>      case 0x0A:
>          /* LDBU */
> @@ -2059,7 +2084,7 @@
>          gen_update_pc(&ctx);
>      }
>  #if defined (DO_TB_FLUSH)
> -    gen_op_tb_flush();
> +    tcg_gen_helper_0_0(do_tb_flush);
>  #endif
>      if (tb->cflags & CF_LAST_IO)
>          gen_io_end();
> 
-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-03  8:32     ` Aurelien Jarno
@ 2008-09-03  8:54       ` Tristan Gingold
  2008-09-03 11:24         ` Thiemo Seufer
  0 siblings, 1 reply; 14+ messages in thread
From: Tristan Gingold @ 2008-09-03  8:54 UTC (permalink / raw)
  To: qemu-devel


On Sep 3, 2008, at 10:32 AM, Aurelien Jarno wrote:
> What kind of programs are you using? I am unable to get the glibc
> correctly working, it segfaults as soon as a shared library is used.
> Therefore I am only able to execute ld.so, probably not enough to test
> regressions.
>
> Without a proper way to test the changes, I am afraid I can't commit
> them.

I am using a very small program with its own crt1 and fully static.
Do you want me to add a test/ subdirectory ?

Tristan.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH] convert of few alpha insn to TCG
  2008-09-03  8:54       ` Tristan Gingold
@ 2008-09-03 11:24         ` Thiemo Seufer
  0 siblings, 0 replies; 14+ messages in thread
From: Thiemo Seufer @ 2008-09-03 11:24 UTC (permalink / raw)
  To: Tristan Gingold; +Cc: qemu-devel

Tristan Gingold wrote:
>
> On Sep 3, 2008, at 10:32 AM, Aurelien Jarno wrote:
>> What kind of programs are you using? I am unable to get the glibc
>> correctly working, it segfaults as soon as a shared library is used.
>> Therefore I am only able to execute ld.so, probably not enough to test
>> regressions.
>>
>> Without a proper way to test the changes, I am afraid I can't commit
>> them.
>
> I am using a very small program with its own crt1 and fully static.
> Do you want me to add a test/ subdirectory ?

Yes please.


Thiemo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2] convert of few alpha insn to TCG
  2008-09-03  8:46 ` Aurelien Jarno
@ 2008-09-03 12:44   ` Tristan Gingold
  2008-09-04  4:35     ` Aurelien Jarno
  0 siblings, 1 reply; 14+ messages in thread
From: Tristan Gingold @ 2008-09-03 12:44 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 125 bytes --]

Hi,

all the issues have been fixed in this second version.

Tristan.

Signed-off-by: Tristan Gingold <gingold@adacore.com>


[-- Attachment #2: q-alpha1.diff --]
[-- Type: application/octet-stream, Size: 4697 bytes --]

Index: target-alpha/op.c
===================================================================
--- target-alpha/op.c	(revision 5119)
+++ target-alpha/op.c	(working copy)
@@ -131,12 +131,6 @@
     RETURN();
 }
 
-void OPPROTO op_tb_flush (void)
-{
-    helper_tb_flush();
-    RETURN();
-}
-
 /* Load and stores */
 #define MEMSUFFIX _raw
 #include "op_mem.h"
@@ -685,27 +679,6 @@
 }
 #endif
 
-#if 0 // Qemu does not know how to do this...
-void OPPROTO op_update_pc (void)
-{
-    env->pc = PARAM(1);
-    RETURN();
-}
-#else
-void OPPROTO op_update_pc (void)
-{
-    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
-    RETURN();
-}
-#endif
-
-/* Optimization for 32 bits hosts architectures */
-void OPPROTO op_update_pc32 (void)
-{
-    env->pc = (uint64_t)PARAM(1);
-    RETURN();
-}
-
 /* IEEE floating point arithmetic */
 /* S floating (single) */
 void OPPROTO op_adds (void)
Index: target-alpha/helper.h
===================================================================
--- target-alpha/helper.h	(revision 0)
+++ target-alpha/helper.h	(revision 0)
@@ -0,0 +1,5 @@
+#ifndef DEF_HELPER
+#define DEF_HELPER(ret, name, params) ret name params;
+#endif
+
+DEF_HELPER(void, helper_tb_flush, (void))
Index: target-alpha/translate.c
===================================================================
--- target-alpha/translate.c	(revision 5119)
+++ target-alpha/translate.c	(working copy)
@@ -25,6 +25,7 @@
 #include "cpu.h"
 #include "exec-all.h"
 #include "disas.h"
+#include "helper.h"
 #include "tcg-op.h"
 #include "qemu-common.h"
 
@@ -44,15 +45,34 @@
 };
 
 static TCGv cpu_env;
+static TCGv cpu_ir[31];
+static TCGv cpu_pc;
 
 #include "gen-icount.h"
 
 static void alpha_translate_init(void)
 {
     static int done_init = 0;
+    static char cpu_reg_names[4*31];
+    char *p;
+    int i;
+
     if (done_init)
-        return;
+	return;
+
     cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
+
+    p = cpu_reg_names;
+    for (i = 0; i < 31; i++) {
+        sprintf(p, "r%d", i);
+        cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
+				       offsetof(CPUState, ir[i]), p);
+	p += 4;
+    }
+
+    cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
+				offsetof(CPUState, pc), "pc");
+
     done_init = 1;
 }
 
@@ -126,6 +146,20 @@
     }
 }
 
+static inline void get_ir (TCGv t, int reg)
+{
+    if (reg == 31)
+        tcg_gen_movi_i64(t, 0);
+    else
+        tcg_gen_mov_i64(t, cpu_ir[reg]);
+}
+
+static inline void set_ir (TCGv t, int reg)
+{
+    if (reg != 31)
+        tcg_gen_mov_i64(cpu_ir[reg], t);
+}
+
 /* FIR moves */
 /* Special hacks for fir31 */
 #define gen_op_load_FT0_fir31 gen_op_reset_FT0
@@ -356,15 +390,9 @@
 
 static always_inline void gen_update_pc (DisasContext *ctx)
 {
-    if (!(ctx->pc >> 32)) {
-        gen_op_update_pc32(ctx->pc);
-    } else {
-#if 0 // Qemu does not know how to do this...
-        gen_op_update_pc(ctx->pc);
-#else
-        gen_op_update_pc(ctx->pc >> 32, ctx->pc);
-#endif
-    }
+    TCGv v = tcg_const_i64(ctx->pc);
+    tcg_gen_mov_i64(cpu_pc, v);
+    tcg_temp_free(v);
 }
 
 static always_inline void _gen_op_bcond (DisasContext *ctx)
@@ -700,17 +728,23 @@
         goto invalid_opc;
     case 0x08:
         /* LDA */
-        gen_load_ir(ctx, rb, 0);
-        gen_set_sT1(ctx, disp16);
-        gen_op_addq();
-        gen_store_ir(ctx, ra, 0);
+        {
+	    TCGv v = tcg_const_i64(disp16);
+	    if (rb != 31)
+		tcg_gen_add_i64(v, cpu_ir[rb], v);
+	    set_ir(v, ra);
+	    tcg_temp_free(v);
+	}
         break;
     case 0x09:
         /* LDAH */
-        gen_load_ir(ctx, rb, 0);
-        gen_set_sT1(ctx, disp16 << 16);
-        gen_op_addq();
-        gen_store_ir(ctx, ra, 0);
+        {
+	    TCGv v = tcg_const_i64(disp16 << 16);
+	    if (rb != 31)
+		tcg_gen_add_i64(v, cpu_ir[rb], v);
+	    set_ir(v, ra);
+	    tcg_temp_free(v);
+	}
         break;
     case 0x0A:
         /* LDBU */
@@ -1871,13 +1905,16 @@
         break;
     case 0x30:
         /* BR */
-        gen_set_uT0(ctx, ctx->pc);
-        gen_store_ir(ctx, ra, 0);
-        if (disp21 != 0) {
-            gen_set_sT1(ctx, disp21 << 2);
-            gen_op_addq();
+	if (ra != 31) {
+	    TCGv t = tcg_const_i64(ctx->pc);
+	    set_ir(t, ra);
+	    tcg_temp_free(t);
+	}
+	{
+	    TCGv pc = tcg_const_i64(ctx->pc + (disp21 << 2));
+	    tcg_gen_mov_i64(cpu_pc, pc);
+	    tcg_temp_free(pc);
         }
-        gen_op_branch();
         ret = 1;
         break;
     case 0x31:
@@ -2059,7 +2096,7 @@
         gen_update_pc(&ctx);
     }
 #if defined (DO_TB_FLUSH)
-    gen_op_tb_flush();
+    tcg_gen_helper_0_0(helper_tb_flush);
 #endif
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

[-- Attachment #3: Type: text/plain, Size: 5366 bytes --]



On Sep 3, 2008, at 10:46 AM, Aurelien Jarno wrote:

>> On Mon, Sep 01, 2008 at 01:38:15PM +0200, Tristan Gingold wrote:
>>> Hi,
>>>
>>> this patch switches a very few instructions to TCG.
>>>
>>> Tristan.
>
> Please find my comments below.
>
>> Index: target-alpha/op.c
>> ===================================================================
>> --- target-alpha/op.c	(revision 5119)
>> +++ target-alpha/op.c	(working copy)
>> @@ -131,12 +131,6 @@
>>      RETURN();
>>  }
>>
>> -void OPPROTO op_tb_flush (void)
>> -{
>> -    helper_tb_flush();
>> -    RETURN();
>> -}
>> -
>>  /* Load and stores */
>>  #define MEMSUFFIX _raw
>>  #include "op_mem.h"
>> @@ -685,27 +679,6 @@
>>  }
>>  #endif
>>
>> -#if 0 // Qemu does not know how to do this...
>> -void OPPROTO op_update_pc (void)
>> -{
>> -    env->pc = PARAM(1);
>> -    RETURN();
>> -}
>> -#else
>> -void OPPROTO op_update_pc (void)
>> -{
>> -    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
>> -    RETURN();
>> -}
>> -#endif
>> -
>> -/* Optimization for 32 bits hosts architectures */
>> -void OPPROTO op_update_pc32 (void)
>> -{
>> -    env->pc = (uint64_t)PARAM(1);
>> -    RETURN();
>> -}
>> -
>>  /* IEEE floating point arithmetic */
>>  /* S floating (single) */
>>  void OPPROTO op_adds (void)
>> Index: target-alpha/helper.h
>> ===================================================================
>> --- target-alpha/helper.h	(revision 0)
>> +++ target-alpha/helper.h	(revision 0)
>> @@ -0,0 +1,5 @@
>> +#ifndef DEF_HELPER
>> +#define DEF_HELPER(ret, name, params) ret name params;
>> +#endif
>> +
>> +DEF_HELPER(void, do_tb_flush, (void))
>> Index: target-alpha/op_helper.c
>> ===================================================================
>> --- target-alpha/op_helper.c	(revision 5119)
>> +++ target-alpha/op_helper.c	(working copy)
>> @@ -45,7 +45,7 @@
>>  #include "op_helper_mem.h"
>>  #endif
>>
>> -void helper_tb_flush (void)
>> +void do_tb_flush (void)
>
> No need to change the name of the helper...
>
>>  {
>>      tlb_flush(env, 1);
>>  }
>> Index: target-alpha/translate.c
>> ===================================================================
>> --- target-alpha/translate.c	(revision 5119)
>> +++ target-alpha/translate.c	(working copy)
>> @@ -25,6 +25,7 @@
>>  #include "cpu.h"
>>  #include "exec-all.h"
>>  #include "disas.h"
>> +#include "helper.h"
>>  #include "tcg-op.h"
>>  #include "qemu-common.h"
>>
>> @@ -126,6 +127,22 @@
>>      }
>>  }
>>
>> +static inline void tcg_gen_load_ir (TCGv t, int reg)
>> +{
>> +    if (reg == 31)
>> +        tcg_gen_movi_i64(t, 0);
>> +    else
>> +        tcg_gen_ld_i64(t, cpu_env, offsetof(CPUState, ir) +
>> +		       sizeof(target_ulong) * reg);
>> +}
>> +
>> +static inline void tcg_gen_store_ir (TCGv t, int reg)
>> +{
>> +    if (reg != 31)
>> +        tcg_gen_st_i64(t, cpu_env, offsetof(CPUState, ir) +
>> +                                  sizeof(target_ulong) * reg);
>> +}
>> +
>
> As said in the other mail, I have concerns about that part. TCG works
> better if most (all ?) registers are mapped.
>
>>  /* FIR moves */
>>  /* Special hacks for fir31 */
>>  #define gen_op_load_FT0_fir31 gen_op_reset_FT0
>> @@ -356,15 +373,9 @@
>>
>>  static always_inline void gen_update_pc (DisasContext *ctx)
>>  {
>> -    if (!(ctx->pc >> 32)) {
>> -        gen_op_update_pc32(ctx->pc);
>> -    } else {
>> -#if 0 // Qemu does not know how to do this...
>> -        gen_op_update_pc(ctx->pc);
>> -#else
>> -        gen_op_update_pc(ctx->pc >> 32, ctx->pc);
>> -#endif
>> -    }
>> +    TCGv v = tcg_const_i64(ctx->pc);
>> +    tcg_gen_st_i64(v, cpu_env, offsetof(CPUState, pc));
>> +    tcg_temp_free(v);
>>  }
>
> pc is an often used register, it should be mapped in TCG.
>
>>  static always_inline void _gen_op_bcond (DisasContext *ctx)
>> @@ -700,17 +711,31 @@
>>          goto invalid_opc;
>>      case 0x08:
>>          /* LDA */
>> -        gen_load_ir(ctx, rb, 0);
>> -        gen_set_sT1(ctx, disp16);
>> -        gen_op_addq();
>> -        gen_store_ir(ctx, ra, 0);
>> +        {
>> +	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
>> +	    TCGv v = tcg_const_i64(disp16);
>> +	    if (rb != 31) {
>> +		tcg_gen_load_ir(r, rb);
>> +		tcg_gen_add_i64(v, r, v);
>> +	    }
>> +	    tcg_gen_store_ir(v, ra);
>> +	    tcg_temp_free(r);
>> +	    tcg_temp_free(v);
>> +	}
>>          break;
>>      case 0x09:
>>          /* LDAH */
>> -        gen_load_ir(ctx, rb, 0);
>> -        gen_set_sT1(ctx, disp16 << 16);
>> -        gen_op_addq();
>> -        gen_store_ir(ctx, ra, 0);
>> +        {
>> +	    TCGv r = tcg_temp_new(TCG_TYPE_I64);
>> +	    TCGv v = tcg_const_i64(disp16 << 16);
>> +	    if (rb != 31) {
>> +		tcg_gen_load_ir(r, rb);
>> +		tcg_gen_add_i64(v, r, v);
>> +	    }
>> +	    tcg_gen_store_ir(v, ra);
>> +	    tcg_temp_free(r);
>> +	    tcg_temp_free(v);
>> +	}
>>          break;
>>      case 0x0A:
>>          /* LDBU */
>> @@ -2059,7 +2084,7 @@
>>          gen_update_pc(&ctx);
>>      }
>>  #if defined (DO_TB_FLUSH)
>> -    gen_op_tb_flush();
>> +    tcg_gen_helper_0_0(do_tb_flush);
>>  #endif
>>      if (tb->cflags & CF_LAST_IO)
>>          gen_io_end();
>>
> -- 
>   .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
>  : :' :  Debian developer           | Electrical Engineer
>  `. `'   aurel32@debian.org         | aurelien@aurel32.net
>    `-    people.debian.org/~aurel32 | www.aurel32.net
>
>


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2] convert of few alpha insn to TCG
  2008-09-03 12:44   ` [Qemu-devel] [PATCH v2] " Tristan Gingold
@ 2008-09-04  4:35     ` Aurelien Jarno
  2008-09-04 19:51       ` Thiemo Seufer
  0 siblings, 1 reply; 14+ messages in thread
From: Aurelien Jarno @ 2008-09-04  4:35 UTC (permalink / raw)
  To: qemu-devel

On Wed, Sep 03, 2008 at 02:44:48PM +0200, Tristan Gingold wrote:
> Hi,
>
> all the issues have been fixed in this second version.
>
> Tristan.
>
> Signed-off-by: Tristan Gingold <gingold@adacore.com>
>

I have applied a modified version of this patch, as I don't want to
spend to much time doing mail ping pong. Please see the details of the
change below.

Also please watch the indentation, target-alpha/ is indented with space,
I am not sure we want to mix that.

> Index: target-alpha/op.c
> ===================================================================
> --- target-alpha/op.c	(revision 5119)
> +++ target-alpha/op.c	(working copy)
> @@ -131,12 +131,6 @@
>      RETURN();
>  }
>  
> -void OPPROTO op_tb_flush (void)
> -{
> -    helper_tb_flush();
> -    RETURN();
> -}
> -
>  /* Load and stores */
>  #define MEMSUFFIX _raw
>  #include "op_mem.h"
> @@ -685,27 +679,6 @@
>  }
>  #endif
>  
> -#if 0 // Qemu does not know how to do this...
> -void OPPROTO op_update_pc (void)
> -{
> -    env->pc = PARAM(1);
> -    RETURN();
> -}
> -#else
> -void OPPROTO op_update_pc (void)
> -{
> -    env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
> -    RETURN();
> -}
> -#endif
> -
> -/* Optimization for 32 bits hosts architectures */
> -void OPPROTO op_update_pc32 (void)
> -{
> -    env->pc = (uint64_t)PARAM(1);
> -    RETURN();
> -}
> -
>  /* IEEE floating point arithmetic */
>  /* S floating (single) */
>  void OPPROTO op_adds (void)
> Index: target-alpha/helper.h
> ===================================================================
> --- target-alpha/helper.h	(revision 0)
> +++ target-alpha/helper.h	(revision 0)
> @@ -0,0 +1,5 @@
> +#ifndef DEF_HELPER
> +#define DEF_HELPER(ret, name, params) ret name params;
> +#endif
> +
> +DEF_HELPER(void, helper_tb_flush, (void))
> Index: target-alpha/translate.c
> ===================================================================
> --- target-alpha/translate.c	(revision 5119)
> +++ target-alpha/translate.c	(working copy)
> @@ -25,6 +25,7 @@
>  #include "cpu.h"
>  #include "exec-all.h"
>  #include "disas.h"
> +#include "helper.h"
>  #include "tcg-op.h"
>  #include "qemu-common.h"
>  
> @@ -44,15 +45,34 @@
>  };
>  
>  static TCGv cpu_env;
> +static TCGv cpu_ir[31];
> +static TCGv cpu_pc;
>  
>  #include "gen-icount.h"
>  
>  static void alpha_translate_init(void)
>  {
>      static int done_init = 0;
> +    static char cpu_reg_names[4*31];
> +    char *p;
> +    int i;
> +
>      if (done_init)
> -        return;
> +	return;
> +
>      cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
> +
> +    p = cpu_reg_names;
> +    for (i = 0; i < 31; i++) {
> +        sprintf(p, "r%d", i);

ir would be better to match the name of the variable.

> +        cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
> +				       offsetof(CPUState, ir[i]), p);
> +	p += 4;
> +    }
> +
> +    cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
> +				offsetof(CPUState, pc), "pc");
> +
>      done_init = 1;
>  }

You should also register the helpers here.

> @@ -126,6 +146,20 @@
>      }
>  }
>  
> +static inline void get_ir (TCGv t, int reg)
> +{
> +    if (reg == 31)
> +        tcg_gen_movi_i64(t, 0);
> +    else
> +        tcg_gen_mov_i64(t, cpu_ir[reg]);
> +}
> +
> +static inline void set_ir (TCGv t, int reg)
> +{
> +    if (reg != 31)
> +        tcg_gen_mov_i64(cpu_ir[reg], t);
> +}
> +

Even if the register are now mapped directly in TCG, this way of doing
will not really help to find some optimisations later: the ir registers
can't directly be a target register of a TCG instruction, the only way
to read or write those register is through a move.

I'll fix that in another patch.

>  /* FIR moves */
>  /* Special hacks for fir31 */
>  #define gen_op_load_FT0_fir31 gen_op_reset_FT0
> @@ -356,15 +390,9 @@
>  
>  static always_inline void gen_update_pc (DisasContext *ctx)
>  {
> -    if (!(ctx->pc >> 32)) {
> -        gen_op_update_pc32(ctx->pc);
> -    } else {
> -#if 0 // Qemu does not know how to do this...
> -        gen_op_update_pc(ctx->pc);
> -#else
> -        gen_op_update_pc(ctx->pc >> 32, ctx->pc);
> -#endif
> -    }
> +    TCGv v = tcg_const_i64(ctx->pc);
> +    tcg_gen_mov_i64(cpu_pc, v);
> +    tcg_temp_free(v);
>  }

There is no need to use a TCG const, you can use tcg_gen_movi_i64
instead.

>  
>  static always_inline void _gen_op_bcond (DisasContext *ctx)
> @@ -700,17 +728,23 @@
>          goto invalid_opc;
>      case 0x08:
>          /* LDA */
> -        gen_load_ir(ctx, rb, 0);
> -        gen_set_sT1(ctx, disp16);
> -        gen_op_addq();
> -        gen_store_ir(ctx, ra, 0);
> +        {
> +	    TCGv v = tcg_const_i64(disp16);
> +	    if (rb != 31)
> +		tcg_gen_add_i64(v, cpu_ir[rb], v);
> +	    set_ir(v, ra);
> +	    tcg_temp_free(v);
> +	}
>          break;
>      case 0x09:
>          /* LDAH */
> -        gen_load_ir(ctx, rb, 0);
> -        gen_set_sT1(ctx, disp16 << 16);
> -        gen_op_addq();
> -        gen_store_ir(ctx, ra, 0);
> +        {
> +	    TCGv v = tcg_const_i64(disp16 << 16);
> +	    if (rb != 31)
> +		tcg_gen_add_i64(v, cpu_ir[rb], v);
> +	    set_ir(v, ra);
> +	    tcg_temp_free(v);
> +	}
>          break;
>      case 0x0A:
>          /* LDBU */
> @@ -1871,13 +1905,16 @@
>          break;
>      case 0x30:
>          /* BR */
> -        gen_set_uT0(ctx, ctx->pc);
> -        gen_store_ir(ctx, ra, 0);
> -        if (disp21 != 0) {
> -            gen_set_sT1(ctx, disp21 << 2);
> -            gen_op_addq();
> +	if (ra != 31) {
> +	    TCGv t = tcg_const_i64(ctx->pc);
> +	    set_ir(t, ra);
> +	    tcg_temp_free(t);
> +	}
> +	{
> +	    TCGv pc = tcg_const_i64(ctx->pc + (disp21 << 2));
> +	    tcg_gen_mov_i64(cpu_pc, pc);
> +	    tcg_temp_free(pc);
>          }

Same here, tcg_gen_movi_i64 could be use instead.

> -        gen_op_branch();
>          ret = 1;
>          break;
>      case 0x31:
> @@ -2059,7 +2096,7 @@
>          gen_update_pc(&ctx);
>      }
>  #if defined (DO_TB_FLUSH)
> -    gen_op_tb_flush();
> +    tcg_gen_helper_0_0(helper_tb_flush);
>  #endif
>      if (tb->cflags & CF_LAST_IO)
>          gen_io_end();
> 
-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2] convert of few alpha insn to TCG
  2008-09-04  4:35     ` Aurelien Jarno
@ 2008-09-04 19:51       ` Thiemo Seufer
  2008-09-04 23:32         ` Aurelien Jarno
  0 siblings, 1 reply; 14+ messages in thread
From: Thiemo Seufer @ 2008-09-04 19:51 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

Aurelien Jarno wrote:
> On Wed, Sep 03, 2008 at 02:44:48PM +0200, Tristan Gingold wrote:
> > Hi,
> >
> > all the issues have been fixed in this second version.
> >
> > Tristan.
> >
> > Signed-off-by: Tristan Gingold <gingold@adacore.com>
> >
> 
> I have applied a modified version of this patch, as I don't want to
> spend to much time doing mail ping pong. Please see the details of the
> change below.
> 
> Also please watch the indentation, target-alpha/ is indented with space,
> I am not sure we want to mix that.

Apparently you missed to commit target-alpha/helper.h.


Thiemo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2] convert of few alpha insn to TCG
  2008-09-04 19:51       ` Thiemo Seufer
@ 2008-09-04 23:32         ` Aurelien Jarno
  0 siblings, 0 replies; 14+ messages in thread
From: Aurelien Jarno @ 2008-09-04 23:32 UTC (permalink / raw)
  To: Thiemo Seufer; +Cc: qemu-devel

On Thu, Sep 04, 2008 at 09:51:37PM +0200, Thiemo Seufer wrote:
> Aurelien Jarno wrote:
> > On Wed, Sep 03, 2008 at 02:44:48PM +0200, Tristan Gingold wrote:
> > > Hi,
> > >
> > > all the issues have been fixed in this second version.
> > >
> > > Tristan.
> > >
> > > Signed-off-by: Tristan Gingold <gingold@adacore.com>
> > >
> > 
> > I have applied a modified version of this patch, as I don't want to
> > spend to much time doing mail ping pong. Please see the details of the
> > change below.
> > 
> > Also please watch the indentation, target-alpha/ is indented with space,
> > I am not sure we want to mix that.
> 
> Apparently you missed to commit target-alpha/helper.h.
> 

Oops, sorry about that. That should be fixed now.

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2008-09-04 23:32 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-01 11:38 [Qemu-devel] [PATCH] convert of few alpha insn to TCG Tristan Gingold
2008-09-01 14:32 ` Thiemo Seufer
2008-09-01 15:54   ` Tristan Gingold
2008-09-03  8:32     ` Aurelien Jarno
2008-09-03  8:54       ` Tristan Gingold
2008-09-03 11:24         ` Thiemo Seufer
2008-09-03  8:07 ` Ping: " Tristan Gingold
2008-09-03  8:27   ` Aurelien Jarno
2008-09-03  8:36     ` Tristan Gingold
2008-09-03  8:46 ` Aurelien Jarno
2008-09-03 12:44   ` [Qemu-devel] [PATCH v2] " Tristan Gingold
2008-09-04  4:35     ` Aurelien Jarno
2008-09-04 19:51       ` Thiemo Seufer
2008-09-04 23:32         ` Aurelien Jarno

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).