Print this page
*** 29,39 ****
/*
* Copyright 2011, Richard Lowe.
*/
! /* Functions in this file are duplicated in libm.m4. Keep them in sync */
#ifndef _LIBM_INLINES_H
#define _LIBM_INLINES_H
#ifdef __GNUC__
--- 29,39 ----
/*
* Copyright 2011, Richard Lowe.
*/
! /* Functions in this file are duplicated in locallibm.il. Keep them in sync */
#ifndef _LIBM_INLINES_H
#define _LIBM_INLINES_H
#ifdef __GNUC__
*** 43,61 ****
#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;
--- 43,52 ----
*** 70,87 ****
__asm__ __volatile__("sqrtsd %1, %0\n\t" : "=x" (ret) : "x" (a));
return (ret);
}
! /* XXX: Not actually called */
! extern __inline__ short
! __inline_fstsw(void)
{
! short ret;
!
! __asm__ __volatile__("fstsw %0\n\t" : "=r" (ret));
! return (ret);
}
/*
* 00 - 24 bits
* 01 - reserved
--- 61,74 ----
__asm__ __volatile__("sqrtsd %1, %0\n\t" : "=x" (ret) : "x" (a));
return (ret);
}
! extern __inline__ double
! __ieee754_sqrt(double a)
{
! return (__inline_sqrt(a));
}
/*
* 00 - 24 bits
* 01 - reserved
*** 129,282 ****
extern __inline__ int
abs(int i)
{
int ret;
__asm__ __volatile__(
! "movl %1,%0\n\t"
"negl %1\n\t"
! "cmovnsl %1,%0\n\t"
! : "=r" (ret), "+r" (i));
return (ret);
}
extern __inline__ double
copysign(double d1, double d2)
{
! double ret;
__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");
! 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);
}
extern __inline__ double
fabs(double d)
{
! double ret;
__asm__ __volatile__(
! "movq $0x7fffffffffffffff,%%rax\n\t"
! "movd %%rax,%%xmm1\n\t"
! "andpd %%xmm1,%0"
! : "=x" (ret)
! : "0" (d)
! : "rax", "xmm1");
! return (ret);
}
extern __inline__ float
fabsf(float d)
{
- float ret;
-
__asm__ __volatile__(
! "andpd %2,%0"
! : "=x" (ret)
! : "0" (d), "x" (0x7fffffff));
! return (ret);
}
extern __inline__ int
finite(double d)
{
! long ret; /* A long, so gcc chooses an %r* for %0 */
__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)
: "x" (d)
! : "rcx");
!
! return (ret);
! }
!
! extern __inline__ float
! r_sqrt_(float *f)
! {
! float ret;
- __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"
"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));
return (ret);
}
extern __inline__ double
sqrt(double d)
{
! double ret;
!
! __asm__ __volatile__(
! "sqrtsd %0, %0"
! : "=x" (ret)
! : "0" (d));
! return (ret);
}
extern __inline__ float
sqrtf(float f)
{
! float ret;
!
! __asm__ __volatile__(
! "sqrtss %0, %0"
! : "=x" (ret)
! : "0" (f));
! return (ret);
}
#ifdef __cplusplus
}
#endif
--- 116,217 ----
extern __inline__ int
abs(int i)
{
int ret;
__asm__ __volatile__(
! "movl %1, %0\n\t"
"negl %1\n\t"
! "cmovnsl %1, %0\n\t"
! : "=r" (ret), "+r" (i)
! :
! : "cc");
return (ret);
}
extern __inline__ double
copysign(double d1, double d2)
{
! double tmpd;
__asm__ __volatile__(
! "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 (d1);
}
extern __inline__ double
fabs(double d)
{
! double tmp;
__asm__ __volatile__(
! "movd %2, %1\n\t"
! "andpd %1, %0"
! : "+x" (d), "=x" (tmp)
! : "r" (0x7fffffffffffffff));
! return (d);
}
extern __inline__ float
fabsf(float d)
{
__asm__ __volatile__(
! "andpd %1, %0"
! : "+x" (d)
! : "x" (0x7fffffff));
! return (d);
}
extern __inline__ int
finite(double d)
{
! long ret = 0x7fffffffffffffff;
! uint64_t tmp;
__asm__ __volatile__(
! "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)
! : "cc");
return (ret);
}
extern __inline__ int
signbit(double d)
{
long ret;
__asm__ __volatile__(
! "movmskpd %1, %0\n\t"
"andq $1, %0\n\t"
: "=r" (ret)
! : "x" (d)
! : "cc");
return (ret);
}
extern __inline__ double
sqrt(double d)
{
! return (__inline_sqrt(d));
}
extern __inline__ float
sqrtf(float f)
{
! return (__inline_sqrtf(f));
}
#ifdef __cplusplus
}
#endif