* [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).