qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions.


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions.
Date: Sat, 3 Jan 2009 20:43:20 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Tue, Dec 30, 2008 at 07:09:59PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <address@hidden>
> ---
>  target-ppc/translate.c |   37 +++++++++++++++++++++++++++++++++++++
>  1 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 4e1bd23..5c13ed2 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6178,6 +6178,43 @@ GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, 
> PPC_ALTIVEC)
>      tcg_temp_free_ptr(rd);
>  }
>  
> +static always_inline uint32_t gen_vscr_offset (int r)
> +{
> +#if defined(WORDS_BIGENDIAN)
> +    return offsetof(CPUPPCState, avr[r].u32[3]);
> +#else
> +    return offsetof(CPUPPCState, avr[r].u32[0]);
> +#endif
> +}
> +
> +GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC)
> +{
> +    TCGv_i32 t;
> +    if (unlikely(!ctx->altivec_enabled)) {
> +        gen_exception(ctx, POWERPC_EXCP_VPU);
> +        return;
> +    }
> +    tcg_gen_movi_i64(cpu_avrh[rD(ctx->opcode)], 0);
> +    tcg_gen_movi_i64(cpu_avrl[rD(ctx->opcode)], 0);
> +    t = tcg_temp_new_i32();
> +    tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, vscr));
> +    tcg_gen_st_i32(t, cpu_env, gen_vscr_offset(rD(ctx->opcode)));
> +    tcg_temp_free_i32(t);
> +}

TCG doesn't like when a variable is accessed through both a TCG register
and a TCG load/store in the same TB. This is most probably the problem
you are seeing with mfvscr/mtvscr.

I suggest you to replace the movi_i64 to cpu_avrl and the st_i32 by a
extu_i32_i64 to cpu_avrl.

> +GEN_HANDLER(mtvscr, 0x04, 0x2, 0x19, 0x03ff0000, PPC_ALTIVEC)
> +{
> +    TCGv_i32 t;
> +    if (unlikely(!ctx->altivec_enabled)) {
> +        gen_exception(ctx, POWERPC_EXCP_VPU);
> +        return;
> +    }
> +    t = tcg_temp_new_i32();
> +    tcg_gen_ld_i32(t, cpu_env, gen_vscr_offset(rB(ctx->opcode)));
> +    tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, vscr));
> +    tcg_temp_free_i32(t);
> +}

The same way, the ld_i32 can be replaced by a trunc_i64_i32 on cpu_avrl.
This way you can get rid of gen_vscr_offset().

>  /* Logical operations */
>  #define GEN_VX_LOGICAL(name, tcg_op, opc2, opc3)                        \
>  GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]