[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/34] target/ppc: Fix FPSCR.FI changing in float_overflow_excp()
From: |
Daniel Henrique Barboza |
Subject: |
[PULL 08/34] target/ppc: Fix FPSCR.FI changing in float_overflow_excp() |
Date: |
Thu, 26 May 2022 18:37:49 -0300 |
From: Víctor Colombo <victor.colombo@eldorado.org.br>
This patch fixes another not-so-clear situation in Power ISA
regarding the inexact bits in FPSCR. The ISA states that:
"""
When Overflow Exception is disabled (OE=0) and an
Overflow Exception occurs, the following actions are
taken:
...
2. Inexact Exception is set
XX <- 1
...
FI is set to 1
...
"""
However, when tested on a Power 9 hardware, some instructions that
trigger an OX don't set the FI bit:
xvcvdpsp(0x4050533fcdb7b95ff8d561c40bf90996) = FI: CLEARED -> CLEARED
xvnmsubmsp(0xf3c0c1fc8f3230, 0xbeaab9c5) = FI: CLEARED -> CLEARED
(just a few examples. Other instructions are also affected)
The root cause for this seems to be that only instructions that list
the bit FI in the "Special Registers Altered" should modify it.
QEMU is, today, not working like the hardware:
xvcvdpsp(0x4050533fcdb7b95ff8d561c40bf90996) = FI: CLEARED -> SET
xvnmsubmsp(0xf3c0c1fc8f3230, 0xbeaab9c5) = FI: CLEARED -> SET
(all tests assume FI is cleared beforehand)
Fix this by making float_overflow_excp() return float_flag_inexact
if it should update the inexact flags.
Signed-off-by: Víctor Colombo <victor.colombo@eldorado.org.br>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>
Message-Id: <20220517161522.36132-3-victor.colombo@eldorado.org.br>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
target/ppc/fpu_helper.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index f1ea4aa10e..88f9e756a5 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -329,24 +329,25 @@ static inline void float_zero_divide_excp(CPUPPCState
*env, uintptr_t raddr)
}
}
-static inline void float_overflow_excp(CPUPPCState *env)
+static inline int float_overflow_excp(CPUPPCState *env)
{
CPUState *cs = env_cpu(env);
env->fpscr |= FP_OX;
/* Update the floating-point exception summary */
env->fpscr |= FP_FX;
- if (env->fpscr & FP_OE) {
+
+ bool overflow_enabled = !!(env->fpscr & FP_OE);
+ if (overflow_enabled) {
/* XXX: should adjust the result */
/* Update the floating-point enabled exception summary */
env->fpscr |= FP_FEX;
/* We must update the target FPR before raising the exception */
cs->exception_index = POWERPC_EXCP_PROGRAM;
env->error_code = POWERPC_EXCP_FP | POWERPC_EXCP_FP_OX;
- } else {
- env->fpscr |= FP_XX;
- env->fpscr |= FP_FI;
}
+
+ return overflow_enabled ? 0 : float_flag_inexact;
}
static inline void float_underflow_excp(CPUPPCState *env)
@@ -468,7 +469,7 @@ static void do_float_check_status(CPUPPCState *env, bool
change_fi,
int status = get_float_exception_flags(&env->fp_status);
if (status & float_flag_overflow) {
- float_overflow_excp(env);
+ status |= float_overflow_excp(env);
} else if (status & float_flag_underflow) {
float_underflow_excp(env);
}
--
2.36.1
- [PULL 00/34] ppc queue, Daniel Henrique Barboza, 2022/05/26
- [PULL 01/34] pseries: allow setting stdout-path even on machines with a VGA, Daniel Henrique Barboza, 2022/05/26
- [PULL 02/34] hw/ppc/e500: Remove unused BINARY_DEVICE_TREE_FILE, Daniel Henrique Barboza, 2022/05/26
- [PULL 03/34] spapr: Use address from elf parser for kernel address, Daniel Henrique Barboza, 2022/05/26
- [PULL 04/34] spapr/docs: Add a few words about x-vof, Daniel Henrique Barboza, 2022/05/26
- [PULL 05/34] mos6522: fix linking error when CONFIG_MOS6522 is not set, Daniel Henrique Barboza, 2022/05/26
- [PULL 06/34] target/ppc: Fix tlbie, Daniel Henrique Barboza, 2022/05/26
- [PULL 07/34] target/ppc: Fix FPSCR.FI bit being cleared when it shouldn't, Daniel Henrique Barboza, 2022/05/26
- [PULL 09/34] target/ppc: Rename sfprf to sfifprf where it's also used as set fi flag, Daniel Henrique Barboza, 2022/05/26
- [PULL 10/34] pnv/xive2: Don't overwrite PC registers when writing TCTXT registers, Daniel Henrique Barboza, 2022/05/26
- [PULL 08/34] target/ppc: Fix FPSCR.FI changing in float_overflow_excp(),
Daniel Henrique Barboza <=
- [PULL 11/34] target/ppc: declare darn32/darn64 helpers with TCG_CALL_NO_RWG, Daniel Henrique Barboza, 2022/05/26
- [PULL 13/34] target/ppc: use TCG_CALL_NO_RWG in BCD helpers, Daniel Henrique Barboza, 2022/05/26
- [PULL 15/34] target/ppc: Use TCG_CALL_NO_RWG_SE in fsel helper, Daniel Henrique Barboza, 2022/05/26
- [PULL 19/34] target/ppc: introduce do_va_helper, Daniel Henrique Barboza, 2022/05/26
- [PULL 20/34] target/ppc: declare vmsum[um]bm helpers with call flags, Daniel Henrique Barboza, 2022/05/26
- [PULL 12/34] target/ppc: use TCG_CALL_NO_RWG in vector helpers without env, Daniel Henrique Barboza, 2022/05/26
- [PULL 14/34] target/ppc: use TCG_CALL_NO_RWG in VSX helpers without env, Daniel Henrique Barboza, 2022/05/26
- [PULL 16/34] target/ppc: declare xscvspdpn helper with call flags, Daniel Henrique Barboza, 2022/05/26
- [PULL 25/34] tcg/ppc: Optimize memory ordering generation with lwsync, Daniel Henrique Barboza, 2022/05/26
- [PULL 17/34] target/ppc: declare xvxsigsp helper with call flags, Daniel Henrique Barboza, 2022/05/26