From: Simon Scherer <scherer.simon89@gmail.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, richard.henderson@linaro.org,
Simon Scherer <scherer.simon89@gmail.com>
Subject: [PATCH v2] target/i386: clear C1 for all x87 compare instructions
Date: Fri, 28 Aug 2026 10:22:35 +0200 [thread overview]
Message-ID: <20260828082235.128360-1-scherer.simon89@gmail.com> (raw)
The SDM specifies that FCOM/FCOMP/FCOMPP/FUCOM/FUCOMP/FUCOMPP/FICOM/FICOMP/
FCOMI/FCOMIP/FUCOMI/FUCOMIP unconditionally clear C1 in the FPU status word,
regardless of the comparison result.
helper_fcom_ST0_FT0/helper_fucom_ST0_FT0 only cleared C3, C2, C0 (mask
0x4500) before OR-ing in the comparison result, leaving C1 (bit 9) at
whatever value it already had. FICOM/FICOMP dispatch through the same
helpers after converting their integer operand, so they inherited the
same bug.
helper_fcomi_ST0_FT0/helper_fucomi_ST0_FT0 never touched the FPU status
word at all, so C1 was left untouched by those too.
This patch clears C1 explicitly in all four helpers, adding the clear
into the existing fpus mask for fcom/fucom since fcom_ccval never sets
bit 9. For fcomi/fucomi add a new separate clear.
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4378
Signed-off-by: Simon Scherer <scherer.simon89@gmail.com>
---
v2: merge the C1 clear into the existing fpus mask for
fcom_ST0_FT0/fucom_ST0_FT0 (Richard Henderson)
Signed-off-by: Simon Scherer <scherer.simon89@gmail.com>
---
target/i386/tcg/fpu_helper.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index b812125efa..aa6527b0f5 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -531,7 +531,8 @@ void helper_fcom_ST0_FT0(CPUX86State *env)
FloatRelation ret;
ret = floatx80_compare(ST0, FT0, &env->fp_status);
- env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1];
+ /* C1 is unconditionally cleared to 0 */
+ env->fpus = (env->fpus & ~0x4700) | fcom_ccval[ret + 1];
merge_exception_flags(env, old_flags);
}
@@ -541,7 +542,8 @@ void helper_fucom_ST0_FT0(CPUX86State *env)
FloatRelation ret;
ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status);
- env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1];
+ /* C1 is unconditionally cleared to 0 */
+ env->fpus = (env->fpus & ~0x4700) | fcom_ccval[ret + 1];
merge_exception_flags(env, old_flags);
}
@@ -556,6 +558,8 @@ void helper_fcomi_ST0_FT0(CPUX86State *env)
/* OF, SF, and AF are unconditionally cleared to 0 */
CC_SRC = fcomi_ccval[ret + 1];
CC_OP = CC_OP_EFLAGS;
+ /* C1 is unconditionally cleared to 0 */
+ env->fpus &= ~0x0200;
merge_exception_flags(env, old_flags);
}
@@ -568,6 +572,8 @@ void helper_fucomi_ST0_FT0(CPUX86State *env)
/* OF, SF, and AF are unconditionally cleared to 0 */
CC_SRC = fcomi_ccval[ret + 1];
CC_OP = CC_OP_EFLAGS;
+ /* C1 is unconditionally cleared to 0 */
+ env->fpus &= ~0x0200;
merge_exception_flags(env, old_flags);
}
--
2.53.0
reply other threads:[~2026-08-28 8:23 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260828082235.128360-1-scherer.simon89@gmail.com \
--to=scherer.simon89@gmail.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.