[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 05/26] target/ppc: Tidy helper_fmul
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 05/26] target/ppc: Tidy helper_fmul |
Date: |
Tue, 21 Aug 2018 14:33:22 +1000 |
From: Richard Henderson <address@hidden>
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>
Signed-off-by: David Gibson <address@hidden>
---
target/ppc/fpu_helper.c | 25 +++++++++++--------------
target/ppc/helper.h | 2 +-
2 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index c20b9ae672..b9ee46eb5f 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -635,27 +635,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;
-
- farg1.ll = arg1;
- farg2.ll = arg2;
+ float64 ret = float64_mul(arg1, arg2, &env->fp_status);
+ int status = get_float_exception_flags(&env->fp_status);
- 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. */
diff --git a/target/ppc/helper.h b/target/ppc/helper.h
index 1c453fa0f7..e4f7c55db9 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)
--
2.17.1
- [Qemu-ppc] [PULL 04/26] target/ppc: Honor fpscr_ze semantics and tidy fdiv, (continued)
- [Qemu-ppc] [PULL 04/26] target/ppc: Honor fpscr_ze semantics and tidy fdiv, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 14/26] spapr: Add a pseries-3.1 machine type, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 03/26] target/ppc: Enable fp exceptions for user-only, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 23/26] mac_oldworld: don't use legacy fw_cfg_init_mem() function, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 24/26] mac_newworld: don't use legacy fw_cfg_init_mem() function, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 06/26] target/ppc: Tidy helper_fadd, helper_fsub, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 17/26] hw/ppc/ppc_boards: Don't use old_mmio for ref405ep_fpga, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 12/26] xics: don't include "target/ppc/cpu-qom.h" in "hw/ppc/xics.h", David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 13/26] target/ppc: simplify bcdadd/sub functions, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 08/26] target/ppc: Honor fpscr_ze semantics and tidy fre, fresqrt, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 05/26] target/ppc: Tidy helper_fmul,
David Gibson <=
- [Qemu-ppc] [PULL 20/26] hw/ppc: deprecate the machine type 'prep', replaced by '40p', David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 18/26] hw/ppc/ppc405_uc: Convert away from old_mmio, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 22/26] 40p: don't use legacy fw_cfg_init_mem() function, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 16/26] hw/ppc/prep: Remove ifdeffed-out stub of XCSR code, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 26/26] ppc: add DBCR based debugging, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 19/26] spapr: introduce a IRQ controller backend to the machine, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 15/26] spapr: introduce a fixed IRQ number space, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 09/26] target/ppc: Use non-arithmetic conversions for fp load/store, David Gibson, 2018/08/21
- [Qemu-ppc] [PULL 25/26] spapr_pci: factorize the use of SPAPR_MACHINE_GET_CLASS(), David Gibson, 2018/08/21