diff --git a/softfloat/source/s_mulAddF32.c b/softfloat/source/s_mulAddF32.c index 94c21eb..f324642 100644 --- a/softfloat/source/s_mulAddF32.c +++ b/softfloat/source/s_mulAddF32.c @@ -212,13 +212,18 @@ float32_t /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ zeroProd: - uiZ = (uiC & ~(1UL << 31)) | ((unsigned long)signC << 31); //set sign bit - if ( ! (expC | sigC) && (signProd != signC) ) { - completeCancellation: - uiZ = - packToF32UI( - (softfloat_roundingMode == softfloat_round_min), 0, 0 ); - uiZ = (uiZ & ~(1UL << 31)) | ((unsigned long)(signC|signProd) << 31); //set sign bit + if(expC | sigC){ + //3rd operand != 0 + uiZ = (uiC & ~(1UL << 31)) | ((unsigned long)(signC) << 31); //set sign bit + } + else { + //3rd operand == +-0 + if (signProd != signC) { + completeCancellation: + uiZ = packToF32UI((softfloat_roundingMode == softfloat_round_min), 0, 0 ); + goto uiZ; + } + uiZ = (uiC & ~(1UL << 31)) | ((unsigned long)signC << 31); //set sign bit } uiZ: uZ.ui = uiZ;