qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 07/12] target-arm: fix neon vsri, vshl and vsli ops
@ 2009-10-21 10:17 Juha.Riihimaki
  2009-10-21 10:46 ` Laurent Desnogues
  0 siblings, 1 reply; 6+ messages in thread
From: Juha.Riihimaki @ 2009-10-21 10:17 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2968 bytes --]

Shift immediate value is incorrectly overwritten by a temporary  
variable in the processing of NEON vsri, vshl and vsli instructions.

Signed-off-by: Juha Riihimäki <juha.riihimaki@nokia.com>
---
diff --git a/target-arm/translate.c b/target-arm/translate.c
index 59bf7bc..c92ecc6 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -4094,7 +4094,7 @@ static int disas_neon_data_insn(CPUState * env,  
DisasContext *s, uint32_t insn)
      int pairwise;
      int u;
      int n;
-    uint32_t imm;
+    uint32_t imm, imm2;
      TCGv tmp;
      TCGv tmp2;
      TCGv tmp3;
@@ -4624,31 +4624,31 @@ static int disas_neon_data_insn(CPUState *  
env, DisasContext *s, uint32_t insn)
                              switch (size) {
                              case 0:
                                  if (op == 4)
-                                    imm = 0xff >> -shift;
+                                    imm2 = 0xff >> -shift;
                                  else
-                                    imm = (uint8_t)(0xff << shift);
-                                imm |= imm << 8;
-                                imm |= imm << 16;
+                                    imm2 = (uint8_t)(0xff << shift);
+                                imm2 |= imm2 << 8;
+                                imm2 |= imm2 << 16;
                                  break;
                              case 1:
                                  if (op == 4)
-                                    imm = 0xffff >> -shift;
+                                    imm2 = 0xffff >> -shift;
                                  else
-                                    imm = (uint16_t)(0xffff << shift);
-                                imm |= imm << 16;
+                                    imm2 = (uint16_t)(0xffff << shift);
+                                imm2 |= imm2 << 16;
                                  break;
                              case 2:
                                  if (op == 4)
-                                    imm = 0xffffffffu >> -shift;
+                                    imm2 = 0xffffffffu >> -shift;
                                  else
-                                    imm = 0xffffffffu << shift;
+                                    imm2 = 0xffffffffu << shift;
                                  break;
                              default:
                                  abort();
                              }
                              tmp2 = neon_load_reg(rd, pass);
-                            tcg_gen_andi_i32(tmp, tmp, imm);
-                            tcg_gen_andi_i32(tmp2, tmp2, ~imm);
+                            tcg_gen_andi_i32(tmp, tmp, imm2);
+                            tcg_gen_andi_i32(tmp2, tmp2, ~imm2);
                              tcg_gen_or_i32(tmp, tmp, tmp2);
                              dead_tmp(tmp2);
                          }

[-- Attachment #2: translate.c.neonimm.diff --]
[-- Type: application/octet-stream, Size: 2734 bytes --]

diff --git a/target-arm/translate.c b/target-arm/translate.c
index 59bf7bc..c92ecc6 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -4094,7 +4094,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
     int pairwise;
     int u;
     int n;
-    uint32_t imm;
+    uint32_t imm, imm2;
     TCGv tmp;
     TCGv tmp2;
     TCGv tmp3;
@@ -4624,31 +4624,31 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
                             switch (size) {
                             case 0:
                                 if (op == 4)
-                                    imm = 0xff >> -shift;
+                                    imm2 = 0xff >> -shift;
                                 else
-                                    imm = (uint8_t)(0xff << shift);
-                                imm |= imm << 8;
-                                imm |= imm << 16;
+                                    imm2 = (uint8_t)(0xff << shift);
+                                imm2 |= imm2 << 8;
+                                imm2 |= imm2 << 16;
                                 break;
                             case 1:
                                 if (op == 4)
-                                    imm = 0xffff >> -shift;
+                                    imm2 = 0xffff >> -shift;
                                 else
-                                    imm = (uint16_t)(0xffff << shift);
-                                imm |= imm << 16;
+                                    imm2 = (uint16_t)(0xffff << shift);
+                                imm2 |= imm2 << 16;
                                 break;
                             case 2:
                                 if (op == 4)
-                                    imm = 0xffffffffu >> -shift;
+                                    imm2 = 0xffffffffu >> -shift;
                                 else
-                                    imm = 0xffffffffu << shift;
+                                    imm2 = 0xffffffffu << shift;
                                 break;
                             default:
                                 abort();
                             }
                             tmp2 = neon_load_reg(rd, pass);
-                            tcg_gen_andi_i32(tmp, tmp, imm);
-                            tcg_gen_andi_i32(tmp2, tmp2, ~imm);
+                            tcg_gen_andi_i32(tmp, tmp, imm2);
+                            tcg_gen_andi_i32(tmp2, tmp2, ~imm2);
                             tcg_gen_or_i32(tmp, tmp, tmp2);
                             dead_tmp(tmp2);
                         }

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-10-22  7:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-21 10:17 [Qemu-devel] [PATCH 07/12] target-arm: fix neon vsri, vshl and vsli ops Juha.Riihimaki
2009-10-21 10:46 ` Laurent Desnogues
2009-10-22  6:49   ` Juha.Riihimaki
2009-10-22  7:18     ` Laurent Desnogues
2009-10-22  7:33       ` Juha.Riihimaki
2009-10-22  7:40         ` Laurent Desnogues

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).