INLINE floatx80 propagateFloatx80NaNOneArg(floatx80 a) { if (floatx80_is_signaling_nan(a)) float_raise(float_flag_invalid); a.low |= U64(0xC000000000000000); return a; }
static floatx80 propagateFloatx80NaNOneArg(floatx80 a, float_status *status) { if (floatx80_is_signaling_nan(a, status)) { float_raise(float_flag_invalid, status); } if (status->default_nan_mode) { return floatx80_default_nan(status); } return floatx80_maybe_silence_nan(a, status); }
static floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b) { int aIsNaN = floatx80_is_nan(a); int aIsSignalingNaN = floatx80_is_signaling_nan(a); int bIsNaN = floatx80_is_nan(b); int bIsSignalingNaN = floatx80_is_signaling_nan(b); a.low |= U64(0xC000000000000000); b.low |= U64(0xC000000000000000); if (aIsSignalingNaN | bIsSignalingNaN) float_raise(float_flag_invalid); if (aIsSignalingNaN) { if (bIsSignalingNaN) goto returnLargerSignificand; return bIsNaN ? b : a; } else if (aIsNaN) { if (bIsSignalingNaN | ! bIsNaN) return a; returnLargerSignificand: if (a.low < b.low) return b; if (b.low < a.low) return a; return (a.high < b.high) ? a : b; } else { return b; } }