On 6/2/19 4:08 AM, Mark Cave-Ayland wrote:
>  void helper_xvxsigsp(CPUPPCState *env, uint32_t opcode)
>  {
> -    ppc_vsr_t xt, xb;
> +    ppc_vsr_t *xt = &env->vsr[xT(opcode)];
> +    ppc_vsr_t *xb = &env->vsr[xB(opcode)];
> +    ppc_vsr_t t = *xt;
>      uint32_t exp, i, fraction;
>  
> -    getVSR(xB(opcode), &xb, env);
> -    memset(&xt, 0, sizeof(xt));

Change in behaviour -- zero init to copy init.

Note for future cleanup: most of these initializations do not need to happen,
because we overwrite all elements of T without consuming the previous value.


> @@ -3410,23 +3382,22 @@ void helper_xsrqpi(CPUPPCState *env, uint32_t opcode)
>          env->fp_status.float_exception_flags &= ~float_flag_inexact;
>      }
>  
> -    helper_compute_fprf_float128(env, xt.f128);
> +    helper_compute_fprf_float128(env, t.f128);
> +    *xt = t;
>      do_float_check_status(env, GETPC());
> -    putVSR(rD(opcode) + 32, &xt, env);

Change in behaviour -- writeback happens before do_float_check_status instead
of after.  This may well be a bug fix, but if so should happen separately.


r~

Reply via email to