• Maciej W. Rozycki's avatar
    MIPS: math-emu: Make ABS.fmt and NEG.fmt arithmetic again · 232b6ec5
    Maciej W. Rozycki authored
    The ABS.fmt and NEG.fmt instructions have been specified as arithmetic
    in the MIPS architecture, which in particular implies handling NaN data
    in the usual way with qNaN bit patterns propagated unchanged and sNaN
    bit patterns signalling the usual IEEE 754 Invalid Operation exception
    and quieted by default.
    
    A series of changes applied over time to our implementation:
    
    c5033d78 [MIPS] ieee754[sd]p_neg workaround
    cea2be44 MIPS: Fix abs.[sd] and neg.[sd] emulation for NaN operands
    
    has led to the current situation where the sign bit is updated according
    to the operation requested even for NaN inputs.  This is according to
    these commits a workaround so that broken binaries produced by GCC
    disregarding the properties of these instructions have a chance to work.
    
    For sNaN inputs this remains within IEEE Std 754 as the standard leaves
    the choice of output qNaN bit patterns produced under the default
    Invalid Operation exception handling for individual sNaN input bit
    patterns to implementer's discretion, even though it still recommends as
    much NaN input information to be preserved in NaN outputs.
    
    For qNaN inputs however it violates the standard as it requires a qNaN
    input bit patterns to propagate unchanged to output.
    
    This is also unlike real MIPS FPU hardware behaves where sNaN and/or
    qNaN processing has been fully implemented with no Unimplemented
    Operation exception signalled.  Such hardware propagates any input qNaN
    bit pattern unchanged.  It also quiets any input sNaN bit pattern in an
    implementer-specific manner, for example the MIPS 74Kf processor returns
    the default qNaN pattern with the sign bit always clear and the Broadcom
    SB-1 and BMIPS5000 processors propagate the input sNaN bit pattern with
    the sign bit unchanged and the quiet bit first cleared in the trailing
    significand field and then the next lower bit set if clearing the quiet
    bit left the field with no other bit set.
    
    Especially the latter observation indicates the limited usefulness of
    the workaround as it will cover many hardware configurations, but not
    all of them, only making it harder to discover such broken binaries that
    need to be recompiled with GCC told to avoid the use of ABS.fmt and
    NEG.fmt instructions where non-arithmetic semantics is required by the
    algorithm used.
    
    Revert the damage done by the series of changes then, and take the
    opportunity to simplify implementation by calling `ieee754dp_sub' and
    `ieee754dp_add' as required and also the rounding mode set towards -Inf
    temporarily so that the sign of 0 is correctly handled.
    Signed-off-by: default avatarMaciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/9710/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    232b6ec5
dp_simple.c 1.34 KB