diff --git a/target/i386/helper.h b/target/i386/helper.h index 84a44cb760..dde92f246d 100644 --- a/target/i386/helper.h +++ b/target/i386/helper.h @@ -101,7 +101,7 @@ DEF_HELPER_FLAGS_3(write_crN, TCG_CALL_NO_RWG, void, env, int, tl) #endif /* !CONFIG_USER_ONLY */ /* x86 FPU */ -#if defined(XBOX) && (defined(__x86_64__) || defined(__aarch64__)) +#if defined(XBOX) && defined(__x86_64__) #define HS_DEF_HELPER_1(name, ret, t1) \ DEF_HELPER_1(name ## __soft, ret, t1) \ DEF_HELPER_1(name ## __hard, ret, t1) diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c index 9f8a59f87b..d442db69b5 100644 --- a/target/i386/tcg/fpu_helper.c +++ b/target/i386/tcg/fpu_helper.c @@ -460,7 +460,15 @@ floatx80 int32_to_floatx80__hard(int32_t a, float_status *status) #endif /* USE_HARD_FPU */ #endif /* XBOX && __x86_64__ */ -#if defined(XBOX) && (defined(__x86_64__) || defined(__aarch64__)) +#ifndef FPU_HELPER_COUNT +#define FPU_HELPER_COUNT() ((void)0) +#endif + +#ifndef MAP_HELPER_SOFT_HARD +#define MAP_HELPER_SOFT_HARD(func) helper_ ## func ## __soft +#endif + +#if defined(XBOX) && defined(__x86_64__) #ifdef USE_HARD_FPU #define MAP_HELPER_SOFT_HARD(func) helper_ ## func ## __hard extern int g_fpu_helper_calls; diff --git a/target/i386/tcg/fpu_helper_hard.c b/target/i386/tcg/fpu_helper_hard.c index a91a74ad8e..c8e9ec76d0 100644 --- a/target/i386/tcg/fpu_helper_hard.c +++ b/target/i386/tcg/fpu_helper_hard.c @@ -1,4 +1,10 @@ -#if defined(XBOX) && (defined(__x86_64__) || defined(__aarch64__)) +/* + * On AArch64, the hard FPU helper path currently uses native double + * precision and does not correctly emulate x87 extended-precision + * compare/equality semantics. Disable the hard-FPU variant there to + * avoid equality bugs in games like Fable: The Lost Chapters on Android. + */ +#if defined(XBOX) && defined(__x86_64__) #define USE_HARD_FPU 1 #include "fpu_helper.c" #endif diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index d510e78853..484554bdee 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -53,7 +53,7 @@ struct FPUProfileCounters g_fpu_profile; int g_fpu_helper_calls; #endif -#if defined(XBOX) && (defined(__x86_64__) || defined(__aarch64__)) +#if defined(XBOX) && defined(__x86_64__) #include "ui/xemu-settings.h" #define MAP_GEN_HELPER_SOFT_HARD(name) \ (g_use_fp_jit ? gen_helper_##name##__hard : gen_helper_##name##__soft) @@ -4393,7 +4393,7 @@ void tcg_x86_init(void) fpstt = tcg_global_mem_new_i32(tcg_env, offsetof(CPUX86State, fpstt), "fpstt"); -#if defined(XBOX) && (defined(__x86_64__) || defined(__aarch64__)) +#if defined(XBOX) && defined(__x86_64__) g_use_fp_jit = g_config.perf.fp_jit; #endif }