Patchwork [2/4] target-arm: Fix mixup in decoding of saturating add and sub

login
register
mail settings
Submitter Johan Bengtsson
Date Oct. 11, 2010, 8:18 a.m.
Message ID <1286785138-20401-2-git-send-email-teofrastius@gmail.com>
Download mbox | patch
Permalink /patch/67390/
State New
Headers show

Comments

Johan Bengtsson - Oct. 11, 2010, 8:18 a.m.
The thumb2 decoder contained a mixup between the bit controlling
doubling and the bit controlling if the operation was an add or a sub.

Signed-off-by: Johan Bengtsson <teofrastius@gmail.com>
---
 target-arm/translate.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Peter Maydell - Oct. 13, 2010, 4 p.m.
On 11 October 2010 09:18, Johan Bengtsson <teofrastius@gmail.com> wrote:
> The thumb2 decoder contained a mixup between the bit controlling
> doubling and the bit controlling if the operation was an add or a sub.
>
> Signed-off-by: Johan Bengtsson <teofrastius@gmail.com>

I've confirmed against the ARM ARM that this patch matches
the T1 encodings of QADD, QDADD, QSUB, QDSUB, and
have tested that once the patch is applied qemu gives identical
results to the hardware for execution of these instructions.

Acked-by: Peter Maydell <peter.maydell@linaro.org>

> ---
>  target-arm/translate.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index f39efc5..b530a53 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -7713,9 +7713,9 @@ static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1)
>                 /* Saturating add/subtract.  */
>                 tmp = load_reg(s, rn);
>                 tmp2 = load_reg(s, rm);
> -                if (op & 2)
> -                    gen_helper_double_saturate(tmp, tmp);
>                 if (op & 1)
> +                    gen_helper_double_saturate(tmp, tmp);
> +                if (op & 2)
>                     gen_helper_sub_saturate(tmp, tmp2, tmp);
>                 else
>                     gen_helper_add_saturate(tmp, tmp, tmp2);
> --
> 1.7.0.4
>
>
>

Patch

diff --git a/target-arm/translate.c b/target-arm/translate.c
index f39efc5..b530a53 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -7713,9 +7713,9 @@  static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1)
                 /* Saturating add/subtract.  */
                 tmp = load_reg(s, rn);
                 tmp2 = load_reg(s, rm);
-                if (op & 2)
-                    gen_helper_double_saturate(tmp, tmp);
                 if (op & 1)
+                    gen_helper_double_saturate(tmp, tmp);
+                if (op & 2)
                     gen_helper_sub_saturate(tmp, tmp2, tmp);
                 else
                     gen_helper_add_saturate(tmp, tmp, tmp2);