mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 11:04:58 -06:00
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>
This commit is contained in:
parent
8ca27ce2e1
commit
29851ee7c8
3 changed files with 59 additions and 27 deletions
|
@ -11,7 +11,38 @@ int main()
|
|||
resultdsp = 1;
|
||||
|
||||
__asm
|
||||
("shll.ph %0, %2, 0x0B\n\t"
|
||||
("wrdsp $0\n\t"
|
||||
"shll.ph %0, %2, 0x0B\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rt)
|
||||
);
|
||||
dsp = (dsp >> 22) & 0x01;
|
||||
assert(dsp == resultdsp);
|
||||
assert(rd == result);
|
||||
|
||||
rt = 0x7fff8000;
|
||||
result = 0xfffe0000;
|
||||
resultdsp = 1;
|
||||
|
||||
__asm
|
||||
("wrdsp $0\n\t"
|
||||
"shll.ph %0, %2, 0x01\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 = 0x00008000;
|
||||
resultdsp = 1;
|
||||
|
||||
__asm
|
||||
("wrdsp $0\n\t"
|
||||
"shll.ph %0, %2, 0x0F\n\t"
|
||||
"rddsp %1\n\t"
|
||||
: "=r"(rd), "=r"(dsp)
|
||||
: "r"(rt)
|
||||
|
|
|
@ -11,12 +11,14 @@ int main()
|
|||
resultdsp = 0x00;
|
||||
|
||||
__asm
|
||||
("shll.qb %0, %2, 0x00\n\t"
|
||||
("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;
|
||||
|
@ -24,12 +26,29 @@ int main()
|
|||
resultdsp = 0x01;
|
||||
|
||||
__asm
|
||||
("shll.qb %0, %2, 0x03\n\t"
|
||||
("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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue