Print this page
11210 libm should be cstyle(1ONBLD) clean

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libm/common/LD/hypotl.c
          +++ new/usr/src/lib/libm/common/LD/hypotl.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24   24   */
       25 +
  25   26  /*
  26   27   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  27   28   * Use is subject to license terms.
  28   29   */
  29   30  
  30   31  #pragma weak __hypotl = hypotl
  31   32  
  32   33  /*
  33   34   * hypotl(x,y)
  34   35   * Method :
↓ open down ↓ 10 lines elided ↑ open up ↑
  45   46   *      where t1 = 2x with lower 64 bits cleared, t2 = 2x-t1, y1= y with
  46   47   *      lower 32 bits cleared, y2 = y-y1.
  47   48   *
  48   49   *      NOTE: DO NOT remove parenthsis!
  49   50   *
  50   51   * Special cases:
  51   52   *      hypot(x,y) is INF if x or y is +INF or -INF; else
  52   53   *      hypot(x,y) is NAN if x or y is NAN.
  53   54   *
  54   55   * Accuracy:
  55      - *      hypot(x,y) returns sqrt(x^2+y^2) with error less than 1 ulps (units
       56 + *      hypot(x,y) returns sqrt(x^2+y^2) with error less than 1 ulps (units
  56   57   *      in the last place)
  57   58   */
  58   59  
  59   60  #include "libm.h"
  60   61  
  61   62  #if defined(__x86)
  62   63  extern enum fp_direction_type __swap87RD(enum fp_direction_type);
  63   64  
  64   65  #define k       0x7fff
  65   66  
  66   67  long double
  67      -hypotl(long double x, long double y) {
       68 +hypotl(long double x, long double y)
       69 +{
  68   70          long double t1, t2, y1, y2, w;
  69      -        int *px = (int *) &x, *py = (int *) &y;
  70      -        int *pt1 = (int *) &t1, *py1 = (int *) &y1;
       71 +        int *px = (int *)&x, *py = (int *)&y;
       72 +        int *pt1 = (int *)&t1, *py1 = (int *)&y1;
  71   73          enum fp_direction_type rd;
  72   74          int j, nx, ny, nz;
  73   75  
  74   76          px[2] &= 0x7fff;        /* clear sign bit and padding bits of x and y */
  75   77          py[2] &= 0x7fff;
  76   78          nx = px[2];             /* biased exponent of x and y */
  77   79          ny = py[2];
       80 +
  78   81          if (ny > nx) {
  79   82                  w = x;
  80   83                  x = y;
  81   84                  y = w;
  82   85                  nz = ny;
  83   86                  ny = nx;
  84   87                  nx = nz;
  85      -        }                       /* force nx >= ny */
       88 +        }                               /* force nx >= ny */
       89 +
  86   90          if (nx - ny >= 66)
  87   91                  return (x + y); /* x / y >= 2**65 */
       92 +
  88   93          if (nx < 0x5ff3 && ny > 0x205b) {       /* medium x,y */
  89   94                  /* save and set RD to Rounding to nearest */
  90   95                  rd = __swap87RD(fp_nearest);
  91   96                  w = x - y;
       97 +
  92   98                  if (w > y) {
  93   99                          pt1[2] = px[2];
  94  100                          pt1[1] = px[1];
  95  101                          pt1[0] = 0;
  96  102                          t2 = x - t1;
  97  103                          x = sqrtl(t1 * t1 - (y * (-y) - t2 * (x + t1)));
  98  104                  } else {
  99  105                          x += x;
 100  106                          py1[2] = py[2];
 101  107                          py1[1] = py[1];
 102  108                          py1[0] = 0;
 103  109                          y2 = y - y1;
 104  110                          pt1[2] = px[2];
 105  111                          pt1[1] = px[1];
 106  112                          pt1[0] = 0;
 107  113                          t2 = x - t1;
 108  114                          x = sqrtl(t1 * y1 - (w * (-w) - (t2 * y1 + y2 * x)));
 109  115                  }
      116 +
 110  117                  if (rd != fp_nearest)
 111      -                        __swap87RD(rd); /* restore rounding mode */
      118 +                        __swap87RD(rd);         /* restore rounding mode */
      119 +
 112  120                  return (x);
 113  121          } else {
 114  122                  if (nx == k || ny == k) {       /* x or y is INF or NaN */
 115  123                          /* since nx >= ny; nx is always k within this block */
 116  124                          if (px[1] == 0x80000000 && px[0] == 0)
 117  125                                  return (x);
 118  126                          else if (ny == k && py[1] == 0x80000000 && py[0] == 0)
 119  127                                  return (y);
 120  128                          else
 121  129                                  return (x + y);
 122  130                  }
      131 +
 123  132                  if (ny == 0) {
 124  133                          if (y == 0.L || x == 0.L)
 125  134                                  return (x + y);
      135 +
 126  136                          pt1[2] = 0x3fff + 16381;
 127  137                          pt1[1] = 0x80000000;
 128  138                          pt1[0] = 0;
 129  139                          py1[2] = 0x3fff - 16381;
 130  140                          py1[1] = 0x80000000;
 131  141                          py1[0] = 0;
 132  142                          x *= t1;
 133  143                          y *= t1;
 134  144                          return (y1 * hypotl(x, y));
 135  145                  }
      146 +
 136  147                  j = nx - 0x3fff;
 137  148                  px[2] -= j;
 138  149                  py[2] -= j;
 139  150                  pt1[2] = nx;
 140  151                  pt1[1] = 0x80000000;
 141  152                  pt1[0] = 0;
 142  153                  return (t1 * hypotl(x, y));
 143  154          }
 144  155  }
 145  156  #endif
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX