qemu-e2k/tests/tcg/mips/mips32-dsp/shll_qb.c
Petar Jovanovic 29851ee7c8 target-mips: fix calculation of overflow for SHLL.PH and SHLL.QB
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>
2013-05-03 11:50:49 +02:00

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