qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] target-mips: fix mipsdsp_mul_q15_q15 and tests


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH] target-mips: fix mipsdsp_mul_q15_q15 and tests for MAQ_SA_Q_PHL/PHR
Date: Mon, 15 Apr 2013 16:24:46 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

On Mon, Apr 15, 2013 at 01:54:07PM +0200, Petar Jovanovic wrote:
> From: Petar Jovanovic <address@hidden>
> 
> The operands for MAQ_SA_W.PHL/MAQ_SA_W.PHR must in specified format.
> Otherwise, the results are unpredictable. Once the operands were corrected
> in the tests (part of this change), a bug in mipsdsp_mul_q15_q15 became
> visible.
> 
> This change corrects the tests for MAQ_SA_W.PHL/MAQ_SA_W.PHR and fixes
> sign-related issue in mipsdsp_mul_q15_q15. It also removes unnecessary
> comment.
> 
> Signed-off-by: Petar Jovanovic <address@hidden>
> ---
>  target-mips/dsp_helper.c                 |   14 +-------------
>  tests/tcg/mips/mips32-dsp/maq_sa_w_phl.c |   12 ++++++------
>  tests/tcg/mips/mips32-dsp/maq_sa_w_phr.c |   24 ++++++++++++------------
>  3 files changed, 19 insertions(+), 31 deletions(-)

Thanks, applied (with the subject tweaked).

> diff --git a/target-mips/dsp_helper.c b/target-mips/dsp_helper.c
> index c7df595..a368062 100644
> --- a/target-mips/dsp_helper.c
> +++ b/target-mips/dsp_helper.c
> @@ -269,18 +269,6 @@ static inline int32_t mipsdsp_sat32_acc_q31(int32_t acc, 
> int32_t a,
>      temp31 = (temp_sum >> 31) & 0x01;
>      result = temp_sum & 0xFFFFFFFF;
>  
> -    /* FIXME
> -       This sat function may wrong, because user manual wrote:
> -       temp127..0 ← temp + ( (signA) || a31..0
> -       if ( temp32 ≠ temp31 ) then
> -           if ( temp32 = 0 ) then
> -               temp31..0 ← 0x80000000
> -           else
> -                temp31..0 ← 0x7FFFFFFF
> -           endif
> -           DSPControlouflag:16+acc ← 1
> -       endif
> -     */
>      if (temp32 != temp31) {
>          if (temp32 == 0) {
>              result = 0x7FFFFFFF;
> @@ -578,7 +566,7 @@ static inline int32_t mipsdsp_mul_q15_q15(int32_t ac, 
> uint16_t a, uint16_t b,
>          temp = 0x7FFFFFFF;
>          set_DSPControl_overflow_flag(1, 16 + ac, env);
>      } else {
> -        temp = ((uint32_t)a * (uint32_t)b) << 1;
> +         temp = ((int16_t)a * (int16_t)b) << 1;
>      }
>  
>      return temp;
> diff --git a/tests/tcg/mips/mips32-dsp/maq_sa_w_phl.c 
> b/tests/tcg/mips/mips32-dsp/maq_sa_w_phl.c
> index a756991..d83dce6 100644
> --- a/tests/tcg/mips/mips32-dsp/maq_sa_w_phl.c
> +++ b/tests/tcg/mips/mips32-dsp/maq_sa_w_phl.c
> @@ -10,12 +10,12 @@ int main()
>      int resulth, resultl;
>      int resdsp;
>  
> -    achi = 0x05;
> -    acli = 0xB4CB;
> +    achi = 0x00000000;
> +    acli = 0x0000B4CB;
>      rs = 0xFF060000;
>      rt = 0xCB000000;
> -    resulth = 0x00;
> -    resultl = 0x7FFFFFFF;
> +    resulth = 0x00000000;
> +    resultl = 0x006838CB;
>  
>      __asm
>          ("mthi %2, $ac1\n\t"
> @@ -29,8 +29,8 @@ int main()
>      assert(resulth == acho);
>      assert(resultl == aclo);
>  
> -    achi = 0x06;
> -    acli = 0xB4CB;
> +    achi = 0x00000000;
> +    acli = 0x0000B4CB;
>      rs  = 0x80000000;
>      rt  = 0x80000000;
>      resulth = 0x00;
> diff --git a/tests/tcg/mips/mips32-dsp/maq_sa_w_phr.c 
> b/tests/tcg/mips/mips32-dsp/maq_sa_w_phr.c
> index d6498f8..d233111 100644
> --- a/tests/tcg/mips/mips32-dsp/maq_sa_w_phr.c
> +++ b/tests/tcg/mips/mips32-dsp/maq_sa_w_phr.c
> @@ -10,12 +10,12 @@ int main()
>      int resulth, resultl;
>      int resdsp;
>  
> -    achi = 0x05;
> -    acli = 0xB4CB;
> -    rs  = 0xFF06;
> -    rt  = 0xCB00;
> -    resulth = 0x00;
> -    resultl = 0x7FFFFFFF;
> +    achi = 0x00000000;
> +    acli = 0x0000B4CB;
> +    rs  = 0x0000FF06;
> +    rt  = 0x0000CB00;
> +    resulth = 0x00000000;
> +    resultl = 0x006838CB;
>  
>      __asm
>          ("mthi %2, $ac1\n\t"
> @@ -29,12 +29,12 @@ int main()
>      assert(resulth == acho);
>      assert(resultl == aclo);
>  
> -    achi = 0x06;
> -    acli = 0xB4CB;
> -    rs  = 0x8000;
> -    rt  = 0x8000;
> -    resulth = 0x00;
> -    resultl = 0x7fffffff;
> +    achi = 0x00000000;
> +    acli = 0x0000B4CB;
> +    rs  = 0x00008000;
> +    rt  = 0x00008000;
> +    resulth = 0x00000000;
> +    resultl = 0x7FFFFFFF;
>      resdsp = 0x01;
>  
>      __asm
> -- 
> 1.7.9.5
> 
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

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