On 08/04/2014 07:38 AM, Bastian Koppelmann wrote:
> +target_ulong helper_add_ssov(CPUTRICOREState *env, target_ulong r1,
> +                             target_ulong r2)
> +{
> +    target_ulong ret;
> +    int64_t result = (int64_t)r1 + (int64_t)r2;
> +    SSOV(env, ret, result, 32);
> +    return ret;
> +}
> +
> +target_ulong helper_sub_ssov(CPUTRICOREState *env, target_ulong r1,
> +                             target_ulong r2)
> +{
> +    target_ulong ret;
> +    int64_t result = (int64_t)r1 - (int64_t)r2;
> +    SSOV(env, ret, result, 32);
> +    return ret;
> +}
> +

This zero-extends r1 and r2; you need to sign-extend in order for your
saturation to work.

> +    tcg_gen_sub2_tl(ret, cpu_PSW_V, r1, t0, r2, t0);
> +    gen_calc_psw_sv_i32(cpu_PSW_SV, cpu_PSW_V);

This computes neither carry nor overflow.

> +    /* mul and set V/SV bits */
> +    tcg_gen_muls2_tl(ret, cpu_PSW_V, r1, r2);

Overflow computation requires that you compare the high part of the result vs
the sign of the low part of the result.  I.e.

        overflow = (high != (low >> 31));


r~

Reply via email to