mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
target-mips: fix DSP overflow macro and affected routines
The previous implementation incorrectly used same macro to detect overflow for addition and subtraction. This patch makes distinction between these two, and creates separate macros. The affected routines are changed accordingly. This change also includes additions to the existing tests for SUBQ_S_PH and SUBQ_S_W that would trigger the fixed issue, and it removes dead code from the test file. The last test case in subq_s_w.c is a bug found/reported/ isolated by Klaus Peichl from Dolby. Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
71df81afc6
commit
20c334a797
3 changed files with 95 additions and 55 deletions
|
@ -12,7 +12,8 @@ int main()
|
|||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("subq_s.ph %0, %2, %3\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.ph %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
|
@ -27,7 +28,24 @@ int main()
|
|||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("subq_s.ph %0, %2, %3\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.ph %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
);
|
||||
dsp = (dsp >> 20) & 0x01;
|
||||
assert(dsp == resultdsp);
|
||||
assert(rd == result);
|
||||
|
||||
rs = 0x12340000;
|
||||
rt = 0x87658000;
|
||||
result = 0x7FFF7FFF;
|
||||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.ph %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
|
|
|
@ -12,7 +12,8 @@ int main()
|
|||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("subq_s.w %0, %2, %3\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.w %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
|
@ -24,10 +25,11 @@ int main()
|
|||
rs = 0x66666;
|
||||
rt = 0x55555;
|
||||
result = 0x11111;
|
||||
resultdsp = 0x01;
|
||||
resultdsp = 0x0;
|
||||
|
||||
__asm
|
||||
("subq_s.w %0, %2, %3\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.w %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
|
@ -36,23 +38,37 @@ int main()
|
|||
assert(dsp == resultdsp);
|
||||
assert(rd == result);
|
||||
|
||||
|
||||
#if 0
|
||||
rs = 0x35555555;
|
||||
rt = 0xf5555555;
|
||||
result = 0x80000000;
|
||||
rs = 0x0;
|
||||
rt = 0x80000000;
|
||||
result = 0x7FFFFFFF;
|
||||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("subq_s.w %0, %2, %3\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.w %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
);
|
||||
|
||||
dsp = (dsp >> 20) & 0x01;
|
||||
assert(dsp == resultdsp);
|
||||
assert(rd == result);
|
||||
#endif
|
||||
|
||||
rs = 0x80000000;
|
||||
rt = 0x80000000;
|
||||
result = 0;
|
||||
resultdsp = 0x00;
|
||||
|
||||
__asm
|
||||
("wrdsp $0\n\t"
|
||||
"subq_s.w %0, %2, %3\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rs), "r"(rt)
|
||||
);
|
||||
dsp = (dsp >> 20) & 0x01;
|
||||
assert(dsp == resultdsp);
|
||||
assert(rd == result);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue