qemu-e2k/tests/tcg/mips/mips32-dsp/subq_s_w.c
Petar Jovanovic 20c334a797 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>
2013-03-04 18:15:34 +01:00

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