[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 04/50] target/i386: fix pcmpxstrx substring search
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 04/50] target/i386: fix pcmpxstrx substring search |
Date: |
Tue, 19 Sep 2017 14:28:53 +0200 |
From: Joseph Myers <address@hidden>
One of the cases of the SSE4.2 pcmpestri / pcmpestrm / pcmpistri /
pcmpistrm instructions does a substring search. The implementation of
this case in the pcmpxstrx helper is incorrect. The operation in this
case is a search for a string (argument d to the helper) in another
string (argument s to the helper); if a copy of d at a particular
position would run off the end of s, the resulting output bit should
be 0 whether or not the strings match in the region where they
overlap, but the QEMU implementation was wrongly comparing only up to
the point where s ends and counting it as a match if an initial
segment of d matched a terminal segment of s. Here, "run off the end
of s" means that some byte of d would overlap some byte outside of s;
thus, if d has zero length, it is considered to match everywhere,
including after the end of s. This patch fixes the implementation to
correspond with the proper instruction semantics. This fixes four gcc
test failures in my GCC 6-based testing.
Signed-off-by: Joseph Myers <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
target/i386/ops_sse.h | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h
index 05b1701..9f1b351 100644
--- a/target/i386/ops_sse.h
+++ b/target/i386/ops_sse.h
@@ -2040,10 +2040,14 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg
*d, Reg *s,
}
break;
case 3:
- for (j = valids; j >= 0; j--) {
+ if (validd == -1) {
+ res = (2 << upper) - 1;
+ break;
+ }
+ for (j = valids - validd; j >= 0; j--) {
res <<= 1;
v = 1;
- for (i = MIN(valids - j, validd); i >= 0; i--) {
+ for (i = validd; i >= 0; i--) {
v &= (pcmp_val(s, ctrl, i + j) == pcmp_val(d, ctrl, i));
}
res |= v;
--
1.8.3.1
- [Qemu-devel] [PULL 00/50] Misc patches for 2017-09-19, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 02/50] target/i386: set rip_offset for further SSE instructions, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 05/50] target/i386: fix phminposuw in-place operation, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 04/50] target/i386: fix pcmpxstrx substring search,
Paolo Bonzini <=
- [Qemu-devel] [PULL 03/50] target/i386: fix packusdw in-place operation, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 01/50] target/i386: fix pmovsx/pmovzx in-place operations, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 06/50] virtio-scsi: Add virtqueue_size parameter allowing virtqueue size to be set., Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 09/50] scsi: Improve scsi_sense_to_errno, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 08/50] scsi: Refactor scsi sense interpreting code, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 11/50] scsi-block: Support rerror/werror, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 14/50] scsi: introduce scsi_build_sense, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 10/50] scsi: Introduce scsi_sense_buf_to_errno, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 07/50] scsi-bus: correct responses for INQUIRY and REQUEST SENSE, Paolo Bonzini, 2017/09/19
- [Qemu-devel] [PULL 12/50] scsi: rename scsi_build_sense to scsi_convert_sense, Paolo Bonzini, 2017/09/19