float128-cmp-invalid.c, [...]: New tests.

gcc/testsuite:
	* gcc.dg/torture/float128-cmp-invalid.c,
	gcc.dg/torture/float128-div-underflow.c,
	gcc.dg/torture/float128-extend-nan.c,
	gcc.dg/torture/fp-int-convert-float128-timode-3.c: New tests.

libgcc:
	* soft-fp/README: Update.
	* soft-fp/adddf3.c: Update from glibc.
	* soft-fp/addsf3.c: Likewise.
	* soft-fp/addtf3.c: Likewise.
	* soft-fp/divdf3.c: Likewise.
	* soft-fp/divsf3.c: Likewise.
	* soft-fp/divtf3.c: Likewise.
	* soft-fp/double.h: Likewise.
	* soft-fp/eqdf2.c: Likewise.
	* soft-fp/eqsf2.c: Likewise.
	* soft-fp/eqtf2.c: Likewise.
	* soft-fp/extenddftf2.c: Likewise.
	* soft-fp/extended.h: Likewise.
	* soft-fp/extendsfdf2.c: Likewise.
	* soft-fp/extendsftf2.c: Likewise.
	* soft-fp/extendxftf2.c: Likewise.
	* soft-fp/fixdfdi.c: Likewise.
	* soft-fp/fixdfsi.c: Likewise.
	* soft-fp/fixdfti.c: Likewise.
	* soft-fp/fixsfdi.c: Likewise.
	* soft-fp/fixsfsi.c: Likewise.
	* soft-fp/fixsfti.c: Likewise.
	* soft-fp/fixtfdi.c: Likewise.
	* soft-fp/fixtfsi.c: Likewise.
	* soft-fp/fixtfti.c: Likewise.
	* soft-fp/fixunsdfdi.c: Likewise.
	* soft-fp/fixunsdfsi.c: Likewise.
	* soft-fp/fixunsdfti.c: Likewise.
	* soft-fp/fixunssfdi.c: Likewise.
	* soft-fp/fixunssfsi.c: Likewise.
	* soft-fp/fixunssfti.c: Likewise.
	* soft-fp/fixunstfdi.c: Likewise.
	* soft-fp/fixunstfsi.c: Likewise.
	* soft-fp/fixunstfti.c: Likewise.
	* soft-fp/floatdidf.c: Likewise.
	* soft-fp/floatdisf.c: Likewise.
	* soft-fp/floatditf.c: Likewise.
	* soft-fp/floatsidf.c: Likewise.
	* soft-fp/floatsisf.c: Likewise.
	* soft-fp/floatsitf.c: Likewise.
	* soft-fp/floattidf.c: Likewise.
	* soft-fp/floattisf.c: Likewise.
	* soft-fp/floattitf.c: Likewise.
	* soft-fp/floatundidf.c: Likewise.
	* soft-fp/floatundisf.c: Likewise.
	* soft-fp/floatunditf.c: Likewise.
	* soft-fp/floatunsidf.c: Likewise.
	* soft-fp/floatunsisf.c: Likewise.
	* soft-fp/floatunsitf.c: Likewise.
	* soft-fp/floatuntidf.c: Likewise.
	* soft-fp/floatuntisf.c: Likewise.
	* soft-fp/floatuntitf.c: Likewise.
	* soft-fp/gedf2.c: Likewise.
	* soft-fp/gesf2.c: Likewise.
	* soft-fp/getf2.c: Likewise.
	* soft-fp/ledf2.c: Likewise.
	* soft-fp/lesf2.c: Likewise.
	* soft-fp/letf2.c: Likewise.
	* soft-fp/muldf3.c: Likewise.
	* soft-fp/mulsf3.c: Likewise.
	* soft-fp/multf3.c: Likewise.
	* soft-fp/negdf2.c: Likewise.
	* soft-fp/negsf2.c: Likewise.
	* soft-fp/negtf2.c: Likewise.
	* soft-fp/op-1.h: Likewise.
	* soft-fp/op-2.h: Likewise.
	* soft-fp/op-4.h: Likewise.
	* soft-fp/op-8.h: Likewise.
	* soft-fp/op-common.h: Likewise.
	* soft-fp/quad.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/soft-fp.h: Likewise.
	* soft-fp/subdf3.c: Likewise.
	* soft-fp/subsf3.c: Likewise.
	* soft-fp/subtf3.c: Likewise.
	* soft-fp/truncdfsf2.c: Likewise.
	* soft-fp/trunctfdf2.c: Likewise.
	* soft-fp/trunctfsf2.c: Likewise.
	* soft-fp/trunctfxf2.c: Likewise.
	* soft-fp/unorddf2.c: Likewise.
	* soft-fp/unordsf2.c: Likewise.
	* soft-fp/unordtf2.c: Likewise.

From-SVN: r204489
This commit is contained in:
Joseph Myers 2013-11-06 22:46:39 +00:00 committed by Joseph Myers
parent 3c40bae1c5
commit 9954c743b9
88 changed files with 4681 additions and 3680 deletions

View File

@ -1,3 +1,10 @@
2013-11-06 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/torture/float128-cmp-invalid.c,
gcc.dg/torture/float128-div-underflow.c,
gcc.dg/torture/float128-extend-nan.c,
gcc.dg/torture/fp-int-convert-float128-timode-3.c: New tests.
2013-11-06 Oleg Endo <olegendo@gcc.gnu.org>
* gcc.target/sh/pr51244-11.c: Remove target line.

View File

@ -0,0 +1,18 @@
/* Test for "invalid" exceptions from __float128 comparisons. */
/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
/* { dg-options "" } */
#include <fenv.h>
#include <stdlib.h>
int
main (void)
{
volatile __float128 a = __builtin_nan (""), b = 0;
volatile int r = a < b;
if (!fetestexcept (FE_INVALID))
abort ();
if (r)
abort ();
exit (0);
}

View File

@ -0,0 +1,18 @@
/* Test for spurious underflow from __float128 division. */
/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
/* { dg-options "" } */
#include <fenv.h>
#include <stdlib.h>
int
main (void)
{
volatile __float128 a = 0x0.fffp-16382q, b = 0x0.fffp0q, c;
c = a / b;
if (fetestexcept (FE_UNDERFLOW | FE_INEXACT))
abort ();
if (c != 0x1p-16382q)
abort ();
exit (0);
}

View File

@ -0,0 +1,22 @@
/* Test extensions to __float128 quiet signaling NaNs. */
/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
/* { dg-options "-fsignaling-nans" } */
#include <fenv.h>
#include <float.h>
#include <stdlib.h>
volatile long double a = __builtin_nansl ("");
int
main (void)
{
#if LDBL_MANT_DIG < 113
volatile __float128 r = a;
feclearexcept (FE_INVALID);
r += 1;
if (fetestexcept (FE_INVALID))
abort ();
#endif
exit (0);
}

View File

@ -0,0 +1,23 @@
/* Test for correct rounding of conversions from __int128 to
__float128. */
/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
/* { dg-require-effective-target int128 } */
/* { dg-options "-frounding-math" } */
#include <fenv.h>
#include <stdlib.h>
int
main (void)
{
volatile unsigned long long h = -1ULL;
volatile unsigned __int128 u128 = (((unsigned __int128) h) << 64) | h;
volatile __int128 s128 = u128 >> 1;
fesetround (FE_TOWARDZERO);
__float128 ru = u128, rs = s128;
if (ru != 0x1.ffffffffffffffffffffffffffffp127q)
abort ();
if (rs != 0x1.ffffffffffffffffffffffffffffp126q)
abort ();
exit (0);
}

View File

@ -1,3 +1,88 @@
2013-11-06 Joseph Myers <joseph@codesourcery.com>
* soft-fp/README: Update.
* soft-fp/adddf3.c: Update from glibc.
* soft-fp/addsf3.c: Likewise.
* soft-fp/addtf3.c: Likewise.
* soft-fp/divdf3.c: Likewise.
* soft-fp/divsf3.c: Likewise.
* soft-fp/divtf3.c: Likewise.
* soft-fp/double.h: Likewise.
* soft-fp/eqdf2.c: Likewise.
* soft-fp/eqsf2.c: Likewise.
* soft-fp/eqtf2.c: Likewise.
* soft-fp/extenddftf2.c: Likewise.
* soft-fp/extended.h: Likewise.
* soft-fp/extendsfdf2.c: Likewise.
* soft-fp/extendsftf2.c: Likewise.
* soft-fp/extendxftf2.c: Likewise.
* soft-fp/fixdfdi.c: Likewise.
* soft-fp/fixdfsi.c: Likewise.
* soft-fp/fixdfti.c: Likewise.
* soft-fp/fixsfdi.c: Likewise.
* soft-fp/fixsfsi.c: Likewise.
* soft-fp/fixsfti.c: Likewise.
* soft-fp/fixtfdi.c: Likewise.
* soft-fp/fixtfsi.c: Likewise.
* soft-fp/fixtfti.c: Likewise.
* soft-fp/fixunsdfdi.c: Likewise.
* soft-fp/fixunsdfsi.c: Likewise.
* soft-fp/fixunsdfti.c: Likewise.
* soft-fp/fixunssfdi.c: Likewise.
* soft-fp/fixunssfsi.c: Likewise.
* soft-fp/fixunssfti.c: Likewise.
* soft-fp/fixunstfdi.c: Likewise.
* soft-fp/fixunstfsi.c: Likewise.
* soft-fp/fixunstfti.c: Likewise.
* soft-fp/floatdidf.c: Likewise.
* soft-fp/floatdisf.c: Likewise.
* soft-fp/floatditf.c: Likewise.
* soft-fp/floatsidf.c: Likewise.
* soft-fp/floatsisf.c: Likewise.
* soft-fp/floatsitf.c: Likewise.
* soft-fp/floattidf.c: Likewise.
* soft-fp/floattisf.c: Likewise.
* soft-fp/floattitf.c: Likewise.
* soft-fp/floatundidf.c: Likewise.
* soft-fp/floatundisf.c: Likewise.
* soft-fp/floatunditf.c: Likewise.
* soft-fp/floatunsidf.c: Likewise.
* soft-fp/floatunsisf.c: Likewise.
* soft-fp/floatunsitf.c: Likewise.
* soft-fp/floatuntidf.c: Likewise.
* soft-fp/floatuntisf.c: Likewise.
* soft-fp/floatuntitf.c: Likewise.
* soft-fp/gedf2.c: Likewise.
* soft-fp/gesf2.c: Likewise.
* soft-fp/getf2.c: Likewise.
* soft-fp/ledf2.c: Likewise.
* soft-fp/lesf2.c: Likewise.
* soft-fp/letf2.c: Likewise.
* soft-fp/muldf3.c: Likewise.
* soft-fp/mulsf3.c: Likewise.
* soft-fp/multf3.c: Likewise.
* soft-fp/negdf2.c: Likewise.
* soft-fp/negsf2.c: Likewise.
* soft-fp/negtf2.c: Likewise.
* soft-fp/op-1.h: Likewise.
* soft-fp/op-2.h: Likewise.
* soft-fp/op-4.h: Likewise.
* soft-fp/op-8.h: Likewise.
* soft-fp/op-common.h: Likewise.
* soft-fp/quad.h: Likewise.
* soft-fp/single.h: Likewise.
* soft-fp/soft-fp.h: Likewise.
* soft-fp/subdf3.c: Likewise.
* soft-fp/subsf3.c: Likewise.
* soft-fp/subtf3.c: Likewise.
* soft-fp/truncdfsf2.c: Likewise.
* soft-fp/trunctfdf2.c: Likewise.
* soft-fp/trunctfsf2.c: Likewise.
* soft-fp/trunctfxf2.c: Likewise.
* soft-fp/unorddf2.c: Likewise.
* soft-fp/unordsf2.c: Likewise.
* soft-fp/unordtf2.c: Likewise.
2013-11-05 Uros Bizjak <ubizjak@gmail.com>
* config/i386/32/sfp-machine.h (_FP_MUL_MEAT_S): Define.

View File

