* [Qemu-devel] [PATCH] target-i386: Fix several SSE3 instructions.
@ 2011-09-16 15:29 Max Reitz
2011-09-17 18:50 ` Blue Swirl
0 siblings, 1 reply; 2+ messages in thread
From: Max Reitz @ 2011-09-16 15:29 UTC (permalink / raw)
To: qemu-devel; +Cc: Max Reitz
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] target-i386: Fix several SSE3 instructions.
2011-09-16 15:29 [Qemu-devel] [PATCH] target-i386: Fix several SSE3 instructions Max Reitz
@ 2011-09-17 18:50 ` Blue Swirl
0 siblings, 0 replies; 2+ messages in thread
From: Blue Swirl @ 2011-09-17 18:50 UTC (permalink / raw)
To: Max Reitz; +Cc: qemu-devel
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
>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-09-17 18:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-16 15:29 [Qemu-devel] [PATCH] target-i386: Fix several SSE3 instructions Max Reitz
2011-09-17 18:50 ` Blue Swirl
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).