Blame sysdeps/alpha/local-soft-fp.h

Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <soft-fp.h>
Packit 6c4009
#include <quad.h>
Packit 6c4009
Packit 6c4009
/* Helpers for the Ots functions which receive long double arguments
Packit 6c4009
   in two integer registers, and return values in $16+$17.  */
Packit 6c4009
Packit 6c4009
#define AXP_UNPACK_RAW_Q(X, val)			\
Packit 6c4009
  do {							\
Packit 6c4009
    union _FP_UNION_Q _flo;				\
Packit 6c4009
    _flo.longs.a = val##l;				\
Packit 6c4009
    _flo.longs.b = val##h;				\
Packit 6c4009
    FP_UNPACK_RAW_QP(X, &_flo);				\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define AXP_UNPACK_SEMIRAW_Q(X, val)			\
Packit 6c4009
  do {							\
Packit 6c4009
    union _FP_UNION_Q _flo;				\
Packit 6c4009
    _flo.longs.a = val##l;				\
Packit 6c4009
    _flo.longs.b = val##h;				\
Packit 6c4009
    FP_UNPACK_SEMIRAW_QP(X, &_flo);			\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define AXP_UNPACK_Q(X, val)				\
Packit 6c4009
  do {							\
Packit 6c4009
    AXP_UNPACK_RAW_Q(X, val);				\
Packit 6c4009
    _FP_UNPACK_CANONICAL(Q, 2, X);			\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define AXP_PACK_RAW_Q(val, X) FP_PACK_RAW_QP(&val##_flo, X)
Packit 6c4009
Packit 6c4009
#define AXP_PACK_SEMIRAW_Q(val, X)			\
Packit 6c4009
  do {							\
Packit 6c4009
    _FP_PACK_SEMIRAW(Q, 2, X);				\
Packit 6c4009
    AXP_PACK_RAW_Q(val, X);				\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define AXP_PACK_Q(val, X)				\
Packit 6c4009
  do {							\
Packit 6c4009
    _FP_PACK_CANONICAL(Q, 2, X);			\
Packit 6c4009
    AXP_PACK_RAW_Q(val, X);				\
Packit 6c4009
  } while (0)
Packit 6c4009
Packit 6c4009
#define AXP_DECL_RETURN_Q(X) union _FP_UNION_Q X##_flo
Packit 6c4009
Packit 6c4009
/* ??? We don't have a real way to tell the compiler that we're wanting
Packit 6c4009
   to return values in $16+$17.  Instead use a volatile asm to make sure
Packit 6c4009
   that the values are live, and just hope that nothing kills the values
Packit 6c4009
   in between here and the end of the function.  */
Packit 6c4009
#define AXP_RETURN_Q(X)					\
Packit 6c4009
  do {							\
Packit 6c4009
    register long r16 __asm__("16") = X##_flo.longs.a;	\
Packit 6c4009
    register long r17 __asm__("17") = X##_flo.longs.b;	\
Packit 6c4009
    asm volatile ("" : : "r"(r16), "r"(r17));		\
Packit 6c4009
  } while (0)