1*25c28e83SPiotr Jasiukajtis /* 2*25c28e83SPiotr Jasiukajtis * CDDL HEADER START 3*25c28e83SPiotr Jasiukajtis * 4*25c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 5*25c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 6*25c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 7*25c28e83SPiotr Jasiukajtis * 8*25c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*25c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 10*25c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 11*25c28e83SPiotr Jasiukajtis * and limitations under the License. 12*25c28e83SPiotr Jasiukajtis * 13*25c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 14*25c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*25c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 16*25c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 17*25c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 18*25c28e83SPiotr Jasiukajtis * 19*25c28e83SPiotr Jasiukajtis * CDDL HEADER END 20*25c28e83SPiotr Jasiukajtis */ 21*25c28e83SPiotr Jasiukajtis 22*25c28e83SPiotr Jasiukajtis /* 23*25c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*25c28e83SPiotr Jasiukajtis * Use is subject to license terms. 25*25c28e83SPiotr Jasiukajtis */ 26*25c28e83SPiotr Jasiukajtis 27*25c28e83SPiotr Jasiukajtis /* 28*25c28e83SPiotr Jasiukajtis * Copyright 2011, Richard Lowe. 29*25c28e83SPiotr Jasiukajtis */ 30*25c28e83SPiotr Jasiukajtis 31*25c28e83SPiotr Jasiukajtis /* Functions in this file are duplicated in locallibm.il. Keep them in sync */ 32*25c28e83SPiotr Jasiukajtis 33*25c28e83SPiotr Jasiukajtis #ifndef _LIBM_INLINES_H 34*25c28e83SPiotr Jasiukajtis #define _LIBM_INLINES_H 35*25c28e83SPiotr Jasiukajtis 36*25c28e83SPiotr Jasiukajtis #ifdef __GNUC__ 37*25c28e83SPiotr Jasiukajtis 38*25c28e83SPiotr Jasiukajtis #include <sys/types.h> 39*25c28e83SPiotr Jasiukajtis #include <sys/ieeefp.h> 40*25c28e83SPiotr Jasiukajtis 41*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus 42*25c28e83SPiotr Jasiukajtis extern "C" { 43*25c28e83SPiotr Jasiukajtis #endif 44*25c28e83SPiotr Jasiukajtis 45*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_class_type 46*25c28e83SPiotr Jasiukajtis fp_classf(float f) 47*25c28e83SPiotr Jasiukajtis { 48*25c28e83SPiotr Jasiukajtis enum fp_class_type ret; 49*25c28e83SPiotr Jasiukajtis int fint; /* scratch for f as int */ 50*25c28e83SPiotr Jasiukajtis uint64_t tmp; 51*25c28e83SPiotr Jasiukajtis 52*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 53*25c28e83SPiotr Jasiukajtis "fabss %3,%3\n\t" 54*25c28e83SPiotr Jasiukajtis "st %3,%1\n\t" 55*25c28e83SPiotr Jasiukajtis "ld %1,%0\n\t" 56*25c28e83SPiotr Jasiukajtis "orcc %%g0,%0,%%g0\n\t" 57*25c28e83SPiotr Jasiukajtis "be,pn %%icc,2f\n\t" 58*25c28e83SPiotr Jasiukajtis "nop\n\t" 59*25c28e83SPiotr Jasiukajtis "1:\n\t" 60*25c28e83SPiotr Jasiukajtis "sethi %%hi(0x7f800000),%2\n\t" 61*25c28e83SPiotr Jasiukajtis "andcc %0,%2,%%g0\n\t" 62*25c28e83SPiotr Jasiukajtis "bne,pt %%icc,1f\n\t" 63*25c28e83SPiotr Jasiukajtis "nop\n\t" 64*25c28e83SPiotr Jasiukajtis "or %%g0,1,%0\n\t" 65*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" /* subnormal */ 66*25c28e83SPiotr Jasiukajtis "nop\n\t" 67*25c28e83SPiotr Jasiukajtis "1:\n\t" 68*25c28e83SPiotr Jasiukajtis "subcc %0,%2,%%g0\n\t" 69*25c28e83SPiotr Jasiukajtis "bge,pn %%icc,1f\n\t" 70*25c28e83SPiotr Jasiukajtis "nop\n\t" 71*25c28e83SPiotr Jasiukajtis "or %%g0,2,%0\n\t" 72*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" /* normal */ 73*25c28e83SPiotr Jasiukajtis "nop\n\t" 74*25c28e83SPiotr Jasiukajtis "1:\n\t" 75*25c28e83SPiotr Jasiukajtis "bg,pn %%icc,1f\n\t" 76*25c28e83SPiotr Jasiukajtis "nop\n\t" 77*25c28e83SPiotr Jasiukajtis "or %%g0,3,%0\n\t" 78*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" /* infinity */ 79*25c28e83SPiotr Jasiukajtis "nop\n\t" 80*25c28e83SPiotr Jasiukajtis "1:\n\t" 81*25c28e83SPiotr Jasiukajtis "sethi %%hi(0x00400000),%2\n\t" 82*25c28e83SPiotr Jasiukajtis "andcc %0,%2,%%g0\n\t" 83*25c28e83SPiotr Jasiukajtis "or %%g0,4,%0\n\t" 84*25c28e83SPiotr Jasiukajtis "bne,pt %%icc,2f\n\t" /* quiet NaN */ 85*25c28e83SPiotr Jasiukajtis "nop\n\t" 86*25c28e83SPiotr Jasiukajtis "or %%g0,5,%0\n\t" /* signalling NaN */ 87*25c28e83SPiotr Jasiukajtis "2:\n\t" 88*25c28e83SPiotr Jasiukajtis : "=r" (ret), "=m" (fint), "=r" (tmp), "+f" (f) 89*25c28e83SPiotr Jasiukajtis : 90*25c28e83SPiotr Jasiukajtis : "cc"); 91*25c28e83SPiotr Jasiukajtis 92*25c28e83SPiotr Jasiukajtis return (ret); 93*25c28e83SPiotr Jasiukajtis } 94*25c28e83SPiotr Jasiukajtis 95*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_class_type 96*25c28e83SPiotr Jasiukajtis fp_class(double d) 97*25c28e83SPiotr Jasiukajtis { 98*25c28e83SPiotr Jasiukajtis enum fp_class_type ret; 99*25c28e83SPiotr Jasiukajtis uint64_t dint; /* Scratch for d-as-long */ 100*25c28e83SPiotr Jasiukajtis uint64_t tmp; 101*25c28e83SPiotr Jasiukajtis 102*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 103*25c28e83SPiotr Jasiukajtis "fabsd %3,%3\n\t" 104*25c28e83SPiotr Jasiukajtis "std %3,%1\n\t" 105*25c28e83SPiotr Jasiukajtis "ldx %1,%0\n\t" 106*25c28e83SPiotr Jasiukajtis "orcc %%g0,%0,%%g0\n\t" 107*25c28e83SPiotr Jasiukajtis "be,pn %%xcc,2f\n\t" 108*25c28e83SPiotr Jasiukajtis "nop\n\t" 109*25c28e83SPiotr Jasiukajtis "sethi %%hi(0x7ff00000),%2\n\t" 110*25c28e83SPiotr Jasiukajtis "sllx %2,32,%2\n\t" 111*25c28e83SPiotr Jasiukajtis "andcc %0,%2,%%g0\n\t" 112*25c28e83SPiotr Jasiukajtis "bne,pt %%xcc,1f\n\t" 113*25c28e83SPiotr Jasiukajtis "nop\n\t" 114*25c28e83SPiotr Jasiukajtis "or %%g0,1,%0\n\t" 115*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" 116*25c28e83SPiotr Jasiukajtis "nop\n\t" 117*25c28e83SPiotr Jasiukajtis "1:\n\t" 118*25c28e83SPiotr Jasiukajtis "subcc %0,%2,%%g0\n\t" 119*25c28e83SPiotr Jasiukajtis "bge,pn %%xcc,1f\n\t" 120*25c28e83SPiotr Jasiukajtis "nop\n\t" 121*25c28e83SPiotr Jasiukajtis "or %%g0,2,%0\n\t" 122*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" 123*25c28e83SPiotr Jasiukajtis "nop\n\t" 124*25c28e83SPiotr Jasiukajtis "1:\n\t" 125*25c28e83SPiotr Jasiukajtis "andncc %0,%2,%0\n\t" 126*25c28e83SPiotr Jasiukajtis "bne,pn %%xcc,1f\n\t" 127*25c28e83SPiotr Jasiukajtis "nop\n\t" 128*25c28e83SPiotr Jasiukajtis "or %%g0,3,%0\n\t" 129*25c28e83SPiotr Jasiukajtis "ba 2f\n\t" 130*25c28e83SPiotr Jasiukajtis "nop\n\t" 131*25c28e83SPiotr Jasiukajtis "1:\n\t" 132*25c28e83SPiotr Jasiukajtis "sethi %%hi(0x00080000),%2\n\t" 133*25c28e83SPiotr Jasiukajtis "sllx %2,32,%2\n\t" 134*25c28e83SPiotr Jasiukajtis "andcc %0,%2,%%g0\n\t" 135*25c28e83SPiotr Jasiukajtis "or %%g0,4,%0\n\t" 136*25c28e83SPiotr Jasiukajtis "bne,pt %%xcc,2f\n\t" 137*25c28e83SPiotr Jasiukajtis "nop\n\t" 138*25c28e83SPiotr Jasiukajtis "or %%g0,5,%0\n\t" 139*25c28e83SPiotr Jasiukajtis "2:\n\t" 140*25c28e83SPiotr Jasiukajtis : "=r" (ret), "=m" (dint), "=r" (tmp), "+e" (d) 141*25c28e83SPiotr Jasiukajtis : 142*25c28e83SPiotr Jasiukajtis : "cc"); 143*25c28e83SPiotr Jasiukajtis 144*25c28e83SPiotr Jasiukajtis return (ret); 145*25c28e83SPiotr Jasiukajtis } 146*25c28e83SPiotr Jasiukajtis 147*25c28e83SPiotr Jasiukajtis extern __inline__ float 148*25c28e83SPiotr Jasiukajtis __inline_sqrtf(float f) 149*25c28e83SPiotr Jasiukajtis { 150*25c28e83SPiotr Jasiukajtis float ret; 151*25c28e83SPiotr Jasiukajtis 152*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fsqrts %1,%0\n\t" : "=f" (ret) : "f" (f)); 153*25c28e83SPiotr Jasiukajtis return (ret); 154*25c28e83SPiotr Jasiukajtis } 155*25c28e83SPiotr Jasiukajtis 156*25c28e83SPiotr Jasiukajtis extern __inline__ double 157*25c28e83SPiotr Jasiukajtis __inline_sqrt(double d) 158*25c28e83SPiotr Jasiukajtis { 159*25c28e83SPiotr Jasiukajtis double ret; 160*25c28e83SPiotr Jasiukajtis 161*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fsqrtd %1,%0\n\t" : "=f" (ret) : "f" (d)); 162*25c28e83SPiotr Jasiukajtis return (ret); 163*25c28e83SPiotr Jasiukajtis } 164*25c28e83SPiotr Jasiukajtis 165*25c28e83SPiotr Jasiukajtis extern __inline__ int 166*25c28e83SPiotr Jasiukajtis __swapEX(int i) 167*25c28e83SPiotr Jasiukajtis { 168*25c28e83SPiotr Jasiukajtis int ret; 169*25c28e83SPiotr Jasiukajtis uint32_t fsr; 170*25c28e83SPiotr Jasiukajtis uint64_t tmp1, tmp2; 171*25c28e83SPiotr Jasiukajtis 172*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 173*25c28e83SPiotr Jasiukajtis "and %4,0x1f,%2\n\t" 174*25c28e83SPiotr Jasiukajtis "sll %2,5,%2\n\t" /* shift input to aexc bit location */ 175*25c28e83SPiotr Jasiukajtis ".volatile\n\t" 176*25c28e83SPiotr Jasiukajtis "st %%fsr,%1\n\t" 177*25c28e83SPiotr Jasiukajtis "ld %1,%0\n\t" /* %0 = fsr */ 178*25c28e83SPiotr Jasiukajtis "andn %0,0x3e0,%3\n\t" 179*25c28e83SPiotr Jasiukajtis "or %2,%3,%2\n\t" /* %2 = new fsr */ 180*25c28e83SPiotr Jasiukajtis "st %2,%1\n\t" 181*25c28e83SPiotr Jasiukajtis "ld %1,%%fsr\n\t" 182*25c28e83SPiotr Jasiukajtis "srl %0,5,%0\n\t" 183*25c28e83SPiotr Jasiukajtis "and %0,0x1f,%0\n\t" 184*25c28e83SPiotr Jasiukajtis ".nonvolatile\n\t" 185*25c28e83SPiotr Jasiukajtis : "=r" (ret), "=m" (fsr), "=r" (tmp1), "=r" (tmp2) 186*25c28e83SPiotr Jasiukajtis : "r" (i) 187*25c28e83SPiotr Jasiukajtis : "cc"); 188*25c28e83SPiotr Jasiukajtis 189*25c28e83SPiotr Jasiukajtis return (ret); 190*25c28e83SPiotr Jasiukajtis } 191*25c28e83SPiotr Jasiukajtis 192*25c28e83SPiotr Jasiukajtis /* 193*25c28e83SPiotr Jasiukajtis * On the SPARC, __swapRP is a no-op; always return 0 for backward 194*25c28e83SPiotr Jasiukajtis * compatibility 195*25c28e83SPiotr Jasiukajtis */ 196*25c28e83SPiotr Jasiukajtis /* ARGSUSED */ 197*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_precision_type 198*25c28e83SPiotr Jasiukajtis __swapRP(enum fp_precision_type i) 199*25c28e83SPiotr Jasiukajtis { 200*25c28e83SPiotr Jasiukajtis return (0); 201*25c28e83SPiotr Jasiukajtis } 202*25c28e83SPiotr Jasiukajtis 203*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_direction_type 204*25c28e83SPiotr Jasiukajtis __swapRD(enum fp_direction_type d) 205*25c28e83SPiotr Jasiukajtis { 206*25c28e83SPiotr Jasiukajtis enum fp_direction_type ret; 207*25c28e83SPiotr Jasiukajtis uint32_t fsr; 208*25c28e83SPiotr Jasiukajtis uint64_t tmp1, tmp2, tmp3; 209*25c28e83SPiotr Jasiukajtis 210*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 211*25c28e83SPiotr Jasiukajtis "and %5,0x3,%0\n\t" 212*25c28e83SPiotr Jasiukajtis "sll %0,30,%2\n\t" /* shift input to RD bit location */ 213*25c28e83SPiotr Jasiukajtis ".volatile\n\t" 214*25c28e83SPiotr Jasiukajtis "st %%fsr,%1\n\t" 215*25c28e83SPiotr Jasiukajtis "ld %1,%0\n\t" /* %0 = fsr */ 216*25c28e83SPiotr Jasiukajtis /* mask of rounding direction bits */ 217*25c28e83SPiotr Jasiukajtis "sethi %%hi(0xc0000000),%4\n\t" 218*25c28e83SPiotr Jasiukajtis "andn %0,%4,%3\n\t" 219*25c28e83SPiotr Jasiukajtis "or %2,%3,%2\n\t" /* %2 = new fsr */ 220*25c28e83SPiotr Jasiukajtis "st %2,%1\n\t" 221*25c28e83SPiotr Jasiukajtis "ld %1,%%fsr\n\t" 222*25c28e83SPiotr Jasiukajtis "srl %0,30,%0\n\t" 223*25c28e83SPiotr Jasiukajtis "and %0,0x3,%0\n\t" 224*25c28e83SPiotr Jasiukajtis ".nonvolatile\n\t" 225*25c28e83SPiotr Jasiukajtis : "=r" (ret), "=m" (fsr), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3) 226*25c28e83SPiotr Jasiukajtis : "r" (d) 227*25c28e83SPiotr Jasiukajtis : "cc"); 228*25c28e83SPiotr Jasiukajtis 229*25c28e83SPiotr Jasiukajtis return (ret); 230*25c28e83SPiotr Jasiukajtis } 231*25c28e83SPiotr Jasiukajtis 232*25c28e83SPiotr Jasiukajtis extern __inline__ int 233*25c28e83SPiotr Jasiukajtis __swapTE(int i) 234*25c28e83SPiotr Jasiukajtis { 235*25c28e83SPiotr Jasiukajtis int ret; 236*25c28e83SPiotr Jasiukajtis uint32_t fsr; 237*25c28e83SPiotr Jasiukajtis uint64_t tmp1, tmp2, tmp3; 238*25c28e83SPiotr Jasiukajtis 239*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 240*25c28e83SPiotr Jasiukajtis "and %5,0x1f,%0\n\t" 241*25c28e83SPiotr Jasiukajtis "sll %0,23,%2\n\t" /* shift input to TEM bit location */ 242*25c28e83SPiotr Jasiukajtis ".volatile\n\t" 243*25c28e83SPiotr Jasiukajtis "st %%fsr,%1\n\t" 244*25c28e83SPiotr Jasiukajtis "ld %1,%0\n\t" /* %0 = fsr */ 245*25c28e83SPiotr Jasiukajtis /* mask of TEM (Trap Enable Mode bits) */ 246*25c28e83SPiotr Jasiukajtis "sethi %%hi(0x0f800000),%4\n\t" 247*25c28e83SPiotr Jasiukajtis "andn %0,%4,%3\n\t" 248*25c28e83SPiotr Jasiukajtis "or %2,%3,%2\n\t" /* %2 = new fsr */ 249*25c28e83SPiotr Jasiukajtis "st %2,%1\n\t" 250*25c28e83SPiotr Jasiukajtis "ld %1,%%fsr\n\t" 251*25c28e83SPiotr Jasiukajtis "srl %0,23,%0\n\t" 252*25c28e83SPiotr Jasiukajtis "and %0,0x1f,%0\n\t" 253*25c28e83SPiotr Jasiukajtis ".nonvolatile\n\t" 254*25c28e83SPiotr Jasiukajtis : "=r" (ret), "=m" (fsr), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3) 255*25c28e83SPiotr Jasiukajtis : "r" (i) 256*25c28e83SPiotr Jasiukajtis : "cc"); 257*25c28e83SPiotr Jasiukajtis 258*25c28e83SPiotr Jasiukajtis return (ret); 259*25c28e83SPiotr Jasiukajtis } 260*25c28e83SPiotr Jasiukajtis 261*25c28e83SPiotr Jasiukajtis 262*25c28e83SPiotr Jasiukajtis extern __inline__ double 263*25c28e83SPiotr Jasiukajtis sqrt(double d) 264*25c28e83SPiotr Jasiukajtis { 265*25c28e83SPiotr Jasiukajtis return (__inline_sqrt(d)); 266*25c28e83SPiotr Jasiukajtis } 267*25c28e83SPiotr Jasiukajtis 268*25c28e83SPiotr Jasiukajtis extern __inline__ float 269*25c28e83SPiotr Jasiukajtis sqrtf(float f) 270*25c28e83SPiotr Jasiukajtis { 271*25c28e83SPiotr Jasiukajtis return (__inline_sqrtf(f)); 272*25c28e83SPiotr Jasiukajtis } 273*25c28e83SPiotr Jasiukajtis 274*25c28e83SPiotr Jasiukajtis extern __inline__ double 275*25c28e83SPiotr Jasiukajtis fabs(double d) 276*25c28e83SPiotr Jasiukajtis { 277*25c28e83SPiotr Jasiukajtis double ret; 278*25c28e83SPiotr Jasiukajtis 279*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fabsd %1,%0\n\t" : "=e" (ret) : "e" (d)); 280*25c28e83SPiotr Jasiukajtis return (ret); 281*25c28e83SPiotr Jasiukajtis } 282*25c28e83SPiotr Jasiukajtis 283*25c28e83SPiotr Jasiukajtis extern __inline__ float 284*25c28e83SPiotr Jasiukajtis fabsf(float f) 285*25c28e83SPiotr Jasiukajtis { 286*25c28e83SPiotr Jasiukajtis float ret; 287*25c28e83SPiotr Jasiukajtis 288*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fabss %1,%0\n\t" : "=f" (ret) : "f" (f)); 289*25c28e83SPiotr Jasiukajtis return (ret); 290*25c28e83SPiotr Jasiukajtis } 291*25c28e83SPiotr Jasiukajtis 292*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus 293*25c28e83SPiotr Jasiukajtis } 294*25c28e83SPiotr Jasiukajtis #endif 295*25c28e83SPiotr Jasiukajtis 296*25c28e83SPiotr Jasiukajtis #endif /* __GNUC__ */ 297*25c28e83SPiotr Jasiukajtis 298*25c28e83SPiotr Jasiukajtis #endif /* _LIBM_INLINES_H */ 299