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:
Petar Jovanovic 2013-02-25 16:45:40 +01:00 committed by Aurelien Jarno
parent 71df81afc6
commit 20c334a797
3 changed files with 95 additions and 55 deletions

View file

@ -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)

View file

@ -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;
}