qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data ty


From: Laurent Vivier
Subject: [Qemu-devel] [PATCH 1/3] m68k: allow fpu to manage double single data type.
Date: Sun, 31 May 2009 02:50:19 +0200

This patch allows to manage instructions like "fcmpd #2.2, %fp0".
Original function manages only data accessed through an address register.

Signed-off-by: Laurent Vivier <address@hidden>
---
 target-m68k/translate.c |   71 +++++++++++++++++++++++++----------------------
 1 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index ea6b34b..223b296 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -3115,40 +3115,45 @@ DISAS_INSN(fpu)
             goto undef;
         }
         if (opsize == OS_DOUBLE) {
-            tmp32 = tcg_temp_new_i32();
-            tcg_gen_mov_i32(tmp32, AREG(insn, 0));
-            switch ((insn >> 3) & 7) {
-            case 2:
-            case 3:
-                break;
-            case 4:
-                tcg_gen_addi_i32(tmp32, tmp32, -8);
-                break;
-            case 5:
-                offset = ldsw_code(s->pc);
-                s->pc += 2;
-                tcg_gen_addi_i32(tmp32, tmp32, offset);
-                break;
-            case 7:
-                offset = ldsw_code(s->pc);
-                offset += s->pc - 2;
-                s->pc += 2;
-                tcg_gen_addi_i32(tmp32, tmp32, offset);
-                break;
-            default:
-                goto undef;
-            }
-            src = gen_load64(s, tmp32);
-            switch ((insn >> 3) & 7) {
-            case 3:
-                tcg_gen_addi_i32(tmp32, tmp32, 8);
-                tcg_gen_mov_i32(AREG(insn, 0), tmp32);
-                break;
-            case 4:
-                tcg_gen_mov_i32(AREG(insn, 0), tmp32);
-                break;
+            if ((insn & 7) == 4) {
+                src = gen_load64(s, tcg_const_i32(s->pc));
+                s->pc += 8;
+            } else {
+                tmp32 = tcg_temp_new_i32();
+                tcg_gen_mov_i32(tmp32, AREG(insn, 0));
+                switch ((insn >> 3) & 7) {
+                case 2:
+                case 3:
+                    break;
+                case 4:
+                    tcg_gen_addi_i32(tmp32, tmp32, -8);
+                    break;
+                case 5:
+                    offset = ldsw_code(s->pc);
+                    s->pc += 2;
+                    tcg_gen_addi_i32(tmp32, tmp32, offset);
+                    break;
+                case 7:
+                    offset = ldsw_code(s->pc);
+                    offset += s->pc - 2;
+                    s->pc += 2;
+                    tcg_gen_addi_i32(tmp32, tmp32, offset);
+                    break;
+                default:
+                    goto undef;
+                }
+                src = gen_load64(s, tmp32);
+                switch ((insn >> 3) & 7) {
+                case 3:
+                    tcg_gen_addi_i32(tmp32, tmp32, 8);
+                    tcg_gen_mov_i32(AREG(insn, 0), tmp32);
+                    break;
+                case 4:
+                    tcg_gen_mov_i32(AREG(insn, 0), tmp32);
+                    break;
+                }
+                tcg_temp_free_i32(tmp32);
             }
-            tcg_temp_free_i32(tmp32);
         } else {
             SRC_EA(tmp32, opsize, 1, NULL);
             src = tcg_temp_new_i64();
-- 
1.5.6.5





reply via email to

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