Patchwork target-i386: Fix several SSE3 instructions.

login
register
mail settings
Submitter Max Reitz
Date Sept. 16, 2011, 3:29 p.m.
Message ID <1316186944-12946-1-git-send-email-max@tyndur.org>
Download mbox | patch
Permalink /patch/114952/
State New
Headers show

Comments

Max Reitz - Sept. 16, 2011, 3:29 p.m.
haddp[sd], hsubp[sd] and addsubp[sd] operate on floats, thus it is
necessary to use the appropriate floating point calculation functions.
If this is not done, those functions operate merely on integers, which
is not correct.

Signed-off-by: Max Reitz <max@tyndur.org>
---
 target-i386/ops_sse.h |   36 ++++++++++++++++++------------------
 1 files changed, 18 insertions(+), 18 deletions(-)
Blue Swirl - Sept. 17, 2011, 6:50 p.m.
Thanks, applied.

On Fri, Sep 16, 2011 at 3:29 PM, Max Reitz <max@tyndur.org> wrote:
> haddp[sd], hsubp[sd] and addsubp[sd] operate on floats, thus it is
> necessary to use the appropriate floating point calculation functions.
> If this is not done, those functions operate merely on integers, which
> is not correct.
>
> Signed-off-by: Max Reitz <max@tyndur.org>
> ---
>  target-i386/ops_sse.h |   36 ++++++++++++++++++------------------
>  1 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h
> index 703be99..aa41d25 100644
> --- a/target-i386/ops_sse.h
> +++ b/target-i386/ops_sse.h
> @@ -859,51 +859,51 @@ void helper_insertq_i(XMMReg *d, int index, int length)
>  void helper_haddps(XMMReg *d, XMMReg *s)
>  {
>     XMMReg r;
> -    r.XMM_S(0) = d->XMM_S(0) + d->XMM_S(1);
> -    r.XMM_S(1) = d->XMM_S(2) + d->XMM_S(3);
> -    r.XMM_S(2) = s->XMM_S(0) + s->XMM_S(1);
> -    r.XMM_S(3) = s->XMM_S(2) + s->XMM_S(3);
> +    r.XMM_S(0) = float32_add(d->XMM_S(0), d->XMM_S(1), &env->sse_status);
> +    r.XMM_S(1) = float32_add(d->XMM_S(2), d->XMM_S(3), &env->sse_status);
> +    r.XMM_S(2) = float32_add(s->XMM_S(0), s->XMM_S(1), &env->sse_status);
> +    r.XMM_S(3) = float32_add(s->XMM_S(2), s->XMM_S(3), &env->sse_status);
>     *d = r;
>  }
>
>  void helper_haddpd(XMMReg *d, XMMReg *s)
>  {
>     XMMReg r;
> -    r.XMM_D(0) = d->XMM_D(0) + d->XMM_D(1);
> -    r.XMM_D(1) = s->XMM_D(0) + s->XMM_D(1);
> +    r.XMM_D(0) = float64_add(d->XMM_D(0), d->XMM_D(1), &env->sse_status);
> +    r.XMM_D(1) = float64_add(s->XMM_D(0), s->XMM_D(1), &env->sse_status);
>     *d = r;
>  }
>
>  void helper_hsubps(XMMReg *d, XMMReg *s)
>  {
>     XMMReg r;
> -    r.XMM_S(0) = d->XMM_S(0) - d->XMM_S(1);
> -    r.XMM_S(1) = d->XMM_S(2) - d->XMM_S(3);
> -    r.XMM_S(2) = s->XMM_S(0) - s->XMM_S(1);
> -    r.XMM_S(3) = s->XMM_S(2) - s->XMM_S(3);
> +    r.XMM_S(0) = float32_sub(d->XMM_S(0), d->XMM_S(1), &env->sse_status);
> +    r.XMM_S(1) = float32_sub(d->XMM_S(2), d->XMM_S(3), &env->sse_status);
> +    r.XMM_S(2) = float32_sub(s->XMM_S(0), s->XMM_S(1), &env->sse_status);
> +    r.XMM_S(3) = float32_sub(s->XMM_S(2), s->XMM_S(3), &env->sse_status);
>     *d = r;
>  }
>
>  void helper_hsubpd(XMMReg *d, XMMReg *s)
>  {
>     XMMReg r;
> -    r.XMM_D(0) = d->XMM_D(0) - d->XMM_D(1);
> -    r.XMM_D(1) = s->XMM_D(0) - s->XMM_D(1);
> +    r.XMM_D(0) = float64_sub(d->XMM_D(0), d->XMM_D(1), &env->sse_status);
> +    r.XMM_D(1) = float64_sub(s->XMM_D(0), s->XMM_D(1), &env->sse_status);
>     *d = r;
>  }
>
>  void helper_addsubps(XMMReg *d, XMMReg *s)
>  {
> -    d->XMM_S(0) = d->XMM_S(0) - s->XMM_S(0);
> -    d->XMM_S(1) = d->XMM_S(1) + s->XMM_S(1);
> -    d->XMM_S(2) = d->XMM_S(2) - s->XMM_S(2);
> -    d->XMM_S(3) = d->XMM_S(3) + s->XMM_S(3);
> +    d->XMM_S(0) = float32_sub(d->XMM_S(0), s->XMM_S(0), &env->sse_status);
> +    d->XMM_S(1) = float32_add(d->XMM_S(1), s->XMM_S(1), &env->sse_status);
> +    d->XMM_S(2) = float32_sub(d->XMM_S(2), s->XMM_S(2), &env->sse_status);
> +    d->XMM_S(3) = float32_add(d->XMM_S(3), s->XMM_S(3), &env->sse_status);
>  }
>
>  void helper_addsubpd(XMMReg *d, XMMReg *s)
>  {
> -    d->XMM_D(0) = d->XMM_D(0) - s->XMM_D(0);
> -    d->XMM_D(1) = d->XMM_D(1) + s->XMM_D(1);
> +    d->XMM_D(0) = float64_sub(d->XMM_D(0), s->XMM_D(0), &env->sse_status);
> +    d->XMM_D(1) = float64_add(d->XMM_D(1), s->XMM_D(1), &env->sse_status);
>  }
>
>  /* XXX: unordered */
> --
> 1.7.6.1
>
>
>

