qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Re: [PATCH 17/17] m68k: add cas


From: Andreas Schwab
Subject: [Qemu-devel] Re: [PATCH 17/17] m68k: add cas
Date: Sat, 30 May 2009 15:53:43 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.94 (gnu/linux)

Laurent Vivier <address@hidden> writes:

> +    cmp = DREG(ext, 0);
> +    update = DREG(ext, 6);
> +    tmp = gen_load(s, opsize, addr, 0);
> +    dest = tcg_temp_local_new();
> +    tcg_gen_mov_i32(dest, tmp);
> +
> +    res = tcg_temp_new();
> +    tcg_gen_sub_i32(res, dest, cmp);
> +    gen_logic_cc(s, res);
> +
> +    l1 = gen_new_label();
> +    l2 = gen_new_label();
> +
> +    gen_jmpcc(s, 6 /* !Z */, l1);
> +    gen_store(s, opsize, addr, update);

This has a bug: addr is used around a jump.

Andreas.
---
>From b87bc72daf28f519017c79615b962c47a1e0492d Mon Sep 17 00:00:00 2001
From: Andreas Schwab <address@hidden>
Date: Sat, 30 May 2009 15:32:20 +0200
Subject: [PATCH] m68k: fix use of temporary around jump

Signed-off-by: Andreas Schwab <address@hidden>
---
 target-m68k/translate.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 4372975..9d68b02 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -1382,6 +1382,7 @@ DISAS_INSN(cas)
     TCGv tmp;
     TCGv cmp;
     TCGv update;
+    TCGv taddr;
     TCGv addr;
     TCGv res;
     uint16_t ext;
@@ -1408,17 +1409,19 @@ DISAS_INSN(cas)
 
     ext = lduw_code(s->pc);
     s->pc += 2;
-    addr = gen_lea(s, insn, opsize);
-    if (IS_NULL_QREG(addr)) {
+    taddr = gen_lea(s, insn, opsize);
+    if (IS_NULL_QREG(taddr)) {
         gen_addr_fault(s);
         return;
     }
 
     cmp = DREG(ext, 0);
     update = DREG(ext, 6);
-    tmp = gen_load(s, opsize, addr, 0);
+    tmp = gen_load(s, opsize, taddr, 0);
     dest = tcg_temp_local_new();
     tcg_gen_mov_i32(dest, tmp);
+    addr = tcg_temp_local_new ();
+    tcg_gen_mov_i32(addr, taddr);
 
     res = tcg_temp_new();
     tcg_gen_sub_i32(res, dest, cmp);
@@ -1434,6 +1437,7 @@ DISAS_INSN(cas)
     tcg_gen_mov_i32(cmp, dest);
     gen_set_label(l2);
     tcg_temp_free(dest);
+    tcg_temp_free(addr);
 }
 
 DISAS_INSN(byterev)
-- 
1.6.3.1


-- 
Andreas Schwab, address@hidden
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."




reply via email to

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