Print this page
    
5261 libm should stop using synonyms.h
5298 fabs is 0-sized, confuses dis(1) and others
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Approved by: Gordon Ross <gwr@nexenta.com>
    
      
        | Split | Close | 
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/lib/libm/common/R/floorf.c
          +++ new/usr/src/lib/libm/common/R/floorf.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  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
  
    | ↓ open down ↓ | 19 lines elided | ↑ open up ↑ | 
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24   24   */
  25   25  /*
  26   26   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  27   27   * Use is subject to license terms.
  28   28   */
  29   29  
  30      -#pragma weak ceilf = __ceilf
  31      -#pragma weak floorf = __floorf
       30 +#pragma weak __ceilf = ceilf
       31 +#pragma weak __floorf = floorf
  32   32  
  33   33  /* INDENT OFF */
  34   34  /*
  35   35   * ceilf(x)     return the biggest integral value (in float) below x
  36   36   * floorf(x)    return the least integral value (in float) above x
  37   37   *
  38   38   * NOTE: ceilf(x) and floorf(x) return result
  39   39   * with the same sign as x's,  including 0.0F.
  40   40   */
  41   41  
  42   42  #include "libm.h"
  43   43  
  44   44  static const float xf[] = {
  45   45  /* ZEROF */     0.0f,
  46   46  /* ONEF */      1.0f,
  47   47  /* MONEF */     -1.0f,
  48   48  /* HUGEF */     1.0e30f,
  49   49  };
  50   50  
  51   51  #define ZEROF   xf[0]
  52   52  #define ONEF    xf[1]
  53   53  #define MONEF   xf[2]
  54   54  #define HUGEF   xf[3]
  55   55  /* INDENT ON */
  56   56  
  57   57  float
  58   58  ceilf(float x) {
  59   59          volatile float dummy;
  60   60          int hx, k, j, ix;
  61   61  
  62   62          hx = *(int *) &x;
  63   63          ix = hx & ~0x80000000;
  64   64          k = ix >> 23;
  65   65          if (((k - 127) ^ (k - 150)) < 0) {
  66   66                  k = (1 << (150 - k)) - 1;
  67   67                  if ((k & hx) != 0)
  68   68                          dummy = HUGEF + x;      /* raise inexact */
  69   69                  j = k & (~(hx >> 31));
  70   70                  *(int *) &x = (hx + j) & ~k;
  71   71                  return (x);
  72   72          } else if (k <= 126) {
  73   73                  dummy = HUGEF + x;
  74   74                  if (hx > 0)
  75   75                          return (ONEF);
  76   76                  else if (ix == 0)
  77   77                          return (x);
  78   78                  else
  79   79                          return (-ZEROF);
  80   80          } else
  81   81                  /* signal invalid if x is a SNaN */
  82   82                  return (x * ONEF);              /* +0 -> *1 for Cheetah */
  83   83  }
  84   84  
  85   85  float
  86   86  floorf(float x) {
  87   87          volatile float dummy;
  88   88          int hx, k, j, ix;
  89   89  
  90   90          hx = *(int *) &x;
  91   91          ix = hx & ~0x80000000;
  92   92          k = ix >> 23;
  93   93          if (((k - 127) ^ (k - 150)) < 0) {
  94   94                  k = (1 << (150 - k)) - 1;
  95   95                  if ((k & hx) != 0)
  96   96                          dummy = HUGEF + x;      /* raise inexact */
  97   97                  j = k & (hx >> 31);
  98   98                  *(int *) &x = (hx + j) & ~k;
  99   99                  return (x);
 100  100          } else if (k <= 126) {
 101  101                  dummy = HUGEF + x;
 102  102                  if (hx > 0)
 103  103                          return (ZEROF);
 104  104                  else if (ix == 0)
 105  105                          return (x);
 106  106                  else
 107  107                          return (MONEF);
 108  108          } else
 109  109                  /* signal invalid if x is a SNaN */
 110  110                  return (x * ONEF);              /* +0 -> *1 for Cheetah */
 111  111  }
  
    | ↓ open down ↓ | 70 lines elided | ↑ open up ↑ | 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX