Print this page


Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/m9x/fmin.c
          +++ new/usr/src/lib/libm/common/m9x/fmin.c
↓ open down ↓ 33 lines elided ↑ open up ↑
  34   34  /*
  35   35   * fmin(x,y) returns the smaller of x and y.  If just one of the
  36   36   * arguments is NaN, fmin returns the other argument.  If both
  37   37   * arguments are NaN, fmin returns NaN.
  38   38   *
  39   39   * See fmaxf.c for a discussion of implementation trade-offs.
  40   40   */
  41   41  
  42   42  #include "libm.h"       /* for islessequal macro */
  43   43  
       44 +#include "fenv_inlines.h"
       45 +#include <stdio.h>
  44   46  #include <sys/isa_defs.h>
  45   47  
  46   48  double
  47   49  __fmin(double x, double y) {
  48   50          union {
  49   51                  unsigned i[2];
  50   52                  double d;
  51   53          } xx, yy;
  52   54          unsigned s;
  53      -
       55 +        
  54   56          /* if y is nan, replace it by x */
  55   57          if (y != y)
  56   58                  y = x;
  57   59  
  58   60          /* if x is nan, replace it by y */
  59   61          if (x != x)
  60   62                  x = y;
  61   63  
  62      -        /* if x is greater than y or x and y are unordered, replace x by y */
  63      -#if defined(COMPARISON_MACRO_BUG)
  64      -        if (x != x || x > y)
  65      -#else
  66      -        if (!islessequal(x, y))
  67      -#endif
       64 +        /* At this point, x and y are either both numeric, or both NaN */
       65 +        if (!isnan(x) && !islessequal(x, y))
  68   66                  x = y;
  69   67  
  70   68          /*
  71      -         * now x and y are either both NaN or both numeric; set the
  72      -         * sign of the result if either x or y has its sign set
       69 +         * set the sign of the result if either x or y has its sign set
  73   70           */
  74   71          xx.d = x;
  75   72          yy.d = y;
  76   73  #if defined(_BIG_ENDIAN)
  77   74          s = (xx.i[0] | yy.i[0]) & 0x80000000;
  78   75          xx.i[0] |= s;
  79   76  #else
  80   77          s = (xx.i[1] | yy.i[1]) & 0x80000000;
  81   78          xx.i[1] |= s;
  82   79  #endif
  83   80  
  84   81          return (xx.d);
  85   82  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX