lkml.org 
[lkml]   [2013]   [Oct]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] math-emu: fix floating-point to integer unsigned saturation
    From: Joseph Myers <joseph@codesourcery.com>

    The math-emu macros _FP_TO_INT and _FP_TO_INT_ROUND are supposed to
    saturate their results for out-of-range arguments, except in the case
    rsigned == 2 (when instead the low bits of the result are taken).
    However, in the case rsigned == 0 (converting to unsigned integers),
    they mistakenly produce 0 for positive results and the maximum
    unsigned integer for negative results, the opposite of correct
    unsigned saturation. This patch fixes the logic.

    Signed-off-by: Joseph Myers <joseph@codesourcery.com>

    ---

    I intend to make the corresponding changes to the glibc/libgcc copy of
    this code, given that it would be desirable to resync the Linux and
    glibc/libgcc copies (the latter has had many enhancements and bug
    fixes since it was copied into Linux), although strictly this
    incorrect saturation is only a bug when trying to emulate particular
    instruction semantics, not when used in userspace to implement C
    operations where the results of out-of-range conversions are
    unspecified or undefined.

    diff --git a/include/math-emu/op-common.h b/include/math-emu/op-common.h
    index 9696a5e..70fe5e9 100644
    --- a/include/math-emu/op-common.h
    +++ b/include/math-emu/op-common.h
    @@ -685,7 +685,7 @@ do { \
    else \
    { \
    r = 0; \
    - if (X##_s) \
    + if (!X##_s) \
    r = ~r; \
    } \
    FP_SET_EXCEPTION(FP_EX_INVALID); \
    @@ -762,7 +762,7 @@ do { \
    if (!rsigned) \
    { \
    r = 0; \
    - if (X##_s) \
    + if (!X##_s) \
    r = ~r; \
    } \
    else if (rsigned != 2) \
    --
    Joseph S. Myers
    joseph@codesourcery.com


    \
     
     \ /
      Last update: 2013-10-09 01:21    [W:3.189 / U:1.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site