Patchwork [2/2] ARM: Fix decoding of VQSHL/VQSHLU immediate forms

login
register
mail settings
Submitter Peter Maydell
Date Jan. 3, 2011, 4:20 p.m.
Message ID <1294071648-2182-3-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/77303/
State New
Headers show

Comments

Peter Maydell - Jan. 3, 2011, 4:20 p.m.
From: Juha Riihimäki <juha.riihimaki@nokia.com>

Fix errors in the decoding of ARM VQSHL/VQSHLU immediate forms,
including using the new VQSHLU helper functions where appropriate.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/translate.c |   51 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 36 insertions(+), 15 deletions(-)
Aurelien Jarno - Jan. 4, 2011, 10:05 p.m.
On Mon, Jan 03, 2011 at 04:20:48PM +0000, Peter Maydell wrote:
> From: Juha Riihimäki <juha.riihimaki@nokia.com>
> 
> Fix errors in the decoding of ARM VQSHL/VQSHLU immediate forms,
> including using the new VQSHLU helper functions where appropriate.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>

> ---
>  target-arm/translate.c |   51 +++++++++++++++++++++++++++++++++--------------
>  1 files changed, 36 insertions(+), 15 deletions(-)
> 
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index 2598268..1853b5c 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -4647,14 +4647,22 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
>                          case 5: /* VSHL, VSLI */
>                              gen_helper_neon_shl_u64(cpu_V0, cpu_V0, cpu_V1);
>                              break;
> -                        case 6: /* VQSHL */
> -                            if (u)
> -                                gen_helper_neon_qshl_u64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
> -                            else
> -                                gen_helper_neon_qshl_s64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
> +                        case 6: /* VQSHLU */
> +                            if (u) {
> +                                gen_helper_neon_qshlu_s64(cpu_V0, cpu_env,
> +                                                          cpu_V0, cpu_V1);
> +                            } else {
> +                                return 1;
> +                            }
>                              break;
> -                        case 7: /* VQSHLU */
> -                            gen_helper_neon_qshl_u64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
> +                        case 7: /* VQSHL */
> +                            if (u) {
> +                                gen_helper_neon_qshl_u64(cpu_V0, cpu_env,
> +                                                         cpu_V0, cpu_V1);
> +                            } else {
> +                                gen_helper_neon_qshl_s64(cpu_V0, cpu_env,
> +                                                         cpu_V0, cpu_V1);
> +                            }
>                              break;
>                          }
>                          if (op == 1 || op == 3) {
> @@ -4693,17 +4701,30 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
>                              default: return 1;
>                              }
>                              break;
> -                        case 6: /* VQSHL */
> -                            GEN_NEON_INTEGER_OP_ENV(qshl);
> -                            break;
> -                        case 7: /* VQSHLU */
> +                        case 6: /* VQSHLU */
> +                            if (!u) {
> +                                return 1;
> +                            }
>                              switch (size) {
> -                            case 0: gen_helper_neon_qshl_u8(tmp, cpu_env, tmp, tmp2); break;
> -                            case 1: gen_helper_neon_qshl_u16(tmp, cpu_env, tmp, tmp2); break;
> -                            case 2: gen_helper_neon_qshl_u32(tmp, cpu_env, tmp, tmp2); break;
> -                            default: return 1;
> +                            case 0:
> +                                gen_helper_neon_qshlu_s8(tmp, cpu_env,
> +                                                         tmp, tmp2);
> +                                break;
> +                            case 1:
> +                                gen_helper_neon_qshlu_s16(tmp, cpu_env,
> +                                                          tmp, tmp2);
> +                                break;
> +                            case 2:
> +                                gen_helper_neon_qshlu_s32(tmp, cpu_env,
> +                                                          tmp, tmp2);
> +                                break;
> +                            default:
> +                                return 1;
>                              }
>                              break;
> +                        case 7: /* VQSHL */
> +                            GEN_NEON_INTEGER_OP_ENV(qshl);
> +                            break;
>                          }
>                          dead_tmp(tmp2);
>  
> -- 
> 1.6.3.3
> 
> 
>

Patch

diff --git a/target-arm/translate.c b/target-arm/translate.c
index 2598268..1853b5c 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -4647,14 +4647,22 @@  static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
                         case 5: /* VSHL, VSLI */
                             gen_helper_neon_shl_u64(cpu_V0, cpu_V0, cpu_V1);
                             break;
-                        case 6: /* VQSHL */
-                            if (u)
-                                gen_helper_neon_qshl_u64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
-                            else
-                                gen_helper_neon_qshl_s64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
+                        case 6: /* VQSHLU */
+                            if (u) {
+                                gen_helper_neon_qshlu_s64(cpu_V0, cpu_env,
+                                                          cpu_V0, cpu_V1);
+                            } else {
+                                return 1;
+                            }
                             break;
-                        case 7: /* VQSHLU */
-                            gen_helper_neon_qshl_u64(cpu_V0, cpu_env, cpu_V0, cpu_V1);
+                        case 7: /* VQSHL */
+                            if (u) {
+                                gen_helper_neon_qshl_u64(cpu_V0, cpu_env,
+                                                         cpu_V0, cpu_V1);
+                            } else {
+                                gen_helper_neon_qshl_s64(cpu_V0, cpu_env,
+                                                         cpu_V0, cpu_V1);
+                            }
                             break;
                         }
                         if (op == 1 || op == 3) {
@@ -4693,17 +4701,30 @@  static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn)
                             default: return 1;
                             }
                             break;
-                        case 6: /* VQSHL */
-                            GEN_NEON_INTEGER_OP_ENV(qshl);
-                            break;
-                        case 7: /* VQSHLU */
+                        case 6: /* VQSHLU */
+                            if (!u) {
+                                return 1;
+                            }
                             switch (size) {
-                            case 0: gen_helper_neon_qshl_u8(tmp, cpu_env, tmp, tmp2); break;
-                            case 1: gen_helper_neon_qshl_u16(tmp, cpu_env, tmp, tmp2); break;
-                            case 2: gen_helper_neon_qshl_u32(tmp, cpu_env, tmp, tmp2); break;
-                            default: return 1;
+                            case 0:
+                                gen_helper_neon_qshlu_s8(tmp, cpu_env,
+                                                         tmp, tmp2);
+                                break;
+                            case 1:
+                                gen_helper_neon_qshlu_s16(tmp, cpu_env,
+                                                          tmp, tmp2);
+                                break;
+                            case 2:
+                                gen_helper_neon_qshlu_s32(tmp, cpu_env,
+                                                          tmp, tmp2);
+                                break;
+                            default:
+                                return 1;
                             }
                             break;
+                        case 7: /* VQSHL */
+                            GEN_NEON_INTEGER_OP_ENV(qshl);
+                            break;
                         }
                         dead_tmp(tmp2);