On 09/28/2011 10:27 AM, Peter Maydell wrote: > > /*---------------------------------------------------------------------------- > +| Select which NaN to propagate for a three-input operation. > +| For the moment we assume that no CPU needs the 'larger significand' > +| information. > +| Return values : 0 : a; 1 : b; 2 : c; 3 : default-NaN > +*----------------------------------------------------------------------------*/ > +#if defined(TARGET_ARM) > +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag > bIsSNaN, > + flag cIsQNaN, flag cIsSNaN, flag infzero > STATUS_PARAM) ... > +#elif defined(TARGET_PPC) > +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag > bIsSNaN, > + flag cIsQNaN, flag cIsSNaN, flag infzero > STATUS_PARAM) > +{
The function declaration should be outside the #if, so that the interface is forcibly consistent across the platforms. > + cSig64 = (uint64_t)cSig << 39; This might be more readable as << (62 - 23), since you've just mentioned the explicit bit at bit 62 above. > + if (pSign == cSign) { > + /* Addition */ ... > + shift64RightJamming(zSig64, 32, &zSig64); > + return roundAndPackFloat32(zSign, zExp, zSig64 STATUS_VAR); > + } else { > + /* Subtraction */ ... > + shift64RightJamming(zSig64, 32, &zSig64); > + return roundAndPackFloat32(zSign, zExp, zSig64 STATUS_VAR); > + } > +} Push those two calls down after the IF? Similar comments wrt float64_muladd. But I don't see any actual logic errors wrt the handling of any of the edge cases. r~