@ -1,5 +1,4 @@
Except for conversions involving TImode and conversions involving
XFmode, the files in this directory are part of the GNU C Library, not part
of GCC. As described at <http://gcc.gnu.org/codingconventions.html>, changes
should be made to the GNU C Library and the changed files then imported
into GCC.
The files in this directory are part of the GNU C Library, not part of
GCC. As described at <http://gcc.gnu.org/codingconventions.html>,
changes should be made to the GNU C Library and the changed files then
imported into GCC.

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "double.h"
DFtype __adddf3(DFtype a, DFtype b)
DFtype
__adddf3 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
FP_DECL_D (A);
FP_DECL_D (B);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_D(A, a);
FP_UNPACK_SEMIRAW_D(B, b);
FP_ADD_D(R, A, B);
FP_PACK_SEMIRAW_D(r, R);
FP_UNPACK_SEMIRAW_D (A, a);
FP_UNPACK_SEMIRAW_D (B, b);
FP_ADD_D (R, A, B);
FP_PACK_SEMIRAW_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "single.h"
SFtype __addsf3(SFtype a, SFtype b)
SFtype
__addsf3 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
FP_DECL_S (A);
FP_DECL_S (B);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_S(A, a);
FP_UNPACK_SEMIRAW_S(B, b);
FP_ADD_S(R, A, B);
FP_PACK_SEMIRAW_S(r, R);
FP_UNPACK_SEMIRAW_S (A, a);
FP_UNPACK_SEMIRAW_S (B, b);
FP_ADD_S (R, A, B);
FP_PACK_SEMIRAW_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "quad.h"
TFtype __addtf3(TFtype a, TFtype b)
TFtype
__addtf3 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
FP_DECL_Q (A);
FP_DECL_Q (B);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_Q(A, a);
FP_UNPACK_SEMIRAW_Q(B, b);
FP_ADD_Q(R, A, B);
FP_PACK_SEMIRAW_Q(r, R);
FP_UNPACK_SEMIRAW_Q (A, a);
FP_UNPACK_SEMIRAW_Q (B, b);
FP_ADD_Q (R, A, B);
FP_PACK_SEMIRAW_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "double.h"
DFtype __divdf3(DFtype a, DFtype b)
DFtype
__divdf3 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
FP_DECL_D (A);
FP_DECL_D (B);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_D(A, a);
FP_UNPACK_D(B, b);
FP_DIV_D(R, A, B);
FP_PACK_D(r, R);
FP_UNPACK_D (A, a);
FP_UNPACK_D (B, b);
FP_DIV_D (R, A, B);
FP_PACK_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "single.h"
SFtype __divsf3(SFtype a, SFtype b)
SFtype
__divsf3 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
FP_DECL_S (A);
FP_DECL_S (B);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_S(A, a);
FP_UNPACK_S(B, b);
FP_DIV_S(R, A, B);
FP_PACK_S(r, R);
FP_UNPACK_S (A, a);
FP_UNPACK_S (B, b);
FP_DIV_S (R, A, B);
FP_PACK_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "quad.h"
TFtype __divtf3(TFtype a, TFtype b)
TFtype
__divtf3 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
FP_DECL_Q (A);
FP_DECL_Q (B);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_Q(A, a);
FP_UNPACK_Q(B, b);
FP_DIV_Q(R, A, B);
FP_PACK_Q(r, R);
FP_UNPACK_Q (A, a);
FP_UNPACK_Q (B, b);
FP_DIV_Q (R, A, B);
FP_PACK_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,13 +31,15 @@
<http://www.gnu.org/licenses/>. */
#if _FP_W_TYPE_SIZE < 32
#error "Here's a nickel kid. Go buy yourself a real computer."
# error "Here's a nickel kid. Go buy yourself a real computer."
#endif
#if _FP_W_TYPE_SIZE < 64
#define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_DW_D (4 * _FP_W_TYPE_SIZE)
#else
#define _FP_FRACTBITS_D _FP_W_TYPE_SIZE
# define _FP_FRACTBITS_D _FP_W_TYPE_SIZE
# define _FP_FRACTBITS_DW_D (2 * _FP_W_TYPE_SIZE)
#endif
#define _FP_FRACBITS_D 53
@ -49,215 +51,264 @@
#define _FP_EXPMAX_D 2047
#define _FP_QNANBIT_D \
((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
#define _FP_QNANBIT_SH_D \
((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_D \
((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_SH_D \
((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_OVERFLOW_D \
((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
typedef float DFtype __attribute__((mode(DF)));
#define _FP_WFRACBITS_DW_D (2 * _FP_WFRACBITS_D)
#define _FP_WFRACXBITS_DW_D (_FP_FRACTBITS_DW_D - _FP_WFRACBITS_DW_D)
#define _FP_HIGHBIT_DW_D \
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_D - 1) % _FP_W_TYPE_SIZE)
typedef float DFtype __attribute__ ((mode (DF)));
#if _FP_W_TYPE_SIZE < 64
union _FP_UNION_D
{
DFtype flt;
struct _FP_STRUCT_LAYOUT {
#if __BYTE_ORDER == __BIG_ENDIAN
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_D;
unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
unsigned frac0 : _FP_W_TYPE_SIZE;
#else
# else
unsigned frac0 : _FP_W_TYPE_SIZE;
unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_D;
unsigned sign : 1;
#endif
} bits __attribute__((packed));
# endif
} bits __attribute__ ((packed));
};
#define FP_DECL_D(X) _FP_DECL(2,X)
#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val)
#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_2_P(D,X,val)
#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_2(D,val,X)
#define FP_PACK_RAW_DP(val,X) \
do { \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(D,val,X); \
} while (0)
# define FP_DECL_D(X) _FP_DECL (2, X)
# define FP_UNPACK_RAW_D(X, val) _FP_UNPACK_RAW_2 (D, X, val)
# define FP_UNPACK_RAW_DP(X, val) _FP_UNPACK_RAW_2_P (D, X, val)
# define FP_PACK_RAW_D(val, X) _FP_PACK_RAW_2 (D, val, X)
# define FP_PACK_RAW_DP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (D, val, X); \
} \
while (0)
#define FP_UNPACK_D(X,val) \
do { \
_FP_UNPACK_RAW_2(D,X,val); \
_FP_UNPACK_CANONICAL(D,2,X); \
} while (0)
# define FP_UNPACK_D(X, val) \
do \
{ \
_FP_UNPACK_RAW_2 (D, X, val); \
_FP_UNPACK_CANONICAL (D, 2, X); \
} \
while (0)
#define FP_UNPACK_DP(X,val) \
do { \
_FP_UNPACK_RAW_2_P(D,X,val); \
_FP_UNPACK_CANONICAL(D,2,X); \
} while (0)
# define FP_UNPACK_DP(X, val) \
do \
{ \
_FP_UNPACK_RAW_2_P (D, X, val); \
_FP_UNPACK_CANONICAL (D, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_D(X,val) \
do { \
_FP_UNPACK_RAW_2(D,X,val); \
_FP_UNPACK_SEMIRAW(D,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_D(X, val) \
do \
{ \
_FP_UNPACK_RAW_2 (D, X, val); \
_FP_UNPACK_SEMIRAW (D, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_DP(X,val) \
do { \
_FP_UNPACK_RAW_2_P(D,X,val); \
_FP_UNPACK_SEMIRAW(D,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_DP(X, val) \
do \
{ \
_FP_UNPACK_RAW_2_P (D, X, val); \
_FP_UNPACK_SEMIRAW (D, 2, X); \
} \
while (0)
#define FP_PACK_D(val,X) \
do { \
_FP_PACK_CANONICAL(D,2,X); \
_FP_PACK_RAW_2(D,val,X); \
} while (0)
# define FP_PACK_D(val, X) \
do \
{ \
_FP_PACK_CANONICAL (D, 2, X); \
_FP_PACK_RAW_2 (D, val, X); \
} \
while (0)
#define FP_PACK_DP(val,X) \
do { \
_FP_PACK_CANONICAL(D,2,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(D,val,X); \
} while (0)
# define FP_PACK_DP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (D, 2, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (D, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_D(val,X) \
do { \
_FP_PACK_SEMIRAW(D,2,X); \
_FP_PACK_RAW_2(D,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_D(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (D, 2, X); \
_FP_PACK_RAW_2 (D, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_DP(val,X) \
do { \
_FP_PACK_SEMIRAW(D,2,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(D,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_DP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (D, 2, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (D, val, X); \
} \
while (0)
#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,2,X)
#define FP_NEG_D(R,X) _FP_NEG(D,2,R,X)
#define FP_ADD_D(R,X,Y) _FP_ADD(D,2,R,X,Y)
#define FP_SUB_D(R,X,Y) _FP_SUB(D,2,R,X,Y)
#define FP_MUL_D(R,X,Y) _FP_MUL(D,2,R,X,Y)
#define FP_DIV_D(R,X,Y) _FP_DIV(D,2,R,X,Y)
#define FP_SQRT_D(R,X) _FP_SQRT(D,2,R,X)
#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q)
# define FP_ISSIGNAN_D(X) _FP_ISSIGNAN (D, 2, X)
# define FP_NEG_D(R, X) _FP_NEG (D, 2, R, X)
# define FP_ADD_D(R, X, Y) _FP_ADD (D, 2, R, X, Y)
# define FP_SUB_D(R, X, Y) _FP_SUB (D, 2, R, X, Y)
# define FP_MUL_D(R, X, Y) _FP_MUL (D, 2, R, X, Y)
# define FP_DIV_D(R, X, Y) _FP_DIV (D, 2, R, X, Y)
# define FP_SQRT_D(R, X) _FP_SQRT (D, 2, R, X)
# define _FP_SQRT_MEAT_D(R, S, T, X, Q) _FP_SQRT_MEAT_2 (R, S, T, X, Q)
# define FP_FMA_D(R, X, Y, Z) _FP_FMA (D, 2, 4, R, X, Y, Z)
#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,2,r,X,Y,un)
#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,2,r,X,Y)
#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,2,r,X,Y)
# define FP_CMP_D(r, X, Y, un) _FP_CMP (D, 2, r, X, Y, un)
# define FP_CMP_EQ_D(r, X, Y) _FP_CMP_EQ (D, 2, r, X, Y)
# define FP_CMP_UNORD_D(r, X, Y) _FP_CMP_UNORD (D, 2, r, X, Y)
#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,2,r,X,rsz,rsg)
#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,2,X,r,rs,rt)
# define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 2, r, X, rsz, rsg)
# define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 2, X, r, rs, rt)
#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_2(X)
#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2(X)
# define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_2 (X)
# define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_2 (X)
# define _FP_FRAC_HIGH_DW_D(X) _FP_FRAC_HIGH_4 (X)
#else
union _FP_UNION_D
{
DFtype flt;
struct _FP_STRUCT_LAYOUT {
#if __BYTE_ORDER == __BIG_ENDIAN
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_D;
_FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
#else
# else
_FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
unsigned exp : _FP_EXPBITS_D;
unsigned sign : 1;
#endif
} bits __attribute__((packed));
# endif
} bits __attribute__ ((packed));
};
#define FP_DECL_D(X) _FP_DECL(1,X)
#define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val)
#define FP_UNPACK_RAW_DP(X,val) _FP_UNPACK_RAW_1_P(D,X,val)
#define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_1(D,val,X)
#define FP_PACK_RAW_DP(val,X) \
do { \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(D,val,X); \
} while (0)
# define FP_DECL_D(X) _FP_DECL (1, X)
# define FP_UNPACK_RAW_D(X, val) _FP_UNPACK_RAW_1 (D, X, val)
# define FP_UNPACK_RAW_DP(X, val) _FP_UNPACK_RAW_1_P (D, X, val)
# define FP_PACK_RAW_D(val, X) _FP_PACK_RAW_1 (D, val, X)
# define FP_PACK_RAW_DP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (D, val, X); \
} \
while (0)
#define FP_UNPACK_D(X,val) \
do { \
_FP_UNPACK_RAW_1(D,X,val); \
_FP_UNPACK_CANONICAL(D,1,X); \
} while (0)
# define FP_UNPACK_D(X, val) \
do \
{ \
_FP_UNPACK_RAW_1 (D, X, val); \
_FP_UNPACK_CANONICAL (D, 1, X); \
} \
while (0)
#define FP_UNPACK_DP(X,val) \
do { \
_FP_UNPACK_RAW_1_P(D,X,val); \
_FP_UNPACK_CANONICAL(D,1,X); \
} while (0)
# define FP_UNPACK_DP(X, val) \
do \
{ \
_FP_UNPACK_RAW_1_P (D, X, val); \
_FP_UNPACK_CANONICAL (D, 1, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_D(X,val) \
do { \
_FP_UNPACK_RAW_1(D,X,val); \
_FP_UNPACK_SEMIRAW(D,1,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_D(X, val) \
do \
{ \
_FP_UNPACK_RAW_1 (D, X, val); \
_FP_UNPACK_SEMIRAW (D, 1, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_DP(X,val) \
do { \
_FP_UNPACK_RAW_1_P(D,X,val); \
_FP_UNPACK_SEMIRAW(D,1,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_DP(X, val) \
do \
{ \
_FP_UNPACK_RAW_1_P (D, X, val); \
_FP_UNPACK_SEMIRAW (D, 1, X); \
} \
while (0)
#define FP_PACK_D(val,X) \
do { \
_FP_PACK_CANONICAL(D,1,X); \
_FP_PACK_RAW_1(D,val,X); \
} while (0)
# define FP_PACK_D(val, X) \
do \
{ \
_FP_PACK_CANONICAL (D, 1, X); \
_FP_PACK_RAW_1 (D, val, X); \
} \
while (0)
#define FP_PACK_DP(val,X) \
do { \
_FP_PACK_CANONICAL(D,1,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(D,val,X); \
} while (0)
# define FP_PACK_DP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (D, 1, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (D, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_D(val,X) \
do { \
_FP_PACK_SEMIRAW(D,1,X); \
_FP_PACK_RAW_1(D,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_D(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (D, 1, X); \
_FP_PACK_RAW_1 (D, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_DP(val,X) \
do { \
_FP_PACK_SEMIRAW(D,1,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(D,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_DP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (D, 1, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (D, val, X); \
} \
while (0)
#define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,1,X)
#define FP_NEG_D(R,X) _FP_NEG(D,1,R,X)
#define FP_ADD_D(R,X,Y) _FP_ADD(D,1,R,X,Y)
#define FP_SUB_D(R,X,Y) _FP_SUB(D,1,R,X,Y)
#define FP_MUL_D(R,X,Y) _FP_MUL(D,1,R,X,Y)
#define FP_DIV_D(R,X,Y) _FP_DIV(D,1,R,X,Y)
#define FP_SQRT_D(R,X) _FP_SQRT(D,1,R,X)
#define _FP_SQRT_MEAT_D(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q)
# define FP_ISSIGNAN_D(X) _FP_ISSIGNAN (D, 1, X)
# define FP_NEG_D(R, X) _FP_NEG (D, 1, R, X)
# define FP_ADD_D(R, X, Y) _FP_ADD (D, 1, R, X, Y)
# define FP_SUB_D(R, X, Y) _FP_SUB (D, 1, R, X, Y)
# define FP_MUL_D(R, X, Y) _FP_MUL (D, 1, R, X, Y)
# define FP_DIV_D(R, X, Y) _FP_DIV (D, 1, R, X, Y)
# define FP_SQRT_D(R, X) _FP_SQRT (D, 1, R, X)
# define _FP_SQRT_MEAT_D(R, S, T, X, Q) _FP_SQRT_MEAT_1 (R, S, T, X, Q)
# define FP_FMA_D(R, X, Y, Z) _FP_FMA (D, 1, 2, R, X, Y, Z)
/* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
the target machine. */
#define FP_CMP_D(r,X,Y,un) _FP_CMP(D,1,r,X,Y,un)
#define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,1,r,X,Y)
#define FP_CMP_UNORD_D(r,X,Y) _FP_CMP_UNORD(D,1,r,X,Y)
# define FP_CMP_D(r, X, Y, un) _FP_CMP (D, 1, r, X, Y, un)
# define FP_CMP_EQ_D(r, X, Y) _FP_CMP_EQ (D, 1, r, X, Y)
# define FP_CMP_UNORD_D(r, X, Y) _FP_CMP_UNORD (D, 1, r, X, Y)
#define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,1,r,X,rsz,rsg)
#define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,1,X,r,rs,rt)
# define FP_TO_INT_D(r, X, rsz, rsg) _FP_TO_INT (D, 1, r, X, rsz, rsg)
# define FP_FROM_INT_D(X, r, rs, rt) _FP_FROM_INT (D, 1, X, r, rs, rt)
#define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_1(X)
#define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1(X)
# define _FP_FRAC_HIGH_D(X) _FP_FRAC_HIGH_1 (X)
# define _FP_FRAC_HIGH_RAW_D(X) _FP_FRAC_HIGH_1 (X)
# define _FP_FRAC_HIGH_DW_D(X) _FP_FRAC_HIGH_2 (X)
#endif /* W_TYPE_SIZE < 64 */

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "double.h"
CMPtype __eqdf2(DFtype a, DFtype b)
CMPtype
__eqdf2 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B);
FP_DECL_D (A);
FP_DECL_D (B);
CMPtype r;
FP_UNPACK_RAW_D(A, a);
FP_UNPACK_RAW_D(B, b);
FP_CMP_EQ_D(r, A, B);
if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_UNPACK_RAW_D (B, b);
FP_CMP_EQ_D (r, A, B);
if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__eqdf2, __nedf2);
strong_alias (__eqdf2, __nedf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "single.h"
CMPtype __eqsf2(SFtype a, SFtype b)
CMPtype
__eqsf2 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B);
FP_DECL_S (A);
FP_DECL_S (B);
CMPtype r;
FP_UNPACK_RAW_S(A, a);
FP_UNPACK_RAW_S(B, b);
FP_CMP_EQ_S(r, A, B);
if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_UNPACK_RAW_S (B, b);
FP_CMP_EQ_S (r, A, B);
if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__eqsf2, __nesf2);
strong_alias (__eqsf2, __nesf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "quad.h"
CMPtype __eqtf2(TFtype a, TFtype b)
CMPtype
__eqtf2 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B);
FP_DECL_Q (A);
FP_DECL_Q (B);
CMPtype r;
FP_UNPACK_RAW_Q(A, a);
FP_UNPACK_RAW_Q(B, b);
FP_CMP_EQ_Q(r, A, B);
if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_UNPACK_RAW_Q (B, b);
FP_CMP_EQ_Q (r, A, B);
if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__eqtf2, __netf2);
strong_alias (__eqtf2, __netf2);

View File

@ -32,21 +32,22 @@
#include "double.h"
#include "quad.h"
TFtype __extenddftf2(DFtype a)
TFtype
__extenddftf2 (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_Q(R);
FP_DECL_D (A);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_RAW_D(A, a);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_EXTEND(Q,D,4,2,R,A);
FP_EXTEND (Q, D, 4, 2, R, A);
#else
FP_EXTEND(Q,D,2,1,R,A);
FP_EXTEND (Q, D, 2, 1, R, A);
#endif
FP_PACK_RAW_Q(r, R);
FP_PACK_RAW_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -28,13 +28,15 @@
<http://www.gnu.org/licenses/>. */
#if _FP_W_TYPE_SIZE < 32
#error "Here's a nickel, kid. Go buy yourself a real computer."
# error "Here's a nickel, kid. Go buy yourself a real computer."
#endif
#if _FP_W_TYPE_SIZE < 64
#define _FP_FRACTBITS_E (4*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_E (4*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_DW_E (8*_FP_W_TYPE_SIZE)
#else
#define _FP_FRACTBITS_E (2*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_E (2*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_DW_E (4*_FP_W_TYPE_SIZE)
#endif
#define _FP_FRACBITS_E 64
@ -46,152 +48,187 @@
#define _FP_EXPMAX_E 32767
#define _FP_QNANBIT_E \
((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
#define _FP_QNANBIT_SH_E \
((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_E \
((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_SH_E \
((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_OVERFLOW_E \
((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
typedef float XFtype __attribute__((mode(XF)));
#define _FP_WFRACBITS_DW_E (2 * _FP_WFRACBITS_E)
#define _FP_WFRACXBITS_DW_E (_FP_FRACTBITS_DW_E - _FP_WFRACBITS_DW_E)
#define _FP_HIGHBIT_DW_E \
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_E - 1) % _FP_W_TYPE_SIZE)
typedef float XFtype __attribute__ ((mode (XF)));
#if _FP_W_TYPE_SIZE < 64
union _FP_UNION_E
{
XFtype flt;
struct _FP_STRUCT_LAYOUT
{
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned long pad1 : _FP_W_TYPE_SIZE;
unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
unsigned long sign : 1;
unsigned long exp : _FP_EXPBITS_E;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE;
#else
unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_E;
unsigned sign : 1;
#endif /* not bigendian */
} bits __attribute__((packed));
XFtype flt;
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
unsigned long pad1 : _FP_W_TYPE_SIZE;
unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
unsigned long sign : 1;
unsigned long exp : _FP_EXPBITS_E;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE;
# else
unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_E;
unsigned sign : 1;
# endif /* not bigendian */
} bits __attribute__ ((packed));
};
#define FP_DECL_E(X) _FP_DECL(4,X)
# define FP_DECL_E(X) _FP_DECL (4, X)
#define FP_UNPACK_RAW_E(X, val) \
do { \
union _FP_UNION_E _flo; _flo.flt = (val); \
\
X##_f[2] = 0; X##_f[3] = 0; \
X##_f[0] = _flo.bits.frac0; \
X##_f[1] = _flo.bits.frac1; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} while (0)
# define FP_UNPACK_RAW_E(X, val) \
do \
{ \
union _FP_UNION_E _flo; \
_flo.flt = (val); \
\
X##_f[2] = 0; \
X##_f[3] = 0; \
X##_f[0] = _flo.bits.frac0; \
X##_f[1] = _flo.bits.frac1; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} \
while (0)
#define FP_UNPACK_RAW_EP(X, val) \
do { \
union _FP_UNION_E *_flo = \
(union _FP_UNION_E *)(val); \
\
X##_f[2] = 0; X##_f[3] = 0; \
X##_f[0] = _flo->bits.frac0; \
X##_f[1] = _flo->bits.frac1; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} while (0)
# define FP_UNPACK_RAW_EP(X, val) \
do \
{ \
union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val); \
\
X##_f[2] = 0; \
X##_f[3] = 0; \
X##_f[0] = _flo->bits.frac0; \
X##_f[1] = _flo->bits.frac1; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} \
while (0)
#define FP_PACK_RAW_E(val, X) \
do { \
union _FP_UNION_E _flo; \
\
if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \
else X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo.bits.frac0 = X##_f[0]; \
_flo.bits.frac1 = X##_f[1]; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} while (0)
# define FP_PACK_RAW_E(val, X) \
do \
{ \
union _FP_UNION_E _flo; \
\
if (X##_e) \
X##_f[1] |= _FP_IMPLBIT_E; \
else \
X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo.bits.frac0 = X##_f[0]; \
_flo.bits.frac1 = X##_f[1]; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} \
while (0)
#define FP_PACK_RAW_EP(val, X) \
do { \
if (!FP_INHIBIT_RESULTS) \
{ \
union _FP_UNION_E *_flo = \
(union _FP_UNION_E *)(val); \
\
if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \
else X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo->bits.frac0 = X##_f[0]; \
_flo->bits.frac1 = X##_f[1]; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} \
} while (0)
# define FP_PACK_RAW_EP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
{ \
union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val); \
\
if (X##_e) \
X##_f[1] |= _FP_IMPLBIT_E; \
else \
X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo->bits.frac0 = X##_f[0]; \
_flo->bits.frac1 = X##_f[1]; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} \
} \
while (0)
#define FP_UNPACK_E(X,val) \
do { \
FP_UNPACK_RAW_E(X,val); \
_FP_UNPACK_CANONICAL(E,4,X); \
} while (0)
# define FP_UNPACK_E(X, val) \
do \
{ \
FP_UNPACK_RAW_E (X, val); \
_FP_UNPACK_CANONICAL (E, 4, X); \
} \
while (0)
#define FP_UNPACK_EP(X,val) \
do { \
FP_UNPACK_RAW_EP(X,val); \
_FP_UNPACK_CANONICAL(E,4,X); \
} while (0)
# define FP_UNPACK_EP(X, val) \
do \
{ \
FP_UNPACK_RAW_EP (X, val); \
_FP_UNPACK_CANONICAL (E, 4, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_E(X,val) \
do { \
FP_UNPACK_RAW_E(X,val); \
_FP_UNPACK_SEMIRAW(E,4,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_E(X, val) \
do \
{ \
FP_UNPACK_RAW_E (X, val); \
_FP_UNPACK_SEMIRAW (E, 4, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_EP(X,val) \
do { \
FP_UNPACK_RAW_EP(X,val); \
_FP_UNPACK_SEMIRAW(E,4,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_EP(X, val) \
do \
{ \
FP_UNPACK_RAW_EP (X, val); \
_FP_UNPACK_SEMIRAW (E, 4, X); \
} \
while (0)
#define FP_PACK_E(val,X) \
do { \
_FP_PACK_CANONICAL(E,4,X); \
FP_PACK_RAW_E(val,X); \
} while (0)
# define FP_PACK_E(val, X) \
do \
{ \
_FP_PACK_CANONICAL (E, 4, X); \
FP_PACK_RAW_E (val, X); \
} \
while (0)
#define FP_PACK_EP(val,X) \
do { \
_FP_PACK_CANONICAL(E,4,X); \
FP_PACK_RAW_EP(val,X); \
} while (0)
# define FP_PACK_EP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (E, 4, X); \
FP_PACK_RAW_EP (val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_E(val,X) \
do { \
_FP_PACK_SEMIRAW(E,4,X); \
FP_PACK_RAW_E(val,X); \
} while (0)
# define FP_PACK_SEMIRAW_E(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (E, 4, X); \
FP_PACK_RAW_E (val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_EP(val,X) \
do { \
_FP_PACK_SEMIRAW(E,4,X); \
FP_PACK_RAW_EP(val,X); \
} while (0)
# define FP_PACK_SEMIRAW_EP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (E, 4, X); \
FP_PACK_RAW_EP (val, X); \
} \
while (0)
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
#define FP_NEG_E(R,X) _FP_NEG(E,4,R,X)
#define FP_ADD_E(R,X,Y) _FP_ADD(E,4,R,X,Y)
#define FP_SUB_E(R,X,Y) _FP_SUB(E,4,R,X,Y)
#define FP_MUL_E(R,X,Y) _FP_MUL(E,4,R,X,Y)
#define FP_DIV_E(R,X,Y) _FP_DIV(E,4,R,X,Y)
#define FP_SQRT_E(R,X) _FP_SQRT(E,4,R,X)
# define FP_ISSIGNAN_E(X) _FP_ISSIGNAN (E, 4, X)
# define FP_NEG_E(R, X) _FP_NEG (E, 4, R, X)
# define FP_ADD_E(R, X, Y) _FP_ADD (E, 4, R, X, Y)
# define FP_SUB_E(R, X, Y) _FP_SUB (E, 4, R, X, Y)
# define FP_MUL_E(R, X, Y) _FP_MUL (E, 4, R, X, Y)
# define FP_DIV_E(R, X, Y) _FP_DIV (E, 4, R, X, Y)
# define FP_SQRT_E(R, X) _FP_SQRT (E, 4, R, X)
# define FP_FMA_E(R, X, Y, Z) _FP_FMA (E, 4, 8, R, X, Y, Z)
/*
* Square root algorithms:
@ -204,185 +241,218 @@ union _FP_UNION_E
* in two UWtype registers instead of four.
*/
#define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do { \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
_FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \
while (q) \
{ \
T##_f[1] = S##_f[1] + q; \
if (T##_f[1] <= X##_f[1]) \
{ \
S##_f[1] = T##_f[1] + q; \
X##_f[1] -= T##_f[1]; \
R##_f[1] += q; \
} \
_FP_FRAC_SLL_2(X, 1); \
q >>= 1; \
} \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
while (q) \
{ \
T##_f[0] = S##_f[0] + q; \
T##_f[1] = S##_f[1]; \
if (T##_f[1] < X##_f[1] || \
(T##_f[1] == X##_f[1] && \
T##_f[0] <= X##_f[0])) \
{ \
S##_f[0] = T##_f[0] + q; \
S##_f[1] += (T##_f[0] > S##_f[0]); \
_FP_FRAC_DEC_2(X, T); \
R##_f[0] += q; \
} \
_FP_FRAC_SLL_2(X, 1); \
q >>= 1; \
} \
_FP_FRAC_SLL_4(R, (_FP_WORKBITS)); \
if (X##_f[0] | X##_f[1]) \
{ \
if (S##_f[1] < X##_f[1] || \
(S##_f[1] == X##_f[1] && \
S##_f[0] < X##_f[0])) \
R##_f[0] |= _FP_WORK_ROUND; \
R##_f[0] |= _FP_WORK_STICKY; \
} \
} while (0)
# define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do \
{ \
q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1); \
_FP_FRAC_SRL_4 (X, (_FP_WORKBITS)); \
while (q) \
{ \
T##_f[1] = S##_f[1] + q; \
if (T##_f[1] <= X##_f[1]) \
{ \
S##_f[1] = T##_f[1] + q; \
X##_f[1] -= T##_f[1]; \
R##_f[1] += q; \
} \
_FP_FRAC_SLL_2 (X, 1); \
q >>= 1; \
} \
q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1); \
while (q) \
{ \
T##_f[0] = S##_f[0] + q; \
T##_f[1] = S##_f[1]; \
if (T##_f[1] < X##_f[1] \
|| (T##_f[1] == X##_f[1] \
&& T##_f[0] <= X##_f[0])) \
{ \
S##_f[0] = T##_f[0] + q; \
S##_f[1] += (T##_f[0] > S##_f[0]); \
_FP_FRAC_DEC_2 (X, T); \
R##_f[0] += q; \
} \
_FP_FRAC_SLL_2 (X, 1); \
q >>= 1; \
} \
_FP_FRAC_SLL_4 (R, (_FP_WORKBITS)); \
if (X##_f[0] | X##_f[1]) \
{ \
if (S##_f[1] < X##_f[1] \
|| (S##_f[1] == X##_f[1] \
&& S##_f[0] < X##_f[0])) \
R##_f[0] |= _FP_WORK_ROUND; \
R##_f[0] |= _FP_WORK_STICKY; \
} \
} \
while (0)
#define FP_CMP_E(r,X,Y,un) _FP_CMP(E,4,r,X,Y,un)
#define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,4,r,X,Y)
#define FP_CMP_UNORD_E(r,X,Y) _FP_CMP_UNORD(E,4,r,X,Y)
# define FP_CMP_E(r, X, Y, un) _FP_CMP (E, 4, r, X, Y, un)
# define FP_CMP_EQ_E(r, X, Y) _FP_CMP_EQ (E, 4, r, X, Y)
# define FP_CMP_UNORD_E(r, X, Y) _FP_CMP_UNORD (E, 4, r, X, Y)
#define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,4,r,X,rsz,rsg)
#define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,4,X,r,rs,rt)
# define FP_TO_INT_E(r, X, rsz, rsg) _FP_TO_INT (E, 4, r, X, rsz, rsg)
# define FP_FROM_INT_E(X, r, rs, rt) _FP_FROM_INT (E, 4, X, r, rs, rt)
#define _FP_FRAC_HIGH_E(X) (X##_f[2])
#define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
# define _FP_FRAC_HIGH_E(X) (X##_f[2])
# define _FP_FRAC_HIGH_RAW_E(X) (X##_f[1])
# define _FP_FRAC_HIGH_DW_E(X) (X##_f[4])
#else /* not _FP_W_TYPE_SIZE < 64 */
union _FP_UNION_E
{
XFtype flt;
struct _FP_STRUCT_LAYOUT {
#if __BYTE_ORDER == __BIG_ENDIAN
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
_FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_E;
_FP_W_TYPE frac : _FP_W_TYPE_SIZE;
#else
# else
_FP_W_TYPE frac : _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_E;
unsigned sign : 1;
#endif
# endif
} bits;
};
#define FP_DECL_E(X) _FP_DECL(2,X)
# define FP_DECL_E(X) _FP_DECL (2, X)
#define FP_UNPACK_RAW_E(X, val) \
do { \
union _FP_UNION_E _flo; _flo.flt = (val); \
# define FP_UNPACK_RAW_E(X, val) \
do \
{ \
union _FP_UNION_E _flo; \
_flo.flt = (val); \
\
X##_f0 = _flo.bits.frac; \
X##_f1 = 0; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} \
while (0)
# define FP_UNPACK_RAW_EP(X, val) \
do \
{ \
union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val); \
\
X##_f0 = _flo.bits.frac; \
X##_f1 = 0; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} while (0)
X##_f0 = _flo->bits.frac; \
X##_f1 = 0; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} \
while (0)
#define FP_UNPACK_RAW_EP(X, val) \
do { \
union _FP_UNION_E *_flo = \
(union _FP_UNION_E *)(val); \
\
X##_f0 = _flo->bits.frac; \
X##_f1 = 0; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} while (0)
# define FP_PACK_RAW_E(val, X) \
do \
{ \
union _FP_UNION_E _flo; \
\
if (X##_e) \
X##_f0 |= _FP_IMPLBIT_E; \
else \
X##_f0 &= ~(_FP_IMPLBIT_E); \
_flo.bits.frac = X##_f0; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} \
while (0)
#define FP_PACK_RAW_E(val, X) \
do { \
union _FP_UNION_E _flo; \
\
if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \
else X##_f0 &= ~(_FP_IMPLBIT_E); \
_flo.bits.frac = X##_f0; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} while (0)
#define FP_PACK_RAW_EP(fs, val, X) \
do { \
if (!FP_INHIBIT_RESULTS) \
{ \
union _FP_UNION_E *_flo = \
(union _FP_UNION_E *)(val); \
\
if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \
else X##_f0 &= ~(_FP_IMPLBIT_E); \
_flo->bits.frac = X##_f0; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} \
} while (0)
# define FP_PACK_RAW_EP(fs, val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
{ \
union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val); \
\
if (X##_e) \
X##_f0 |= _FP_IMPLBIT_E; \
else \
X##_f0 &= ~(_FP_IMPLBIT_E); \
_flo->bits.frac = X##_f0; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} \
} \
while (0)
#define FP_UNPACK_E(X,val) \
do { \
FP_UNPACK_RAW_E(X,val); \
_FP_UNPACK_CANONICAL(E,2,X); \
} while (0)
# define FP_UNPACK_E(X, val) \
do \
{ \
FP_UNPACK_RAW_E (X, val); \
_FP_UNPACK_CANONICAL (E, 2, X); \
} \
while (0)
#define FP_UNPACK_EP(X,val) \
do { \
FP_UNPACK_RAW_EP(X,val); \
_FP_UNPACK_CANONICAL(E,2,X); \
} while (0)
# define FP_UNPACK_EP(X, val) \
do \
{ \
FP_UNPACK_RAW_EP (X, val); \
_FP_UNPACK_CANONICAL (E, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_E(X,val) \
do { \
FP_UNPACK_RAW_E(X,val); \
_FP_UNPACK_SEMIRAW(E,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_E(X, val) \
do \
{ \
FP_UNPACK_RAW_E (X, val); \
_FP_UNPACK_SEMIRAW (E, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_EP(X,val) \
do { \
FP_UNPACK_RAW_EP(X,val); \
_FP_UNPACK_SEMIRAW(E,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_EP(X, val) \
do \
{ \
FP_UNPACK_RAW_EP (X, val); \
_FP_UNPACK_SEMIRAW (E, 2, X); \
} \
while (0)
#define FP_PACK_E(val,X) \
do { \
_FP_PACK_CANONICAL(E,2,X); \
FP_PACK_RAW_E(val,X); \
} while (0)
# define FP_PACK_E(val, X) \
do \
{ \
_FP_PACK_CANONICAL (E, 2, X); \
FP_PACK_RAW_E (val, X); \
} \
while (0)
#define FP_PACK_EP(val,X) \
do { \
_FP_PACK_CANONICAL(E,2,X); \
FP_PACK_RAW_EP(val,X); \
} while (0)
# define FP_PACK_EP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (E, 2, X); \
FP_PACK_RAW_EP (val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_E(val,X) \
do { \
_FP_PACK_SEMIRAW(E,2,X); \
FP_PACK_RAW_E(val,X); \
} while (0)
# define FP_PACK_SEMIRAW_E(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (E, 2, X); \
FP_PACK_RAW_E (val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_EP(val,X) \
do { \
_FP_PACK_SEMIRAW(E,2,X); \
FP_PACK_RAW_EP(val,X); \
} while (0)
# define FP_PACK_SEMIRAW_EP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (E, 2, X); \
FP_PACK_RAW_EP (val, X); \
} \
while (0)
#define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
#define FP_NEG_E(R,X) _FP_NEG(E,2,R,X)
#define FP_ADD_E(R,X,Y) _FP_ADD(E,2,R,X,Y)
#define FP_SUB_E(R,X,Y) _FP_SUB(E,2,R,X,Y)
#define FP_MUL_E(R,X,Y) _FP_MUL(E,2,R,X,Y)
#define FP_DIV_E(R,X,Y) _FP_DIV(E,2,R,X,Y)
#define FP_SQRT_E(R,X) _FP_SQRT(E,2,R,X)
# define FP_ISSIGNAN_E(X) _FP_ISSIGNAN (E, 2, X)
# define FP_NEG_E(R, X) _FP_NEG (E, 2, R, X)
# define FP_ADD_E(R, X, Y) _FP_ADD (E, 2, R, X, Y)
# define FP_SUB_E(R, X, Y) _FP_SUB (E, 2, R, X, Y)
# define FP_MUL_E(R, X, Y) _FP_MUL (E, 2, R, X, Y)
# define FP_DIV_E(R, X, Y) _FP_DIV (E, 2, R, X, Y)
# define FP_SQRT_E(R, X) _FP_SQRT (E, 2, R, X)
# define FP_FMA_E(R, X, Y, Z) _FP_FMA (E, 2, 4, R, X, Y, Z)
/*
* Square root algorithms:
@ -392,39 +462,43 @@ union _FP_UNION_E
* in one UWtype registers instead of two, although we don't
* have to.
*/
#define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do { \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
_FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \
while (q) \
{ \
T##_f0 = S##_f0 + q; \
if (T##_f0 <= X##_f0) \
{ \
S##_f0 = T##_f0 + q; \
X##_f0 -= T##_f0; \
R##_f0 += q; \
} \
_FP_FRAC_SLL_1(X, 1); \
q >>= 1; \
} \
_FP_FRAC_SLL_2(R, (_FP_WORKBITS)); \
if (X##_f0) \
{ \
if (S##_f0 < X##_f0) \
R##_f0 |= _FP_WORK_ROUND; \
R##_f0 |= _FP_WORK_STICKY; \
} \
} while (0)
# define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do \
{ \
q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1); \
_FP_FRAC_SRL_2 (X, (_FP_WORKBITS)); \
while (q) \
{ \
T##_f0 = S##_f0 + q; \
if (T##_f0 <= X##_f0) \
{ \
S##_f0 = T##_f0 + q; \
X##_f0 -= T##_f0; \
R##_f0 += q; \
} \
_FP_FRAC_SLL_1 (X, 1); \
q >>= 1; \
} \
_FP_FRAC_SLL_2 (R, (_FP_WORKBITS)); \
if (X##_f0) \
{ \
if (S##_f0 < X##_f0) \
R##_f0 |= _FP_WORK_ROUND; \
R##_f0 |= _FP_WORK_STICKY; \
} \
} \
while (0)
#define FP_CMP_E(r,X,Y,un) _FP_CMP(E,2,r,X,Y,un)
#define FP_CMP_EQ_E(r,X,Y) _FP_CMP_EQ(E,2,r,X,Y)
#define FP_CMP_UNORD_E(r,X,Y) _FP_CMP_UNORD(E,2,r,X,Y)
# define FP_CMP_E(r, X, Y, un) _FP_CMP (E, 2, r, X, Y, un)
# define FP_CMP_EQ_E(r, X, Y) _FP_CMP_EQ (E, 2, r, X, Y)
# define FP_CMP_UNORD_E(r, X, Y) _FP_CMP_UNORD (E, 2, r, X, Y)
#define FP_TO_INT_E(r,X,rsz,rsg) _FP_TO_INT(E,2,r,X,rsz,rsg)
#define FP_FROM_INT_E(X,r,rs,rt) _FP_FROM_INT(E,2,X,r,rs,rt)
# define FP_TO_INT_E(r, X, rsz, rsg) _FP_TO_INT (E, 2, r, X, rsz, rsg)
# define FP_FROM_INT_E(X, r, rs, rt) _FP_FROM_INT (E, 2, X, r, rs, rt)
#define _FP_FRAC_HIGH_E(X) (X##_f1)
#define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
# define _FP_FRAC_HIGH_E(X) (X##_f1)
# define _FP_FRAC_HIGH_RAW_E(X) (X##_f0)
# define _FP_FRAC_HIGH_DW_E(X) (X##_f[2])
#endif /* not _FP_W_TYPE_SIZE < 64 */

View File

@ -32,21 +32,22 @@
#include "single.h"
#include "double.h"
DFtype __extendsfdf2(SFtype a)
DFtype
__extendsfdf2 (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_D(R);
FP_DECL_S (A);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_RAW_S(A, a);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
FP_EXTEND(D,S,2,1,R,A);
FP_EXTEND (D, S, 2, 1, R, A);
#else
FP_EXTEND(D,S,1,1,R,A);
FP_EXTEND (D, S, 1, 1, R, A);
#endif
FP_PACK_RAW_D(r, R);
FP_PACK_RAW_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -32,21 +32,22 @@
#include "single.h"
#include "quad.h"
TFtype __extendsftf2(SFtype a)
TFtype
__extendsftf2 (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_Q(R);
FP_DECL_S (A);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_RAW_S(A, a);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_EXTEND(Q,S,4,1,R,A);
FP_EXTEND (Q, S, 4, 1, R, A);
#else
FP_EXTEND(Q,S,2,1,R,A);
FP_EXTEND (Q, S, 2, 1, R, A);
#endif
FP_PACK_RAW_Q(r, R);
FP_PACK_RAW_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Return a converted to IEEE quad
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,29 +24,29 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "extended.h"
#include "quad.h"
TFtype __extendxftf2(XFtype a)
TFtype
__extendxftf2 (XFtype a)
{
FP_DECL_EX;
FP_DECL_E(A);
FP_DECL_Q(R);
FP_DECL_E (A);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_RAW_E(A, a);
FP_UNPACK_RAW_E (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_EXTEND(Q,E,4,4,R,A);
FP_EXTEND (Q, E, 4, 4, R, A);
#else
FP_EXTEND(Q,E,2,2,R,A);
FP_EXTEND (Q, E, 2, 2, R, A);
#endif
FP_PACK_RAW_Q(r, R);
FP_PACK_RAW_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
DItype __fixdfdi(DFtype a)
DItype
__fixdfdi (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
UDItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, DI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, DI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
SItype __fixdfsi(DFtype a)
SItype
__fixdfsi (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
USItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, SI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, SI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE double to 128bit signed integer
Copyright (C) 2007, 2008 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "double.h"
TItype __fixdfti(DFtype a)
TItype
__fixdfti (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
UTItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, TI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, TI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
DItype __fixsfdi(SFtype a)
DItype
__fixsfdi (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
UDItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, DI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, DI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SItype __fixsfsi(SFtype a)
SItype
__fixsfsi (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
USItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, SI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, SI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE single to 128bit signed integer
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "single.h"
TItype __fixsfti(SFtype a)
TItype
__fixsfti (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
UTItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, TI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, TI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "quad.h"
DItype __fixtfdi(TFtype a)
DItype
__fixtfdi (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
UDItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, DI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, DI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "quad.h"
SItype __fixtfsi(TFtype a)
SItype
__fixtfsi (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
USItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, SI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, SI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE quad to 128bit signed integer
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "quad.h"
TItype __fixtfti(TFtype a)
TItype
__fixtfti (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
UTItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, TI_BITS, 1);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, TI_BITS, 1);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
UDItype __fixunsdfdi(DFtype a)
UDItype
__fixunsdfdi (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
UDItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, DI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, DI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
USItype __fixunsdfsi(DFtype a)
USItype
__fixunsdfsi (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
USItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, SI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, SI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE double to 128bit unsigned integer
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "double.h"
UTItype __fixunsdfti(DFtype a)
UTItype
__fixunsdfti (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
UTItype r;
FP_UNPACK_RAW_D(A, a);
FP_TO_INT_D(r, A, TI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_TO_INT_D (r, A, TI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
UDItype __fixunssfdi(SFtype a)
UDItype
__fixunssfdi (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
UDItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, DI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, DI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
USItype __fixunssfsi(SFtype a)
USItype
__fixunssfsi (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
USItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, SI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, SI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE single to 128bit unsigned integer
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "single.h"
UTItype __fixunssfti(SFtype a)
UTItype
__fixunssfti (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
UTItype r;
FP_UNPACK_RAW_S(A, a);
FP_TO_INT_S(r, A, TI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_TO_INT_S (r, A, TI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "quad.h"
UDItype __fixunstfdi(TFtype a)
UDItype
__fixunstfdi (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
UDItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, DI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, DI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "quad.h"
USItype __fixunstfsi(TFtype a)
USItype
__fixunstfsi (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
USItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, SI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, SI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert IEEE quad to 128bit unsigned integer
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "quad.h"
UTItype __fixunstfti(TFtype a)
UTItype
__fixunstfti (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
UTItype r;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, TI_BITS, 0);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_TO_INT_Q (r, A, TI_BITS, 0);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
DFtype __floatdidf(DItype i)
DFtype
__floatdidf (DItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, DI_BITS, UDItype);
FP_PACK_RAW_D(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_D (A, i, DI_BITS, UDItype);
FP_PACK_RAW_D (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SFtype __floatdisf(DItype i)
SFtype
__floatdisf (DItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, DI_BITS, UDItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, DI_BITS, UDItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -28,18 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "quad.h"
TFtype __floatditf(DItype i)
TFtype
__floatditf (DItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_Q (A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q (a, A);
return a;
}

View File

@ -28,18 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "double.h"
DFtype __floatsidf(SItype i)
DFtype
__floatsidf (SItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, SI_BITS, USItype);
FP_PACK_RAW_D(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_D (A, i, SI_BITS, USItype);
FP_PACK_RAW_D (a, A);
return a;
}

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SFtype __floatsisf(SItype i)
SFtype
__floatsisf (SItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, SI_BITS, USItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, SI_BITS, USItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -28,18 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "quad.h"
TFtype __floatsitf(SItype i)
TFtype
__floatsitf (SItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, SI_BITS, USItype);
FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_Q (A, i, SI_BITS, USItype);
FP_PACK_RAW_Q (a, A);
return a;
}

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit signed integer to IEEE double
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "double.h"
DFtype __floattidf(TItype i)
DFtype
__floattidf (TItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, TI_BITS, UTItype);
FP_PACK_RAW_D(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_D (A, i, TI_BITS, UTItype);
FP_PACK_RAW_D (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit signed integer to IEEE single
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "single.h"
SFtype __floattisf(TItype i)
SFtype
__floattisf (TItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, TI_BITS, UTItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, TI_BITS, UTItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit signed integer to IEEE quad
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "quad.h"
TFtype __floattitf(TItype i)
TFtype
__floattitf (TItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
FP_PACK_RAW_Q(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_Q (A, i, TI_BITS, UTItype);
FP_PACK_RAW_Q (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "double.h"
DFtype __floatundidf(UDItype i)
DFtype
__floatundidf (UDItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, DI_BITS, UDItype);
FP_PACK_RAW_D(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_D (A, i, DI_BITS, UDItype);
FP_PACK_RAW_D (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SFtype __floatundisf(UDItype i)
SFtype
__floatundisf (UDItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, DI_BITS, UDItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, DI_BITS, UDItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -28,19 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "quad.h"
TFtype
__floatunditf(UDItype i)
__floatunditf (UDItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_Q (A, i, DI_BITS, UDItype);
FP_PACK_RAW_Q (a, A);
return a;
}

View File

@ -28,18 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "double.h"
DFtype __floatunsidf(USItype i)
DFtype
__floatunsidf (USItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, SI_BITS, USItype);
FP_PACK_RAW_D(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_D (A, i, SI_BITS, USItype);
FP_PACK_RAW_D (a, A);
return a;
}

View File

@ -31,14 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SFtype __floatunsisf(USItype i)
SFtype
__floatunsisf (USItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, SI_BITS, USItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, SI_BITS, USItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -28,19 +28,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#define FP_NO_EXCEPTIONS
#include "soft-fp.h"
#include "quad.h"
TFtype
__floatunsitf(USItype i)
__floatunsitf (USItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, SI_BITS, USItype);
FP_PACK_RAW_Q(a, A);
FP_HANDLE_EXCEPTIONS;
FP_FROM_INT_Q (A, i, SI_BITS, USItype);
FP_PACK_RAW_Q (a, A);
return a;
}

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit unsigned integer to IEEE double
Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
Copyright (C) 1997-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "double.h"
DFtype __floatuntidf(UTItype i)
DFtype
__floatuntidf (UTItype i)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_D (A);
DFtype a;
FP_FROM_INT_D(A, i, TI_BITS, UTItype);
FP_PACK_RAW_D(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_D (A, i, TI_BITS, UTItype);
FP_PACK_RAW_D (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit unsigned integer to IEEE single
Copyright (C) 2007, 2008 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "single.h"
SFtype __floatuntisf(UTItype i)
SFtype
__floatuntisf (UTItype i)
{
FP_DECL_EX;
FP_DECL_S(A);
FP_DECL_S (A);
SFtype a;
FP_FROM_INT_S(A, i, TI_BITS, UTItype);
FP_PACK_RAW_S(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_S (A, i, TI_BITS, UTItype);
FP_PACK_RAW_S (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Convert a 128bit unsigned integer to IEEE quad
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,21 +24,22 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "quad.h"
TFtype __floatuntitf(UTItype i)
TFtype
__floatuntitf (UTItype i)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_Q (A);
TFtype a;
FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
FP_PACK_RAW_Q(a, A);
FP_INIT_ROUNDMODE;
FP_FROM_INT_Q (A, i, TI_BITS, UTItype);
FP_PACK_RAW_Q (a, A);
FP_HANDLE_EXCEPTIONS;
return a;

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "double.h"
CMPtype __gedf2(DFtype a, DFtype b)
CMPtype
__gedf2 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B);
FP_DECL_D (A);
FP_DECL_D (B);
CMPtype r;
FP_UNPACK_RAW_D(A, a);
FP_UNPACK_RAW_D(B, b);
FP_CMP_D(r, A, B, -2);
if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_UNPACK_RAW_D (B, b);
FP_CMP_D (r, A, B, -2);
if (r == -2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__gedf2, __gtdf2);
strong_alias (__gedf2, __gtdf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "single.h"
CMPtype __gesf2(SFtype a, SFtype b)
CMPtype
__gesf2 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B);
FP_DECL_S (A);
FP_DECL_S (B);
CMPtype r;
FP_UNPACK_RAW_S(A, a);
FP_UNPACK_RAW_S(B, b);
FP_CMP_S(r, A, B, -2);
if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_UNPACK_RAW_S (B, b);
FP_CMP_S (r, A, B, -2);
if (r == -2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__gesf2, __gtsf2);
strong_alias (__gesf2, __gtsf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "quad.h"
CMPtype __getf2(TFtype a, TFtype b)
CMPtype
__getf2 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B);
FP_DECL_Q (A);
FP_DECL_Q (B);
CMPtype r;
FP_UNPACK_RAW_Q(A, a);
FP_UNPACK_RAW_Q(B, b);
FP_CMP_Q(r, A, B, -2);
if (r == -2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_UNPACK_RAW_Q (B, b);
FP_CMP_Q (r, A, B, -2);
if (r == -2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__getf2, __gttf2);
strong_alias (__getf2, __gttf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "double.h"
CMPtype __ledf2(DFtype a, DFtype b)
CMPtype
__ledf2 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B);
FP_DECL_D (A);
FP_DECL_D (B);
CMPtype r;
FP_UNPACK_RAW_D(A, a);
FP_UNPACK_RAW_D(B, b);
FP_CMP_D(r, A, B, 2);
if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_UNPACK_RAW_D (B, b);
FP_CMP_D (r, A, B, 2);
if (r == 2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__ledf2, __ltdf2);
strong_alias (__ledf2, __ltdf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "single.h"
CMPtype __lesf2(SFtype a, SFtype b)
CMPtype
__lesf2 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B);
FP_DECL_S (A);
FP_DECL_S (B);
CMPtype r;
FP_UNPACK_RAW_S(A, a);
FP_UNPACK_RAW_S(B, b);
FP_CMP_S(r, A, B, 2);
if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_UNPACK_RAW_S (B, b);
FP_CMP_S (r, A, B, 2);
if (r == 2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__lesf2, __ltsf2);
strong_alias (__lesf2, __ltsf2);

View File

@ -31,20 +31,23 @@
#include "soft-fp.h"
#include "quad.h"
CMPtype __letf2(TFtype a, TFtype b)
CMPtype
__letf2 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B);
FP_DECL_Q (A);
FP_DECL_Q (B);
CMPtype r;
FP_UNPACK_RAW_Q(A, a);
FP_UNPACK_RAW_Q(B, b);
FP_CMP_Q(r, A, B, 2);
if (r == 2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
FP_SET_EXCEPTION(FP_EX_INVALID);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_UNPACK_RAW_Q (B, b);
FP_CMP_Q (r, A, B, 2);
if (r == 2)
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}
strong_alias(__letf2, __lttf2);
strong_alias (__letf2, __lttf2);

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "double.h"
DFtype __muldf3(DFtype a, DFtype b)
DFtype
__muldf3 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
FP_DECL_D (A);
FP_DECL_D (B);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_D(A, a);
FP_UNPACK_D(B, b);
FP_MUL_D(R, A, B);
FP_PACK_D(r, R);
FP_UNPACK_D (A, a);
FP_UNPACK_D (B, b);
FP_MUL_D (R, A, B);
FP_PACK_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "single.h"
SFtype __mulsf3(SFtype a, SFtype b)
SFtype
__mulsf3 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
FP_DECL_S (A);
FP_DECL_S (B);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_S(A, a);
FP_UNPACK_S(B, b);
FP_MUL_S(R, A, B);
FP_PACK_S(r, R);
FP_UNPACK_S (A, a);
FP_UNPACK_S (B, b);
FP_MUL_S (R, A, B);
FP_PACK_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "quad.h"
TFtype __multf3(TFtype a, TFtype b)
TFtype
__multf3 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
FP_DECL_Q (A);
FP_DECL_Q (B);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_Q(A, a);
FP_UNPACK_Q(B, b);
FP_MUL_Q(R, A, B);
FP_PACK_Q(r, R);
FP_UNPACK_Q (A, a);
FP_UNPACK_Q (B, b);
FP_MUL_Q (R, A, B);
FP_PACK_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,16 @@
#include "soft-fp.h"
#include "double.h"
DFtype __negdf2(DFtype a)
DFtype
__negdf2 (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(R);
FP_DECL_D (A);
FP_DECL_D (R);
DFtype r;
FP_UNPACK_D(A, a);
FP_NEG_D(R, A);
FP_PACK_D(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_NEG_D (R, A);
FP_PACK_RAW_D (r, R);
return r;
}

View File

@ -31,17 +31,16 @@
#include "soft-fp.h"
#include "single.h"
SFtype __negsf2(SFtype a)
SFtype
__negsf2 (SFtype a)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(R);
FP_DECL_S (A);
FP_DECL_S (R);
SFtype r;
FP_UNPACK_S(A, a);
FP_NEG_S(R, A);
FP_PACK_S(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_NEG_S (R, A);
FP_PACK_RAW_S (r, R);
return r;
}

View File

@ -31,17 +31,16 @@
#include "soft-fp.h"
#include "quad.h"
TFtype __negtf2(TFtype a)
TFtype
__negtf2 (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(R);
FP_DECL_Q (A);
FP_DECL_Q (R);
TFtype r;
FP_UNPACK_Q(A, a);
FP_NEG_Q(R, A);
FP_PACK_Q(r, R);
FP_CLEAR_EXCEPTIONS;
FP_HANDLE_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_NEG_Q (R, A);
FP_PACK_RAW_Q (r, R);
return r;
}

View File

@ -31,103 +31,117 @@
<http://www.gnu.org/licenses/>. */
#define _FP_FRAC_DECL_1(X) _FP_W_TYPE X##_f
#define _FP_FRAC_COPY_1(D,S) (D##_f = S##_f)
#define _FP_FRAC_SET_1(X,I) (X##_f = I)
#define _FP_FRAC_COPY_1(D, S) (D##_f = S##_f)
#define _FP_FRAC_SET_1(X, I) (X##_f = I)
#define _FP_FRAC_HIGH_1(X) (X##_f)
#define _FP_FRAC_LOW_1(X) (X##_f)
#define _FP_FRAC_WORD_1(X,w) (X##_f)
#define _FP_FRAC_WORD_1(X, w) (X##_f)
#define _FP_FRAC_ADDI_1(X,I) (X##_f += I)
#define _FP_FRAC_SLL_1(X,N) \
do { \
if (__builtin_constant_p(N) && (N) == 1) \
X##_f += X##_f; \
else \
X##_f <<= (N); \
} while (0)
#define _FP_FRAC_SRL_1(X,N) (X##_f >>= N)
#define _FP_FRAC_ADDI_1(X, I) (X##_f += I)
#define _FP_FRAC_SLL_1(X, N) \
do \
{ \
if (__builtin_constant_p (N) && (N) == 1) \
X##_f += X##_f; \
else \
X##_f <<= (N); \
} \
while (0)
#define _FP_FRAC_SRL_1(X, N) (X##_f >>= N)
/* Right shift with sticky-lsb. */
#define _FP_FRAC_SRST_1(X,S,N,sz) __FP_FRAC_SRST_1(X##_f, S, N, sz)
#define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz)
#define _FP_FRAC_SRST_1(X, S, N, sz) __FP_FRAC_SRST_1 (X##_f, S, N, sz)
#define _FP_FRAC_SRS_1(X, N, sz) __FP_FRAC_SRS_1 (X##_f, N, sz)
#define __FP_FRAC_SRST_1(X,S,N,sz) \
do { \
S = (__builtin_constant_p(N) && (N) == 1 \
? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
X = X >> (N); \
} while (0)
#define __FP_FRAC_SRST_1(X, S, N, sz) \
do \
{ \
S = (__builtin_constant_p (N) && (N) == 1 \
? X & 1 \
: (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
X = X >> (N); \
} \
while (0)
#define __FP_FRAC_SRS_1(X,N,sz) \
(X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \
? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
#define __FP_FRAC_SRS_1(X, N, sz) \
(X = (X >> (N) | (__builtin_constant_p (N) && (N) == 1 \
? X & 1 \
: (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
#define _FP_FRAC_ADD_1(R,X,Y) (R##_f = X##_f + Y##_f)
#define _FP_FRAC_SUB_1(R,X,Y) (R##_f = X##_f - Y##_f)
#define _FP_FRAC_DEC_1(X,Y) (X##_f -= Y##_f)
#define _FP_FRAC_CLZ_1(z, X) __FP_CLZ(z, X##_f)
#define _FP_FRAC_ADD_1(R, X, Y) (R##_f = X##_f + Y##_f)
#define _FP_FRAC_SUB_1(R, X, Y) (R##_f = X##_f - Y##_f)
#define _FP_FRAC_DEC_1(X, Y) (X##_f -= Y##_f)
#define _FP_FRAC_CLZ_1(z, X) __FP_CLZ (z, X##_f)
/* Predicates */
#define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE)X##_f < 0)
#define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE) X##_f < 0)
#define _FP_FRAC_ZEROP_1(X) (X##_f == 0)
#define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
#define _FP_FRAC_CLEAR_OVERP_1(fs,X) (X##_f &= ~_FP_OVERFLOW_##fs)
#define _FP_FRAC_OVERP_1(fs, X) (X##_f & _FP_OVERFLOW_##fs)
#define _FP_FRAC_CLEAR_OVERP_1(fs, X) (X##_f &= ~_FP_OVERFLOW_##fs)
#define _FP_FRAC_HIGHBIT_DW_1(fs, X) (X##_f & _FP_HIGHBIT_DW_##fs)
#define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f)
#define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f)
#define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f)
#define _FP_ZEROFRAC_1 0
#define _FP_MINFRAC_1 1
#define _FP_MAXFRAC_1 (~(_FP_WS_TYPE)0)
#define _FP_MAXFRAC_1 (~(_FP_WS_TYPE) 0)
/*
* Unpack the raw bits of a native fp value. Do not classify or
* normalize the data.
*/
#define _FP_UNPACK_RAW_1(fs, X, val) \
do { \
union _FP_UNION_##fs _flo; _flo.flt = (val); \
\
X##_f = _flo.bits.frac; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} while (0)
#define _FP_UNPACK_RAW_1(fs, X, val) \
do \
{ \
union _FP_UNION_##fs _flo; \
_flo.flt = (val); \
\
X##_f = _flo.bits.frac; \
X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} \
while (0)
#define _FP_UNPACK_RAW_1_P(fs, X, val) \
do { \
union _FP_UNION_##fs *_flo = \
(union _FP_UNION_##fs *)(val); \
\
X##_f = _flo->bits.frac; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} while (0)
#define _FP_UNPACK_RAW_1_P(fs, X, val) \
do \
{ \
union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val); \
\
X##_f = _flo->bits.frac; \
X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \
} \
while (0)
/*
* Repack the raw bits of a native fp value.
*/
#define _FP_PACK_RAW_1(fs, val, X) \
do { \
union _FP_UNION_##fs _flo; \
\
_flo.bits.frac = X##_f; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} while (0)
#define _FP_PACK_RAW_1(fs, val, X) \
do \
{ \
union _FP_UNION_##fs _flo; \
\
_flo.bits.frac = X##_f; \
_flo.bits.exp = X##_e; \
_flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} \
while (0)
#define _FP_PACK_RAW_1_P(fs, val, X) \
do { \
union _FP_UNION_##fs *_flo = \
(union _FP_UNION_##fs *)(val); \
\
_flo->bits.frac = X##_f; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} while (0)
#define _FP_PACK_RAW_1_P(fs, val, X) \
do \
{ \
union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val); \
\
_flo->bits.frac = X##_f; \
_flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \
} \
while (0)
/*
@ -137,57 +151,86 @@ do { \
/* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the
multiplication immediately. */
#define _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y) \
do \
{ \
R##_f = X##_f * Y##_f; \
} \
while (0)
#define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y) \
do { \
R##_f = X##_f * Y##_f; \
/* Normalize since we know where the msb of the multiplicands \
were (bit B), we know that the msb of the of the product is \
at either 2B or 2B-1. */ \
_FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \
} while (0)
do \
{ \
_FP_MUL_MEAT_DW_1_imm (wfracbits, R, X, Y); \
/* Normalize since we know where the msb of the multiplicands \
were (bit B), we know that the msb of the of the product is \
at either 2B or 2B-1. */ \
_FP_FRAC_SRS_1 (R, wfracbits-1, 2*wfracbits); \
} \
while (0)
/* Given a 1W * 1W => 2W primitive, do the extended multiplication. */
#define _FP_MUL_MEAT_DW_1_wide(wfracbits, R, X, Y, doit) \
do \
{ \
doit (R##_f1, R##_f0, X##_f, Y##_f); \
} \
while (0)
#define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit) \
do { \
_FP_W_TYPE _Z_f0, _Z_f1; \
doit(_Z_f1, _Z_f0, X##_f, Y##_f); \
/* Normalize since we know where the msb of the multiplicands \
were (bit B), we know that the msb of the of the product is \
at either 2B or 2B-1. */ \
_FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \
R##_f = _Z_f0; \
} while (0)
do \
{ \
_FP_FRAC_DECL_2 (_Z); \
_FP_MUL_MEAT_DW_1_wide (wfracbits, _Z, X, Y, doit); \
/* Normalize since we know where the msb of the multiplicands \
were (bit B), we know that the msb of the of the product is \
at either 2B or 2B-1. */ \
_FP_FRAC_SRS_2 (_Z, wfracbits-1, 2*wfracbits); \
R##_f = _Z_f0; \
} \
while (0)
/* Finally, a simple widening multiply algorithm. What fun! */
#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \
do { \
_FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1; \
#define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y) \
do \
{ \
_FP_W_TYPE _xh, _xl, _yh, _yl; \
_FP_FRAC_DECL_2 (_a); \
\
/* split the words in half */ \
_xh = X##_f >> (_FP_W_TYPE_SIZE/2); \
_xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
_yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \
_yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
/* split the words in half */ \
_xh = X##_f >> (_FP_W_TYPE_SIZE/2); \
_xl = X##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1); \
_yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \
_yl = Y##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1); \
\
/* multiply the pieces */ \
_z_f0 = _xl * _yl; \
_a_f0 = _xh * _yl; \
_a_f1 = _xl * _yh; \
_z_f1 = _xh * _yh; \
/* multiply the pieces */ \
R##_f0 = _xl * _yl; \
_a_f0 = _xh * _yl; \
_a_f1 = _xl * _yh; \
R##_f1 = _xh * _yh; \
\
/* reassemble into two full words */ \
if ((_a_f0 += _a_f1) < _a_f1) \
_z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \
_a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \
_a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \
_FP_FRAC_ADD_2(_z, _z, _a); \
\
/* normalize */ \
_FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits); \
R##_f = _z_f0; \
} while (0)
/* reassemble into two full words */ \
if ((_a_f0 += _a_f1) < _a_f1) \
R##_f1 += (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2); \
_a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \
_a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \
_FP_FRAC_ADD_2 (R, R, _a); \
} \
while (0)
#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \
do \
{ \
_FP_FRAC_DECL_2 (_z); \
_FP_MUL_MEAT_DW_1_hard (wfracbits, _z, X, Y); \
\
/* normalize */ \
_FP_FRAC_SRS_2 (_z, wfracbits - 1, 2*wfracbits); \
R##_f = _z_f0; \
} \
while (0)
/*
@ -199,15 +242,17 @@ do { \
C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you
choose will depend on what the compiler does with divrem4. */
#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \
do { \
_FP_W_TYPE _q, _r; \
X##_f <<= (X##_f < Y##_f \
? R##_e--, _FP_WFRACBITS_##fs \
: _FP_WFRACBITS_##fs - 1); \
doit(_q, _r, X##_f, Y##_f); \
R##_f = _q | (_r != 0); \
} while (0)
#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \
do \
{ \
_FP_W_TYPE _q, _r; \
X##_f <<= (X##_f < Y##_f \
? R##_e--, _FP_WFRACBITS_##fs \
: _FP_WFRACBITS_##fs - 1); \
doit (_q, _r, X##_f, Y##_f); \
R##_f = _q | (_r != 0); \
} \
while (0)
/* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
that may be useful in this situation. This first is for a primitive
@ -215,46 +260,50 @@ do { \
for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */
#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \
do { \
_FP_W_TYPE _nh, _nl, _q, _r, _y; \
do \
{ \
_FP_W_TYPE _nh, _nl, _q, _r, _y; \
\
/* Normalize Y -- i.e. make the most significant bit set. */ \
_y = Y##_f << _FP_WFRACXBITS_##fs; \
/* Normalize Y -- i.e. make the most significant bit set. */ \
_y = Y##_f << _FP_WFRACXBITS_##fs; \
\
/* Shift X op correspondingly high, that is, up one full word. */ \
if (X##_f < Y##_f) \
{ \
R##_e--; \
_nl = 0; \
_nh = X##_f; \
} \
else \
{ \
_nl = X##_f << (_FP_W_TYPE_SIZE - 1); \
_nh = X##_f >> 1; \
} \
/* Shift X op correspondingly high, that is, up one full word. */ \
if (X##_f < Y##_f) \
{ \
R##_e--; \
_nl = 0; \
_nh = X##_f; \
} \
else \
{ \
_nl = X##_f << (_FP_W_TYPE_SIZE - 1); \
_nh = X##_f >> 1; \
} \
\
udiv_qrnnd(_q, _r, _nh, _nl, _y); \
R##_f = _q | (_r != 0); \
} while (0)
udiv_qrnnd (_q, _r, _nh, _nl, _y); \
R##_f = _q | (_r != 0); \
} \
while (0)
#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \
do { \
_FP_W_TYPE _nh, _nl, _q, _r; \
if (X##_f < Y##_f) \
{ \
R##_e--; \
_nl = X##_f << _FP_WFRACBITS_##fs; \
_nh = X##_f >> _FP_WFRACXBITS_##fs; \
} \
else \
{ \
_nl = X##_f << (_FP_WFRACBITS_##fs - 1); \
_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \
} \
udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
R##_f = _q | (_r != 0); \
} while (0)
do \
{ \
_FP_W_TYPE _nh, _nl, _q, _r; \
if (X##_f < Y##_f) \
{ \
R##_e--; \
_nl = X##_f << _FP_WFRACBITS_##fs; \
_nh = X##_f >> _FP_WFRACXBITS_##fs; \
} \
else \
{ \
_nl = X##_f << (_FP_WFRACBITS_##fs - 1); \
_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \
} \
udiv_qrnnd (_q, _r, _nh, _nl, Y##_f); \
R##_f = _q | (_r != 0); \
} \
while (0)
/*
@ -263,27 +312,29 @@ do { \
* should be added for those machines where division is fast.
*/
#define _FP_SQRT_MEAT_1(R, S, T, X, q) \
do { \
while (q != _FP_WORK_ROUND) \
{ \
T##_f = S##_f + q; \
if (T##_f <= X##_f) \
{ \
S##_f = T##_f + q; \
X##_f -= T##_f; \
R##_f += q; \
} \
_FP_FRAC_SLL_1(X, 1); \
q >>= 1; \
} \
if (X##_f) \
{ \
if (S##_f < X##_f) \
R##_f |= _FP_WORK_ROUND; \
R##_f |= _FP_WORK_STICKY; \
} \
} while (0)
#define _FP_SQRT_MEAT_1(R, S, T, X, q) \
do \
{ \
while (q != _FP_WORK_ROUND) \
{ \
T##_f = S##_f + q; \
if (T##_f <= X##_f) \
{ \
S##_f = T##_f + q; \
X##_f -= T##_f; \
R##_f += q; \
} \
_FP_FRAC_SLL_1 (X, 1); \
q >>= 1; \
} \
if (X##_f) \
{ \
if (S##_f < X##_f) \
R##_f |= _FP_WORK_ROUND; \
R##_f |= _FP_WORK_STICKY; \
} \
} \
while (0)
/*
* Assembly/disassembly for converting to/from integral types.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -34,47 +34,51 @@
#define _FP_FRAC_DECL_8(X) _FP_W_TYPE X##_f[8]
#define _FP_FRAC_HIGH_8(X) (X##_f[7])
#define _FP_FRAC_LOW_8(X) (X##_f[0])
#define _FP_FRAC_WORD_8(X,w) (X##_f[w])
#define _FP_FRAC_WORD_8(X, w) (X##_f[w])
#define _FP_FRAC_SLL_8(X,N) \
do { \
_FP_I_TYPE _up, _down, _skip, _i; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_up = (N) % _FP_W_TYPE_SIZE; \
_down = _FP_W_TYPE_SIZE - _up; \
if (!_up) \
for (_i = 7; _i >= _skip; --_i) \
X##_f[_i] = X##_f[_i-_skip]; \
else \
{ \
for (_i = 7; _i > _skip; --_i) \
X##_f[_i] = X##_f[_i-_skip] << _up \
| X##_f[_i-_skip-1] >> _down; \
X##_f[_i--] = X##_f[0] << _up; \
} \
for (; _i >= 0; --_i) \
X##_f[_i] = 0; \
} while (0)
#define _FP_FRAC_SLL_8(X, N) \
do \
{ \
_FP_I_TYPE _up, _down, _skip, _i; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_up = (N) % _FP_W_TYPE_SIZE; \
_down = _FP_W_TYPE_SIZE - _up; \
if (!_up) \
for (_i = 7; _i >= _skip; --_i) \
X##_f[_i] = X##_f[_i-_skip]; \
else \
{ \
for (_i = 7; _i > _skip; --_i) \
X##_f[_i] = (X##_f[_i-_skip] << _up \
| X##_f[_i-_skip-1] >> _down); \
X##_f[_i--] = X##_f[0] << _up; \
} \
for (; _i >= 0; --_i) \
X##_f[_i] = 0; \
} \
while (0)
#define _FP_FRAC_SRL_8(X,N) \
do { \
_FP_I_TYPE _up, _down, _skip, _i; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_down = (N) % _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \
if (!_down) \
for (_i = 0; _i <= 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip]; \
else \
{ \
for (_i = 0; _i < 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip] >> _down \
| X##_f[_i+_skip+1] << _up; \
X##_f[_i++] = X##_f[7] >> _down; \
} \
for (; _i < 8; ++_i) \
X##_f[_i] = 0; \
} while (0)
#define _FP_FRAC_SRL_8(X, N) \
do \
{ \
_FP_I_TYPE _up, _down, _skip, _i; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_down = (N) % _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \
if (!_down) \
for (_i = 0; _i <= 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip]; \
else \
{ \
for (_i = 0; _i < 7-_skip; ++_i) \
X##_f[_i] = (X##_f[_i+_skip] >> _down \
| X##_f[_i+_skip+1] << _up); \
X##_f[_i++] = X##_f[7] >> _down; \
} \
for (; _i < 8; ++_i) \
X##_f[_i] = 0; \
} \
while (0)
/* Right shift with sticky-lsb.
@ -82,28 +86,31 @@
* but that if any of the bits that fall off the right hand side
* were one then we always set the LSbit.
*/
#define _FP_FRAC_SRS_8(X,N,size) \
do { \
_FP_I_TYPE _up, _down, _skip, _i; \
_FP_W_TYPE _s; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_down = (N) % _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \
for (_s = _i = 0; _i < _skip; ++_i) \
_s |= X##_f[_i]; \
if (!_down) \
for (_i = 0; _i <= 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip]; \
else \
{ \
_s |= X##_f[_i] << _up; \
for (_i = 0; _i < 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip] >> _down \
| X##_f[_i+_skip+1] << _up; \
X##_f[_i++] = X##_f[7] >> _down; \
} \
for (; _i < 8; ++_i) \
X##_f[_i] = 0; \
/* don't fix the LSB until the very end when we're sure f[0] is stable */ \
X##_f[0] |= (_s != 0); \
} while (0)
#define _FP_FRAC_SRS_8(X, N, size) \
do \
{ \
_FP_I_TYPE _up, _down, _skip, _i; \
_FP_W_TYPE _s; \
_skip = (N) / _FP_W_TYPE_SIZE; \
_down = (N) % _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \
for (_s = _i = 0; _i < _skip; ++_i) \
_s |= X##_f[_i]; \
if (!_down) \
for (_i = 0; _i <= 7-_skip; ++_i) \
X##_f[_i] = X##_f[_i+_skip]; \
else \
{ \
_s |= X##_f[_i] << _up; \
for (_i = 0; _i < 7-_skip; ++_i) \
X##_f[_i] = (X##_f[_i+_skip] >> _down \
| X##_f[_i+_skip+1] << _up); \
X##_f[_i++] = X##_f[7] >> _down; \
} \
for (; _i < 8; ++_i) \
X##_f[_i] = 0; \
/* don't fix the LSB until the very end when we're sure f[0] is \
stable */ \
X##_f[0] |= (_s != 0); \
} \
while (0)

File diff suppressed because it is too large Load Diff

View File

@ -31,13 +31,15 @@
<http://www.gnu.org/licenses/>. */
#if _FP_W_TYPE_SIZE < 32
#error "Here's a nickel, kid. Go buy yourself a real computer."
# error "Here's a nickel, kid. Go buy yourself a real computer."
#endif
#if _FP_W_TYPE_SIZE < 64
#define _FP_FRACTBITS_Q (4*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_Q (4*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_DW_Q (8*_FP_W_TYPE_SIZE)
#else
#define _FP_FRACTBITS_Q (2*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_Q (2*_FP_W_TYPE_SIZE)
# define _FP_FRACTBITS_DW_Q (4*_FP_W_TYPE_SIZE)
#endif
#define _FP_FRACBITS_Q 113
@ -49,222 +51,271 @@
#define _FP_EXPMAX_Q 32767
#define _FP_QNANBIT_Q \
((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
#define _FP_QNANBIT_SH_Q \
((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_Q \
((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
#define _FP_IMPLBIT_SH_Q \
((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
#define _FP_OVERFLOW_Q \
((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
typedef float TFtype __attribute__((mode(TF)));
#define _FP_WFRACBITS_DW_Q (2 * _FP_WFRACBITS_Q)
#define _FP_WFRACXBITS_DW_Q (_FP_FRACTBITS_DW_Q - _FP_WFRACBITS_DW_Q)
#define _FP_HIGHBIT_DW_Q \
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_Q - 1) % _FP_W_TYPE_SIZE)
typedef float TFtype __attribute__ ((mode (TF)));
#if _FP_W_TYPE_SIZE < 64
union _FP_UNION_Q
{
TFtype flt;
struct _FP_STRUCT_LAYOUT
{
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_Q;
unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned long frac2 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE;
#else
unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac2 : _FP_W_TYPE_SIZE;
unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned exp : _FP_EXPBITS_Q;
unsigned sign : 1;
#endif /* not bigendian */
} bits __attribute__((packed));
TFtype flt;
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_Q;
unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned long frac2 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE;
# else
unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac2 : _FP_W_TYPE_SIZE;
unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned exp : _FP_EXPBITS_Q;
unsigned sign : 1;
# endif /* not bigendian */
} bits __attribute__ ((packed));
};
#define FP_DECL_Q(X) _FP_DECL(4,X)
#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val)
#define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_4_P(Q,X,val)
#define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_4(Q,val,X)
#define FP_PACK_RAW_QP(val,X) \
do { \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P(Q,val,X); \
} while (0)
# define FP_DECL_Q(X) _FP_DECL (4, X)
# define FP_UNPACK_RAW_Q(X, val) _FP_UNPACK_RAW_4 (Q, X, val)
# define FP_UNPACK_RAW_QP(X, val) _FP_UNPACK_RAW_4_P (Q, X, val)
# define FP_PACK_RAW_Q(val, X) _FP_PACK_RAW_4 (Q, val, X)
# define FP_PACK_RAW_QP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P (Q, val, X); \
} \
while (0)
#define FP_UNPACK_Q(X,val) \
do { \
_FP_UNPACK_RAW_4(Q,X,val); \
_FP_UNPACK_CANONICAL(Q,4,X); \
} while (0)
# define FP_UNPACK_Q(X, val) \
do \
{ \
_FP_UNPACK_RAW_4 (Q, X, val); \
_FP_UNPACK_CANONICAL (Q, 4, X); \
} \
while (0)
#define FP_UNPACK_QP(X,val) \
do { \
_FP_UNPACK_RAW_4_P(Q,X,val); \
_FP_UNPACK_CANONICAL(Q,4,X); \
} while (0)
# define FP_UNPACK_QP(X, val) \
do \
{ \
_FP_UNPACK_RAW_4_P (Q, X, val); \
_FP_UNPACK_CANONICAL (Q, 4, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_Q(X,val) \
do { \
_FP_UNPACK_RAW_4(Q,X,val); \
_FP_UNPACK_SEMIRAW(Q,4,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_Q(X, val) \
do \
{ \
_FP_UNPACK_RAW_4 (Q, X, val); \
_FP_UNPACK_SEMIRAW (Q, 4, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_QP(X,val) \
do { \
_FP_UNPACK_RAW_4_P(Q,X,val); \
_FP_UNPACK_SEMIRAW(Q,4,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_QP(X, val) \
do \
{ \
_FP_UNPACK_RAW_4_P (Q, X, val); \
_FP_UNPACK_SEMIRAW (Q, 4, X); \
} \
while (0)
#define FP_PACK_Q(val,X) \
do { \
_FP_PACK_CANONICAL(Q,4,X); \
_FP_PACK_RAW_4(Q,val,X); \
} while (0)
# define FP_PACK_Q(val, X) \
do \
{ \
_FP_PACK_CANONICAL (Q, 4, X); \
_FP_PACK_RAW_4 (Q, val, X); \
} \
while (0)
#define FP_PACK_QP(val,X) \
do { \
_FP_PACK_CANONICAL(Q,4,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P(Q,val,X); \
} while (0)
# define FP_PACK_QP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (Q, 4, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P (Q, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_Q(val,X) \
do { \
_FP_PACK_SEMIRAW(Q,4,X); \
_FP_PACK_RAW_4(Q,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_Q(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (Q, 4, X); \
_FP_PACK_RAW_4 (Q, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_QP(val,X) \
do { \
_FP_PACK_SEMIRAW(Q,4,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P(Q,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_QP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (Q, 4, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_4_P (Q, val, X); \
} \
while (0)
#define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,4,X)
#define FP_NEG_Q(R,X) _FP_NEG(Q,4,R,X)
#define FP_ADD_Q(R,X,Y) _FP_ADD(Q,4,R,X,Y)
#define FP_SUB_Q(R,X,Y) _FP_SUB(Q,4,R,X,Y)
#define FP_MUL_Q(R,X,Y) _FP_MUL(Q,4,R,X,Y)
#define FP_DIV_Q(R,X,Y) _FP_DIV(Q,4,R,X,Y)
#define FP_SQRT_Q(R,X) _FP_SQRT(Q,4,R,X)
#define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_4(R,S,T,X,Q)
# define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN (Q, 4, X)
# define FP_NEG_Q(R, X) _FP_NEG (Q, 4, R, X)
# define FP_ADD_Q(R, X, Y) _FP_ADD (Q, 4, R, X, Y)
# define FP_SUB_Q(R, X, Y) _FP_SUB (Q, 4, R, X, Y)
# define FP_MUL_Q(R, X, Y) _FP_MUL (Q, 4, R, X, Y)
# define FP_DIV_Q(R, X, Y) _FP_DIV (Q, 4, R, X, Y)
# define FP_SQRT_Q(R, X) _FP_SQRT (Q, 4, R, X)
# define _FP_SQRT_MEAT_Q(R, S, T, X, Q) _FP_SQRT_MEAT_4 (R, S, T, X, Q)
# define FP_FMA_Q(R, X, Y, Z) _FP_FMA (Q, 4, 8, R, X, Y, Z)
#define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,4,r,X,Y,un)
#define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,4,r,X,Y)
#define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,4,r,X,Y)
# define FP_CMP_Q(r, X, Y, un) _FP_CMP (Q, 4, r, X, Y, un)
# define FP_CMP_EQ_Q(r, X, Y) _FP_CMP_EQ (Q, 4, r, X, Y)
# define FP_CMP_UNORD_Q(r, X, Y) _FP_CMP_UNORD (Q, 4, r, X, Y)
#define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,4,r,X,rsz,rsg)
#define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,4,X,r,rs,rt)
# define FP_TO_INT_Q(r, X, rsz, rsg) _FP_TO_INT (Q, 4, r, X, rsz, rsg)
# define FP_FROM_INT_Q(X, r, rs, rt) _FP_FROM_INT (Q, 4, X, r, rs, rt)
#define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_4(X)
#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4(X)
# define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_4 (X)
# define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_4 (X)
# define _FP_FRAC_HIGH_DW_Q(X) _FP_FRAC_HIGH_8 (X)
#else /* not _FP_W_TYPE_SIZE < 64 */
union _FP_UNION_Q
{
TFtype flt /* __attribute__((mode(TF))) */ ;
struct _FP_STRUCT_LAYOUT {
TFtype flt /* __attribute__ ((mode (TF))) */ ;
struct _FP_STRUCT_LAYOUT
{
_FP_W_TYPE a, b;
} longs;
struct _FP_STRUCT_LAYOUT {
#if __BYTE_ORDER == __BIG_ENDIAN
struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_Q;
_FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
_FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
#else
# else
_FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
_FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_Q;
unsigned sign : 1;
#endif
# endif
} bits;
};
#define FP_DECL_Q(X) _FP_DECL(2,X)
#define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val)
#define FP_UNPACK_RAW_QP(X,val) _FP_UNPACK_RAW_2_P(Q,X,val)
#define FP_PACK_RAW_Q(val,X) _FP_PACK_RAW_2(Q,val,X)
#define FP_PACK_RAW_QP(val,X) \
do { \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(Q,val,X); \
} while (0)
# define FP_DECL_Q(X) _FP_DECL (2, X)
# define FP_UNPACK_RAW_Q(X, val) _FP_UNPACK_RAW_2 (Q, X, val)
# define FP_UNPACK_RAW_QP(X, val) _FP_UNPACK_RAW_2_P (Q, X, val)
# define FP_PACK_RAW_Q(val, X) _FP_PACK_RAW_2 (Q, val, X)
# define FP_PACK_RAW_QP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (Q, val, X); \
} \
while (0)
#define FP_UNPACK_Q(X,val) \
do { \
_FP_UNPACK_RAW_2(Q,X,val); \
_FP_UNPACK_CANONICAL(Q,2,X); \
} while (0)
# define FP_UNPACK_Q(X, val) \
do \
{ \
_FP_UNPACK_RAW_2 (Q, X, val); \
_FP_UNPACK_CANONICAL (Q, 2, X); \
} \
while (0)
#define FP_UNPACK_QP(X,val) \
do { \
_FP_UNPACK_RAW_2_P(Q,X,val); \
_FP_UNPACK_CANONICAL(Q,2,X); \
} while (0)
# define FP_UNPACK_QP(X, val) \
do \
{ \
_FP_UNPACK_RAW_2_P (Q, X, val); \
_FP_UNPACK_CANONICAL (Q, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_Q(X,val) \
do { \
_FP_UNPACK_RAW_2(Q,X,val); \
_FP_UNPACK_SEMIRAW(Q,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_Q(X, val) \
do \
{ \
_FP_UNPACK_RAW_2 (Q, X, val); \
_FP_UNPACK_SEMIRAW (Q, 2, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_QP(X,val) \
do { \
_FP_UNPACK_RAW_2_P(Q,X,val); \
_FP_UNPACK_SEMIRAW(Q,2,X); \
} while (0)
# define FP_UNPACK_SEMIRAW_QP(X, val) \
do \
{ \
_FP_UNPACK_RAW_2_P (Q, X, val); \
_FP_UNPACK_SEMIRAW (Q, 2, X); \
} \
while (0)
#define FP_PACK_Q(val,X) \
do { \
_FP_PACK_CANONICAL(Q,2,X); \
_FP_PACK_RAW_2(Q,val,X); \
} while (0)
# define FP_PACK_Q(val, X) \
do \
{ \
_FP_PACK_CANONICAL (Q, 2, X); \
_FP_PACK_RAW_2 (Q, val, X); \
} \
while (0)
#define FP_PACK_QP(val,X) \
do { \
_FP_PACK_CANONICAL(Q,2,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(Q,val,X); \
} while (0)
# define FP_PACK_QP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (Q, 2, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (Q, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_Q(val,X) \
do { \
_FP_PACK_SEMIRAW(Q,2,X); \
_FP_PACK_RAW_2(Q,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_Q(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (Q, 2, X); \
_FP_PACK_RAW_2 (Q, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_QP(val,X) \
do { \
_FP_PACK_SEMIRAW(Q,2,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P(Q,val,X); \
} while (0)
# define FP_PACK_SEMIRAW_QP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (Q, 2, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_2_P (Q, val, X); \
} \
while (0)
#define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,2,X)
#define FP_NEG_Q(R,X) _FP_NEG(Q,2,R,X)
#define FP_ADD_Q(R,X,Y) _FP_ADD(Q,2,R,X,Y)
#define FP_SUB_Q(R,X,Y) _FP_SUB(Q,2,R,X,Y)
#define FP_MUL_Q(R,X,Y) _FP_MUL(Q,2,R,X,Y)
#define FP_DIV_Q(R,X,Y) _FP_DIV(Q,2,R,X,Y)
#define FP_SQRT_Q(R,X) _FP_SQRT(Q,2,R,X)
#define _FP_SQRT_MEAT_Q(R,S,T,X,Q) _FP_SQRT_MEAT_2(R,S,T,X,Q)
# define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN (Q, 2, X)
# define FP_NEG_Q(R, X) _FP_NEG (Q, 2, R, X)
# define FP_ADD_Q(R, X, Y) _FP_ADD (Q, 2, R, X, Y)
# define FP_SUB_Q(R, X, Y) _FP_SUB (Q, 2, R, X, Y)
# define FP_MUL_Q(R, X, Y) _FP_MUL (Q, 2, R, X, Y)
# define FP_DIV_Q(R, X, Y) _FP_DIV (Q, 2, R, X, Y)
# define FP_SQRT_Q(R, X) _FP_SQRT (Q, 2, R, X)
# define _FP_SQRT_MEAT_Q(R, S, T, X, Q) _FP_SQRT_MEAT_2 (R, S, T, X, Q)
# define FP_FMA_Q(R, X, Y, Z) _FP_FMA (Q, 2, 4, R, X, Y, Z)
#define FP_CMP_Q(r,X,Y,un) _FP_CMP(Q,2,r,X,Y,un)
#define FP_CMP_EQ_Q(r,X,Y) _FP_CMP_EQ(Q,2,r,X,Y)
#define FP_CMP_UNORD_Q(r,X,Y) _FP_CMP_UNORD(Q,2,r,X,Y)
# define FP_CMP_Q(r, X, Y, un) _FP_CMP (Q, 2, r, X, Y, un)
# define FP_CMP_EQ_Q(r, X, Y) _FP_CMP_EQ (Q, 2, r, X, Y)
# define FP_CMP_UNORD_Q(r, X, Y) _FP_CMP_UNORD (Q, 2, r, X, Y)
#define FP_TO_INT_Q(r,X,rsz,rsg) _FP_TO_INT(Q,2,r,X,rsz,rsg)
#define FP_FROM_INT_Q(X,r,rs,rt) _FP_FROM_INT(Q,2,X,r,rs,rt)
# define FP_TO_INT_Q(r, X, rsz, rsg) _FP_TO_INT (Q, 2, r, X, rsz, rsg)
# define FP_FROM_INT_Q(X, r, rs, rt) _FP_FROM_INT (Q, 2, X, r, rs, rt)
#define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_2(X)
#define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2(X)
# define _FP_FRAC_HIGH_Q(X) _FP_FRAC_HIGH_2 (X)
# define _FP_FRAC_HIGH_RAW_Q(X) _FP_FRAC_HIGH_2 (X)
# define _FP_FRAC_HIGH_DW_Q(X) _FP_FRAC_HIGH_4 (X)
#endif /* not _FP_W_TYPE_SIZE < 64 */

View File

@ -31,11 +31,17 @@
<http://www.gnu.org/licenses/>. */
#if _FP_W_TYPE_SIZE < 32
#error "Here's a nickel kid. Go buy yourself a real computer."
# error "Here's a nickel kid. Go buy yourself a real computer."
#endif
#define _FP_FRACTBITS_S _FP_W_TYPE_SIZE
#if _FP_W_TYPE_SIZE < 64
# define _FP_FRACTBITS_DW_S (2 * _FP_W_TYPE_SIZE)
#else
# define _FP_FRACTBITS_DW_S _FP_W_TYPE_SIZE
#endif
#define _FP_FRACBITS_S 24
#define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S)
#define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S)
@ -43,21 +49,27 @@
#define _FP_EXPBITS_S 8
#define _FP_EXPBIAS_S 127
#define _FP_EXPMAX_S 255
#define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
#define _FP_QNANBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
#define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
#define _FP_IMPLBIT_SH_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
#define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
#define _FP_QNANBIT_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2))
#define _FP_QNANBIT_SH_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
#define _FP_IMPLBIT_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1))
#define _FP_IMPLBIT_SH_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
#define _FP_OVERFLOW_S ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_S))
#define _FP_WFRACBITS_DW_S (2 * _FP_WFRACBITS_S)
#define _FP_WFRACXBITS_DW_S (_FP_FRACTBITS_DW_S - _FP_WFRACBITS_DW_S)
#define _FP_HIGHBIT_DW_S \
((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_S - 1) % _FP_W_TYPE_SIZE)
/* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
chosen by the target machine. */
typedef float SFtype __attribute__((mode(SF)));
typedef float SFtype __attribute__ ((mode (SF)));
union _FP_UNION_S
{
SFtype flt;
struct _FP_STRUCT_LAYOUT {
struct _FP_STRUCT_LAYOUT
{
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1;
unsigned exp : _FP_EXPBITS_S;
@ -67,84 +79,114 @@ union _FP_UNION_S
unsigned exp : _FP_EXPBITS_S;
unsigned sign : 1;
#endif
} bits __attribute__((packed));
} bits __attribute__ ((packed));
};
#define FP_DECL_S(X) _FP_DECL(1,X)
#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val)
#define FP_UNPACK_RAW_SP(X,val) _FP_UNPACK_RAW_1_P(S,X,val)
#define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X)
#define FP_PACK_RAW_SP(val,X) \
do { \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(S,val,X); \
} while (0)
#define FP_DECL_S(X) _FP_DECL (1, X)
#define FP_UNPACK_RAW_S(X, val) _FP_UNPACK_RAW_1 (S, X, val)
#define FP_UNPACK_RAW_SP(X, val) _FP_UNPACK_RAW_1_P (S, X, val)
#define FP_PACK_RAW_S(val, X) _FP_PACK_RAW_1 (S, val, X)
#define FP_PACK_RAW_SP(val, X) \
do \
{ \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (S, val, X); \
} \
while (0)
#define FP_UNPACK_S(X,val) \
do { \
_FP_UNPACK_RAW_1(S,X,val); \
_FP_UNPACK_CANONICAL(S,1,X); \
} while (0)
#define FP_UNPACK_S(X, val) \
do \
{ \
_FP_UNPACK_RAW_1 (S, X, val); \
_FP_UNPACK_CANONICAL (S, 1, X); \
} \
while (0)
#define FP_UNPACK_SP(X,val) \
do { \
_FP_UNPACK_RAW_1_P(S,X,val); \
_FP_UNPACK_CANONICAL(S,1,X); \
} while (0)
#define FP_UNPACK_SP(X, val) \
do \
{ \
_FP_UNPACK_RAW_1_P (S, X, val); \
_FP_UNPACK_CANONICAL (S, 1, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_S(X,val) \
do { \
_FP_UNPACK_RAW_1(S,X,val); \
_FP_UNPACK_SEMIRAW(S,1,X); \
} while (0)
#define FP_UNPACK_SEMIRAW_S(X, val) \
do \
{ \
_FP_UNPACK_RAW_1 (S, X, val); \
_FP_UNPACK_SEMIRAW (S, 1, X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_SP(X,val) \
do { \
_FP_UNPACK_RAW_1_P(S,X,val); \
_FP_UNPACK_SEMIRAW(S,1,X); \
} while (0)
#define FP_UNPACK_SEMIRAW_SP(X, val) \
do \
{ \
_FP_UNPACK_RAW_1_P (S, X, val); \
_FP_UNPACK_SEMIRAW (S, 1, X); \
} \
while (0)
#define FP_PACK_S(val,X) \
do { \
_FP_PACK_CANONICAL(S,1,X); \
_FP_PACK_RAW_1(S,val,X); \
} while (0)
#define FP_PACK_S(val, X) \
do \
{ \
_FP_PACK_CANONICAL (S, 1, X); \
_FP_PACK_RAW_1 (S, val, X); \
} \
while (0)
#define FP_PACK_SP(val,X) \
do { \
_FP_PACK_CANONICAL(S,1,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(S,val,X); \
} while (0)
#define FP_PACK_SP(val, X) \
do \
{ \
_FP_PACK_CANONICAL (S, 1, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (S, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_S(val,X) \
do { \
_FP_PACK_SEMIRAW(S,1,X); \
_FP_PACK_RAW_1(S,val,X); \
} while (0)
#define FP_PACK_SEMIRAW_S(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (S, 1, X); \
_FP_PACK_RAW_1 (S, val, X); \
} \
while (0)
#define FP_PACK_SEMIRAW_SP(val,X) \
do { \
_FP_PACK_SEMIRAW(S,1,X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P(S,val,X); \
} while (0)
#define FP_PACK_SEMIRAW_SP(val, X) \
do \
{ \
_FP_PACK_SEMIRAW (S, 1, X); \
if (!FP_INHIBIT_RESULTS) \
_FP_PACK_RAW_1_P (S, val, X); \
} \
while (0)
#define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X)
#define FP_NEG_S(R,X) _FP_NEG(S,1,R,X)
#define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y)
#define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y)
#define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y)
#define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y)
#define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X)
#define _FP_SQRT_MEAT_S(R,S,T,X,Q) _FP_SQRT_MEAT_1(R,S,T,X,Q)
#define FP_ISSIGNAN_S(X) _FP_ISSIGNAN (S, 1, X)
#define FP_NEG_S(R, X) _FP_NEG (S, 1, R, X)
#define FP_ADD_S(R, X, Y) _FP_ADD (S, 1, R, X, Y)
#define FP_SUB_S(R, X, Y) _FP_SUB (S, 1, R, X, Y)
#define FP_MUL_S(R, X, Y) _FP_MUL (S, 1, R, X, Y)
#define FP_DIV_S(R, X, Y) _FP_DIV (S, 1, R, X, Y)
#define FP_SQRT_S(R, X) _FP_SQRT (S, 1, R, X)
#define _FP_SQRT_MEAT_S(R, S, T, X, Q) _FP_SQRT_MEAT_1 (R, S, T, X, Q)
#define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un)
#define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y)
#define FP_CMP_UNORD_S(r,X,Y) _FP_CMP_UNORD(S,1,r,X,Y)
#if _FP_W_TYPE_SIZE < 64
# define FP_FMA_S(R, X, Y, Z) _FP_FMA (S, 1, 2, R, X, Y, Z)
#else
# define FP_FMA_S(R, X, Y, Z) _FP_FMA (S, 1, 1, R, X, Y, Z)
#endif
#define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg)
#define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt)
#define FP_CMP_S(r, X, Y, un) _FP_CMP (S, 1, r, X, Y, un)
#define FP_CMP_EQ_S(r, X, Y) _FP_CMP_EQ (S, 1, r, X, Y)
#define FP_CMP_UNORD_S(r, X, Y) _FP_CMP_UNORD (S, 1, r, X, Y)
#define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1(X)
#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1(X)
#define FP_TO_INT_S(r, X, rsz, rsg) _FP_TO_INT (S, 1, r, X, rsz, rsg)
#define FP_FROM_INT_S(X, r, rs, rt) _FP_FROM_INT (S, 1, X, r, rs, rt)
#define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1 (X)
#define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1 (X)
#if _FP_W_TYPE_SIZE < 64
# define _FP_FRAC_HIGH_DW_S(X) _FP_FRAC_HIGH_2 (X)
#else
# define _FP_FRAC_HIGH_DW_S(X) _FP_FRAC_HIGH_1 (X)
#endif

View File

@ -33,25 +33,25 @@
#define SOFT_FP_H
#ifdef _LIBC
#include <sfp-machine.h>
# include <sfp-machine.h>
#else
#include "sfp-machine.h"
# include "sfp-machine.h"
#endif
/* Allow sfp-machine to have its own byte order definitions. */
#ifndef __BYTE_ORDER
#ifdef _LIBC
#include <endian.h>
#else
#error "endianness not defined by sfp-machine.h"
#endif
# ifdef _LIBC
# include <endian.h>
# else
# error "endianness not defined by sfp-machine.h"
# endif
#endif
#define _FP_WORKBITS 3
#define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3)
#define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2)
#define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1)
#define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0)
#define _FP_WORK_LSB ((_FP_W_TYPE) 1 << 3)
#define _FP_WORK_ROUND ((_FP_W_TYPE) 1 << 2)
#define _FP_WORK_GUARD ((_FP_W_TYPE) 1 << 1)
#define _FP_WORK_STICKY ((_FP_W_TYPE) 1 << 0)
#ifndef FP_RND_NEAREST
# define FP_RND_NEAREST 0
@ -65,22 +65,22 @@
/* By default don't care about exceptions. */
#ifndef FP_EX_INVALID
#define FP_EX_INVALID 0
# define FP_EX_INVALID 0
#endif
#ifndef FP_EX_OVERFLOW
#define FP_EX_OVERFLOW 0
# define FP_EX_OVERFLOW 0
#endif
#ifndef FP_EX_UNDERFLOW
#define FP_EX_UNDERFLOW 0
# define FP_EX_UNDERFLOW 0
#endif
#ifndef FP_EX_DIVZERO
#define FP_EX_DIVZERO 0
# define FP_EX_DIVZERO 0
#endif
#ifndef FP_EX_INEXACT
#define FP_EX_INEXACT 0
# define FP_EX_INEXACT 0
#endif
#ifndef FP_EX_DENORM
#define FP_EX_DENORM 0
# define FP_EX_DENORM 0
#endif
/* _FP_STRUCT_LAYOUT may be defined as an attribute to determine the
@ -90,23 +90,31 @@
differences in how consecutive bit-fields are laid out from the
default expected by soft-fp. */
#ifndef _FP_STRUCT_LAYOUT
#define _FP_STRUCT_LAYOUT
# define _FP_STRUCT_LAYOUT
#endif
#ifdef _FP_DECL_EX
#define FP_DECL_EX \
# define FP_DECL_EX \
int _fex = 0; \
_FP_DECL_EX
#else
#define FP_DECL_EX int _fex = 0
# define FP_DECL_EX int _fex = 0
#endif
/* Initialize any machine-specific state used in FP_ROUNDMODE,
FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS. */
#ifndef FP_INIT_ROUNDMODE
#define FP_INIT_ROUNDMODE do {} while (0)
# define FP_INIT_ROUNDMODE do {} while (0)
#endif
/* Initialize any machine-specific state used in
FP_HANDLE_EXCEPTIONS. */
#ifndef FP_INIT_EXCEPTIONS
# define FP_INIT_EXCEPTIONS FP_INIT_ROUNDMODE
#endif
#ifndef FP_HANDLE_EXCEPTIONS
#define FP_HANDLE_EXCEPTIONS do {} while (0)
# define FP_HANDLE_EXCEPTIONS do {} while (0)
#endif
#ifndef FP_INHIBIT_RESULTS
@ -115,15 +123,12 @@
* check if some exceptions are unmasked
* and inhibit it in such a case.
*/
#define FP_INHIBIT_RESULTS 0
# define FP_INHIBIT_RESULTS 0
#endif
#define FP_SET_EXCEPTION(ex) \
_fex |= (ex)
#define FP_UNSET_EXCEPTION(ex) \
_fex &= ~(ex)
#define FP_CLEAR_EXCEPTIONS \
_fex = 0
@ -131,58 +136,90 @@
(_fex)
#ifndef FP_TRAPPING_EXCEPTIONS
#define FP_TRAPPING_EXCEPTIONS 0
# define FP_TRAPPING_EXCEPTIONS 0
#endif
#define _FP_ROUND_NEAREST(wc, X) \
do { \
if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
} while (0)
/* A file using soft-fp may define FP_NO_EXCEPTIONS before including
soft-fp.h to indicate that, although a macro used there could raise
exceptions, or do rounding and potentially thereby raise
exceptions, for some arguments, for the particular arguments used
in that file no exceptions or rounding can occur. Such a file
should not itself use macros relating to handling exceptions and
rounding modes; this is only for indirect uses (in particular, in
_FP_FROM_INT and the macros it calls). */
#ifdef FP_NO_EXCEPTIONS
#define _FP_ROUND_ZERO(wc, X) (void)0
# undef FP_SET_EXCEPTION
# define FP_SET_EXCEPTION(ex) do {} while (0)
# undef FP_CUR_EXCEPTIONS
# define FP_CUR_EXCEPTIONS 0
# undef FP_TRAPPING_EXCEPTIONS
# define FP_TRAPPING_EXCEPTIONS 0
# undef FP_ROUNDMODE
# define FP_ROUNDMODE FP_RND_ZERO
#endif
#define _FP_ROUND_NEAREST(wc, X) \
do \
{ \
if ((_FP_FRAC_LOW_##wc (X) & 15) != _FP_WORK_ROUND) \
_FP_FRAC_ADDI_##wc (X, _FP_WORK_ROUND); \
} \
while (0)
#define _FP_ROUND_ZERO(wc, X) (void) 0
#define _FP_ROUND_PINF(wc, X) \
do { \
if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
} while (0)
do \
{ \
if (!X##_s && (_FP_FRAC_LOW_##wc (X) & 7)) \
_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB); \
} \
while (0)
#define _FP_ROUND_MINF(wc, X) \
do { \
if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
} while (0)
#define _FP_ROUND_MINF(wc, X) \
do \
{ \
if (X##_s && (_FP_FRAC_LOW_##wc (X) & 7)) \
_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB); \
} \
while (0)
#define _FP_ROUND(wc, X) \
do { \
if (_FP_FRAC_LOW_##wc(X) & 7) \
{ \
FP_SET_EXCEPTION(FP_EX_INEXACT); \
switch (FP_ROUNDMODE) \
{ \
case FP_RND_NEAREST: \
_FP_ROUND_NEAREST(wc,X); \
break; \
case FP_RND_ZERO: \
_FP_ROUND_ZERO(wc,X); \
break; \
case FP_RND_PINF: \
_FP_ROUND_PINF(wc,X); \
break; \
case FP_RND_MINF: \
_FP_ROUND_MINF(wc,X); \
break; \
} \
} \
} while (0)
do \
{ \
if (_FP_FRAC_LOW_##wc (X) & 7) \
{ \
FP_SET_EXCEPTION (FP_EX_INEXACT); \
switch (FP_ROUNDMODE) \
{ \
case FP_RND_NEAREST: \
_FP_ROUND_NEAREST (wc, X); \
break; \
case FP_RND_ZERO: \
_FP_ROUND_ZERO (wc, X); \
break; \
case FP_RND_PINF: \
_FP_ROUND_PINF (wc, X); \
break; \
case FP_RND_MINF: \
_FP_ROUND_MINF (wc, X); \
break; \
} \
} \
} \
while (0)
#define FP_CLS_NORMAL 0
#define FP_CLS_ZERO 1
#define FP_CLS_INF 2
#define FP_CLS_NAN 3
#define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y))
#define _FP_CLS_COMBINE(x, y) (((x) << 2) | (y))
#include "op-1.h"
#include "op-2.h"
@ -194,35 +231,35 @@ do { \
#define UWtype _FP_W_TYPE
#define W_TYPE_SIZE _FP_W_TYPE_SIZE
typedef int QItype __attribute__((mode(QI)));
typedef int SItype __attribute__((mode(SI)));
typedef int DItype __attribute__((mode(DI)));
typedef unsigned int UQItype __attribute__((mode(QI)));
typedef unsigned int USItype __attribute__((mode(SI)));
typedef unsigned int UDItype __attribute__((mode(DI)));
typedef int QItype __attribute__ ((mode (QI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef int DItype __attribute__ ((mode (DI)));
typedef unsigned int UQItype __attribute__ ((mode (QI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
typedef unsigned int UDItype __attribute__ ((mode (DI)));
#if _FP_W_TYPE_SIZE == 32
typedef unsigned int UHWtype __attribute__((mode(HI)));
typedef unsigned int UHWtype __attribute__ ((mode (HI)));
#elif _FP_W_TYPE_SIZE == 64
typedef USItype UHWtype;
#endif
#ifndef CMPtype
#define CMPtype int
# define CMPtype int
#endif
#define SI_BITS (__CHAR_BIT__ * (int)sizeof(SItype))
#define DI_BITS (__CHAR_BIT__ * (int)sizeof(DItype))
#define SI_BITS (__CHAR_BIT__ * (int) sizeof (SItype))
#define DI_BITS (__CHAR_BIT__ * (int) sizeof (DItype))
#ifndef umul_ppmm
#ifdef _LIBC
#include <stdlib/longlong.h>
#else
#include "longlong.h"
#endif
# ifdef _LIBC
# include <stdlib/longlong.h>
# else
# include "longlong.h"
# endif
#endif
#ifdef _LIBC
#include <stdlib.h>
# include <stdlib.h>
#else
extern void abort (void);
#endif

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "double.h"
DFtype __subdf3(DFtype a, DFtype b)
DFtype
__subdf3 (DFtype a, DFtype b)
{
FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
FP_DECL_D (A);
FP_DECL_D (B);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_D(A, a);
FP_UNPACK_SEMIRAW_D(B, b);
FP_SUB_D(R, A, B);
FP_PACK_SEMIRAW_D(r, R);
FP_UNPACK_SEMIRAW_D (A, a);
FP_UNPACK_SEMIRAW_D (B, b);
FP_SUB_D (R, A, B);
FP_PACK_SEMIRAW_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "single.h"
SFtype __subsf3(SFtype a, SFtype b)
SFtype
__subsf3 (SFtype a, SFtype b)
{
FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
FP_DECL_S (A);
FP_DECL_S (B);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_S(A, a);
FP_UNPACK_SEMIRAW_S(B, b);
FP_SUB_S(R, A, B);
FP_PACK_SEMIRAW_S(r, R);
FP_UNPACK_SEMIRAW_S (A, a);
FP_UNPACK_SEMIRAW_S (B, b);
FP_SUB_S (R, A, B);
FP_PACK_SEMIRAW_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -31,17 +31,20 @@
#include "soft-fp.h"
#include "quad.h"
TFtype __subtf3(TFtype a, TFtype b)
TFtype
__subtf3 (TFtype a, TFtype b)
{
FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
FP_DECL_Q (A);
FP_DECL_Q (B);
FP_DECL_Q (R);
TFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_Q(A, a);
FP_UNPACK_SEMIRAW_Q(B, b);
FP_SUB_Q(R, A, B);
FP_PACK_SEMIRAW_Q(r, R);
FP_UNPACK_SEMIRAW_Q (A, a);
FP_UNPACK_SEMIRAW_Q (B, b);
FP_SUB_Q (R, A, B);
FP_PACK_SEMIRAW_Q (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -32,21 +32,22 @@
#include "single.h"
#include "double.h"
SFtype __truncdfsf2(DFtype a)
SFtype
__truncdfsf2 (DFtype a)
{
FP_DECL_EX;
FP_DECL_D(A);
FP_DECL_S(R);
FP_DECL_D (A);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_D(A, a);
FP_UNPACK_SEMIRAW_D (A, a);
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
FP_TRUNC(S,D,1,2,R,A);
FP_TRUNC (S, D, 1, 2, R, A);
#else
FP_TRUNC(S,D,1,1,R,A);
FP_TRUNC (S, D, 1, 1, R, A);
#endif
FP_PACK_SEMIRAW_S(r, R);
FP_PACK_SEMIRAW_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -32,21 +32,22 @@
#include "double.h"
#include "quad.h"
DFtype __trunctfdf2(TFtype a)
DFtype
__trunctfdf2 (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_D(R);
FP_DECL_Q (A);
FP_DECL_D (R);
DFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_Q(A, a);
FP_UNPACK_SEMIRAW_Q (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_TRUNC(D,Q,2,4,R,A);
FP_TRUNC (D, Q, 2, 4, R, A);
#else
FP_TRUNC(D,Q,1,2,R,A);
FP_TRUNC (D, Q, 1, 2, R, A);
#endif
FP_PACK_SEMIRAW_D(r, R);
FP_PACK_SEMIRAW_D (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -32,21 +32,22 @@
#include "single.h"
#include "quad.h"
SFtype __trunctfsf2(TFtype a)
SFtype
__trunctfsf2 (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_S(R);
FP_DECL_Q (A);
FP_DECL_S (R);
SFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_Q(A, a);
FP_UNPACK_SEMIRAW_Q (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_TRUNC(S,Q,1,4,R,A);
FP_TRUNC (S, Q, 1, 4, R, A);
#else
FP_TRUNC(S,Q,1,2,R,A);
FP_TRUNC (S, Q, 1, 2, R, A);
#endif
FP_PACK_SEMIRAW_S(r, R);
FP_PACK_SEMIRAW_S (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -1,6 +1,6 @@
/* Software floating-point emulation.
Truncate IEEE quad into IEEE extended
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 2007-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Uros Bizjak (ubizjak@gmail.com).
@ -24,29 +24,29 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "soft-fp.h"
#include "extended.h"
#include "quad.h"
XFtype __trunctfxf2(TFtype a)
XFtype
__trunctfxf2 (TFtype a)
{
FP_DECL_EX;
FP_DECL_Q(A);
FP_DECL_E(R);
FP_DECL_Q (A);
FP_DECL_E (R);
XFtype r;
FP_INIT_ROUNDMODE;
FP_UNPACK_SEMIRAW_Q(A, a);
FP_UNPACK_SEMIRAW_Q (A, a);
#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
FP_TRUNC(E,Q,4,4,R,A);
FP_TRUNC (E, Q, 4, 4, R, A);
#else
FP_TRUNC(E,Q,2,2,R,A);
FP_TRUNC (E, Q, 2, 2, R, A);
#endif
FP_PACK_SEMIRAW_E(r, R);
FP_PACK_SEMIRAW_E (r, R);
FP_HANDLE_EXCEPTIONS;
return r;

View File

@ -30,14 +30,21 @@
#include "soft-fp.h"
#include "double.h"
CMPtype __unorddf2(DFtype a, DFtype b)
CMPtype
__unorddf2 (DFtype a, DFtype b)
{
FP_DECL_D(A); FP_DECL_D(B);
FP_DECL_EX;
FP_DECL_D (A);
FP_DECL_D (B);
CMPtype r;
FP_UNPACK_RAW_D(A, a);
FP_UNPACK_RAW_D(B, b);
FP_CMP_UNORD_D(r, A, B);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_D (A, a);
FP_UNPACK_RAW_D (B, b);
FP_CMP_UNORD_D (r, A, B);
if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}

View File

@ -30,15 +30,21 @@
#include "soft-fp.h"
#include "single.h"
CMPtype __unordsf2(SFtype a, SFtype b)
CMPtype
__unordsf2 (SFtype a, SFtype b)
{
FP_DECL_S(A);
FP_DECL_S(B);
FP_DECL_EX;
FP_DECL_S (A);
FP_DECL_S (B);
CMPtype r;
FP_UNPACK_RAW_S(A, a);
FP_UNPACK_RAW_S(B, b);
FP_CMP_UNORD_S(r, A, B);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_S (A, a);
FP_UNPACK_RAW_S (B, b);
FP_CMP_UNORD_S (r, A, B);
if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}

View File

@ -30,15 +30,21 @@
#include "soft-fp.h"
#include "quad.h"
CMPtype __unordtf2(TFtype a, TFtype b)
CMPtype
__unordtf2 (TFtype a, TFtype b)
{
FP_DECL_Q(A);
FP_DECL_Q(B);
FP_DECL_EX;
FP_DECL_Q (A);
FP_DECL_Q (B);
CMPtype r;
FP_UNPACK_RAW_Q(A, a);
FP_UNPACK_RAW_Q(B, b);
FP_CMP_UNORD_Q(r, A, B);
FP_INIT_EXCEPTIONS;
FP_UNPACK_RAW_Q (A, a);
FP_UNPACK_RAW_Q (B, b);
FP_CMP_UNORD_Q (r, A, B);
if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
FP_SET_EXCEPTION (FP_EX_INVALID);
FP_HANDLE_EXCEPTIONS;
return r;
}