mirror of https://github.com/xemu-project/xemu.git
powerpc: correctly handle fpu exceptions.
Raise the exception on the first occurence, do not wait for the next floating point operation. Signed-off-by: Fabien Chouteau <chouteau@adacore.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
c4eda5b723
commit
db72c9f256
|
@ -470,6 +470,18 @@ void store_fpscr(CPUPPCState *env, uint64_t arg, uint32_t mask)
|
||||||
|
|
||||||
void helper_float_check_status(CPUPPCState *env)
|
void helper_float_check_status(CPUPPCState *env)
|
||||||
{
|
{
|
||||||
|
int status = get_float_exception_flags(&env->fp_status);
|
||||||
|
|
||||||
|
if (status & float_flag_divbyzero) {
|
||||||
|
float_zero_divide_excp(env);
|
||||||
|
} else if (status & float_flag_overflow) {
|
||||||
|
float_overflow_excp(env);
|
||||||
|
} else if (status & float_flag_underflow) {
|
||||||
|
float_underflow_excp(env);
|
||||||
|
} else if (status & float_flag_inexact) {
|
||||||
|
float_inexact_excp(env);
|
||||||
|
}
|
||||||
|
|
||||||
if (env->exception_index == POWERPC_EXCP_PROGRAM &&
|
if (env->exception_index == POWERPC_EXCP_PROGRAM &&
|
||||||
(env->error_code & POWERPC_EXCP_FP)) {
|
(env->error_code & POWERPC_EXCP_FP)) {
|
||||||
/* Differred floating-point exception after target FPR update */
|
/* Differred floating-point exception after target FPR update */
|
||||||
|
@ -477,17 +489,6 @@ void helper_float_check_status(CPUPPCState *env)
|
||||||
helper_raise_exception_err(env, env->exception_index,
|
helper_raise_exception_err(env, env->exception_index,
|
||||||
env->error_code);
|
env->error_code);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
int status = get_float_exception_flags(&env->fp_status);
|
|
||||||
if (status & float_flag_divbyzero) {
|
|
||||||
float_zero_divide_excp(env);
|
|
||||||
} else if (status & float_flag_overflow) {
|
|
||||||
float_overflow_excp(env);
|
|
||||||
} else if (status & float_flag_underflow) {
|
|
||||||
float_underflow_excp(env);
|
|
||||||
} else if (status & float_flag_inexact) {
|
|
||||||
float_inexact_excp(env);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue