aboutsummaryrefslogtreecommitdiff
path: root/target/i386/ops_sse.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-08-11 14:23:35 +0000
committerPaolo Bonzini <pbonzini@redhat.com>2017-09-19 14:09:11 +0200
commitaa406feadfc5b095ca147ec56d6187c64be015a7 (patch)
treeaed5629358a12e313bfdc126678306b1d1de27fb /target/i386/ops_sse.h
parentae35eea7e4a9f21dd147406dfbcd0c4c6aaf2a60 (diff)
target/i386: fix phminposuw in-place operation
The SSE4.1 phminposuw instruction finds the minimum 16-bit element in the source vector, putting the value of that element in the low 16 bits of the destination vector, the index of that element in the next three bits and zeroing the rest of the destination. The helper for this operation fills the destination from high to low, meaning that when the source and destination are the same register, the minimum source element can be overwritten before it is copied to the destination. This patch fixes it to fill the destination from low to high instead, so the minimum source element is always copied first. This fixes one gcc test failure in my GCC 6-based testing (and so concludes the present sequence of patches, as I don't have any further gcc test failures left in that testing that I attribute to QEMU bugs). Signed-off-by: Joseph Myers <joseph@codesourcery.com> Message-Id: <alpine.DEB.2.20.1708111422580.11919@digraph.polyomino.org.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'target/i386/ops_sse.h')
-rw-r--r--target/i386/ops_sse.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h
index 9f1b35194c..ed05989768 100644
--- a/target/i386/ops_sse.h
+++ b/target/i386/ops_sse.h
@@ -1710,10 +1710,10 @@ void glue(helper_phminposuw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s)
idx = 7;
}
- d->Q(1) = 0;
- d->L(1) = 0;
- d->W(1) = idx;
d->W(0) = s->W(idx);
+ d->W(1) = idx;
+ d->L(1) = 0;
+ d->Q(1) = 0;
}
void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,