[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 3/7] target/ppc: Tidy helper_fmul
From: |
Richard Henderson |
Subject: |
[Qemu-ppc] [PATCH 3/7] target/ppc: Tidy helper_fmul |
Date: |
Tue, 3 Jul 2018 08:17:28 -0700 |
Tidy the invalid exception checking so that we rely on softfloat for
initial argument validation, and select the kind of invalid operand
exception only when we know we must. Pass and return float64 values
directly rather than bounce through the CPU_DoubleU union.
Signed-off-by: Richard Henderson <address@hidden>
---
target/ppc/helper.h | 2 +-
target/ppc/fpu_helper.c | 25 +++++++++++--------------
2 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/target/ppc/helper.h b/target/ppc/helper.h
index 151437d8fc..7ddbc0fc19 100644
--- a/target/ppc/helper.h
+++ b/target/ppc/helper.h
@@ -87,7 +87,7 @@ DEF_HELPER_2(frim, i64, env, i64)
DEF_HELPER_3(fadd, i64, env, i64, i64)
DEF_HELPER_3(fsub, i64, env, i64, i64)
-DEF_HELPER_3(fmul, i64, env, i64, i64)
+DEF_HELPER_3(fmul, f64, env, f64, f64)
DEF_HELPER_3(fdiv, f64, env, f64, f64)
DEF_HELPER_4(fmadd, i64, env, i64, i64, i64)
DEF_HELPER_4(fmsub, i64, env, i64, i64, i64)
diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index 0df7e31c10..5642734b5b 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -627,27 +627,24 @@ uint64_t helper_fsub(CPUPPCState *env, uint64_t arg1,
uint64_t arg2)
}
/* fmul - fmul. */
-uint64_t helper_fmul(CPUPPCState *env, uint64_t arg1, uint64_t arg2)
+float64 helper_fmul(CPUPPCState *env, float64 arg1, float64 arg2)
{
- CPU_DoubleU farg1, farg2;
+ float64 ret = float64_mul(arg1, arg2, &env->fp_status);
+ int status = get_float_exception_flags(&env->fp_status);
- farg1.ll = arg1;
- farg2.ll = arg2;
-
- if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) ||
- (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) {
- /* Multiplication of zero by infinity */
- farg1.ll = float_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
- } else {
- if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
- float64_is_signaling_nan(farg2.d, &env->fp_status))) {
+ if (unlikely(status & float_flag_invalid)) {
+ if ((float64_is_infinity(arg1) && float64_is_zero(arg2)) ||
+ (float64_is_zero(arg1) && float64_is_infinity(arg2))) {
+ /* Multiplication of zero by infinity */
+ float_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
+ } else if (float64_is_signaling_nan(arg1, &env->fp_status) ||
+ float64_is_signaling_nan(arg2, &env->fp_status)) {
/* sNaN multiplication */
float_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
- farg1.d = float64_mul(farg1.d, farg2.d, &env->fp_status);
}
- return farg1.ll;
+ return ret;
}
/* fdiv - fdiv. */
--
2.17.1
- [Qemu-ppc] [PATCH for-3.1 0/7] target/ppc fp cleanups, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 1/7] target/ppc: Enable fp exceptions for user-only, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 2/7] target/ppc: Honor fpscr_ze semantics and tidy fdiv, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 4/7] target/ppc: Tidy helper_fadd, helper_fsub, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 3/7] target/ppc: Tidy helper_fmul,
Richard Henderson <=
- [Qemu-ppc] [PATCH 5/7] target/ppc: Tidy helper_fsqrt, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 6/7] target/ppc: Honor fpscr_ze semantics and tidy fre, fresqrt, Richard Henderson, 2018/07/03
- [Qemu-ppc] [PATCH 7/7] target/ppc: Use non-arithmetic conversions for fp load/store, Richard Henderson, 2018/07/03
Re: [Qemu-ppc] [PATCH for-3.1 0/7] target/ppc fp cleanups, David Gibson, 2018/07/04