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 #ifdef __cplusplus 39*25c28e83SPiotr Jasiukajtis extern "C" { 40*25c28e83SPiotr Jasiukajtis #endif 41*25c28e83SPiotr Jasiukajtis 42*25c28e83SPiotr Jasiukajtis #include <sys/types.h> 43*25c28e83SPiotr Jasiukajtis #include <sys/ieeefp.h> 44*25c28e83SPiotr Jasiukajtis 45*25c28e83SPiotr Jasiukajtis #define _LO_WORD(x) ((uint32_t *)&x)[0] 46*25c28e83SPiotr Jasiukajtis #define _HI_WORD(x) ((uint32_t *)&x)[1] 47*25c28e83SPiotr Jasiukajtis #define _HIER_WORD(x) ((uint32_t *)&x)[2] 48*25c28e83SPiotr Jasiukajtis 49*25c28e83SPiotr Jasiukajtis extern __inline__ double 50*25c28e83SPiotr Jasiukajtis __inline_sqrt(double a) 51*25c28e83SPiotr Jasiukajtis { 52*25c28e83SPiotr Jasiukajtis double ret; 53*25c28e83SPiotr Jasiukajtis 54*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fsqrt\n\t" : "=t" (ret) : "0" (a) : "cc"); 55*25c28e83SPiotr Jasiukajtis return (ret); 56*25c28e83SPiotr Jasiukajtis } 57*25c28e83SPiotr Jasiukajtis 58*25c28e83SPiotr Jasiukajtis extern __inline__ double 59*25c28e83SPiotr Jasiukajtis __ieee754_sqrt(double a) 60*25c28e83SPiotr Jasiukajtis { 61*25c28e83SPiotr Jasiukajtis return (__inline_sqrt(a)); 62*25c28e83SPiotr Jasiukajtis } 63*25c28e83SPiotr Jasiukajtis 64*25c28e83SPiotr Jasiukajtis extern __inline__ float 65*25c28e83SPiotr Jasiukajtis __inline_sqrtf(float a) 66*25c28e83SPiotr Jasiukajtis { 67*25c28e83SPiotr Jasiukajtis float ret; 68*25c28e83SPiotr Jasiukajtis 69*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fsqrt\n\t" : "=t" (ret) : "0" (a) : "cc"); 70*25c28e83SPiotr Jasiukajtis return (ret); 71*25c28e83SPiotr Jasiukajtis } 72*25c28e83SPiotr Jasiukajtis 73*25c28e83SPiotr Jasiukajtis extern __inline__ double 74*25c28e83SPiotr Jasiukajtis __inline_rint(double a) 75*25c28e83SPiotr Jasiukajtis { 76*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 77*25c28e83SPiotr Jasiukajtis "andl $0x7fffffff,%1\n\t" 78*25c28e83SPiotr Jasiukajtis "cmpl $0x43300000,%1\n\t" 79*25c28e83SPiotr Jasiukajtis "jae 1f\n\t" 80*25c28e83SPiotr Jasiukajtis "frndint\n\t" 81*25c28e83SPiotr Jasiukajtis "1: fwait\n\t" 82*25c28e83SPiotr Jasiukajtis : "+t" (a), "+&r" (_HI_WORD(a)) 83*25c28e83SPiotr Jasiukajtis : 84*25c28e83SPiotr Jasiukajtis : "cc"); 85*25c28e83SPiotr Jasiukajtis 86*25c28e83SPiotr Jasiukajtis return (a); 87*25c28e83SPiotr Jasiukajtis } 88*25c28e83SPiotr Jasiukajtis 89*25c28e83SPiotr Jasiukajtis /* 90*25c28e83SPiotr Jasiukajtis * 00 - 24 bits 91*25c28e83SPiotr Jasiukajtis * 01 - reserved 92*25c28e83SPiotr Jasiukajtis * 10 - 53 bits 93*25c28e83SPiotr Jasiukajtis * 11 - 64 bits 94*25c28e83SPiotr Jasiukajtis */ 95*25c28e83SPiotr Jasiukajtis extern __inline__ int 96*25c28e83SPiotr Jasiukajtis __swapRP(int i) 97*25c28e83SPiotr Jasiukajtis { 98*25c28e83SPiotr Jasiukajtis int ret; 99*25c28e83SPiotr Jasiukajtis uint16_t cw; 100*25c28e83SPiotr Jasiukajtis 101*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fstcw %0\n\t" : "=m" (cw)); 102*25c28e83SPiotr Jasiukajtis 103*25c28e83SPiotr Jasiukajtis ret = (cw >> 8) & 0x3; 104*25c28e83SPiotr Jasiukajtis cw = (cw & 0xfcff) | ((i & 0x3) << 8); 105*25c28e83SPiotr Jasiukajtis 106*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fldcw %0\n\t" : : "m" (cw)); 107*25c28e83SPiotr Jasiukajtis 108*25c28e83SPiotr Jasiukajtis return (ret); 109*25c28e83SPiotr Jasiukajtis } 110*25c28e83SPiotr Jasiukajtis 111*25c28e83SPiotr Jasiukajtis /* 112*25c28e83SPiotr Jasiukajtis * 00 - Round to nearest, with even preferred 113*25c28e83SPiotr Jasiukajtis * 01 - Round down 114*25c28e83SPiotr Jasiukajtis * 10 - Round up 115*25c28e83SPiotr Jasiukajtis * 11 - Chop 116*25c28e83SPiotr Jasiukajtis */ 117*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_direction_type 118*25c28e83SPiotr Jasiukajtis __swap87RD(enum fp_direction_type i) 119*25c28e83SPiotr Jasiukajtis { 120*25c28e83SPiotr Jasiukajtis int ret; 121*25c28e83SPiotr Jasiukajtis uint16_t cw; 122*25c28e83SPiotr Jasiukajtis 123*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fstcw %0\n\t" : "=m" (cw)); 124*25c28e83SPiotr Jasiukajtis 125*25c28e83SPiotr Jasiukajtis ret = (cw >> 10) & 0x3; 126*25c28e83SPiotr Jasiukajtis cw = (cw & 0xf3ff) | ((i & 0x3) << 10); 127*25c28e83SPiotr Jasiukajtis 128*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fldcw %0\n\t" : : "m" (cw)); 129*25c28e83SPiotr Jasiukajtis 130*25c28e83SPiotr Jasiukajtis return (ret); 131*25c28e83SPiotr Jasiukajtis } 132*25c28e83SPiotr Jasiukajtis 133*25c28e83SPiotr Jasiukajtis extern __inline__ double 134*25c28e83SPiotr Jasiukajtis ceil(double d) 135*25c28e83SPiotr Jasiukajtis { 136*25c28e83SPiotr Jasiukajtis /* 137*25c28e83SPiotr Jasiukajtis * Let's set a Rounding Control (RC) bits from x87 FPU Control Word 138*25c28e83SPiotr Jasiukajtis * to fp_positive and save old bits in rd. 139*25c28e83SPiotr Jasiukajtis */ 140*25c28e83SPiotr Jasiukajtis short rd = __swap87RD(fp_positive); 141*25c28e83SPiotr Jasiukajtis 142*25c28e83SPiotr Jasiukajtis /* 143*25c28e83SPiotr Jasiukajtis * The FRNDINT instruction returns a floating-point value that is the 144*25c28e83SPiotr Jasiukajtis * integral value closest to the source value in the direction of the 145*25c28e83SPiotr Jasiukajtis * rounding mode specified in the RC field of the x87 FPU control word. 146*25c28e83SPiotr Jasiukajtis * 147*25c28e83SPiotr Jasiukajtis * Rounds the source value in the ST(0) register to the nearest 148*25c28e83SPiotr Jasiukajtis * integral value, depending on the current rounding mode 149*25c28e83SPiotr Jasiukajtis * (setting of the RC field of the FPU control word), 150*25c28e83SPiotr Jasiukajtis * and stores the result in ST(0). 151*25c28e83SPiotr Jasiukajtis */ 152*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("frndint" : "+t" (d) : : "cc"); 153*25c28e83SPiotr Jasiukajtis 154*25c28e83SPiotr Jasiukajtis /* restore old RC bits */ 155*25c28e83SPiotr Jasiukajtis __swap87RD(rd); 156*25c28e83SPiotr Jasiukajtis 157*25c28e83SPiotr Jasiukajtis return (d); 158*25c28e83SPiotr Jasiukajtis } 159*25c28e83SPiotr Jasiukajtis 160*25c28e83SPiotr Jasiukajtis extern __inline__ double 161*25c28e83SPiotr Jasiukajtis copysign(double d1, double d2) 162*25c28e83SPiotr Jasiukajtis { 163*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 164*25c28e83SPiotr Jasiukajtis "andl $0x7fffffff,%0\n\t" /* %0 <-- hi_32(abs(d)) */ 165*25c28e83SPiotr Jasiukajtis "andl $0x80000000,%1\n\t" /* %1[31] <-- sign_bit(d2) */ 166*25c28e83SPiotr Jasiukajtis "orl %1,%0\n\t" /* %0 <-- hi_32(copysign(x,y)) */ 167*25c28e83SPiotr Jasiukajtis : "+&r" (_HI_WORD(d1)), "+r" (_HI_WORD(d2)) 168*25c28e83SPiotr Jasiukajtis : 169*25c28e83SPiotr Jasiukajtis : "cc"); 170*25c28e83SPiotr Jasiukajtis 171*25c28e83SPiotr Jasiukajtis return (d1); 172*25c28e83SPiotr Jasiukajtis } 173*25c28e83SPiotr Jasiukajtis 174*25c28e83SPiotr Jasiukajtis extern __inline__ double 175*25c28e83SPiotr Jasiukajtis fabs(double d) 176*25c28e83SPiotr Jasiukajtis { 177*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc"); 178*25c28e83SPiotr Jasiukajtis return (d); 179*25c28e83SPiotr Jasiukajtis } 180*25c28e83SPiotr Jasiukajtis 181*25c28e83SPiotr Jasiukajtis extern __inline__ float 182*25c28e83SPiotr Jasiukajtis fabsf(float d) 183*25c28e83SPiotr Jasiukajtis { 184*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc"); 185*25c28e83SPiotr Jasiukajtis return (d); 186*25c28e83SPiotr Jasiukajtis } 187*25c28e83SPiotr Jasiukajtis 188*25c28e83SPiotr Jasiukajtis extern __inline__ long double 189*25c28e83SPiotr Jasiukajtis fabsl(long double d) 190*25c28e83SPiotr Jasiukajtis { 191*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc"); 192*25c28e83SPiotr Jasiukajtis return (d); 193*25c28e83SPiotr Jasiukajtis } 194*25c28e83SPiotr Jasiukajtis 195*25c28e83SPiotr Jasiukajtis extern __inline__ int 196*25c28e83SPiotr Jasiukajtis finite(double d) 197*25c28e83SPiotr Jasiukajtis { 198*25c28e83SPiotr Jasiukajtis int ret = _HI_WORD(d); 199*25c28e83SPiotr Jasiukajtis 200*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 201*25c28e83SPiotr Jasiukajtis "notl %0\n\t" 202*25c28e83SPiotr Jasiukajtis "andl $0x7ff00000,%0\n\t" 203*25c28e83SPiotr Jasiukajtis "negl %0\n\t" 204*25c28e83SPiotr Jasiukajtis "shrl $31,%0\n\t" 205*25c28e83SPiotr Jasiukajtis : "+r" (ret) 206*25c28e83SPiotr Jasiukajtis : 207*25c28e83SPiotr Jasiukajtis : "cc"); 208*25c28e83SPiotr Jasiukajtis return (ret); 209*25c28e83SPiotr Jasiukajtis } 210*25c28e83SPiotr Jasiukajtis 211*25c28e83SPiotr Jasiukajtis extern __inline__ double 212*25c28e83SPiotr Jasiukajtis floor(double d) 213*25c28e83SPiotr Jasiukajtis { 214*25c28e83SPiotr Jasiukajtis short rd = __swap87RD(fp_negative); 215*25c28e83SPiotr Jasiukajtis 216*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("frndint" : "+t" (d), "+r" (rd) : : "cc"); 217*25c28e83SPiotr Jasiukajtis __swap87RD(rd); 218*25c28e83SPiotr Jasiukajtis 219*25c28e83SPiotr Jasiukajtis return (d); 220*25c28e83SPiotr Jasiukajtis } 221*25c28e83SPiotr Jasiukajtis 222*25c28e83SPiotr Jasiukajtis /* 223*25c28e83SPiotr Jasiukajtis * branchless __isnan 224*25c28e83SPiotr Jasiukajtis * ((0x7ff00000-[((lx|-lx)>>31)&1]|ahx)>>31)&1 = 1 iff x is NaN 225*25c28e83SPiotr Jasiukajtis */ 226*25c28e83SPiotr Jasiukajtis extern __inline__ int 227*25c28e83SPiotr Jasiukajtis isnan(double d) 228*25c28e83SPiotr Jasiukajtis { 229*25c28e83SPiotr Jasiukajtis int ret; 230*25c28e83SPiotr Jasiukajtis 231*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 232*25c28e83SPiotr Jasiukajtis "movl %1,%%ecx\n\t" 233*25c28e83SPiotr Jasiukajtis "negl %%ecx\n\t" /* ecx <-- -lo_32(x) */ 234*25c28e83SPiotr Jasiukajtis "orl %%ecx,%1\n\t" 235*25c28e83SPiotr Jasiukajtis "shrl $31,%1\n\t" /* 1 iff lx != 0 */ 236*25c28e83SPiotr Jasiukajtis "andl $0x7fffffff,%2\n\t" /* ecx <-- hi_32(abs(x)) */ 237*25c28e83SPiotr Jasiukajtis "orl %2,%1\n\t" 238*25c28e83SPiotr Jasiukajtis "subl $0x7ff00000,%1\n\t" 239*25c28e83SPiotr Jasiukajtis "negl %1\n\t" 240*25c28e83SPiotr Jasiukajtis "shrl $31,%1\n\t" 241*25c28e83SPiotr Jasiukajtis : "=r" (ret) 242*25c28e83SPiotr Jasiukajtis : "0" (_HI_WORD(d)), "r" (_LO_WORD(d)) 243*25c28e83SPiotr Jasiukajtis : "ecx"); 244*25c28e83SPiotr Jasiukajtis 245*25c28e83SPiotr Jasiukajtis return (ret); 246*25c28e83SPiotr Jasiukajtis } 247*25c28e83SPiotr Jasiukajtis 248*25c28e83SPiotr Jasiukajtis extern __inline__ int 249*25c28e83SPiotr Jasiukajtis isnanf(float f) 250*25c28e83SPiotr Jasiukajtis { 251*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 252*25c28e83SPiotr Jasiukajtis "andl $0x7fffffff,%0\n\t" 253*25c28e83SPiotr Jasiukajtis "negl %0\n\t" 254*25c28e83SPiotr Jasiukajtis "addl $0x7f800000,%0\n\t" 255*25c28e83SPiotr Jasiukajtis "shrl $31,%0\n\t" 256*25c28e83SPiotr Jasiukajtis : "+r" (f) 257*25c28e83SPiotr Jasiukajtis : 258*25c28e83SPiotr Jasiukajtis : "cc"); 259*25c28e83SPiotr Jasiukajtis 260*25c28e83SPiotr Jasiukajtis return (f); 261*25c28e83SPiotr Jasiukajtis } 262*25c28e83SPiotr Jasiukajtis 263*25c28e83SPiotr Jasiukajtis extern __inline__ double 264*25c28e83SPiotr Jasiukajtis rint(double a) { 265*25c28e83SPiotr Jasiukajtis return (__inline_rint(a)); 266*25c28e83SPiotr Jasiukajtis } 267*25c28e83SPiotr Jasiukajtis 268*25c28e83SPiotr Jasiukajtis extern __inline__ double 269*25c28e83SPiotr Jasiukajtis scalbn(double d, int n) 270*25c28e83SPiotr Jasiukajtis { 271*25c28e83SPiotr Jasiukajtis double dummy; 272*25c28e83SPiotr Jasiukajtis 273*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 274*25c28e83SPiotr Jasiukajtis "fildl %2\n\t" /* Convert N to extended */ 275*25c28e83SPiotr Jasiukajtis "fxch\n\t" 276*25c28e83SPiotr Jasiukajtis "fscale\n\t" 277*25c28e83SPiotr Jasiukajtis : "+t" (d), "=u" (dummy) 278*25c28e83SPiotr Jasiukajtis : "m" (n) 279*25c28e83SPiotr Jasiukajtis : "cc"); 280*25c28e83SPiotr Jasiukajtis 281*25c28e83SPiotr Jasiukajtis return (d); 282*25c28e83SPiotr Jasiukajtis } 283*25c28e83SPiotr Jasiukajtis 284*25c28e83SPiotr Jasiukajtis extern __inline__ int 285*25c28e83SPiotr Jasiukajtis signbit(double d) 286*25c28e83SPiotr Jasiukajtis { 287*25c28e83SPiotr Jasiukajtis return (_HI_WORD(d) >> 31); 288*25c28e83SPiotr Jasiukajtis } 289*25c28e83SPiotr Jasiukajtis 290*25c28e83SPiotr Jasiukajtis extern __inline__ int 291*25c28e83SPiotr Jasiukajtis signbitf(float f) 292*25c28e83SPiotr Jasiukajtis { 293*25c28e83SPiotr Jasiukajtis return ((*(uint32_t *)&f) >> 31); 294*25c28e83SPiotr Jasiukajtis } 295*25c28e83SPiotr Jasiukajtis 296*25c28e83SPiotr Jasiukajtis extern __inline__ double 297*25c28e83SPiotr Jasiukajtis sqrt(double d) 298*25c28e83SPiotr Jasiukajtis { 299*25c28e83SPiotr Jasiukajtis return (__inline_sqrt(d)); 300*25c28e83SPiotr Jasiukajtis } 301*25c28e83SPiotr Jasiukajtis 302*25c28e83SPiotr Jasiukajtis extern __inline__ float 303*25c28e83SPiotr Jasiukajtis sqrtf(float f) 304*25c28e83SPiotr Jasiukajtis { 305*25c28e83SPiotr Jasiukajtis return (__inline_sqrtf(f)); 306*25c28e83SPiotr Jasiukajtis } 307*25c28e83SPiotr Jasiukajtis 308*25c28e83SPiotr Jasiukajtis extern __inline__ long double 309*25c28e83SPiotr Jasiukajtis sqrtl(long double ld) 310*25c28e83SPiotr Jasiukajtis { 311*25c28e83SPiotr Jasiukajtis __asm__ __volatile__("fsqrt" : "+t" (ld) : : "cc"); 312*25c28e83SPiotr Jasiukajtis return (ld); 313*25c28e83SPiotr Jasiukajtis } 314*25c28e83SPiotr Jasiukajtis 315*25c28e83SPiotr Jasiukajtis extern __inline__ int 316*25c28e83SPiotr Jasiukajtis isnanl(long double ld) 317*25c28e83SPiotr Jasiukajtis { 318*25c28e83SPiotr Jasiukajtis int ret = _HIER_WORD(ld); 319*25c28e83SPiotr Jasiukajtis 320*25c28e83SPiotr Jasiukajtis __asm__ __volatile__( 321*25c28e83SPiotr Jasiukajtis "andl $0x00007fff,%0\n\t" 322*25c28e83SPiotr Jasiukajtis "jz 1f\n\t" /* jump if exp is all 0 */ 323*25c28e83SPiotr Jasiukajtis "xorl $0x00007fff,%0\n\t" 324*25c28e83SPiotr Jasiukajtis "jz 2f\n\t" /* jump if exp is all 1 */ 325*25c28e83SPiotr Jasiukajtis "testl $0x80000000,%1\n\t" 326*25c28e83SPiotr Jasiukajtis "jz 3f\n\t" /* jump if leading bit is 0 */ 327*25c28e83SPiotr Jasiukajtis "xorl %0,%0\n\t" 328*25c28e83SPiotr Jasiukajtis "jmp 1f\n\t" 329*25c28e83SPiotr Jasiukajtis "2:\n\t" /* note that %0 = 0 from before */ 330*25c28e83SPiotr Jasiukajtis "cmpl $0x80000000,%1\n\t" /* what is first half of significand? */ 331*25c28e83SPiotr Jasiukajtis "jnz 3f\n\t" /* jump if not equal to 0x80000000 */ 332*25c28e83SPiotr Jasiukajtis "testl $0xffffffff,%2\n\t" /* is second half of significand 0? */ 333*25c28e83SPiotr Jasiukajtis "jnz 3f\n\t" /* jump if not equal to 0 */ 334*25c28e83SPiotr Jasiukajtis "jmp 1f\n\t" 335*25c28e83SPiotr Jasiukajtis "3:\n\t" 336*25c28e83SPiotr Jasiukajtis "movl $1,%0\n\t" 337*25c28e83SPiotr Jasiukajtis "1:\n\t" 338*25c28e83SPiotr Jasiukajtis : "+&r" (ret) 339*25c28e83SPiotr Jasiukajtis : "r" (_HI_WORD(ld)), "r" (_LO_WORD(ld)) 340*25c28e83SPiotr Jasiukajtis : "cc"); 341*25c28e83SPiotr Jasiukajtis 342*25c28e83SPiotr Jasiukajtis return (ret); 343*25c28e83SPiotr Jasiukajtis } 344*25c28e83SPiotr Jasiukajtis 345*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus 346*25c28e83SPiotr Jasiukajtis } 347*25c28e83SPiotr Jasiukajtis #endif 348*25c28e83SPiotr Jasiukajtis 349*25c28e83SPiotr Jasiukajtis #endif /* __GNUC__ */ 350*25c28e83SPiotr Jasiukajtis 351*25c28e83SPiotr Jasiukajtis #endif /* _LIBM_INLINES_H */ 352