From: Paolo Bonzini Date: Wed, 24 Apr 2024 10:20:17 +0000 (+0200) Subject: target/i386/tcg: reuse gen_helper_fp_arith_ST0_FT0 for undocumented fcom/fcomp variants X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcc2b436c1f94a28760e20fad4eb050e79d187cc;p=thirdparty%2Fqemu.git target/i386/tcg: reuse gen_helper_fp_arith_ST0_FT0 for undocumented fcom/fcomp variants For 0x32 hack the op to be fcomp; for the others there isn't even anything special to do. Signed-off-by: Paolo Bonzini --- diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 32a371e2d9..cf5e2c158c 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -2777,10 +2777,18 @@ static void gen_x87(DisasContext *s, X86DecodedInsn *decode) break; } break; + /* map to fcomp; op & 7 == 2 would not pop */ + op = 0x03; + /* fallthrough */ case 0x00 ... 0x07: /* fxxx st, sti */ + case 0x22 ... 0x23: /* fcom2 and fcomp3, undocumented ops */ + case 0x32: /* fcomp5, undocumented op */ gen_helper_fmov_FT0_STN(tcg_env, tcg_constant_i32(opreg)); gen_helper_fp_arith_ST0_FT0(op & 7); + if (op >= 0x30) { + gen_helper_fpop(tcg_env); + } break; case 0x20: case 0x21: case 0x24 ... 0x27: /* fxxx sti, st */ @@ -2790,16 +2798,6 @@ static void gen_x87(DisasContext *s, X86DecodedInsn *decode) gen_helper_fpop(tcg_env); } break; - case 0x22: /* fcom2, undocumented op */ - gen_helper_fmov_FT0_STN(tcg_env, tcg_constant_i32(opreg)); - gen_helper_fcom_ST0_FT0(tcg_env); - break; - case 0x23: /* fcomp3, undocumented op */ - case 0x32: /* fcomp5, undocumented op */ - gen_helper_fmov_FT0_STN(tcg_env, tcg_constant_i32(opreg)); - gen_helper_fcom_ST0_FT0(tcg_env); - gen_helper_fpop(tcg_env); - break; case 0x15: /* da/5 */ switch (rm) { case 1: /* fucompp */