On Thu, Dec 06, 2012 at 08:30:35PM +0100, Petar Jovanovic wrote:
> From: Petar Jovanovic <pet...@mips.com>
> 
> Upper 4 bits of ccond (bits 31..28 ) of DSPControl register are not used in
> the MIPS32 architecture. They are used in the MIPS64 architecture. For MIPS32
> these bits must be written as zero, and return zero on read.
> 
> The change fixes writes (WRDSP) and reads (RDDSP) to the register. It also 
> fixes
> the tests that use these instructions, and makes them smaller and simpler.
> 
> Signed-off-by: Petar Jovanovic <pet...@mips.com>
> ---
>  target-mips/dsp_helper.c          |    8 ++++++++
>  tests/tcg/mips/mips32-dsp/rddsp.c |   32 ++++++++++++--------------------
>  tests/tcg/mips/mips32-dsp/wrdsp.c |   32 ++++++++++++--------------------
>  3 files changed, 32 insertions(+), 40 deletions(-)
> 
> diff --git a/target-mips/dsp_helper.c b/target-mips/dsp_helper.c
> index 14daf91..acf7ceb 100644
> --- a/target-mips/dsp_helper.c
> +++ b/target-mips/dsp_helper.c
> @@ -3948,7 +3948,11 @@ void helper_wrdsp(target_ulong rs, target_ulong 
> mask_num, CPUMIPSState *env)
>      if (mask[4] == 1) {
>          overwrite &= 0x00FFFFFF;
>          newbits   &= 0x00FFFFFF;
> +#if defined(TARGET_MIPS64)
>          newbits   |= 0xFF000000 & rs;
> +#else
> +        newbits   |= 0x0F000000 & rs;
> +#endif
>      }
>  
>      if (mask[5] == 1) {
> @@ -3999,7 +4003,11 @@ target_ulong helper_rddsp(target_ulong masknum, 
> CPUMIPSState *env)
>      }
>  
>      if (mask[4] == 1) {
> +#if defined(TARGET_MIPS64)
>          temp |= dsp & 0xFF000000;
> +#else
> +        temp |= dsp & 0x0F000000;
> +#endif
>      }
>  
>      if (mask[5] == 1) {
> diff --git a/tests/tcg/mips/mips32-dsp/rddsp.c 
> b/tests/tcg/mips/mips32-dsp/rddsp.c
> index e8948ec..2f30285 100644
> --- a/tests/tcg/mips/mips32-dsp/rddsp.c
> +++ b/tests/tcg/mips/mips32-dsp/rddsp.c
> @@ -6,14 +6,13 @@ int main()
>      int dsp_i, dsp_o;
>      int ccond_i, outflag_i, efi_i, c_i, scount_i, pos_i;
>      int ccond_o, outflag_o, efi_o, c_o, scount_o, pos_o;
> -    int ccond_r, outflag_r, efi_r, c_r, scount_r, pos_r;
>  
> -    ccond_i   = 0x000000BC;/* 4 */
> -    outflag_i = 0x0000001B;/* 3 */
> -    efi_i     = 0x00000001;/* 5 */
> -    c_i       = 0x00000001;/* 2 */
> -    scount_i  = 0x0000000F;/* 1 */
> -    pos_i     = 0x0000000C;/* 0 */
> +    ccond_i   = 0x0000000C;  /* 4 */
> +    outflag_i = 0x0000001B;  /* 3 */
> +    efi_i     = 0x00000001;  /* 5 */
> +    c_i       = 0x00000001;  /* 2 */
> +    scount_i  = 0x0000000F;  /* 1 */
> +    pos_i     = 0x0000000C;  /* 0 */
>  
>      dsp_i = (ccond_i   << 24) | \
>              (outflag_i << 16) | \
> @@ -22,13 +21,6 @@ int main()
>              (scount_i  <<  7) | \
>              pos_i;
>  
> -    ccond_r   = ccond_i;
> -    outflag_r = outflag_i;
> -    efi_r     = efi_i;
> -    c_r       = c_i;
> -    scount_r  = scount_i;
> -    pos_r     = pos_i;
> -
>      __asm
>          ("wrdsp %1, 0x3F\n\t"
>           "rddsp %0, 0x3F\n\t"
> @@ -43,12 +35,12 @@ int main()
>      scount_o  = (dsp_o >>  7) & 0x3F;
>      pos_o     =  dsp_o & 0x1F;
>  
> -    assert(ccond_o   == ccond_r);
> -    assert(outflag_o == outflag_r);
> -    assert(efi_o     == efi_r);
> -    assert(c_o       == c_r);
> -    assert(scount_o  == scount_r);
> -    assert(pos_o     == pos_r);
> +    assert(ccond_o   == ccond_i);
> +    assert(outflag_o == outflag_i);
> +    assert(efi_o     == efi_i);
> +    assert(c_o       == c_i);
> +    assert(scount_o  == scount_i);
> +    assert(pos_o     == pos_i);
>  
>      return 0;
>  }
> diff --git a/tests/tcg/mips/mips32-dsp/wrdsp.c 
> b/tests/tcg/mips/mips32-dsp/wrdsp.c
> index e8948ec..dc54943 100644
> --- a/tests/tcg/mips/mips32-dsp/wrdsp.c
> +++ b/tests/tcg/mips/mips32-dsp/wrdsp.c
> @@ -6,14 +6,13 @@ int main()
>      int dsp_i, dsp_o;
>      int ccond_i, outflag_i, efi_i, c_i, scount_i, pos_i;
>      int ccond_o, outflag_o, efi_o, c_o, scount_o, pos_o;
> -    int ccond_r, outflag_r, efi_r, c_r, scount_r, pos_r;
>  
> -    ccond_i   = 0x000000BC;/* 4 */
> -    outflag_i = 0x0000001B;/* 3 */
> -    efi_i     = 0x00000001;/* 5 */
> -    c_i       = 0x00000001;/* 2 */
> -    scount_i  = 0x0000000F;/* 1 */
> -    pos_i     = 0x0000000C;/* 0 */
> +    ccond_i   = 0x000000BC;  /* 4 */
> +    outflag_i = 0x0000001B;  /* 3 */
> +    efi_i     = 0x00000001;  /* 5 */
> +    c_i       = 0x00000001;  /* 2 */
> +    scount_i  = 0x0000000F;  /* 1 */
> +    pos_i     = 0x0000000C;  /* 0 */
>  
>      dsp_i = (ccond_i   << 24) | \
>              (outflag_i << 16) | \
> @@ -22,13 +21,6 @@ int main()
>              (scount_i  <<  7) | \
>              pos_i;
>  
> -    ccond_r   = ccond_i;
> -    outflag_r = outflag_i;
> -    efi_r     = efi_i;
> -    c_r       = c_i;
> -    scount_r  = scount_i;
> -    pos_r     = pos_i;
> -
>      __asm
>          ("wrdsp %1, 0x3F\n\t"
>           "rddsp %0, 0x3F\n\t"
> @@ -43,12 +35,12 @@ int main()
>      scount_o  = (dsp_o >>  7) & 0x3F;
>      pos_o     =  dsp_o & 0x1F;
>  
> -    assert(ccond_o   == ccond_r);
> -    assert(outflag_o == outflag_r);
> -    assert(efi_o     == efi_r);
> -    assert(c_o       == c_r);
> -    assert(scount_o  == scount_r);
> -    assert(pos_o     == pos_r);
> +    assert(ccond_o   == (ccond_i & 0x0F));
> +    assert(outflag_o == outflag_i);
> +    assert(efi_o     == efi_i);
> +    assert(c_o       == c_i);
> +    assert(scount_o  == scount_i);
> +    assert(pos_o     == pos_i);
>  
>      return 0;
>  }

Thanks, applied.


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

Reply via email to