[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/18] i386: pcmpestr 64-bit sign extension bug
From: |
Paolo Bonzini |
Subject: |
[PULL 04/18] i386: pcmpestr 64-bit sign extension bug |
Date: |
Thu, 28 Apr 2022 08:53:21 +0200 |
From: Paul Brook <paul@nowt.org>
The abs1 function in ops_sse.h only works sorrectly when the result fits
in a signed int. This is fine most of the time because we're only dealing
with byte sized values.
However pcmp_elen helper function uses abs1 to calculate the absolute value
of a cpu register. This incorrectly truncates to 32 bits, and will give
the wrong anser for the most negative value.
Fix by open coding the saturation check before taking the absolute value.
Signed-off-by: Paul Brook <paul@nowt.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/ops_sse.h | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h
index e4d74b814a..535440f882 100644
--- a/target/i386/ops_sse.h
+++ b/target/i386/ops_sse.h
@@ -2011,25 +2011,23 @@ SSE_HELPER_Q(helper_pcmpgtq, FCMPGTQ)
static inline int pcmp_elen(CPUX86State *env, int reg, uint32_t ctrl)
{
- int val;
+ target_long val, limit;
/* Presence of REX.W is indicated by a bit higher than 7 set */
if (ctrl >> 8) {
- val = abs1((int64_t)env->regs[reg]);
+ val = (target_long)env->regs[reg];
} else {
- val = abs1((int32_t)env->regs[reg]);
+ val = (int32_t)env->regs[reg];
}
-
if (ctrl & 1) {
- if (val > 8) {
- return 8;
- }
+ limit = 8;
} else {
- if (val > 16) {
- return 16;
- }
+ limit = 16;
}
- return val;
+ if ((val > limit) || (val < -limit)) {
+ return limit;
+ }
+ return abs1(val);
}
static inline int pcmp_ilen(Reg *r, uint8_t ctrl)
--
2.35.1
- [PULL 00/18] Misc QEMU patches for 2022-04-28, Paolo Bonzini, 2022/04/28
- [PULL 01/18] error-report: fix g_date_time_format assertion, Paolo Bonzini, 2022/04/28
- [PULL 03/18] remove -writeconfig, Paolo Bonzini, 2022/04/28
- [PULL 07/18] qga: wixl: get path to sysroot from pkg-config as intended, Paolo Bonzini, 2022/04/28
- [PULL 09/18] configure: gcov should not exclude fortify-source, Paolo Bonzini, 2022/04/28
- [PULL 10/18] configure: move --enable/--disable-debug-info to second option parsing pass, Paolo Bonzini, 2022/04/28
- [PULL 02/18] configure: make fortify_source=yes by default, Paolo Bonzini, 2022/04/28
- [PULL 04/18] i386: pcmpestr 64-bit sign extension bug,
Paolo Bonzini <=
- [PULL 05/18] meson: show final set of compiler flags, Paolo Bonzini, 2022/04/28
- [PULL 06/18] configure: remove dead code, Paolo Bonzini, 2022/04/28
- [PULL 08/18] configure: pc-bios/qemu-icon.bmp does not exist, Paolo Bonzini, 2022/04/28
- [PULL 14/18] meson, configure: move usbfs test to meson, Paolo Bonzini, 2022/04/28
- [PULL 12/18] meson, configure: move RDMA options to meson, Paolo Bonzini, 2022/04/28
- [PULL 16/18] meson: remove CONFIG_XEN_PCI_PASSTHROUGH from config-target.h, Paolo Bonzini, 2022/04/28
- [PULL 18/18] qemu-options: Limit the -enable-kvm option to the targets that support it, Paolo Bonzini, 2022/04/28
- [PULL 15/18] meson, configure: move libgio test to meson, Paolo Bonzini, 2022/04/28
- [PULL 17/18] meson, configure: move --enable-module-upgrades to meson, Paolo Bonzini, 2022/04/28
- [PULL 11/18] configure, meson: move OpenGL check to meson, Paolo Bonzini, 2022/04/28