[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Fix overflow conditions for MIPS add / subtract
From: |
Stefan Weil |
Subject: |
[Qemu-devel] [PATCH] Fix overflow conditions for MIPS add / subtract |
Date: |
Thu, 13 Apr 2006 20:49:19 +0200 |
User-agent: |
Mozilla Thunderbird 1.0.6 (X11/20050716) |
Hi,
I had problems with MIPS system emulation (AR7 based DSL router)
which were caused by wrong overflow exceptions.
With the patch given below emulation works. See this link for
first results: http://forum.openwrt.org/viewtopic.php?id=4381
In user mode emulation, the MIPS emulation currently ignores
exceptions. So the bug might have an effect on emulation speed
but not on functionality for user mode emulation.
Regards
Stefan Weil
PS. Please include this and also my last MIPS patch in CVS HEAD.
Index: target-mips/op.c
===================================================================
RCS file: /sources/qemu/qemu/target-mips/op.c,v
retrieving revision 1.5
diff -u -b -B -r1.5 op.c
--- target-mips/op.c 5 Dec 2005 19:59:36 -0000 1.5
+++ target-mips/op.c 13 Apr 2006 18:38:19 -0000
@@ -206,7 +206,8 @@
tmp = T0;
T0 += T1;
- if ((T0 >> 31) ^ (T1 >> 31) ^ (tmp >> 31)) {
+ if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 31) {
+ /* operands of same sign, result different sign */
CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW);
}
RETURN();
@@ -224,7 +225,8 @@
tmp = T0;
T0 = (int32_t)T0 - (int32_t)T1;
- if (!((T0 >> 31) ^ (T1 >> 31) ^ (tmp >> 31))) {
+ if (((tmp ^ T1) & (tmp ^ T0)) >> 31) {
+ /* operands of different sign, first operand and result
different sign */
CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW);
}
RETURN();
- [Qemu-devel] [PATCH] Fix overflow conditions for MIPS add / subtract,
Stefan Weil <=