From 56e0e961ec14f7f89f9d5f20e12b61b9510ed1ad Mon Sep 17 00:00:00 2001 From: Yasmin Beatriz Date: Mon, 16 Jul 2018 19:03:12 +0000 Subject: target/ppc: bcdsub fix sign when result is zero When the result of bcdsub is equal to zero, the result sign may be set to negative in some cases, and this does not follow the Power ISA specifications as to decimal integer arithmetic instructions. Signed-off-by: Yasmin Beatriz Signed-off-by: David Gibson --- target/ppc/int_helper.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'target/ppc/int_helper.c') diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c index d52338ed71..ac7f92d7ae 100644 --- a/target/ppc/int_helper.c +++ b/target/ppc/int_helper.c @@ -2747,6 +2747,9 @@ uint32_t helper_bcdadd(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t ps) result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgna, ps); zero = bcd_sub_mag(&result, a, b, &invalid, &overflow); cr = (sgna > 0) ? CRF_GT : CRF_LT; + } else if (bcd_cmp_mag(a, b) == 0) { + result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(0, ps); + zero = bcd_sub_mag(&result, b, a, &invalid, &overflow); } else { result.u8[BCD_DIG_BYTE(0)] = bcd_preferred_sgn(sgnb, ps); zero = bcd_sub_mag(&result, b, a, &invalid, &overflow); -- cgit v1.2.3