qemu/tests/tcg/mips/mips32-dsp/wrdsp.c
Petar Jovanovic eec8972a5b target-mips: Fix incorrect reads and writes to DSPControl register
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 <petarj@mips.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
2013-01-01 11:10:47 +01:00

47 lines
1.1 KiB
C

#include<stdio.h>
#include<assert.h>
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;
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) | \
(efi_i << 14) | \
(c_i << 13) | \
(scount_i << 7) | \
pos_i;
__asm
("wrdsp %1, 0x3F\n\t"
"rddsp %0, 0x3F\n\t"
: "=r"(dsp_o)
: "r"(dsp_i)
);
ccond_o = (dsp_o >> 24) & 0xFF;
outflag_o = (dsp_o >> 16) & 0xFF;
efi_o = (dsp_o >> 14) & 0x01;
c_o = (dsp_o >> 14) & 0x01;
scount_o = (dsp_o >> 7) & 0x3F;
pos_o = dsp_o & 0x1F;
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;
}