1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  24  */
  25 /*
  26  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  27  * Use is subject to license terms.
  28  */
  29 
  30 #include "libm_inlines.h"
  31 
  32 #ifdef __RESTRICT
  33 #define restrict _Restrict
  34 #else
  35 #define restrict
  36 #endif
  37 
  38 extern double sqrt(double);
  39 
  40 void
  41 __vhypotf(int n, float * restrict x, int stridex, float * restrict y,
  42         int stridey, float * restrict z, int stridez)
  43 {
  44         float           x0, x1, x2, y0, y1, y2, z0, z1, z2, *pz0, *pz1, *pz2;
  45         unsigned        hx0, hx1, hx2, hy0, hy1, hy2;
  46         int                     i, j0, j1, j2;
  47 
  48         do
  49         {
  50 LOOP0:
  51                 hx0 = *(unsigned*)x & ~0x80000000;
  52                 hy0 = *(unsigned*)y & ~0x80000000;
  53                 *(unsigned*)&x0 = hx0;
  54                 *(unsigned*)&y0 = hy0;
  55                 if (hy0 > hx0)
  56                 {
  57                         i = hy0 - hx0;
  58                         j0 = hy0 & 0x7f800000;
  59                         if (hx0 == 0)
  60                                 i = 0x7f800000;
  61                 }
  62                 else
  63                 {
  64                         i = hx0 - hy0;
  65                         j0 = hx0 & 0x7f800000;
  66                         if (hy0 == 0)
  67                                 i = 0x7f800000;
  68                         else if (hx0 == 0)
  69                                 i = 0x7f800000;
  70                 }
  71                 if (i >= 0x0c800000 || j0 >= 0x7f800000)
  72                 {
  73                         z0 = x0 + y0;
  74                         if (hx0 == 0x7f800000)
  75                                 z0 = x0;
  76                         else if (hy0  == 0x7f800000)
  77                                 z0 = y0;
  78                         else if (hx0 > 0x7f800000 || hy0 > 0x7f800000)
  79                                 z0 = *x + *y;
  80                         *z = z0;
  81                         x += stridex;
  82                         y += stridey;
  83                         z += stridez;
  84                         i = 0;
  85                         if (--n <= 0)
  86                                 break;
  87                         goto LOOP0;
  88                 }
  89                 pz0 = z;
  90                 x += stridex;
  91                 y += stridey;
  92                 z += stridez;
  93                 i = 1;
  94                 if (--n <= 0)
  95                         break;
  96 
  97 LOOP1:
  98                 hx1 = *(unsigned*)x & ~0x80000000;
  99                 hy1 = *(unsigned*)y & ~0x80000000;
 100                 *(unsigned*)&x1 = hx1;
 101                 *(unsigned*)&y1 = hy1;
 102                 if (hy1 > hx1)
 103                 {
 104                         i = hy1 - hx1;
 105                         j1 = hy1 & 0x7f800000;
 106                         if (hx1 == 0)
 107                                 i = 0x7f800000;
 108                 }
 109                 else
 110                 {
 111                         i = hx1 - hy1;
 112                         j1 = hx1 & 0x7f800000;
 113                         if (hy1 == 0)
 114                                 i = 0x7f800000;
 115                         else if (hx1 == 0)
 116                                 i = 0x7f800000;
 117                 }
 118                 if (i >= 0x0c800000 || j1 >= 0x7f800000)
 119                 {
 120                         z1 = x1 + y1;
 121                         if (hx1 == 0x7f800000)
 122                                 z1 = x1;
 123                         else if (hy1 == 0x7f800000)
 124                                 z1 = y1;
 125                         else if (hx1 > 0x7f800000 || hy1 > 0x7f800000)
 126                                 z1 = *x + *y;
 127                         *z = z1;
 128                         x += stridex;
 129                         y += stridey;
 130                         z += stridez;
 131                         i = 1;
 132                         if (--n <= 0)
 133                                 break;
 134                         goto LOOP1;
 135                 }
 136                 pz1 = z;
 137                 x += stridex;
 138                 y += stridey;
 139                 z += stridez;
 140                 i = 2;
 141                 if (--n <= 0)
 142                         break;
 143 
 144 LOOP2:
 145                 hx2 = *(unsigned*)x & ~0x80000000;
 146                 hy2 = *(unsigned*)y & ~0x80000000;
 147                 *(unsigned*)&x2 = hx2;
 148                 *(unsigned*)&y2 = hy2;
 149                 if (hy2 > hx2)
 150                 {
 151                         i = hy2 - hx2;
 152                         j2 = hy2 & 0x7f800000;
 153                         if (hx2 == 0)
 154                                 i = 0x7f800000;
 155                 }
 156                 else
 157                 {
 158                         i = hx2 - hy2;
 159                         j2 = hx2 & 0x7f800000;
 160                         if (hy2 == 0)
 161                                 i = 0x7f800000;
 162                         else if (hx2 == 0)
 163                                 i = 0x7f800000;
 164                 }
 165                 if (i >= 0x0c800000 || j2 >= 0x7f800000)
 166                 {
 167                         z2 = x2 + y2;
 168                         if (hx2 == 0x7f800000)
 169                                 z2 = x2;
 170                         else if (hy2 == 0x7f800000)
 171                                 z2 = y2;
 172                         else if (hx2 > 0x7f800000 || hy2 > 0x7f800000)
 173                                 z2 = *x + *y;
 174                         *z = z2;
 175                         x += stridex;
 176                         y += stridey;
 177                         z += stridez;
 178                         i = 2;
 179                         if (--n <= 0)
 180                                 break;
 181                         goto LOOP2;
 182                 }
 183                 pz2 = z;
 184 
 185                 z0 = sqrt(x0 * (double)x0 + y0 * (double)y0);
 186                 z1 = sqrt(x1 * (double)x1 + y1 * (double)y1);
 187                 z2 = sqrt(x2 * (double)x2 + y2 * (double)y2);
 188                 *pz0 = z0;
 189                 *pz1 = z1;
 190                 *pz2 = z2;
 191 
 192                 x += stridex;
 193                 y += stridey;
 194                 z += stridez;
 195                 i = 0;
 196         } while (--n > 0);
 197 
 198         if (i > 0)
 199         {
 200                 if (i > 1)
 201                 {
 202                         z1 = sqrt(x1 * (double)x1 + y1 * (double)y1);
 203                         *pz1 = z1;
 204                 }
 205                 z0 = sqrt(x0 * (double)x0 + y0 * (double)y0);
 206                 *pz0 = z0;
 207         }
 208 }