diff options
author | Tristan Gingold <gingold@adacore.com> | 2013-04-09 05:00:55 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-04-26 23:02:42 +0200 |
commit | db72c9f256ae70b30c5d5985234f085df4226c55 (patch) | |
tree | 76ed1e1270c0db69e49b911f3ff98ee9d2bb884e /target-ppc | |
parent | c4eda5b7234265313b09c2c9f9fdd3a960db97db (diff) | |
download | qemu-db72c9f256ae70b30c5d5985234f085df4226c55.zip qemu-db72c9f256ae70b30c5d5985234f085df4226c55.tar.gz qemu-db72c9f256ae70b30c5d5985234f085df4226c55.tar.bz2 |
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>
Diffstat (limited to 'target-ppc')
-rw-r--r-- | target-ppc/fpu_helper.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c index 9e779ea..1e141fb 100644 --- a/target-ppc/fpu_helper.c +++ b/target-ppc/fpu_helper.c @@ -470,6 +470,18 @@ void store_fpscr(CPUPPCState *env, uint64_t arg, uint32_t mask) 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 && (env->error_code & POWERPC_EXCP_FP)) { /* 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, 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); - } } } |