20c334a797
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>
75 lines
1.4 KiB
C
75 lines
1.4 KiB
C
#include<stdio.h>
|
|
#include<assert.h>
|
|
|
|
int main()
|
|
{
|
|
int rd, rs, rt, dsp;
|
|
int result, resultdsp;
|
|
|
|
rs = 0x12345678;
|
|
rt = 0x87654321;
|
|
result = 0x7FFFFFFF;
|
|
resultdsp = 0x01;
|
|
|
|
__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);
|
|
|
|
rs = 0x66666;
|
|
rt = 0x55555;
|
|
result = 0x11111;
|
|
resultdsp = 0x0;
|
|
|
|
__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);
|
|
|
|
rs = 0x0;
|
|
rt = 0x80000000;
|
|
result = 0x7FFFFFFF;
|
|
resultdsp = 0x01;
|
|
|
|
__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);
|
|
|
|
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;
|
|
}
|