Patch

diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h
index 703be99..aa41d25 100644
--- a/target-i386/ops_sse.h
+++ b/target-i386/ops_sse.h
@@ -859,51 +859,51 @@  void helper_insertq_i(XMMReg *d, int index, int length)
 void helper_haddps(XMMReg *d, XMMReg *s)
 {
     XMMReg r;
-    r.XMM_S(0) = d->XMM_S(0) + d->XMM_S(1);
-    r.XMM_S(1) = d->XMM_S(2) + d->XMM_S(3);
-    r.XMM_S(2) = s->XMM_S(0) + s->XMM_S(1);
-    r.XMM_S(3) = s->XMM_S(2) + s->XMM_S(3);
+    r.XMM_S(0) = float32_add(d->XMM_S(0), d->XMM_S(1), &env->sse_status);
+    r.XMM_S(1) = float32_add(d->XMM_S(2), d->XMM_S(3), &env->sse_status);
+    r.XMM_S(2) = float32_add(s->XMM_S(0), s->XMM_S(1), &env->sse_status);
+    r.XMM_S(3) = float32_add(s->XMM_S(2), s->XMM_S(3), &env->sse_status);
     *d = r;
 }
 
 void helper_haddpd(XMMReg *d, XMMReg *s)
 {
     XMMReg r;
-    r.XMM_D(0) = d->XMM_D(0) + d->XMM_D(1);
-    r.XMM_D(1) = s->XMM_D(0) + s->XMM_D(1);
+    r.XMM_D(0) = float64_add(d->XMM_D(0), d->XMM_D(1), &env->sse_status);
+    r.XMM_D(1) = float64_add(s->XMM_D(0), s->XMM_D(1), &env->sse_status);
     *d = r;
 }
 
 void helper_hsubps(XMMReg *d, XMMReg *s)
 {
     XMMReg r;
-    r.XMM_S(0) = d->XMM_S(0) - d->XMM_S(1);
-    r.XMM_S(1) = d->XMM_S(2) - d->XMM_S(3);
-    r.XMM_S(2) = s->XMM_S(0) - s->XMM_S(1);
-    r.XMM_S(3) = s->XMM_S(2) - s->XMM_S(3);
+    r.XMM_S(0) = float32_sub(d->XMM_S(0), d->XMM_S(1), &env->sse_status);
+    r.XMM_S(1) = float32_sub(d->XMM_S(2), d->XMM_S(3), &env->sse_status);
+    r.XMM_S(2) = float32_sub(s->XMM_S(0), s->XMM_S(1), &env->sse_status);
+    r.XMM_S(3) = float32_sub(s->XMM_S(2), s->XMM_S(3), &env->sse_status);
     *d = r;
 }
 
 void helper_hsubpd(XMMReg *d, XMMReg *s)
 {
     XMMReg r;
-    r.XMM_D(0) = d->XMM_D(0) - d->XMM_D(1);
-    r.XMM_D(1) = s->XMM_D(0) - s->XMM_D(1);
+    r.XMM_D(0) = float64_sub(d->XMM_D(0), d->XMM_D(1), &env->sse_status);
+    r.XMM_D(1) = float64_sub(s->XMM_D(0), s->XMM_D(1), &env->sse_status);
     *d = r;
 }
 
 void helper_addsubps(XMMReg *d, XMMReg *s)
 {
-    d->XMM_S(0) = d->XMM_S(0) - s->XMM_S(0);
-    d->XMM_S(1) = d->XMM_S(1) + s->XMM_S(1);
-    d->XMM_S(2) = d->XMM_S(2) - s->XMM_S(2);
-    d->XMM_S(3) = d->XMM_S(3) + s->XMM_S(3);
+    d->XMM_S(0) = float32_sub(d->XMM_S(0), s->XMM_S(0), &env->sse_status);
+    d->XMM_S(1) = float32_add(d->XMM_S(1), s->XMM_S(1), &env->sse_status);
+    d->XMM_S(2) = float32_sub(d->XMM_S(2), s->XMM_S(2), &env->sse_status);
+    d->XMM_S(3) = float32_add(d->XMM_S(3), s->XMM_S(3), &env->sse_status);
 }
 
 void helper_addsubpd(XMMReg *d, XMMReg *s)
 {
-    d->XMM_D(0) = d->XMM_D(0) - s->XMM_D(0);
-    d->XMM_D(1) = d->XMM_D(1) + s->XMM_D(1);
+    d->XMM_D(0) = float64_sub(d->XMM_D(0), s->XMM_D(0), &env->sse_status);
+    d->XMM_D(1) = float64_add(d->XMM_D(1), s->XMM_D(1), &env->sse_status);
 }
 
 /* XXX: unordered */