OSDN Git Service

64-bit multiplication fix (Ulrich Hecht)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 11 Nov 2003 13:55:33 +0000 (13:55 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 11 Nov 2003 13:55:33 +0000 (13:55 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@446 c046a42c-6fe2-441c-8c8c-71466251a162

target-arm/op.c
target-arm/translate.c

index 5879eba..73f95b7 100644 (file)
@@ -368,7 +368,7 @@ void OPPROTO op_mul_T0_T1(void)
 void OPPROTO op_mull_T0_T1(void)
 {
     uint64_t res;
-    res = T0 * T1;
+    res = (uint64_t)T0 * (uint64_t)T1;
     T1 = res >> 32;
     T0 = res;
 }
@@ -377,7 +377,7 @@ void OPPROTO op_mull_T0_T1(void)
 void OPPROTO op_imull_T0_T1(void)
 {
     uint64_t res;
-    res = (int32_t)T0 * (int32_t)T1;
+    res = (int64_t)T0 * (int64_t)T1;
     T1 = res >> 32;
     T0 = res;
 }
index 808fa2b..9447946 100644 (file)
@@ -516,9 +516,9 @@ static void disas_arm_insn(DisasContext *s)
                         gen_movl_T0_reg(s, rs);
                         gen_movl_T1_reg(s, rm);
                         if (insn & (1 << 22)) 
-                            gen_op_mull_T0_T1();
-                        else
                             gen_op_imull_T0_T1();
+                        else
+                            gen_op_mull_T0_T1();
                         if (insn & (1 << 21)) 
                             gen_op_addq_T0_T1(rn, rd);
                         if (insn & (1 << 20))