qemu-devel
[Top][All Lists]
Advanced

[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();





reply via email to

[Prev in Thread] Current Thread [Next in Thread]