The soft-fp __neg* functions use cooked unpacking and packing, meaning that signaling NaNs wrongly get converted to quiet NaNs (although they take care to avoid raising the "invalid" exception). (This isn't readily visible in that GCC will typically expand negation inline for soft-float rather than using these functions at all.)