mirror of
https://github.com/qemu/qemu.git
synced 2024-12-05 09:43:44 +08:00
target/sh4: fix FPU unorderered compare
In case of unordered compare, the fcmp instructions should either trigger and invalid exception (if enabled) or set T=0. The existing code left it unchanged. LP: https://bugs.launchpad.net/qemu/+bug/1701821 Reported-by: Bruno Haible <bruno@clisp.org> Message-Id: <20170702202814.27793-3-aurelien@aurel32.net> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
57f5c1b093
commit
fea7d77d3e
@ -274,11 +274,8 @@ void helper_fcmp_eq_FT(CPUSH4State *env, float32 t0, float32 t1)
|
|||||||
|
|
||||||
set_float_exception_flags(0, &env->fp_status);
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
relation = float32_compare(t0, t1, &env->fp_status);
|
relation = float32_compare(t0, t1, &env->fp_status);
|
||||||
if (unlikely(relation == float_relation_unordered)) {
|
update_fpscr(env, GETPC());
|
||||||
update_fpscr(env, GETPC());
|
env->sr_t = (relation == float_relation_equal);
|
||||||
} else {
|
|
||||||
env->sr_t = (relation == float_relation_equal);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_fcmp_eq_DT(CPUSH4State *env, float64 t0, float64 t1)
|
void helper_fcmp_eq_DT(CPUSH4State *env, float64 t0, float64 t1)
|
||||||
@ -287,11 +284,8 @@ void helper_fcmp_eq_DT(CPUSH4State *env, float64 t0, float64 t1)
|
|||||||
|
|
||||||
set_float_exception_flags(0, &env->fp_status);
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
relation = float64_compare(t0, t1, &env->fp_status);
|
relation = float64_compare(t0, t1, &env->fp_status);
|
||||||
if (unlikely(relation == float_relation_unordered)) {
|
update_fpscr(env, GETPC());
|
||||||
update_fpscr(env, GETPC());
|
env->sr_t = (relation == float_relation_equal);
|
||||||
} else {
|
|
||||||
env->sr_t = (relation == float_relation_equal);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_fcmp_gt_FT(CPUSH4State *env, float32 t0, float32 t1)
|
void helper_fcmp_gt_FT(CPUSH4State *env, float32 t0, float32 t1)
|
||||||
@ -300,11 +294,8 @@ void helper_fcmp_gt_FT(CPUSH4State *env, float32 t0, float32 t1)
|
|||||||
|
|
||||||
set_float_exception_flags(0, &env->fp_status);
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
relation = float32_compare(t0, t1, &env->fp_status);
|
relation = float32_compare(t0, t1, &env->fp_status);
|
||||||
if (unlikely(relation == float_relation_unordered)) {
|
update_fpscr(env, GETPC());
|
||||||
update_fpscr(env, GETPC());
|
env->sr_t = (relation == float_relation_greater);
|
||||||
} else {
|
|
||||||
env->sr_t = (relation == float_relation_greater);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_fcmp_gt_DT(CPUSH4State *env, float64 t0, float64 t1)
|
void helper_fcmp_gt_DT(CPUSH4State *env, float64 t0, float64 t1)
|
||||||
@ -313,11 +304,8 @@ void helper_fcmp_gt_DT(CPUSH4State *env, float64 t0, float64 t1)
|
|||||||
|
|
||||||
set_float_exception_flags(0, &env->fp_status);
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
relation = float64_compare(t0, t1, &env->fp_status);
|
relation = float64_compare(t0, t1, &env->fp_status);
|
||||||
if (unlikely(relation == float_relation_unordered)) {
|
update_fpscr(env, GETPC());
|
||||||
update_fpscr(env, GETPC());
|
env->sr_t = (relation == float_relation_greater);
|
||||||
} else {
|
|
||||||
env->sr_t = (relation == float_relation_greater);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float64 helper_fcnvsd_FT_DT(CPUSH4State *env, float32 t0)
|
float64 helper_fcnvsd_FT_DT(CPUSH4State *env, float32 t0)
|
||||||
|
Loading…
Reference in New Issue
Block a user