Blame sysdeps/x86_64/fpu/math_private.h

Packit 6c4009
#ifndef X86_64_MATH_PRIVATE_H
Packit 6c4009
#define X86_64_MATH_PRIVATE_H 1
Packit 6c4009
Packit 6c4009
/* We can do a few things better on x86-64.  */
Packit 6c4009
Packit 6c4009
#if defined __AVX__ || defined SSE2AVX
Packit 6c4009
# define MOVD "vmovd"
Packit 6c4009
# define MOVQ "vmovq"
Packit 6c4009
#else
Packit 6c4009
# define MOVD "movd"
Packit 6c4009
# define MOVQ "movq"
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Direct movement of float into integer register.  */
Packit 6c4009
#define EXTRACT_WORDS64(i, d)						      \
Packit 6c4009
  do {									      \
Packit 6c4009
    int64_t i_;								      \
Packit 6c4009
    asm (MOVQ " %1, %0" : "=rm" (i_) : "x" ((double) (d)));		      \
Packit 6c4009
    (i) = i_;								      \
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
/* And the reverse.  */
Packit 6c4009
#define INSERT_WORDS64(d, i) \
Packit 6c4009
  do {									      \
Packit 6c4009
    int64_t i_ = i;							      \
Packit 6c4009
    double d__;								      \
Packit 6c4009
    asm (MOVQ " %1, %0" : "=x" (d__) : "rm" (i_));			      \
Packit 6c4009
    d = d__;								      \
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
/* Direct movement of float into integer register.  */
Packit 6c4009
#define GET_FLOAT_WORD(i, d) \
Packit 6c4009
  do {									      \
Packit 6c4009
    int i_;								      \
Packit 6c4009
    asm (MOVD " %1, %0" : "=rm" (i_) : "x" ((float) (d)));		      \
Packit 6c4009
    (i) = i_;								      \
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
/* And the reverse.  */
Packit 6c4009
#define SET_FLOAT_WORD(f, i) \
Packit 6c4009
  do {									      \
Packit 6c4009
    int i_ = i;								      \
Packit 6c4009
    float f__;								      \
Packit 6c4009
    asm (MOVD " %1, %0" : "=x" (f__) : "rm" (i_));			      \
Packit 6c4009
    f = f__;								      \
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#include <sysdeps/i386/fpu/fenv_private.h>
Packit 6c4009
#include_next <math_private.h>
Packit 6c4009
Packit 6c4009
#ifdef __SSE4_1__
Packit 6c4009
extern __always_inline double
Packit 6c4009
__rint (double d)
Packit 6c4009
{
Packit 6c4009
  double res;
Packit 6c4009
# if defined __AVX__ || defined SSE2AVX
Packit 6c4009
  asm ("vroundsd $4, %1, %0, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# else
Packit 6c4009
  asm ("roundsd $4, %1, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# endif
Packit 6c4009
  return res;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
extern __always_inline float
Packit 6c4009
__rintf (float d)
Packit 6c4009
{
Packit 6c4009
  float res;
Packit 6c4009
# if defined __AVX__ || defined SSE2AVX
Packit 6c4009
  asm ("vroundss $4, %1, %0, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# else
Packit 6c4009
  asm ("roundss $4, %1, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# endif
Packit 6c4009
  return res;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
extern __always_inline double
Packit 6c4009
__floor (double d)
Packit 6c4009
{
Packit 6c4009
  double res;
Packit 6c4009
# if defined __AVX__ || defined SSE2AVX
Packit 6c4009
  asm ("vroundsd $1, %1, %0, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# else
Packit 6c4009
  asm ("roundsd $1, %1, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# endif
Packit 6c4009
  return res;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
extern __always_inline float
Packit 6c4009
__floorf (float d)
Packit 6c4009
{
Packit 6c4009
  float res;
Packit 6c4009
# if defined __AVX__ || defined SSE2AVX
Packit 6c4009
  asm ("vroundss $1, %1, %0, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
# else
Packit 6c4009
  asm ("roundss $1, %1, %0" : "=x" (res) : "xm" (d));
Packit 6c4009
#  endif
Packit 6c4009
  return res;
Packit 6c4009
}
Packit 6c4009
#endif /* __SSE4_1__ */
Packit 6c4009
Packit 6c4009
#endif /* X86_64_MATH_PRIVATE_H */