qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v4 09/23] ppc: Avoid AREG0 for integer and vecto


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH v4 09/23] ppc: Avoid AREG0 for integer and vector helpers
Date: Wed, 30 May 2012 17:21:21 +0000

On Wed, May 30, 2012 at 2:23 PM, Andreas Färber <address@hidden> wrote:
> From: Blue Swirl <address@hidden>
>
> Add an explicit CPUPPCState parameter instead of relying on AREG0.
>
> Signed-off-by: Blue Swirl <address@hidden>
> Signed-off-by: Alexander Graf <address@hidden>
> Signed-off-by: Andreas Färber <address@hidden>
> ---
>  Makefile.target         |    4 +-
>  target-ppc/helper.h     |  176 +++++++++++++++++++++++-----------------------
>  target-ppc/int_helper.c |  120 +++++++++++++++++++-------------
>  target-ppc/translate.c  |  174 
> ++++++++++++++++++++++++++++++++---------------
>  4 files changed, 281 insertions(+), 193 deletions(-)
>
> diff --git a/Makefile.target b/Makefile.target
> index 14ff7a3..30fd77b 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -1,3 +1,4 @@
> +

Unwanted change, sorry.

>  # -*- Mode: makefile -*-
>
>  GENERATED_HEADERS = config-target.h
> @@ -115,9 +116,6 @@ $(libobj-y): $(GENERATED_HEADERS)
>  ifneq ($(TARGET_BASE_ARCH), sparc)
>  op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
>  endif
> -ifeq ($(TARGET_BASE_ARCH), ppc)
> -int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
> -endif
>  user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
>
>  # Note: this is a workaround. The real fix is to avoid compiling
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 0aba7f8..7074bad 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -33,17 +33,17 @@ DEF_HELPER_4(lscbx, tl, tl, i32, i32, i32)
>  #if defined(TARGET_PPC64)
>  DEF_HELPER_FLAGS_2(mulhd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
>  DEF_HELPER_FLAGS_2(mulhdu, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_2(mulldo, i64, i64, i64)
> +DEF_HELPER_3(mulldo, i64, env, i64, i64)
>  #endif
>
>  DEF_HELPER_FLAGS_1(cntlzw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
>  DEF_HELPER_FLAGS_1(popcntb, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
>  DEF_HELPER_FLAGS_1(popcntw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
> -DEF_HELPER_2(sraw, tl, tl, tl)
> +DEF_HELPER_3(sraw, tl, env, tl, tl)
>  #if defined(TARGET_PPC64)
>  DEF_HELPER_FLAGS_1(cntlzd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
>  DEF_HELPER_FLAGS_1(popcntd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
> -DEF_HELPER_2(srad, tl, tl, tl)
> +DEF_HELPER_3(srad, tl, env, tl, tl)
>  #endif
>
>  DEF_HELPER_FLAGS_1(cntlsw32, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
> @@ -120,32 +120,32 @@ DEF_HELPER_3(vminuw, void, avr, avr, avr)
>  DEF_HELPER_3(vmaxub, void, avr, avr, avr)
>  DEF_HELPER_3(vmaxuh, void, avr, avr, avr)
>  DEF_HELPER_3(vmaxuw, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequb, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequh, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequw, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtub, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtuh, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtuw, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsb, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsh, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsw, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpeqfp, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgefp, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtfp, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpbfp, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequb_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequh_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpequw_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtub_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtuh_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtuw_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsb_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsh_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtsw_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpeqfp_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgefp_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpgtfp_dot, void, avr, avr, avr)
> -DEF_HELPER_3(vcmpbfp_dot, void, avr, avr, avr)
> +DEF_HELPER_4(vcmpequb, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpequh, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpequw, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtub, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtuh, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtuw, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsb, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsh, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsw, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpeqfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgefp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpbfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpequb_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpequh_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpequw_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtub_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtuh_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtuw_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsb_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsh_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtsw_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpeqfp_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgefp_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpgtfp_dot, void, env, avr, avr, avr)
> +DEF_HELPER_4(vcmpbfp_dot, void, env, avr, avr, avr)
>  DEF_HELPER_3(vmrglb, void, avr, avr, avr)
>  DEF_HELPER_3(vmrglh, void, avr, avr, avr)
>  DEF_HELPER_3(vmrglw, void, avr, avr, avr)
> @@ -175,18 +175,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
>  DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
>  DEF_HELPER_2(lvsl, void, avr, tl);
>  DEF_HELPER_2(lvsr, void, avr, tl);
> -DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
> -DEF_HELPER_3(vaddshs, void, avr, avr, avr)
> -DEF_HELPER_3(vaddsws, void, avr, avr, avr)
> -DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
> -DEF_HELPER_3(vsubshs, void, avr, avr, avr)
> -DEF_HELPER_3(vsubsws, void, avr, avr, avr)
> -DEF_HELPER_3(vaddubs, void, avr, avr, avr)
> -DEF_HELPER_3(vadduhs, void, avr, avr, avr)
> -DEF_HELPER_3(vadduws, void, avr, avr, avr)
> -DEF_HELPER_3(vsububs, void, avr, avr, avr)
> -DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
> -DEF_HELPER_3(vsubuws, void, avr, avr, avr)
> +DEF_HELPER_4(vaddsbs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vaddshs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vaddsws, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubsbs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubshs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubsws, void, env, avr, avr, avr)
> +DEF_HELPER_4(vaddubs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vadduhs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vadduws, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsububs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubuhs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubuws, void, env, avr, avr, avr)
>  DEF_HELPER_3(vrlb, void, avr, avr, avr)
>  DEF_HELPER_3(vrlh, void, avr, avr, avr)
>  DEF_HELPER_3(vrlw, void, avr, avr, avr)
> @@ -205,56 +205,56 @@ DEF_HELPER_2(vupkhsb, void, avr, avr)
>  DEF_HELPER_2(vupkhsh, void, avr, avr)
>  DEF_HELPER_2(vupklsb, void, avr, avr)
>  DEF_HELPER_2(vupklsh, void, avr, avr)
> -DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vsel, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vperm, void, avr, avr, avr, avr)
> -DEF_HELPER_3(vpkshss, void, avr, avr, avr)
> -DEF_HELPER_3(vpkshus, void, avr, avr, avr)
> -DEF_HELPER_3(vpkswss, void, avr, avr, avr)
> -DEF_HELPER_3(vpkswus, void, avr, avr, avr)
> -DEF_HELPER_3(vpkuhus, void, avr, avr, avr)
> -DEF_HELPER_3(vpkuwus, void, avr, avr, avr)
> -DEF_HELPER_3(vpkuhum, void, avr, avr, avr)
> -DEF_HELPER_3(vpkuwum, void, avr, avr, avr)
> +DEF_HELPER_5(vmsumubm, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmsummbm, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vsel, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vperm, void, env, avr, avr, avr, avr)
> +DEF_HELPER_4(vpkshss, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkshus, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkswss, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkswus, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkuhus, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkuwus, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkuhum, void, env, avr, avr, avr)
> +DEF_HELPER_4(vpkuwum, void, env, avr, avr, avr)
>  DEF_HELPER_3(vpkpx, void, avr, avr, avr)
> -DEF_HELPER_4(vmhaddshs, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmhraddshs, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmsumuhm, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmsumshm, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vmsumshs, void, avr, avr, avr, avr)
> +DEF_HELPER_5(vmhaddshs, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmhraddshs, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmsumuhm, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmsumuhs, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmsumshm, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vmsumshs, void, env, avr, avr, avr, avr)
>  DEF_HELPER_4(vmladduhm, void, avr, avr, avr, avr)
> -DEF_HELPER_1(mtvscr, void, avr);
> +DEF_HELPER_2(mtvscr, void, env, avr);
>  DEF_HELPER_2(lvebx, void, avr, tl)
>  DEF_HELPER_2(lvehx, void, avr, tl)
>  DEF_HELPER_2(lvewx, void, avr, tl)
>  DEF_HELPER_2(stvebx, void, avr, tl)
>  DEF_HELPER_2(stvehx, void, avr, tl)
>  DEF_HELPER_2(stvewx, void, avr, tl)
> -DEF_HELPER_3(vsumsws, void, avr, avr, avr)
> -DEF_HELPER_3(vsum2sws, void, avr, avr, avr)
> -DEF_HELPER_3(vsum4sbs, void, avr, avr, avr)
> -DEF_HELPER_3(vsum4shs, void, avr, avr, avr)
> -DEF_HELPER_3(vsum4ubs, void, avr, avr, avr)
> -DEF_HELPER_3(vaddfp, void, avr, avr, avr)
> -DEF_HELPER_3(vsubfp, void, avr, avr, avr)
> -DEF_HELPER_3(vmaxfp, void, avr, avr, avr)
> -DEF_HELPER_3(vminfp, void, avr, avr, avr)
> -DEF_HELPER_2(vrefp, void, avr, avr)
> -DEF_HELPER_2(vrsqrtefp, void, avr, avr)
> -DEF_HELPER_4(vmaddfp, void, avr, avr, avr, avr)
> -DEF_HELPER_4(vnmsubfp, void, avr, avr, avr, avr)
> -DEF_HELPER_2(vexptefp, void, avr, avr)
> -DEF_HELPER_2(vlogefp, void, avr, avr)
> -DEF_HELPER_2(vrfim, void, avr, avr)
> -DEF_HELPER_2(vrfin, void, avr, avr)
> -DEF_HELPER_2(vrfip, void, avr, avr)
> -DEF_HELPER_2(vrfiz, void, avr, avr)
> -DEF_HELPER_3(vcfux, void, avr, avr, i32)
> -DEF_HELPER_3(vcfsx, void, avr, avr, i32)
> -DEF_HELPER_3(vctuxs, void, avr, avr, i32)
> -DEF_HELPER_3(vctsxs, void, avr, avr, i32)
> +DEF_HELPER_4(vsumsws, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsum2sws, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsum4sbs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsum4shs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsum4ubs, void, env, avr, avr, avr)
> +DEF_HELPER_4(vaddfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vsubfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vmaxfp, void, env, avr, avr, avr)
> +DEF_HELPER_4(vminfp, void, env, avr, avr, avr)
> +DEF_HELPER_3(vrefp, void, env, avr, avr)
> +DEF_HELPER_3(vrsqrtefp, void, env, avr, avr)
> +DEF_HELPER_5(vmaddfp, void, env, avr, avr, avr, avr)
> +DEF_HELPER_5(vnmsubfp, void, env, avr, avr, avr, avr)
> +DEF_HELPER_3(vexptefp, void, env, avr, avr)
> +DEF_HELPER_3(vlogefp, void, env, avr, avr)
> +DEF_HELPER_3(vrfim, void, env, avr, avr)
> +DEF_HELPER_3(vrfin, void, env, avr, avr)
> +DEF_HELPER_3(vrfip, void, env, avr, avr)
> +DEF_HELPER_3(vrfiz, void, env, avr, avr)
> +DEF_HELPER_4(vcfux, void, env, avr, avr, i32)
> +DEF_HELPER_4(vcfsx, void, env, avr, avr, i32)
> +DEF_HELPER_4(vctuxs, void, env, avr, avr, i32)
> +DEF_HELPER_4(vctsxs, void, env, avr, avr, i32)
>
>  DEF_HELPER_2(efscfsi, i32, env, i32)
>  DEF_HELPER_2(efscfui, i32, env, i32)
> @@ -362,15 +362,15 @@ DEF_HELPER_1(msgsnd, void, tl)
>  DEF_HELPER_2(msgclr, void, env, tl)
>  #endif
>
> -DEF_HELPER_3(dlmzb, tl, tl, tl, i32)
> +DEF_HELPER_4(dlmzb, tl, env, tl, tl, i32)
>  DEF_HELPER_FLAGS_1(clcs, TCG_CALL_CONST | TCG_CALL_PURE, tl, i32)
>  #if !defined(CONFIG_USER_ONLY)
>  DEF_HELPER_1(rac, tl, tl)
>  #endif
> -DEF_HELPER_2(div, tl, tl, tl)
> -DEF_HELPER_2(divo, tl, tl, tl)
> -DEF_HELPER_2(divs, tl, tl, tl)
> -DEF_HELPER_2(divso, tl, tl, tl)
> +DEF_HELPER_3(div, tl, env, tl, tl)
> +DEF_HELPER_3(divo, tl, env, tl, tl)
> +DEF_HELPER_3(divs, tl, env, tl, tl)
> +DEF_HELPER_3(divso, tl, env, tl, tl)
>
>  DEF_HELPER_1(load_dcr, tl, tl);
>  DEF_HELPER_2(store_dcr, void, tl, tl)
> diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c
> index 71c7304..3173f11 100644
> --- a/target-ppc/int_helper.c
> +++ b/target-ppc/int_helper.c
> @@ -17,7 +17,6 @@
>  * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
>  */
>  #include "cpu.h"
> -#include "dyngen-exec.h"
>  #include "host-utils.h"
>  #include "helper.h"
>
> @@ -44,7 +43,7 @@ uint64_t helper_mulhdu(uint64_t arg1, uint64_t arg2)
>     return th;
>  }
>
> -uint64_t helper_mulldo(uint64_t arg1, uint64_t arg2)
> +uint64_t helper_mulldo(CPUPPCState *env, uint64_t arg1, uint64_t arg2)
>  {
>     int64_t th;
>     uint64_t tl;
> @@ -73,7 +72,8 @@ target_ulong helper_cntlzd(target_ulong t)
>  #endif
>
>  /* shift right arithmetic helper */
> -target_ulong helper_sraw(target_ulong value, target_ulong shift)
> +target_ulong helper_sraw(CPUPPCState *env, target_ulong value,
> +                         target_ulong shift)
>  {
>     int32_t ret;
>
> @@ -102,7 +102,8 @@ target_ulong helper_sraw(target_ulong value, target_ulong 
> shift)
>  }
>
>  #if defined(TARGET_PPC64)
> -target_ulong helper_srad(target_ulong value, target_ulong shift)
> +target_ulong helper_srad(CPUPPCState *env, target_ulong value,
> +                         target_ulong shift)
>  {
>     int64_t ret;
>
> @@ -184,7 +185,7 @@ target_ulong helper_popcntw(target_ulong val)
>
>  
> /*****************************************************************************/
>  /* PowerPC 601 specific instructions (POWER bridge) */
> -target_ulong helper_div(target_ulong arg1, target_ulong arg2)
> +target_ulong helper_div(CPUPPCState *env, target_ulong arg1, target_ulong 
> arg2)
>  {
>     uint64_t tmp = (uint64_t)arg1 << 32 | env->spr[SPR_MQ];
>
> @@ -198,7 +199,8 @@ target_ulong helper_div(target_ulong arg1, target_ulong 
> arg2)
>     }
>  }
>
> -target_ulong helper_divo(target_ulong arg1, target_ulong arg2)
> +target_ulong helper_divo(CPUPPCState *env, target_ulong arg1,
> +                         target_ulong arg2)
>  {
>     uint64_t tmp = (uint64_t)arg1 << 32 | env->spr[SPR_MQ];
>
> @@ -219,7 +221,8 @@ target_ulong helper_divo(target_ulong arg1, target_ulong 
> arg2)
>     }
>  }
>
> -target_ulong helper_divs(target_ulong arg1, target_ulong arg2)
> +target_ulong helper_divs(CPUPPCState *env, target_ulong arg1,
> +                         target_ulong arg2)
>  {
>     if (((int32_t)arg1 == INT32_MIN && (int32_t)arg2 == (int32_t)-1) ||
>         (int32_t)arg2 == 0) {
> @@ -231,7 +234,8 @@ target_ulong helper_divs(target_ulong arg1, target_ulong 
> arg2)
>     }
>  }
>
> -target_ulong helper_divso(target_ulong arg1, target_ulong arg2)
> +target_ulong helper_divso(CPUPPCState *env, target_ulong arg1,
> +                          target_ulong arg2)
>  {
>     if (((int32_t)arg1 == INT32_MIN && (int32_t)arg2 == (int32_t)-1) ||
>         (int32_t)arg2 == 0) {
> @@ -361,7 +365,7 @@ void helper_lvsr(ppc_avr_t *r, target_ulong sh)
>     }
>  }
>
> -void helper_mtvscr(ppc_avr_t *r)
> +void helper_mtvscr(CPUPPCState *env, ppc_avr_t *r)
>  {
>  #if defined(HOST_WORDS_BIGENDIAN)
>     env->vscr = r->u32[3];
> @@ -399,7 +403,8 @@ VARITH(uwm, u32)
>  #undef VARITH
>
>  #define VARITHFP(suffix, func)                                          \
> -    void helper_v##suffix(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)     \
> +    void helper_v##suffix(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, \
> +                          ppc_avr_t *b)                                 \
>     {                                                                   \
>         int i;                                                          \
>                                                                         \
> @@ -420,7 +425,8 @@ VARITHFP(subfp, float32_sub)
>     }
>
>  #define VARITHSAT_DO(name, op, optype, cvt, element)                    \
> -    void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)       \
> +    void helper_v##name(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,   \
> +                        ppc_avr_t *b)                                   \
>     {                                                                   \
>         int sat = 0;                                                    \
>         int i;                                                          \
> @@ -481,7 +487,8 @@ VAVG(w, s32, int64_t, u32, uint64_t)
>  #undef VAVG
>
>  #define VCF(suffix, cvt, element)                                       \
> -    void helper_vcf##suffix(ppc_avr_t *r, ppc_avr_t *b, uint32_t uim)   \
> +    void helper_vcf##suffix(CPUPPCState *env, ppc_avr_t *r,             \
> +                            ppc_avr_t *b, uint32_t uim)                 \
>     {                                                                   \
>         int i;                                                          \
>                                                                         \
> @@ -495,7 +502,8 @@ VCF(sx, int32_to_float32, s32)
>  #undef VCF
>
>  #define VCMP_DO(suffix, compare, element, record)                       \
> -    void helper_vcmp##suffix(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
> +    void helper_vcmp##suffix(CPUPPCState *env, ppc_avr_t *r,            \
> +                             ppc_avr_t *a, ppc_avr_t *b)                \
>     {                                                                   \
>         uint32_t ones = (uint32_t)-1;                                   \
>         uint32_t all = ones;                                            \
> @@ -539,7 +547,8 @@ VCMP(gtsw, >, s32)
>  #undef VCMP
>
>  #define VCMPFP_DO(suffix, compare, order, record)                       \
> -    void helper_vcmp##suffix(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
> +    void helper_vcmp##suffix(CPUPPCState *env, ppc_avr_t *r,            \
> +                             ppc_avr_t *a, ppc_avr_t *b)                \
>     {                                                                   \
>         uint32_t ones = (uint32_t)-1;                                   \
>         uint32_t all = ones;                                            \
> @@ -574,8 +583,8 @@ VCMPFP(gtfp, ==, float_relation_greater)
>  #undef VCMPFP_DO
>  #undef VCMPFP
>
> -static inline void vcmpbfp_internal(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
> -                                    int record)
> +static inline void vcmpbfp_internal(CPUPPCState *env, ppc_avr_t *r,
> +                                    ppc_avr_t *a, ppc_avr_t *b, int record)
>  {
>     int i;
>     int all_in = 0;
> @@ -600,18 +609,20 @@ static inline void vcmpbfp_internal(ppc_avr_t *r, 
> ppc_avr_t *a, ppc_avr_t *b,
>     }
>  }
>
> -void helper_vcmpbfp(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vcmpbfp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
> -    vcmpbfp_internal(r, a, b, 0);
> +    vcmpbfp_internal(env, r, a, b, 0);
>  }
>
> -void helper_vcmpbfp_dot(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vcmpbfp_dot(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                        ppc_avr_t *b)
>  {
> -    vcmpbfp_internal(r, a, b, 1);
> +    vcmpbfp_internal(env, r, a, b, 1);
>  }
>
>  #define VCT(suffix, satcvt, element)                                    \
> -    void helper_vct##suffix(ppc_avr_t *r, ppc_avr_t *b, uint32_t uim)   \
> +    void helper_vct##suffix(CPUPPCState *env, ppc_avr_t *r,             \
> +                            ppc_avr_t *b, uint32_t uim)                 \
>     {                                                                   \
>         int i;                                                          \
>         int sat = 0;                                                    \
> @@ -638,7 +649,8 @@ VCT(uxs, cvtsduw, u32)
>  VCT(sxs, cvtsdsw, s32)
>  #undef VCT
>
> -void helper_vmaddfp(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmaddfp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b,
> +                    ppc_avr_t *c)
>  {
>     int i;
>
> @@ -658,7 +670,8 @@ void helper_vmaddfp(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmhaddshs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmhaddshs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                      ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int sat = 0;
>     int i;
> @@ -675,7 +688,8 @@ void helper_vmhaddshs(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmhraddshs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t 
> *c)
> +void helper_vmhraddshs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                       ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int sat = 0;
>     int i;
> @@ -717,7 +731,8 @@ VMINMAX(uw, u32)
>  #undef VMINMAX
>
>  #define VMINMAXFP(suffix, rT, rF)                                       \
> -    void helper_v##suffix(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)     \
> +    void helper_v##suffix(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, \
> +                          ppc_avr_t *b)                                 \
>     {                                                                   \
>         int i;                                                          \
>                                                                         \
> @@ -784,7 +799,8 @@ VMRG(w, u32)
>  #undef MRGHI
>  #undef MRGLO
>
> -void helper_vmsummbm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsummbm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int32_t prod[16];
>     int i;
> @@ -799,7 +815,8 @@ void helper_vmsummbm(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmsumshm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsumshm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int32_t prod[8];
>     int i;
> @@ -813,7 +830,8 @@ void helper_vmsumshm(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmsumshs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsumshs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int32_t prod[8];
>     int i;
> @@ -834,7 +852,8 @@ void helper_vmsumshs(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmsumubm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsumubm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     uint16_t prod[16];
>     int i;
> @@ -849,7 +868,8 @@ void helper_vmsumubm(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmsumuhm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsumuhm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     uint32_t prod[8];
>     int i;
> @@ -863,7 +883,8 @@ void helper_vmsumuhm(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vmsumuhs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vmsumuhs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     uint32_t prod[8];
>     int i;
> @@ -909,7 +930,8 @@ VMUL(uh, u16, u32)
>  #undef VMUL_DO
>  #undef VMUL
>
> -void helper_vnmsubfp(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vnmsubfp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> +                     ppc_avr_t *b, ppc_avr_t *c)
>  {
>     int i;
>
> @@ -930,7 +952,8 @@ void helper_vnmsubfp(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b, ppc_avr_t *c)
>     }
>  }
>
> -void helper_vperm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vperm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
> +                  ppc_avr_t *c)
>  {
>     ppc_avr_t result;
>     int i;
> @@ -980,7 +1003,8 @@ void helper_vpkpx(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  }
>
>  #define VPK(suffix, from, to, cvt, dosat)                               \
> -    void helper_vpk##suffix(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
> +    void helper_vpk##suffix(CPUPPCState *env, ppc_avr_t *r,             \
> +                            ppc_avr_t *a, ppc_avr_t *b)                 \
>     {                                                                   \
>         int i;                                                          \
>         int sat = 0;                                                    \
> @@ -1010,7 +1034,7 @@ VPK(uwum, u32, u16, I, 0)
>  #undef VPK
>  #undef PKBIG
>
> -void helper_vrefp(ppc_avr_t *r, ppc_avr_t *b)
> +void helper_vrefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
>  {
>     int i;
>
> @@ -1022,7 +1046,8 @@ void helper_vrefp(ppc_avr_t *r, ppc_avr_t *b)
>  }
>
>  #define VRFI(suffix, rounding)                                  \
> -    void helper_vrfi##suffix(ppc_avr_t *r, ppc_avr_t *b)        \
> +    void helper_vrfi##suffix(CPUPPCState *env, ppc_avr_t *r,    \
> +                             ppc_avr_t *b)                      \
>     {                                                           \
>         int i;                                                  \
>         float_status s = env->vec_status;                       \
> @@ -1059,7 +1084,7 @@ VROTATE(h, u16)
>  VROTATE(w, u32)
>  #undef VROTATE
>
> -void helper_vrsqrtefp(ppc_avr_t *r, ppc_avr_t *b)
> +void helper_vrsqrtefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
>  {
>     int i;
>
> @@ -1072,13 +1097,14 @@ void helper_vrsqrtefp(ppc_avr_t *r, ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsel(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
> +void helper_vsel(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
> +                 ppc_avr_t *c)
>  {
>     r->u64[0] = (a->u64[0] & ~c->u64[0]) | (b->u64[0] & c->u64[0]);
>     r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]);
>  }
>
> -void helper_vexptefp(ppc_avr_t *r, ppc_avr_t *b)
> +void helper_vexptefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
>  {
>     int i;
>
> @@ -1089,7 +1115,7 @@ void helper_vexptefp(ppc_avr_t *r, ppc_avr_t *b)
>     }
>  }
>
> -void helper_vlogefp(ppc_avr_t *r, ppc_avr_t *b)
> +void helper_vlogefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
>  {
>     int i;
>
> @@ -1286,7 +1312,7 @@ void helper_vsubcuw(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsumsws(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vsumsws(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
>     int64_t t;
>     int i, upper;
> @@ -1311,7 +1337,7 @@ void helper_vsumsws(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsum2sws(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vsum2sws(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
>     int i, j, upper;
>     ppc_avr_t result;
> @@ -1338,7 +1364,7 @@ void helper_vsum2sws(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsum4sbs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vsum4sbs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
>     int i, j;
>     int sat = 0;
> @@ -1357,7 +1383,7 @@ void helper_vsum4sbs(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsum4shs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vsum4shs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
>     int sat = 0;
>     int i;
> @@ -1374,7 +1400,7 @@ void helper_vsum4shs(ppc_avr_t *r, ppc_avr_t *a, 
> ppc_avr_t *b)
>     }
>  }
>
> -void helper_vsum4ubs(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +void helper_vsum4ubs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t 
> *b)
>  {
>     int i, j;
>     int sat = 0;
> @@ -1501,8 +1527,8 @@ uint32_t helper_cntlzw32(uint32_t val)
>  }
>
>  /* 440 specific */
> -target_ulong helper_dlmzb(target_ulong high, target_ulong low,
> -                          uint32_t update_Rc)
> +target_ulong helper_dlmzb(CPUPPCState *env, target_ulong high,
> +                          target_ulong low, uint32_t update_Rc)
>  {
>     target_ulong mask;
>     int i;
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index c8b7982..eb3cd5a 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -1181,8 +1181,16 @@ static void gen_mulld(DisasContext *ctx)
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
>  }
> +
>  /* mulldo  mulldo. */
> -GEN_INT_ARITH_MUL_HELPER(mulldo, 0x17);
> +static void gen_mulldo(DisasContext *ctx)
> +{
> +    gen_helper_mulldo(cpu_gpr[rD(ctx->opcode)], cpu_env,
> +                      cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
> +    if (unlikely(Rc(ctx->opcode) != 0)) {
> +        gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
> +    }
> +}
>  #endif
>
>  /* neg neg. nego nego. */
> @@ -1869,7 +1877,7 @@ static void gen_slw(DisasContext *ctx)
>  /* sraw & sraw. */
>  static void gen_sraw(DisasContext *ctx)
>  {
> -    gen_helper_sraw(cpu_gpr[rA(ctx->opcode)],
> +    gen_helper_sraw(cpu_gpr[rA(ctx->opcode)], cpu_env,
>                     cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
> @@ -1953,7 +1961,7 @@ static void gen_sld(DisasContext *ctx)
>  /* srad & srad. */
>  static void gen_srad(DisasContext *ctx)
>  {
> -    gen_helper_srad(cpu_gpr[rA(ctx->opcode)],
> +    gen_helper_srad(cpu_gpr[rA(ctx->opcode)], cpu_env,
>                     cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
> @@ -4550,7 +4558,8 @@ static void gen_clcs(DisasContext *ctx)
>  /* div - div. */
>  static void gen_div(DisasContext *ctx)
>  {
> -    gen_helper_div(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 
> cpu_gpr[rB(ctx->opcode)]);
> +    gen_helper_div(cpu_gpr[rD(ctx->opcode)], cpu_env, 
> cpu_gpr[rA(ctx->opcode)],
> +                   cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
>  }
> @@ -4558,7 +4567,8 @@ static void gen_div(DisasContext *ctx)
>  /* divo - divo. */
>  static void gen_divo(DisasContext *ctx)
>  {
> -    gen_helper_divo(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 
> cpu_gpr[rB(ctx->opcode)]);
> +    gen_helper_divo(cpu_gpr[rD(ctx->opcode)], cpu_env, 
> cpu_gpr[rA(ctx->opcode)],
> +                    cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
>  }
> @@ -4566,7 +4576,8 @@ static void gen_divo(DisasContext *ctx)
>  /* divs - divs. */
>  static void gen_divs(DisasContext *ctx)
>  {
> -    gen_helper_divs(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 
> cpu_gpr[rB(ctx->opcode)]);
> +    gen_helper_divs(cpu_gpr[rD(ctx->opcode)], cpu_env, 
> cpu_gpr[rA(ctx->opcode)],
> +                    cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
>  }
> @@ -4574,7 +4585,8 @@ static void gen_divs(DisasContext *ctx)
>  /* divso - divso. */
>  static void gen_divso(DisasContext *ctx)
>  {
> -    gen_helper_divso(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 
> cpu_gpr[rB(ctx->opcode)]);
> +    gen_helper_divso(cpu_gpr[rD(ctx->opcode)], cpu_env,
> +                     cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]);
>     if (unlikely(Rc(ctx->opcode) != 0))
>         gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]);
>  }
> @@ -6237,8 +6249,8 @@ static void gen_wrteei(DisasContext *ctx)
>  static void gen_dlmzb(DisasContext *ctx)
>  {
>     TCGv_i32 t0 = tcg_const_i32(Rc(ctx->opcode));
> -    gen_helper_dlmzb(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)],
> -                     cpu_gpr[rB(ctx->opcode)], t0);
> +    gen_helper_dlmzb(cpu_gpr[rA(ctx->opcode)], cpu_env,
> +                     cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0);
>     tcg_temp_free_i32(t0);
>  }
>
> @@ -6457,7 +6469,7 @@ static void gen_mtvscr(DisasContext *ctx)
>         return;
>     }
>     p = gen_avr_ptr(rD(ctx->opcode));
> -    gen_helper_mtvscr(p);
> +    gen_helper_mtvscr(cpu_env, p);
>     tcg_temp_free_ptr(p);
>  }
>
> @@ -6496,6 +6508,23 @@ static void glue(gen_, name)(DisasContext *ctx)
>     tcg_temp_free_ptr(rd);                                              \
>  }
>
> +#define GEN_VXFORM_ENV(name, opc2, opc3)                                \
> +static void glue(gen_, name)(DisasContext *ctx)                         \
> +{                                                                       \
> +    TCGv_ptr ra, rb, rd;                                                \
> +    if (unlikely(!ctx->altivec_enabled)) {                              \
> +        gen_exception(ctx, POWERPC_EXCP_VPU);                           \
> +        return;                                                         \
> +    }                                                                   \
> +    ra = gen_avr_ptr(rA(ctx->opcode));                                  \
> +    rb = gen_avr_ptr(rB(ctx->opcode));                                  \
> +    rd = gen_avr_ptr(rD(ctx->opcode));                                  \
> +    gen_helper_##name(rd, cpu_env, ra, rb);                             \
> +    tcg_temp_free_ptr(ra);                                              \
> +    tcg_temp_free_ptr(rb);                                              \
> +    tcg_temp_free_ptr(rd);                                              \
> +}
> +
>  GEN_VXFORM(vaddubm, 0, 0);
>  GEN_VXFORM(vadduhm, 0, 1);
>  GEN_VXFORM(vadduwm, 0, 2);
> @@ -6547,41 +6576,41 @@ GEN_VXFORM(vslo, 6, 16);
>  GEN_VXFORM(vsro, 6, 17);
>  GEN_VXFORM(vaddcuw, 0, 6);
>  GEN_VXFORM(vsubcuw, 0, 22);
> -GEN_VXFORM(vaddubs, 0, 8);
> -GEN_VXFORM(vadduhs, 0, 9);
> -GEN_VXFORM(vadduws, 0, 10);
> -GEN_VXFORM(vaddsbs, 0, 12);
> -GEN_VXFORM(vaddshs, 0, 13);
> -GEN_VXFORM(vaddsws, 0, 14);
> -GEN_VXFORM(vsububs, 0, 24);
> -GEN_VXFORM(vsubuhs, 0, 25);
> -GEN_VXFORM(vsubuws, 0, 26);
> -GEN_VXFORM(vsubsbs, 0, 28);
> -GEN_VXFORM(vsubshs, 0, 29);
> -GEN_VXFORM(vsubsws, 0, 30);
> +GEN_VXFORM_ENV(vaddubs, 0, 8);
> +GEN_VXFORM_ENV(vadduhs, 0, 9);
> +GEN_VXFORM_ENV(vadduws, 0, 10);
> +GEN_VXFORM_ENV(vaddsbs, 0, 12);
> +GEN_VXFORM_ENV(vaddshs, 0, 13);
> +GEN_VXFORM_ENV(vaddsws, 0, 14);
> +GEN_VXFORM_ENV(vsububs, 0, 24);
> +GEN_VXFORM_ENV(vsubuhs, 0, 25);
> +GEN_VXFORM_ENV(vsubuws, 0, 26);
> +GEN_VXFORM_ENV(vsubsbs, 0, 28);
> +GEN_VXFORM_ENV(vsubshs, 0, 29);
> +GEN_VXFORM_ENV(vsubsws, 0, 30);
>  GEN_VXFORM(vrlb, 2, 0);
>  GEN_VXFORM(vrlh, 2, 1);
>  GEN_VXFORM(vrlw, 2, 2);
>  GEN_VXFORM(vsl, 2, 7);
>  GEN_VXFORM(vsr, 2, 11);
> -GEN_VXFORM(vpkuhum, 7, 0);
> -GEN_VXFORM(vpkuwum, 7, 1);
> -GEN_VXFORM(vpkuhus, 7, 2);
> -GEN_VXFORM(vpkuwus, 7, 3);
> -GEN_VXFORM(vpkshus, 7, 4);
> -GEN_VXFORM(vpkswus, 7, 5);
> -GEN_VXFORM(vpkshss, 7, 6);
> -GEN_VXFORM(vpkswss, 7, 7);
> +GEN_VXFORM_ENV(vpkuhum, 7, 0);
> +GEN_VXFORM_ENV(vpkuwum, 7, 1);
> +GEN_VXFORM_ENV(vpkuhus, 7, 2);
> +GEN_VXFORM_ENV(vpkuwus, 7, 3);
> +GEN_VXFORM_ENV(vpkshus, 7, 4);
> +GEN_VXFORM_ENV(vpkswus, 7, 5);
> +GEN_VXFORM_ENV(vpkshss, 7, 6);
> +GEN_VXFORM_ENV(vpkswss, 7, 7);
>  GEN_VXFORM(vpkpx, 7, 12);
> -GEN_VXFORM(vsum4ubs, 4, 24);
> -GEN_VXFORM(vsum4sbs, 4, 28);
> -GEN_VXFORM(vsum4shs, 4, 25);
> -GEN_VXFORM(vsum2sws, 4, 26);
> -GEN_VXFORM(vsumsws, 4, 30);
> -GEN_VXFORM(vaddfp, 5, 0);
> -GEN_VXFORM(vsubfp, 5, 1);
> -GEN_VXFORM(vmaxfp, 5, 16);
> -GEN_VXFORM(vminfp, 5, 17);
> +GEN_VXFORM_ENV(vsum4ubs, 4, 24);
> +GEN_VXFORM_ENV(vsum4sbs, 4, 28);
> +GEN_VXFORM_ENV(vsum4shs, 4, 25);
> +GEN_VXFORM_ENV(vsum2sws, 4, 26);
> +GEN_VXFORM_ENV(vsumsws, 4, 30);
> +GEN_VXFORM_ENV(vaddfp, 5, 0);
> +GEN_VXFORM_ENV(vsubfp, 5, 1);
> +GEN_VXFORM_ENV(vmaxfp, 5, 16);
> +GEN_VXFORM_ENV(vminfp, 5, 17);
>
>  #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
>  static void glue(gen_, name)(DisasContext *ctx)                         \
> @@ -6594,7 +6623,7 @@ static void glue(gen_, name)(DisasContext *ctx)         
>                 \
>         ra = gen_avr_ptr(rA(ctx->opcode));                              \
>         rb = gen_avr_ptr(rB(ctx->opcode));                              \
>         rd = gen_avr_ptr(rD(ctx->opcode));                              \
> -        gen_helper_##opname (rd, ra, rb);                               \
> +        gen_helper_##opname(cpu_env, rd, ra, rb);                       \
>         tcg_temp_free_ptr(ra);                                          \
>         tcg_temp_free_ptr(rb);                                          \
>         tcg_temp_free_ptr(rd);                                          \
> @@ -6653,20 +6682,36 @@ static void glue(gen_, name)(DisasContext *ctx)
>         tcg_temp_free_ptr(rd);                                         \
>     }
>
> +#define GEN_VXFORM_NOA_ENV(name, opc2, opc3)                            \
> +static void glue(gen_, name)(DisasContext *ctx)                         \
> +    {                                                                   \
> +        TCGv_ptr rb, rd;                                                \
> +                                                                        \
> +        if (unlikely(!ctx->altivec_enabled)) {                          \
> +            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
> +            return;                                                     \
> +        }                                                               \
> +        rb = gen_avr_ptr(rB(ctx->opcode));                              \
> +        rd = gen_avr_ptr(rD(ctx->opcode));                              \
> +        gen_helper_##name(cpu_env, rd, rb);                             \
> +        tcg_temp_free_ptr(rb);                                          \
> +        tcg_temp_free_ptr(rd);                                          \
> +    }
> +
>  GEN_VXFORM_NOA(vupkhsb, 7, 8);
>  GEN_VXFORM_NOA(vupkhsh, 7, 9);
>  GEN_VXFORM_NOA(vupklsb, 7, 10);
>  GEN_VXFORM_NOA(vupklsh, 7, 11);
>  GEN_VXFORM_NOA(vupkhpx, 7, 13);
>  GEN_VXFORM_NOA(vupklpx, 7, 15);
> -GEN_VXFORM_NOA(vrefp, 5, 4);
> -GEN_VXFORM_NOA(vrsqrtefp, 5, 5);
> -GEN_VXFORM_NOA(vexptefp, 5, 6);
> -GEN_VXFORM_NOA(vlogefp, 5, 7);
> -GEN_VXFORM_NOA(vrfim, 5, 8);
> -GEN_VXFORM_NOA(vrfin, 5, 9);
> -GEN_VXFORM_NOA(vrfip, 5, 10);
> -GEN_VXFORM_NOA(vrfiz, 5, 11);
> +GEN_VXFORM_NOA_ENV(vrefp, 5, 4);
> +GEN_VXFORM_NOA_ENV(vrsqrtefp, 5, 5);
> +GEN_VXFORM_NOA_ENV(vexptefp, 5, 6);
> +GEN_VXFORM_NOA_ENV(vlogefp, 5, 7);
> +GEN_VXFORM_NOA_ENV(vrfim, 5, 8);
> +GEN_VXFORM_NOA_ENV(vrfin, 5, 9);
> +GEN_VXFORM_NOA_ENV(vrfip, 5, 10);
> +GEN_VXFORM_NOA_ENV(vrfiz, 5, 11);
>
>  #define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
>  static void glue(gen_, name)(DisasContext *ctx)                              
>    \
> @@ -6702,13 +6747,32 @@ static void glue(gen_, name)(DisasContext *ctx)
>         tcg_temp_free_ptr(rd);                                          \
>     }
>
> +#define GEN_VXFORM_UIMM_ENV(name, opc2, opc3)                           \
> +static void glue(gen_, name)(DisasContext *ctx)                         \
> +    {                                                                   \
> +        TCGv_ptr rb, rd;                                                \
> +        TCGv_i32 uimm;                                                  \
> +                                                                        \
> +        if (unlikely(!ctx->altivec_enabled)) {                          \
> +            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
> +            return;                                                     \
> +        }                                                               \
> +        uimm = tcg_const_i32(UIMM5(ctx->opcode));                       \
> +        rb = gen_avr_ptr(rB(ctx->opcode));                              \
> +        rd = gen_avr_ptr(rD(ctx->opcode));                              \
> +        gen_helper_##name(cpu_env, rd, rb, uimm);                       \
> +        tcg_temp_free_i32(uimm);                                        \
> +        tcg_temp_free_ptr(rb);                                          \
> +        tcg_temp_free_ptr(rd);                                          \
> +    }
> +
>  GEN_VXFORM_UIMM(vspltb, 6, 8);
>  GEN_VXFORM_UIMM(vsplth, 6, 9);
>  GEN_VXFORM_UIMM(vspltw, 6, 10);
> -GEN_VXFORM_UIMM(vcfux, 5, 12);
> -GEN_VXFORM_UIMM(vcfsx, 5, 13);
> -GEN_VXFORM_UIMM(vctuxs, 5, 14);
> -GEN_VXFORM_UIMM(vctsxs, 5, 15);
> +GEN_VXFORM_UIMM_ENV(vcfux, 5, 12);
> +GEN_VXFORM_UIMM_ENV(vcfsx, 5, 13);
> +GEN_VXFORM_UIMM_ENV(vctuxs, 5, 14);
> +GEN_VXFORM_UIMM_ENV(vctsxs, 5, 15);
>
>  static void gen_vsldoi(DisasContext *ctx)
>  {
> @@ -6730,7 +6794,7 @@ static void gen_vsldoi(DisasContext *ctx)
>  }
>
>  #define GEN_VAFORM_PAIRED(name0, name1, opc2)                           \
> -static void glue(gen_, name0##_##name1)(DisasContext *ctx)                   
>    \
> +static void glue(gen_, name0##_##name1)(DisasContext *ctx)              \
>     {                                                                   \
>         TCGv_ptr ra, rb, rc, rd;                                        \
>         if (unlikely(!ctx->altivec_enabled)) {                          \
> @@ -6742,9 +6806,9 @@ static void glue(gen_, name0##_##name1)(DisasContext 
> *ctx)
>         rc = gen_avr_ptr(rC(ctx->opcode));                              \
>         rd = gen_avr_ptr(rD(ctx->opcode));                              \
>         if (Rc(ctx->opcode)) {                                          \
> -            gen_helper_##name1 (rd, ra, rb, rc);                        \
> +            gen_helper_##name1(cpu_env, rd, ra, rb, rc);                \
>         } else {                                                        \
> -            gen_helper_##name0 (rd, ra, rb, rc);                        \
> +            gen_helper_##name0(cpu_env, rd, ra, rb, rc);                \
>         }                                                               \
>         tcg_temp_free_ptr(ra);                                          \
>         tcg_temp_free_ptr(rb);                                          \
> --
> 1.7.7
>



reply via email to

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