29851ee7c8
This change corrects and simplifies how discard is calculated for shift left logical vector instructions. It is used to detect overflow and set bit 22 in the DSPControl register. The existing tests (shll_ph.c, shll_qb.c) are extended with the corner cases that expose incorrectness in the previous implementation. Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
56 lines
1.0 KiB
C
56 lines
1.0 KiB
C
#include<stdio.h>
|
|
#include<assert.h>
|
|
|
|
int main()
|
|
{
|
|
int rd, rt, dsp;
|
|
int result, resultdsp;
|
|
|
|
rt = 0x87654321;
|
|
result = 0x87654321;
|
|
resultdsp = 0x00;
|
|
|
|
__asm
|
|
("wrdsp $0\n\t"
|
|
"shll.qb %0, %2, 0x00\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rd), "=r"(dsp)
|
|
: "r"(rt)
|
|
);
|
|
dsp = (dsp >> 22) & 0x01;
|
|
assert(dsp == resultdsp);
|
|
assert(rd == result);
|
|
|
|
rt = 0x87654321;
|
|
result = 0x38281808;
|
|
resultdsp = 0x01;
|
|
|
|
__asm
|
|
("wrdsp $0\n\t"
|
|
"shll.qb %0, %2, 0x03\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rd), "=r"(dsp)
|
|
: "r"(rt)
|
|
);
|
|
dsp = (dsp >> 22) & 0x01;
|
|
assert(dsp == resultdsp);
|
|
assert(rd == result);
|
|
|
|
rt = 0x00000001;
|
|
result = 0x00000080;
|
|
resultdsp = 0x00;
|
|
|
|
__asm
|
|
("wrdsp $0\n\t"
|
|
"shll.qb %0, %2, 0x07\n\t"
|
|
"rddsp %1\n\t"
|
|
: "=r"(rd), "=r"(dsp)
|
|
: "r"(rt)
|
|
);
|
|
dsp = (dsp >> 22) & 0x01;
|
|
assert(dsp == resultdsp);
|
|
assert(rd == result);
|
|
|
|
return 0;
|
|
}
|