Print this page
@@ -29,11 +29,11 @@
/*
* Copyright 2011, Richard Lowe.
*/
-/* Functions in this file are duplicated in libm.m4. Keep them in sync */
+/* Functions in this file are duplicated in locallibm.il. Keep them in sync */
#ifndef _LIBM_INLINES_H
#define _LIBM_INLINES_H
#ifdef __GNUC__
@@ -43,19 +43,10 @@
#endif
#include <sys/types.h>
#include <sys/ieeefp.h>
-extern __inline__ double
-__ieee754_sqrt(double a)
-{
- double ret;
-
- __asm__ __volatile__("sqrtsd %1, %0\n\t" : "=x" (ret) : "x" (a));
- return (ret);
-}
-
extern __inline__ float
__inline_sqrtf(float a)
{
float ret;
@@ -70,18 +61,14 @@
__asm__ __volatile__("sqrtsd %1, %0\n\t" : "=x" (ret) : "x" (a));
return (ret);
}
-/* XXX: Not actually called */
-extern __inline__ short
-__inline_fstsw(void)
+extern __inline__ double
+__ieee754_sqrt(double a)
{
- short ret;
-
- __asm__ __volatile__("fstsw %0\n\t" : "=r" (ret));
- return (ret);
+ return (__inline_sqrt(a));
}
/*
* 00 - 24 bits
* 01 - reserved
@@ -129,154 +116,102 @@
extern __inline__ int
abs(int i)
{
int ret;
__asm__ __volatile__(
- "movl %1,%0\n\t"
+ "movl %1, %0\n\t"
"negl %1\n\t"
- "cmovnsl %1,%0\n\t"
- : "=r" (ret), "+r" (i));
+ "cmovnsl %1, %0\n\t"
+ : "=r" (ret), "+r" (i)
+ :
+ : "cc");
return (ret);
}
extern __inline__ double
copysign(double d1, double d2)
{
- double ret;
+ double tmpd;
__asm__ __volatile__(
- "movq $0x7fffffffffffffff,%%rax\n\t"
- "movd %%rax,%%xmm2\n\t"
- "andpd %%xmm2,%0\n\t"
- "andnpd %1,%%xmm2\n\t"
- "orpd %%xmm2,%0\n\t"
- : "=x" (ret)
- : "x" (d2), "0" (d1)
- : "xmm2", "rax");
+ "movd %3, %1\n\t"
+ "andpd %1, %0\n\t"
+ "andnpd %2, %1\n\t"
+ "orpd %1, %0\n\t"
+ : "+x" (d1), "=x" (tmpd)
+ : "x" (d2), "r" (0x7fffffffffffffff));
- return (ret);
-}
-
-extern __inline__ double
-d_sqrt_(double *d)
-{
- double ret;
- __asm__ __volatile__(
- "movlpd %1,%0\n\t"
- "sqrtsd %0,%0"
- : "=x" (ret)
- : "m" (*d));
- return (ret);
+ return (d1);
}
extern __inline__ double
fabs(double d)
{
- double ret;
+ double tmp;
__asm__ __volatile__(
- "movq $0x7fffffffffffffff,%%rax\n\t"
- "movd %%rax,%%xmm1\n\t"
- "andpd %%xmm1,%0"
- : "=x" (ret)
- : "0" (d)
- : "rax", "xmm1");
+ "movd %2, %1\n\t"
+ "andpd %1, %0"
+ : "+x" (d), "=x" (tmp)
+ : "r" (0x7fffffffffffffff));
- return (ret);
+ return (d);
}
extern __inline__ float
fabsf(float d)
{
- float ret;
-
__asm__ __volatile__(
- "andpd %2,%0"
- : "=x" (ret)
- : "0" (d), "x" (0x7fffffff));
+ "andpd %1, %0"
+ : "+x" (d)
+ : "x" (0x7fffffff));
- return (ret);
+ return (d);
}
extern __inline__ int
finite(double d)
{
- long ret; /* A long, so gcc chooses an %r* for %0 */
+ long ret = 0x7fffffffffffffff;
+ uint64_t tmp;
__asm__ __volatile__(
- "movq %1,%%rcx\n\t"
- "movq $0x7fffffffffffffff,%0\n\t"
- "andq %%rcx,%0\n\t"
- "movq $0x7ff0000000000000,%%rcx\n\t"
- "subq %%rcx,%0\n\t"
- "shrq $63,%0\n\t"
- : "=r" (ret)
+ "movq %2, %1\n\t"
+ "andq %1, %0\n\t"
+ "movq $0x7ff0000000000000, %1\n\t"
+ "subq %1, %0\n\t"
+ "shrq $63, %0\n\t"
+ : "+r" (ret), "=r" (tmp)
: "x" (d)
- : "rcx");
-
- return (ret);
-}
-
-extern __inline__ float
-r_sqrt_(float *f)
-{
- float ret;
+ : "cc");
- __asm__ __volatile__(
- "movss %1,%0\n\t"
- "sqrtss %0,%0\n\t"
- : "+x" (ret)
- : "m" (*f));
return (ret);
}
extern __inline__ int
signbit(double d)
{
long ret;
__asm__ __volatile__(
- "movmskpd %1,%0\n\t"
+ "movmskpd %1, %0\n\t"
"andq $1, %0\n\t"
: "=r" (ret)
- : "x" (d));
- return (ret);
-}
-
-extern __inline__ int
-signbitf(float f)
-{
- int ret;
- __asm__ __volatile__(
- "movskps %1,%0\n\t"
- "andq $1, %0\n\t"
- : "=r" (ret)
- : "x" (f));
+ : "x" (d)
+ : "cc");
return (ret);
}
extern __inline__ double
sqrt(double d)
{
- double ret;
-
- __asm__ __volatile__(
- "sqrtsd %0, %0"
- : "=x" (ret)
- : "0" (d));
- return (ret);
+ return (__inline_sqrt(d));
}
extern __inline__ float
sqrtf(float f)
{
- float ret;
-
- __asm__ __volatile__(
- "sqrtss %0, %0"
- : "=x" (ret)
- : "0" (f));
- return (ret);
+ return (__inline_sqrtf(f));
}
#ifdef __cplusplus
}
#endif