mirror of
https://github.com/qemu/qemu.git
synced 2024-12-02 00:03:35 +08:00
0ba365f4a9
This change makes sure that modifications of pos field in the DSPControl register do not trash other bits in the register. This bug can be triggered with the additional test case in mips32-dsp/extpdp.c in this commit. In addition to this, this change corrects incorrect calculation of the mask for EXTPDP. Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
65 lines
1.2 KiB
C
65 lines
1.2 KiB
C
#include<stdio.h>
|
|
#include<assert.h>
|
|
|
|
int main()
|
|
{
|
|
int rt, ach, acl, dsp, pos, efi;
|
|
int result;
|
|
|
|
ach = 0x05;
|
|
acl = 0xB4CB;
|
|
dsp = 0x07;
|
|
result = 0x000C;
|
|
|
|
__asm
|
|
("wrdsp %1, 0x01\n\t"
|
|
"mthi %2, $ac1\n\t"
|
|
"mtlo %3, $ac1\n\t"
|
|
"extpdp %0, $ac1, 0x03\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rt), "+r"(dsp)
|
|
: "r"(ach), "r"(acl)
|
|
);
|
|
pos = dsp & 0x3F;
|
|
efi = (dsp >> 14) & 0x01;
|
|
assert(pos == 3);
|
|
assert(efi == 0);
|
|
assert(result == rt);
|
|
|
|
ach = 0x05;
|
|
acl = 0xB4CB;
|
|
dsp = 0x01;
|
|
|
|
__asm
|
|
("wrdsp %1, 0x01\n\t"
|
|
"mthi %2, $ac1\n\t"
|
|
"mtlo %3, $ac1\n\t"
|
|
"extpdp %0, $ac1, 0x03\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rt), "+r"(dsp)
|
|
: "r"(ach), "r"(acl)
|
|
);
|
|
efi = (dsp >> 14) & 0x01;
|
|
assert(efi == 1);
|
|
|
|
|
|
ach = 0;
|
|
acl = 0;
|
|
dsp = 0;
|
|
result = 0;
|
|
|
|
__asm
|
|
("wrdsp %1\n\t"
|
|
"mthi %2, $ac1\n\t"
|
|
"mtlo %3, $ac1\n\t"
|
|
"extpdp %0, $ac1, 0x00\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rt), "+r"(dsp)
|
|
: "r"(ach), "r"(acl)
|
|
);
|
|
assert(dsp == 0x3F);
|
|
assert(result == rt);
|
|
|
|
return 0;
|
|
}
|