1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

soft-fp: fix vertical whitespace and indentation.

This commit is contained in:
Joseph Myers
2013-10-15 00:17:35 +00:00
parent 17c48a60b8
commit 1e14558915
86 changed files with 3797 additions and 3218 deletions

View File

@ -1,3 +1,91 @@
2013-10-14 Joseph Myers <joseph@codesourcery.com>
* soft-fp/adddf3.c: Fix vertical whitespace and indentation.
* 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/floatunsidf.c: Likewise.
* soft-fp/floatunsisf.c: Likewise.
* soft-fp/floatuntidf.c: Likewise.
* soft-fp/floatuntisf.c: Likewise.
* soft-fp/floatuntitf.c: Likewise.
* soft-fp/fmadf4.c: Likewise.
* soft-fp/fmasf4.c: Likewise.
* soft-fp/fmatf4.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/sqrtdf2.c: Likewise.
* soft-fp/sqrtsf2.c: Likewise.
* soft-fp/sqrttf2.c: 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-10-14 Ondřej Bílka <neleai@seznam.cz> 2013-10-14 Ondřej Bílka <neleai@seznam.cz>
[BZ #15672] [BZ #15672]

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __adddf3(DFtype a, DFtype b) DFtype
__adddf3(DFtype a, DFtype b)
{ {
FP_DECL_EX; 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; DFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __addsf3(SFtype a, SFtype b) SFtype
__addsf3(SFtype a, SFtype b)
{ {
FP_DECL_EX; 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; SFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __addtf3(TFtype a, TFtype b) TFtype
__addtf3(TFtype a, TFtype b)
{ {
FP_DECL_EX; 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; TFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __divdf3(DFtype a, DFtype b) DFtype
__divdf3(DFtype a, DFtype b)
{ {
FP_DECL_EX; 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; DFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __divsf3(SFtype a, SFtype b) SFtype
__divsf3(SFtype a, SFtype b)
{ {
FP_DECL_EX; 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; SFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __divtf3(TFtype a, TFtype b) TFtype
__divtf3(TFtype a, TFtype b)
{ {
FP_DECL_EX; 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; TFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -73,7 +73,8 @@ typedef float DFtype __attribute__((mode(DF)));
union _FP_UNION_D union _FP_UNION_D
{ {
DFtype flt; DFtype flt;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1; unsigned sign : 1;
unsigned exp : _FP_EXPBITS_D; unsigned exp : _FP_EXPBITS_D;
@ -92,61 +93,79 @@ union _FP_UNION_D
# define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val) # 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_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_D(val,X) _FP_PACK_RAW_2(D,val,X)
# define FP_PACK_RAW_DP(val,X) \ # define FP_PACK_RAW_DP(val,X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
_FP_PACK_RAW_2_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(D,val,X); \
} \
while (0)
# define FP_UNPACK_D(X,val) \ # define FP_UNPACK_D(X,val) \
do { \ do \
_FP_UNPACK_RAW_2(D,X,val); \ { \
_FP_UNPACK_CANONICAL(D,2,X); \ _FP_UNPACK_RAW_2(D,X,val); \
} while (0) _FP_UNPACK_CANONICAL(D,2,X); \
} \
while (0)
# define FP_UNPACK_DP(X,val) \ # define FP_UNPACK_DP(X,val) \
do { \ do \
_FP_UNPACK_RAW_2_P(D,X,val); \ { \
_FP_UNPACK_CANONICAL(D,2,X); \ _FP_UNPACK_RAW_2_P(D,X,val); \
} while (0) _FP_UNPACK_CANONICAL(D,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_D(X,val) \ # define FP_UNPACK_SEMIRAW_D(X,val) \
do { \ do \
_FP_UNPACK_RAW_2(D,X,val); \ { \
_FP_UNPACK_SEMIRAW(D,2,X); \ _FP_UNPACK_RAW_2(D,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(D,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_DP(X,val) \ # define FP_UNPACK_SEMIRAW_DP(X,val) \
do { \ do \
_FP_UNPACK_RAW_2_P(D,X,val); \ { \
_FP_UNPACK_SEMIRAW(D,2,X); \ _FP_UNPACK_RAW_2_P(D,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(D,2,X); \
} \
while (0)
# define FP_PACK_D(val,X) \ # define FP_PACK_D(val,X) \
do { \ do \
_FP_PACK_CANONICAL(D,2,X); \ { \
_FP_PACK_RAW_2(D,val,X); \ _FP_PACK_CANONICAL(D,2,X); \
} while (0) _FP_PACK_RAW_2(D,val,X); \
} \
while (0)
# define FP_PACK_DP(val,X) \ # define FP_PACK_DP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(D,2,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_CANONICAL(D,2,X); \
_FP_PACK_RAW_2_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(D,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_D(val,X) \ # define FP_PACK_SEMIRAW_D(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(D,2,X); \ { \
_FP_PACK_RAW_2(D,val,X); \ _FP_PACK_SEMIRAW(D,2,X); \
} while (0) _FP_PACK_RAW_2(D,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_DP(val,X) \ # define FP_PACK_SEMIRAW_DP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(D,2,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_SEMIRAW(D,2,X); \
_FP_PACK_RAW_2_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(D,val,X); \
} \
while (0)
# define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,2,X) # define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,2,X)
# define FP_NEG_D(R,X) _FP_NEG(D,2,R,X) # define FP_NEG_D(R,X) _FP_NEG(D,2,R,X)
@ -175,7 +194,8 @@ union _FP_UNION_D
union _FP_UNION_D union _FP_UNION_D
{ {
DFtype flt; DFtype flt;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1; unsigned sign : 1;
unsigned exp : _FP_EXPBITS_D; unsigned exp : _FP_EXPBITS_D;
@ -192,61 +212,79 @@ union _FP_UNION_D
# define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val) # 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_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_D(val,X) _FP_PACK_RAW_1(D,val,X)
# define FP_PACK_RAW_DP(val,X) \ # define FP_PACK_RAW_DP(val,X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
_FP_PACK_RAW_1_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(D,val,X); \
} \
while (0)
# define FP_UNPACK_D(X,val) \ # define FP_UNPACK_D(X,val) \
do { \ do \
_FP_UNPACK_RAW_1(D,X,val); \ { \
_FP_UNPACK_CANONICAL(D,1,X); \ _FP_UNPACK_RAW_1(D,X,val); \
} while (0) _FP_UNPACK_CANONICAL(D,1,X); \
} \
while (0)
# define FP_UNPACK_DP(X,val) \ # define FP_UNPACK_DP(X,val) \
do { \ do \
_FP_UNPACK_RAW_1_P(D,X,val); \ { \
_FP_UNPACK_CANONICAL(D,1,X); \ _FP_UNPACK_RAW_1_P(D,X,val); \
} while (0) _FP_UNPACK_CANONICAL(D,1,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_D(X,val) \ # define FP_UNPACK_SEMIRAW_D(X,val) \
do { \ do \
_FP_UNPACK_RAW_1(D,X,val); \ { \
_FP_UNPACK_SEMIRAW(D,1,X); \ _FP_UNPACK_RAW_1(D,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(D,1,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_DP(X,val) \ # define FP_UNPACK_SEMIRAW_DP(X,val) \
do { \ do \
_FP_UNPACK_RAW_1_P(D,X,val); \ { \
_FP_UNPACK_SEMIRAW(D,1,X); \ _FP_UNPACK_RAW_1_P(D,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(D,1,X); \
} \
while (0)
# define FP_PACK_D(val,X) \ # define FP_PACK_D(val,X) \
do { \ do \
_FP_PACK_CANONICAL(D,1,X); \ { \
_FP_PACK_RAW_1(D,val,X); \ _FP_PACK_CANONICAL(D,1,X); \
} while (0) _FP_PACK_RAW_1(D,val,X); \
} \
while (0)
# define FP_PACK_DP(val,X) \ # define FP_PACK_DP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(D,1,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_CANONICAL(D,1,X); \
_FP_PACK_RAW_1_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(D,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_D(val,X) \ # define FP_PACK_SEMIRAW_D(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(D,1,X); \ { \
_FP_PACK_RAW_1(D,val,X); \ _FP_PACK_SEMIRAW(D,1,X); \
} while (0) _FP_PACK_RAW_1(D,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_DP(val,X) \ # define FP_PACK_SEMIRAW_DP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(D,1,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_SEMIRAW(D,1,X); \
_FP_PACK_RAW_1_P(D,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(D,val,X); \
} \
while (0)
# define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,1,X) # define FP_ISSIGNAN_D(X) _FP_ISSIGNAN(D,1,X)
# define FP_NEG_D(R,X) _FP_NEG(D,1,R,X) # define FP_NEG_D(R,X) _FP_NEG(D,1,R,X)

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
CMPtype __eqdf2(DFtype a, DFtype b) CMPtype
__eqdf2(DFtype a, DFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(A);
FP_DECL_D(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
CMPtype __eqsf2(SFtype a, SFtype b) CMPtype
__eqsf2(SFtype a, SFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(A);
FP_DECL_S(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
CMPtype __eqtf2(TFtype a, TFtype b) CMPtype
__eqtf2(TFtype a, TFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(A);
FP_DECL_Q(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -32,7 +32,8 @@
#include "double.h" #include "double.h"
#include "quad.h" #include "quad.h"
TFtype __extenddftf2(DFtype a) TFtype
__extenddftf2(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -69,128 +69,157 @@ typedef float XFtype __attribute__((mode(XF)));
union _FP_UNION_E union _FP_UNION_E
{ {
XFtype flt; XFtype flt;
struct _FP_STRUCT_LAYOUT struct _FP_STRUCT_LAYOUT
{ {
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
unsigned long pad1 : _FP_W_TYPE_SIZE; unsigned long pad1 : _FP_W_TYPE_SIZE;
unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E); unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
unsigned long sign : 1; unsigned long sign : 1;
unsigned long exp : _FP_EXPBITS_E; unsigned long exp : _FP_EXPBITS_E;
unsigned long frac1 : _FP_W_TYPE_SIZE; unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE; unsigned long frac0 : _FP_W_TYPE_SIZE;
# else # else
unsigned long frac0 : _FP_W_TYPE_SIZE; unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE; unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned exp : _FP_EXPBITS_E; unsigned exp : _FP_EXPBITS_E;
unsigned sign : 1; unsigned sign : 1;
# endif /* not bigendian */ # endif /* not bigendian */
} bits __attribute__((packed)); } 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) \ # define FP_UNPACK_RAW_E(X, val) \
do { \ do \
union _FP_UNION_E _flo; _flo.flt = (val); \ { \
\ union _FP_UNION_E _flo; \
X##_f[2] = 0; X##_f[3] = 0; \ _flo.flt = (val); \
X##_f[0] = _flo.bits.frac0; \ \
X##_f[1] = _flo.bits.frac1; \ X##_f[2] = 0; \
X##_e = _flo.bits.exp; \ X##_f[3] = 0; \
X##_s = _flo.bits.sign; \ X##_f[0] = _flo.bits.frac0; \
} while (0) 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) \ # define FP_UNPACK_RAW_EP(X, val) \
do { \ do \
union _FP_UNION_E *_flo = \ { \
(union _FP_UNION_E *)(val); \ union _FP_UNION_E *_flo = (union _FP_UNION_E *)(val); \
\ \
X##_f[2] = 0; X##_f[3] = 0; \ X##_f[2] = 0; \
X##_f[0] = _flo->bits.frac0; \ X##_f[3] = 0; \
X##_f[1] = _flo->bits.frac1; \ X##_f[0] = _flo->bits.frac0; \
X##_e = _flo->bits.exp; \ X##_f[1] = _flo->bits.frac1; \
X##_s = _flo->bits.sign; \ X##_e = _flo->bits.exp; \
} while (0) X##_s = _flo->bits.sign; \
} \
while (0)
# define FP_PACK_RAW_E(val, X) \ # define FP_PACK_RAW_E(val, X) \
do { \ do \
union _FP_UNION_E _flo; \ { \
\ union _FP_UNION_E _flo; \
if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \ \
else X##_f[1] &= ~(_FP_IMPLBIT_E); \ if (X##_e) \
_flo.bits.frac0 = X##_f[0]; \ X##_f[1] |= _FP_IMPLBIT_E; \
_flo.bits.frac1 = X##_f[1]; \ else \
_flo.bits.exp = X##_e; \ X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo.bits.sign = X##_s; \ _flo.bits.frac0 = X##_f[0]; \
\ _flo.bits.frac1 = X##_f[1]; \
(val) = _flo.flt; \ _flo.bits.exp = X##_e; \
} while (0) _flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} \
while (0)
# define FP_PACK_RAW_EP(val, X) \ # define FP_PACK_RAW_EP(val, X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
{ \ if (!FP_INHIBIT_RESULTS) \
union _FP_UNION_E *_flo = \ { \
(union _FP_UNION_E *)(val); \ union _FP_UNION_E *_flo = (union _FP_UNION_E *)(val); \
\ \
if (X##_e) X##_f[1] |= _FP_IMPLBIT_E; \ if (X##_e) \
else X##_f[1] &= ~(_FP_IMPLBIT_E); \ X##_f[1] |= _FP_IMPLBIT_E; \
_flo->bits.frac0 = X##_f[0]; \ else \
_flo->bits.frac1 = X##_f[1]; \ X##_f[1] &= ~(_FP_IMPLBIT_E); \
_flo->bits.exp = X##_e; \ _flo->bits.frac0 = X##_f[0]; \
_flo->bits.sign = X##_s; \ _flo->bits.frac1 = X##_f[1]; \
} \ _flo->bits.exp = X##_e; \
} while (0) _flo->bits.sign = X##_s; \
} \
} \
while (0)
# define FP_UNPACK_E(X,val) \ # define FP_UNPACK_E(X,val) \
do { \ do \
FP_UNPACK_RAW_E(X,val); \ { \
_FP_UNPACK_CANONICAL(E,4,X); \ FP_UNPACK_RAW_E(X,val); \
} while (0) _FP_UNPACK_CANONICAL(E,4,X); \
} \
while (0)
# define FP_UNPACK_EP(X,val) \ # define FP_UNPACK_EP(X,val) \
do { \ do \
FP_UNPACK_RAW_EP(X,val); \ { \
_FP_UNPACK_CANONICAL(E,4,X); \ FP_UNPACK_RAW_EP(X,val); \
} while (0) _FP_UNPACK_CANONICAL(E,4,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_E(X,val) \ # define FP_UNPACK_SEMIRAW_E(X,val) \
do { \ do \
FP_UNPACK_RAW_E(X,val); \ { \
_FP_UNPACK_SEMIRAW(E,4,X); \ FP_UNPACK_RAW_E(X,val); \
} while (0) _FP_UNPACK_SEMIRAW(E,4,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_EP(X,val) \ # define FP_UNPACK_SEMIRAW_EP(X,val) \
do { \ do \
FP_UNPACK_RAW_EP(X,val); \ { \
_FP_UNPACK_SEMIRAW(E,4,X); \ FP_UNPACK_RAW_EP(X,val); \
} while (0) _FP_UNPACK_SEMIRAW(E,4,X); \
} \
while (0)
# define FP_PACK_E(val,X) \ # define FP_PACK_E(val,X) \
do { \ do \
_FP_PACK_CANONICAL(E,4,X); \ { \
FP_PACK_RAW_E(val,X); \ _FP_PACK_CANONICAL(E,4,X); \
} while (0) FP_PACK_RAW_E(val,X); \
} \
while (0)
# define FP_PACK_EP(val,X) \ # define FP_PACK_EP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(E,4,X); \ { \
FP_PACK_RAW_EP(val,X); \ _FP_PACK_CANONICAL(E,4,X); \
} while (0) FP_PACK_RAW_EP(val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_E(val,X) \ # define FP_PACK_SEMIRAW_E(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(E,4,X); \ { \
FP_PACK_RAW_E(val,X); \ _FP_PACK_SEMIRAW(E,4,X); \
} while (0) FP_PACK_RAW_E(val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_EP(val,X) \ # define FP_PACK_SEMIRAW_EP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(E,4,X); \ { \
FP_PACK_RAW_EP(val,X); \ _FP_PACK_SEMIRAW(E,4,X); \
} while (0) FP_PACK_RAW_EP(val,X); \
} \
while (0)
# define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,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_NEG_E(R,X) _FP_NEG(E,4,R,X)
@ -213,48 +242,50 @@ union _FP_UNION_E
*/ */
# define _FP_SQRT_MEAT_E(R, S, T, X, q) \ # define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do { \ do \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \ { \
_FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \ q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
while (q) \ _FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \
{ \ while (q) \
T##_f[1] = S##_f[1] + q; \ { \
if (T##_f[1] <= X##_f[1]) \ 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]; \ S##_f[1] = T##_f[1] + q; \
R##_f[1] += q; \ X##_f[1] -= T##_f[1]; \
} \ R##_f[1] += q; \
_FP_FRAC_SLL_2(X, 1); \ } \
q >>= 1; \ _FP_FRAC_SLL_2(X, 1); \
} \ q >>= 1; \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \ } \
while (q) \ 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]; \ T##_f[0] = S##_f[0] + q; \
if (T##_f[1] < X##_f[1] || \ T##_f[1] = S##_f[1]; \
(T##_f[1] == X##_f[1] && \ if (T##_f[1] < X##_f[1] \
T##_f[0] <= X##_f[0])) \ || (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]); \ S##_f[0] = T##_f[0] + q; \
_FP_FRAC_DEC_2(X, T); \ S##_f[1] += (T##_f[0] > S##_f[0]); \
R##_f[0] += q; \ _FP_FRAC_DEC_2(X, T); \
} \ R##_f[0] += q; \
_FP_FRAC_SLL_2(X, 1); \ } \
q >>= 1; \ _FP_FRAC_SLL_2(X, 1); \
} \ q >>= 1; \
_FP_FRAC_SLL_4(R, (_FP_WORKBITS)); \ } \
if (X##_f[0] | X##_f[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] && \ if (S##_f[1] < X##_f[1] \
S##_f[0] < X##_f[0])) \ || (S##_f[1] == X##_f[1] \
R##_f[0] |= _FP_WORK_ROUND; \ && S##_f[0] < X##_f[0])) \
R##_f[0] |= _FP_WORK_STICKY; \ R##_f[0] |= _FP_WORK_ROUND; \
} \ R##_f[0] |= _FP_WORK_STICKY; \
} while (0) } \
} \
while (0)
# define FP_CMP_E(r,X,Y,un) _FP_CMP(E,4,r,X,Y,un) # 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_EQ_E(r,X,Y) _FP_CMP_EQ(E,4,r,X,Y)
@ -272,7 +303,8 @@ union _FP_UNION_E
union _FP_UNION_E union _FP_UNION_E
{ {
XFtype flt; XFtype flt;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
_FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E); _FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
unsigned sign : 1; unsigned sign : 1;
@ -288,103 +320,130 @@ union _FP_UNION_E
# 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) \ # define FP_UNPACK_RAW_E(X, val) \
do { \ do \
union _FP_UNION_E _flo; _flo.flt = (val); \ { \
\ union _FP_UNION_E _flo; \
X##_f0 = _flo.bits.frac; \ _flo.flt = (val); \
X##_f1 = 0; \ \
X##_e = _flo.bits.exp; \ X##_f0 = _flo.bits.frac; \
X##_s = _flo.bits.sign; \ X##_f1 = 0; \
} while (0) X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} \
while (0)
# define FP_UNPACK_RAW_EP(X, val) \ # define FP_UNPACK_RAW_EP(X, val) \
do { \ do \
union _FP_UNION_E *_flo = \ { \
(union _FP_UNION_E *)(val); \ union _FP_UNION_E *_flo = (union _FP_UNION_E *)(val); \
\ \
X##_f0 = _flo->bits.frac; \ X##_f0 = _flo->bits.frac; \
X##_f1 = 0; \ X##_f1 = 0; \
X##_e = _flo->bits.exp; \ X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \ X##_s = _flo->bits.sign; \
} while (0) } \
while (0)
# define FP_PACK_RAW_E(val, X) \ # define FP_PACK_RAW_E(val, X) \
do { \ do \
union _FP_UNION_E _flo; \ { \
\ union _FP_UNION_E _flo; \
if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \ \
else X##_f0 &= ~(_FP_IMPLBIT_E); \ if (X##_e) \
_flo.bits.frac = X##_f0; \ X##_f0 |= _FP_IMPLBIT_E; \
_flo.bits.exp = X##_e; \ else \
_flo.bits.sign = X##_s; \ X##_f0 &= ~(_FP_IMPLBIT_E); \
\ _flo.bits.frac = X##_f0; \
(val) = _flo.flt; \ _flo.bits.exp = X##_e; \
} while (0) _flo.bits.sign = X##_s; \
\
(val) = _flo.flt; \
} \
while (0)
# define FP_PACK_RAW_EP(fs, val, X) \ # define FP_PACK_RAW_EP(fs, val, X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
{ \ if (!FP_INHIBIT_RESULTS) \
union _FP_UNION_E *_flo = \ { \
(union _FP_UNION_E *)(val); \ union _FP_UNION_E *_flo = (union _FP_UNION_E *)(val); \
\ \
if (X##_e) X##_f0 |= _FP_IMPLBIT_E; \ if (X##_e) \
else X##_f0 &= ~(_FP_IMPLBIT_E); \ X##_f0 |= _FP_IMPLBIT_E; \
_flo->bits.frac = X##_f0; \ else \
_flo->bits.exp = X##_e; \ X##_f0 &= ~(_FP_IMPLBIT_E); \
_flo->bits.sign = X##_s; \ _flo->bits.frac = X##_f0; \
} \ _flo->bits.exp = X##_e; \
} while (0) _flo->bits.sign = X##_s; \
} \
} \
while (0)
# define FP_UNPACK_E(X,val) \ # define FP_UNPACK_E(X,val) \
do { \ do \
FP_UNPACK_RAW_E(X,val); \ { \
_FP_UNPACK_CANONICAL(E,2,X); \ FP_UNPACK_RAW_E(X,val); \
} while (0) _FP_UNPACK_CANONICAL(E,2,X); \
} \
while (0)
# define FP_UNPACK_EP(X,val) \ # define FP_UNPACK_EP(X,val) \
do { \ do \
FP_UNPACK_RAW_EP(X,val); \ { \
_FP_UNPACK_CANONICAL(E,2,X); \ FP_UNPACK_RAW_EP(X,val); \
} while (0) _FP_UNPACK_CANONICAL(E,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_E(X,val) \ # define FP_UNPACK_SEMIRAW_E(X,val) \
do { \ do \
FP_UNPACK_RAW_E(X,val); \ { \
_FP_UNPACK_SEMIRAW(E,2,X); \ FP_UNPACK_RAW_E(X,val); \
} while (0) _FP_UNPACK_SEMIRAW(E,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_EP(X,val) \ # define FP_UNPACK_SEMIRAW_EP(X,val) \
do { \ do \
FP_UNPACK_RAW_EP(X,val); \ { \
_FP_UNPACK_SEMIRAW(E,2,X); \ FP_UNPACK_RAW_EP(X,val); \
} while (0) _FP_UNPACK_SEMIRAW(E,2,X); \
} \
while (0)
# define FP_PACK_E(val,X) \ # define FP_PACK_E(val,X) \
do { \ do \
_FP_PACK_CANONICAL(E,2,X); \ { \
FP_PACK_RAW_E(val,X); \ _FP_PACK_CANONICAL(E,2,X); \
} while (0) FP_PACK_RAW_E(val,X); \
} \
while (0)
# define FP_PACK_EP(val,X) \ # define FP_PACK_EP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(E,2,X); \ { \
FP_PACK_RAW_EP(val,X); \ _FP_PACK_CANONICAL(E,2,X); \
} while (0) FP_PACK_RAW_EP(val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_E(val,X) \ # define FP_PACK_SEMIRAW_E(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(E,2,X); \ { \
FP_PACK_RAW_E(val,X); \ _FP_PACK_SEMIRAW(E,2,X); \
} while (0) FP_PACK_RAW_E(val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_EP(val,X) \ # define FP_PACK_SEMIRAW_EP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(E,2,X); \ { \
FP_PACK_RAW_EP(val,X); \ _FP_PACK_SEMIRAW(E,2,X); \
} while (0) FP_PACK_RAW_EP(val,X); \
} \
while (0)
# define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,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_NEG_E(R,X) _FP_NEG(E,2,R,X)
@ -404,29 +463,31 @@ union _FP_UNION_E
* have to. * have to.
*/ */
# define _FP_SQRT_MEAT_E(R, S, T, X, q) \ # define _FP_SQRT_MEAT_E(R, S, T, X, q) \
do { \ do \
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \ { \
_FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \ q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
while (q) \ _FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \
{ \ while (q) \
T##_f0 = S##_f0 + q; \ { \
if (T##_f0 <= X##_f0) \ T##_f0 = S##_f0 + q; \
{ \ if (T##_f0 <= X##_f0) \
S##_f0 = T##_f0 + q; \ { \
X##_f0 -= T##_f0; \ S##_f0 = T##_f0 + q; \
R##_f0 += q; \ X##_f0 -= T##_f0; \
} \ R##_f0 += q; \
_FP_FRAC_SLL_1(X, 1); \ } \
q >>= 1; \ _FP_FRAC_SLL_1(X, 1); \
} \ q >>= 1; \
_FP_FRAC_SLL_2(R, (_FP_WORKBITS)); \ } \
if (X##_f0) \ _FP_FRAC_SLL_2(R, (_FP_WORKBITS)); \
{ \ if (X##_f0) \
if (S##_f0 < X##_f0) \ { \
R##_f0 |= _FP_WORK_ROUND; \ if (S##_f0 < X##_f0) \
R##_f0 |= _FP_WORK_STICKY; \ R##_f0 |= _FP_WORK_ROUND; \
} \ R##_f0 |= _FP_WORK_STICKY; \
} while (0) } \
} \
while (0)
# define FP_CMP_E(r,X,Y,un) _FP_CMP(E,2,r,X,Y,un) # 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_EQ_E(r,X,Y) _FP_CMP_EQ(E,2,r,X,Y)

View File

@ -32,7 +32,8 @@
#include "single.h" #include "single.h"
#include "double.h" #include "double.h"
DFtype __extendsfdf2(SFtype a) DFtype
__extendsfdf2(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -32,7 +32,8 @@
#include "single.h" #include "single.h"
#include "quad.h" #include "quad.h"
TFtype __extendsftf2(SFtype a) TFtype
__extendsftf2(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -31,7 +31,8 @@
#include "extended.h" #include "extended.h"
#include "quad.h" #include "quad.h"
TFtype __extendxftf2(XFtype a) TFtype
__extendxftf2(XFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_E(A); FP_DECL_E(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DItype __fixdfdi(DFtype a) DItype
__fixdfdi(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
SItype __fixdfsi(DFtype a) SItype
__fixdfsi(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
TItype __fixdfti(DFtype a) TItype
__fixdfti(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
DItype __fixsfdi(SFtype a) DItype
__fixsfdi(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SItype __fixsfsi(SFtype a) SItype
__fixsfsi(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
TItype __fixsfti(SFtype a) TItype
__fixsfti(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
DItype __fixtfdi(TFtype a) DItype
__fixtfdi(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
SItype __fixtfsi(TFtype a) SItype
__fixtfsi(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TItype __fixtfti(TFtype a) TItype
__fixtfti(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
UDItype __fixunsdfdi(DFtype a) UDItype
__fixunsdfdi(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
USItype __fixunsdfsi(DFtype a) USItype
__fixunsdfsi(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
UTItype __fixunsdfti(DFtype a) UTItype
__fixunsdfti(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
UDItype __fixunssfdi(SFtype a) UDItype
__fixunssfdi(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
USItype __fixunssfsi(SFtype a) USItype
__fixunssfsi(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
UTItype __fixunssfti(SFtype a) UTItype
__fixunssfti(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
UDItype __fixunstfdi(TFtype a) UDItype
__fixunstfdi(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
USItype __fixunstfsi(TFtype a) USItype
__fixunstfsi(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
UTItype __fixunstfti(TFtype a) UTItype
__fixunstfti(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatdidf(DItype i) DFtype
__floatdidf(DItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floatdisf(DItype i) SFtype
__floatdisf(DItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -32,7 +32,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floatditf(DItype i) TFtype
__floatditf(DItype i)
{ {
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;

View File

@ -32,7 +32,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatsidf(SItype i) DFtype
__floatsidf(SItype i)
{ {
FP_DECL_D(A); FP_DECL_D(A);
DFtype a; DFtype a;

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floatsisf(SItype i) SFtype
__floatsisf(SItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -32,7 +32,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floatsitf(SItype i) TFtype
__floatsitf(SItype i)
{ {
FP_DECL_Q(A); FP_DECL_Q(A);
TFtype a; TFtype a;

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floattidf(TItype i) DFtype
__floattidf(TItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floattisf(TItype i) SFtype
__floattisf(TItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floattitf(TItype i) TFtype
__floattitf(TItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatundidf(UDItype i) DFtype
__floatundidf(UDItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floatundisf(UDItype i) SFtype
__floatundisf(UDItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -32,7 +32,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatunsidf(USItype i) DFtype
__floatunsidf(USItype i)
{ {
FP_DECL_D(A); FP_DECL_D(A);
DFtype a; DFtype a;

View File

@ -31,7 +31,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floatunsisf(USItype i) SFtype
__floatunsisf(USItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __floatuntidf(UTItype i) DFtype
__floatuntidf(UTItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __floatuntisf(UTItype i) SFtype
__floatuntisf(UTItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __floatuntitf(UTItype i) TFtype
__floatuntitf(UTItype i)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -33,7 +33,10 @@ double
__fma (double a, double b, double c) __fma (double a, double b, double c)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(C); FP_DECL_D(R); FP_DECL_D(A);
FP_DECL_D(B);
FP_DECL_D(C);
FP_DECL_D(R);
double r; double r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -33,7 +33,10 @@ float
__fmaf (float a, float b, float c) __fmaf (float a, float b, float c)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(C); FP_DECL_S(R); FP_DECL_S(A);
FP_DECL_S(B);
FP_DECL_S(C);
FP_DECL_S(R);
float r; float r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -33,7 +33,10 @@ long double
__fmal (long double a, long double b, long double c) __fmal (long double a, long double b, long double c)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); FP_DECL_Q(R); FP_DECL_Q(A);
FP_DECL_Q(B);
FP_DECL_Q(C);
FP_DECL_Q(R);
long double r; long double r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
CMPtype __gedf2(DFtype a, DFtype b) CMPtype
__gedf2(DFtype a, DFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(A);
FP_DECL_D(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
CMPtype __gesf2(SFtype a, SFtype b) CMPtype
__gesf2(SFtype a, SFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(A);
FP_DECL_S(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
CMPtype __getf2(TFtype a, TFtype b) CMPtype
__getf2(TFtype a, TFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(A);
FP_DECL_Q(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
CMPtype __ledf2(DFtype a, DFtype b) CMPtype
__ledf2(DFtype a, DFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(A);
FP_DECL_D(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
CMPtype __lesf2(SFtype a, SFtype b) CMPtype
__lesf2(SFtype a, SFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(A);
FP_DECL_S(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
CMPtype __letf2(TFtype a, TFtype b) CMPtype
__letf2(TFtype a, TFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(A);
FP_DECL_Q(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __muldf3(DFtype a, DFtype b) DFtype
__muldf3(DFtype a, DFtype b)
{ {
FP_DECL_EX; 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; DFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __mulsf3(SFtype a, SFtype b) SFtype
__mulsf3(SFtype a, SFtype b)
{ {
FP_DECL_EX; 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; SFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __multf3(TFtype a, TFtype b) TFtype
__multf3(TFtype a, TFtype b)
{ {
FP_DECL_EX; 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; TFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,9 +31,11 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __negdf2(DFtype a) DFtype
__negdf2(DFtype a)
{ {
FP_DECL_D(A); FP_DECL_D(R); FP_DECL_D(A);
FP_DECL_D(R);
DFtype r; DFtype r;
FP_UNPACK_RAW_D(A, a); FP_UNPACK_RAW_D(A, a);

View File

@ -31,9 +31,11 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __negsf2(SFtype a) SFtype
__negsf2(SFtype a)
{ {
FP_DECL_S(A); FP_DECL_S(R); FP_DECL_S(A);
FP_DECL_S(R);
SFtype r; SFtype r;
FP_UNPACK_RAW_S(A, a); FP_UNPACK_RAW_S(A, a);

View File

@ -31,9 +31,11 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __negtf2(TFtype a) TFtype
__negtf2(TFtype a)
{ {
FP_DECL_Q(A); FP_DECL_Q(R); FP_DECL_Q(A);
FP_DECL_Q(R);
TFtype r; TFtype r;
FP_UNPACK_RAW_Q(A, a); FP_UNPACK_RAW_Q(A, a);

View File

@ -39,12 +39,14 @@
#define _FP_FRAC_ADDI_1(X,I) (X##_f += I) #define _FP_FRAC_ADDI_1(X,I) (X##_f += I)
#define _FP_FRAC_SLL_1(X,N) \ #define _FP_FRAC_SLL_1(X,N) \
do { \ do \
if (__builtin_constant_p(N) && (N) == 1) \ { \
X##_f += X##_f; \ if (__builtin_constant_p(N) && (N) == 1) \
else \ X##_f += X##_f; \
X##_f <<= (N); \ else \
} while (0) X##_f <<= (N); \
} \
while (0)
#define _FP_FRAC_SRL_1(X,N) (X##_f >>= N) #define _FP_FRAC_SRL_1(X,N) (X##_f >>= N)
/* Right shift with sticky-lsb. */ /* Right shift with sticky-lsb. */
@ -52,15 +54,19 @@
#define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, 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) \ #define __FP_FRAC_SRST_1(X,S,N,sz) \
do { \ do \
S = (__builtin_constant_p(N) && (N) == 1 \ { \
? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \ S = (__builtin_constant_p(N) && (N) == 1 \
X = X >> (N); \ ? X & 1 \
} while (0) : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
X = X >> (N); \
} \
while (0)
#define __FP_FRAC_SRS_1(X,N,sz) \ #define __FP_FRAC_SRS_1(X,N,sz) \
(X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \ (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \
? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0))) ? 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_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_SUB_1(R,X,Y) (R##_f = X##_f - Y##_f)
@ -86,49 +92,56 @@ do { \
* normalize the data. * normalize the data.
*/ */
#define _FP_UNPACK_RAW_1(fs, X, val) \ #define _FP_UNPACK_RAW_1(fs, X, val) \
do { \ do \
union _FP_UNION_##fs _flo; _flo.flt = (val); \ { \
\ union _FP_UNION_##fs _flo; \
X##_f = _flo.bits.frac; \ _flo.flt = (val); \
X##_e = _flo.bits.exp; \ \
X##_s = _flo.bits.sign; \ X##_f = _flo.bits.frac; \
} while (0) X##_e = _flo.bits.exp; \
X##_s = _flo.bits.sign; \
} \
while (0)
#define _FP_UNPACK_RAW_1_P(fs, X, val) \ #define _FP_UNPACK_RAW_1_P(fs, X, val) \
do { \ do \
union _FP_UNION_##fs *_flo = \ { \
(union _FP_UNION_##fs *)(val); \ union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *)(val); \
\ \
X##_f = _flo->bits.frac; \ X##_f = _flo->bits.frac; \
X##_e = _flo->bits.exp; \ X##_e = _flo->bits.exp; \
X##_s = _flo->bits.sign; \ X##_s = _flo->bits.sign; \
} while (0) } \
while (0)
/* /*
* Repack the raw bits of a native fp value. * Repack the raw bits of a native fp value.
*/ */
#define _FP_PACK_RAW_1(fs, val, X) \ #define _FP_PACK_RAW_1(fs, val, X) \
do { \ do \
union _FP_UNION_##fs _flo; \ { \
\ union _FP_UNION_##fs _flo; \
_flo.bits.frac = X##_f; \ \
_flo.bits.exp = X##_e; \ _flo.bits.frac = X##_f; \
_flo.bits.sign = X##_s; \ _flo.bits.exp = X##_e; \
\ _flo.bits.sign = X##_s; \
(val) = _flo.flt; \ \
} while (0) (val) = _flo.flt; \
} \
while (0)
#define _FP_PACK_RAW_1_P(fs, val, X) \ #define _FP_PACK_RAW_1_P(fs, val, X) \
do { \ do \
union _FP_UNION_##fs *_flo = \ { \
(union _FP_UNION_##fs *)(val); \ union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *)(val); \
\ \
_flo->bits.frac = X##_f; \ _flo->bits.frac = X##_f; \
_flo->bits.exp = X##_e; \ _flo->bits.exp = X##_e; \
_flo->bits.sign = X##_s; \ _flo->bits.sign = X##_s; \
} while (0) } \
while (0)
/* /*
@ -138,74 +151,86 @@ do { \
/* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the
multiplication immediately. */ multiplication immediately. */
#define _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y) \ #define _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y) \
do { \ do \
R##_f = X##_f * Y##_f; \ { \
} while (0) R##_f = X##_f * Y##_f; \
} \
while (0)
#define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y) \ #define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y) \
do { \ do \
_FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y); \ { \
/* Normalize since we know where the msb of the multiplicands \ _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y); \
were (bit B), we know that the msb of the of the product is \ /* Normalize since we know where the msb of the multiplicands \
at either 2B or 2B-1. */ \ were (bit B), we know that the msb of the of the product is \
_FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \ at either 2B or 2B-1. */ \
} while (0) _FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \
} \
while (0)
/* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */
#define _FP_MUL_MEAT_DW_1_wide(wfracbits, R, X, Y, doit) \ #define _FP_MUL_MEAT_DW_1_wide(wfracbits, R, X, Y, doit) \
do { \ do \
doit(R##_f1, R##_f0, X##_f, Y##_f); \ { \
} while (0) doit(R##_f1, R##_f0, X##_f, Y##_f); \
} \
while (0)
#define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit) \ #define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit) \
do { \ do \
_FP_FRAC_DECL_2(_Z); \ { \
_FP_MUL_MEAT_DW_1_wide(wfracbits, _Z, X, Y, doit); \ _FP_FRAC_DECL_2(_Z); \
/* Normalize since we know where the msb of the multiplicands \ _FP_MUL_MEAT_DW_1_wide(wfracbits, _Z, X, Y, doit); \
were (bit B), we know that the msb of the of the product is \ /* Normalize since we know where the msb of the multiplicands \
at either 2B or 2B-1. */ \ were (bit B), we know that the msb of the of the product is \
_FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \ at either 2B or 2B-1. */ \
R##_f = _Z_f0; \ _FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \
} while (0) R##_f = _Z_f0; \
} \
while (0)
/* Finally, a simple widening multiply algorithm. What fun! */ /* Finally, a simple widening multiply algorithm. What fun! */
#define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y) \ #define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y) \
do { \ do \
_FP_W_TYPE _xh, _xl, _yh, _yl; \ { \
_FP_FRAC_DECL_2(_a); \ _FP_W_TYPE _xh, _xl, _yh, _yl; \
_FP_FRAC_DECL_2(_a); \
\ \
/* split the words in half */ \ /* split the words in half */ \
_xh = X##_f >> (_FP_W_TYPE_SIZE/2); \ _xh = X##_f >> (_FP_W_TYPE_SIZE/2); \
_xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
_yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \ _yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \
_yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \
\ \
/* multiply the pieces */ \ /* multiply the pieces */ \
R##_f0 = _xl * _yl; \ R##_f0 = _xl * _yl; \
_a_f0 = _xh * _yl; \ _a_f0 = _xh * _yl; \
_a_f1 = _xl * _yh; \ _a_f1 = _xl * _yh; \
R##_f1 = _xh * _yh; \ R##_f1 = _xh * _yh; \
\ \
/* reassemble into two full words */ \ /* reassemble into two full words */ \
if ((_a_f0 += _a_f1) < _a_f1) \ if ((_a_f0 += _a_f1) < _a_f1) \
R##_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \ R##_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \
_a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \ _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \
_a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \ _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \
_FP_FRAC_ADD_2(R, R, _a); \ _FP_FRAC_ADD_2(R, R, _a); \
} while (0) } \
while (0)
#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \ #define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \
do { \ do \
_FP_FRAC_DECL_2(_z); \ { \
_FP_MUL_MEAT_DW_1_hard(wfracbits, _z, X, Y); \ _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); \ /* normalize */ \
R##_f = _z_f0; \ _FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits); \
} while (0) R##_f = _z_f0; \
} \
while (0)
/* /*
@ -217,15 +242,17 @@ do { \
C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you
choose will depend on what the compiler does with divrem4. */ choose will depend on what the compiler does with divrem4. */
#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \ #define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \
do { \ do \
_FP_W_TYPE _q, _r; \ { \
X##_f <<= (X##_f < Y##_f \ _FP_W_TYPE _q, _r; \
? R##_e--, _FP_WFRACBITS_##fs \ X##_f <<= (X##_f < Y##_f \
: _FP_WFRACBITS_##fs - 1); \ ? R##_e--, _FP_WFRACBITS_##fs \
doit(_q, _r, X##_f, Y##_f); \ : _FP_WFRACBITS_##fs - 1); \
R##_f = _q | (_r != 0); \ doit(_q, _r, X##_f, Y##_f); \
} while (0) R##_f = _q | (_r != 0); \
} \
while (0)
/* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd /* 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 that may be useful in this situation. This first is for a primitive
@ -233,46 +260,50 @@ do { \
for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */ for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */
#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \ #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \
do { \ do \
_FP_W_TYPE _nh, _nl, _q, _r, _y; \ { \
_FP_W_TYPE _nh, _nl, _q, _r, _y; \
\ \
/* Normalize Y -- i.e. make the most significant bit set. */ \ /* Normalize Y -- i.e. make the most significant bit set. */ \
_y = Y##_f << _FP_WFRACXBITS_##fs; \ _y = Y##_f << _FP_WFRACXBITS_##fs; \
\ \
/* Shift X op correspondingly high, that is, up one full word. */ \ /* Shift X op correspondingly high, that is, up one full word. */ \
if (X##_f < Y##_f) \ if (X##_f < Y##_f) \
{ \ { \
R##_e--; \ R##_e--; \
_nl = 0; \ _nl = 0; \
_nh = X##_f; \ _nh = X##_f; \
} \ } \
else \ else \
{ \ { \
_nl = X##_f << (_FP_W_TYPE_SIZE - 1); \ _nl = X##_f << (_FP_W_TYPE_SIZE - 1); \
_nh = X##_f >> 1; \ _nh = X##_f >> 1; \
} \ } \
\ \
udiv_qrnnd(_q, _r, _nh, _nl, _y); \ udiv_qrnnd(_q, _r, _nh, _nl, _y); \
R##_f = _q | (_r != 0); \ R##_f = _q | (_r != 0); \
} while (0) } \
while (0)
#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \ #define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \
do { \ do \
_FP_W_TYPE _nh, _nl, _q, _r; \ { \
if (X##_f < Y##_f) \ _FP_W_TYPE _nh, _nl, _q, _r; \
{ \ if (X##_f < Y##_f) \
R##_e--; \ { \
_nl = X##_f << _FP_WFRACBITS_##fs; \ R##_e--; \
_nh = X##_f >> _FP_WFRACXBITS_##fs; \ _nl = X##_f << _FP_WFRACBITS_##fs; \
} \ _nh = X##_f >> _FP_WFRACXBITS_##fs; \
else \ } \
{ \ else \
_nl = X##_f << (_FP_WFRACBITS_##fs - 1); \ { \
_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \ _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); \ udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
} while (0) R##_f = _q | (_r != 0); \
} \
while (0)
/* /*
@ -281,27 +312,29 @@ do { \
* should be added for those machines where division is fast. * should be added for those machines where division is fast.
*/ */
#define _FP_SQRT_MEAT_1(R, S, T, X, q) \ #define _FP_SQRT_MEAT_1(R, S, T, X, q) \
do { \ do \
while (q != _FP_WORK_ROUND) \ { \
{ \ while (q != _FP_WORK_ROUND) \
T##_f = S##_f + q; \ { \
if (T##_f <= X##_f) \ T##_f = S##_f + q; \
{ \ if (T##_f <= X##_f) \
S##_f = T##_f + q; \ { \
X##_f -= T##_f; \ S##_f = T##_f + q; \
R##_f += q; \ X##_f -= T##_f; \
} \ R##_f += q; \
_FP_FRAC_SLL_1(X, 1); \ } \
q >>= 1; \ _FP_FRAC_SLL_1(X, 1); \
} \ q >>= 1; \
if (X##_f) \ } \
{ \ if (X##_f) \
if (S##_f < X##_f) \ { \
R##_f |= _FP_WORK_ROUND; \ if (S##_f < X##_f) \
R##_f |= _FP_WORK_STICKY; \ R##_f |= _FP_WORK_ROUND; \
} \ R##_f |= _FP_WORK_STICKY; \
} while (0) } \
} \
while (0)
/* /*
* Assembly/disassembly for converting to/from integral types. * 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

@ -36,45 +36,49 @@
#define _FP_FRAC_LOW_8(X) (X##_f[0]) #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) \ #define _FP_FRAC_SLL_8(X,N) \
do { \ do \
_FP_I_TYPE _up, _down, _skip, _i; \ { \
_skip = (N) / _FP_W_TYPE_SIZE; \ _FP_I_TYPE _up, _down, _skip, _i; \
_up = (N) % _FP_W_TYPE_SIZE; \ _skip = (N) / _FP_W_TYPE_SIZE; \
_down = _FP_W_TYPE_SIZE - _up; \ _up = (N) % _FP_W_TYPE_SIZE; \
if (!_up) \ _down = _FP_W_TYPE_SIZE - _up; \
for (_i = 7; _i >= _skip; --_i) \ if (!_up) \
X##_f[_i] = X##_f[_i-_skip]; \ for (_i = 7; _i >= _skip; --_i) \
else \ X##_f[_i] = X##_f[_i-_skip]; \
{ \ else \
for (_i = 7; _i > _skip; --_i) \ { \
X##_f[_i] = X##_f[_i-_skip] << _up \ for (_i = 7; _i > _skip; --_i) \
| X##_f[_i-_skip-1] >> _down; \ X##_f[_i] = (X##_f[_i-_skip] << _up \
X##_f[_i--] = X##_f[0] << _up; \ | X##_f[_i-_skip-1] >> _down); \
} \ X##_f[_i--] = X##_f[0] << _up; \
for (; _i >= 0; --_i) \ } \
X##_f[_i] = 0; \ for (; _i >= 0; --_i) \
} while (0) X##_f[_i] = 0; \
} \
while (0)
#define _FP_FRAC_SRL_8(X,N) \ #define _FP_FRAC_SRL_8(X,N) \
do { \ do \
_FP_I_TYPE _up, _down, _skip, _i; \ { \
_skip = (N) / _FP_W_TYPE_SIZE; \ _FP_I_TYPE _up, _down, _skip, _i; \
_down = (N) % _FP_W_TYPE_SIZE; \ _skip = (N) / _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \ _down = (N) % _FP_W_TYPE_SIZE; \
if (!_down) \ _up = _FP_W_TYPE_SIZE - _down; \
for (_i = 0; _i <= 7-_skip; ++_i) \ if (!_down) \
X##_f[_i] = X##_f[_i+_skip]; \ for (_i = 0; _i <= 7-_skip; ++_i) \
else \ X##_f[_i] = X##_f[_i+_skip]; \
{ \ else \
for (_i = 0; _i < 7-_skip; ++_i) \ { \
X##_f[_i] = X##_f[_i+_skip] >> _down \ for (_i = 0; _i < 7-_skip; ++_i) \
| X##_f[_i+_skip+1] << _up; \ X##_f[_i] = (X##_f[_i+_skip] >> _down \
X##_f[_i++] = X##_f[7] >> _down; \ | X##_f[_i+_skip+1] << _up); \
} \ X##_f[_i++] = X##_f[7] >> _down; \
for (; _i < 8; ++_i) \ } \
X##_f[_i] = 0; \ for (; _i < 8; ++_i) \
} while (0) X##_f[_i] = 0; \
} \
while (0)
/* Right shift with sticky-lsb. /* Right shift with sticky-lsb.
@ -83,27 +87,30 @@
* were one then we always set the LSbit. * were one then we always set the LSbit.
*/ */
#define _FP_FRAC_SRS_8(X,N,size) \ #define _FP_FRAC_SRS_8(X,N,size) \
do { \ do \
_FP_I_TYPE _up, _down, _skip, _i; \ { \
_FP_W_TYPE _s; \ _FP_I_TYPE _up, _down, _skip, _i; \
_skip = (N) / _FP_W_TYPE_SIZE; \ _FP_W_TYPE _s; \
_down = (N) % _FP_W_TYPE_SIZE; \ _skip = (N) / _FP_W_TYPE_SIZE; \
_up = _FP_W_TYPE_SIZE - _down; \ _down = (N) % _FP_W_TYPE_SIZE; \
for (_s = _i = 0; _i < _skip; ++_i) \ _up = _FP_W_TYPE_SIZE - _down; \
_s |= X##_f[_i]; \ for (_s = _i = 0; _i < _skip; ++_i) \
if (!_down) \ _s |= X##_f[_i]; \
for (_i = 0; _i <= 7-_skip; ++_i) \ if (!_down) \
X##_f[_i] = X##_f[_i+_skip]; \ for (_i = 0; _i <= 7-_skip; ++_i) \
else \ X##_f[_i] = X##_f[_i+_skip]; \
{ \ else \
_s |= X##_f[_i] << _up; \ { \
for (_i = 0; _i < 7-_skip; ++_i) \ _s |= X##_f[_i] << _up; \
X##_f[_i] = X##_f[_i+_skip] >> _down \ for (_i = 0; _i < 7-_skip; ++_i) \
| X##_f[_i+_skip+1] << _up; \ X##_f[_i] = (X##_f[_i+_skip] >> _down \
X##_f[_i++] = X##_f[7] >> _down; \ | X##_f[_i+_skip+1] << _up); \
} \ X##_f[_i++] = X##_f[7] >> _down; \
for (; _i < 8; ++_i) \ } \
X##_f[_i] = 0; \ for (; _i < 8; ++_i) \
/* don't fix the LSB until the very end when we're sure f[0] is stable */ \ X##_f[_i] = 0; \
X##_f[0] |= (_s != 0); \ /* don't fix the LSB until the very end when we're sure f[0] is \
} while (0) stable */ \
X##_f[0] |= (_s != 0); \
} \
while (0)

File diff suppressed because it is too large Load Diff

View File

@ -72,25 +72,25 @@ typedef float TFtype __attribute__((mode(TF)));
union _FP_UNION_Q union _FP_UNION_Q
{ {
TFtype flt; TFtype flt;
struct _FP_STRUCT_LAYOUT struct _FP_STRUCT_LAYOUT
{ {
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1; unsigned sign : 1;
unsigned exp : _FP_EXPBITS_Q; unsigned exp : _FP_EXPBITS_Q;
unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3); unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned long frac2 : _FP_W_TYPE_SIZE; unsigned long frac2 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE; unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac0 : _FP_W_TYPE_SIZE; unsigned long frac0 : _FP_W_TYPE_SIZE;
# else # else
unsigned long frac0 : _FP_W_TYPE_SIZE; unsigned long frac0 : _FP_W_TYPE_SIZE;
unsigned long frac1 : _FP_W_TYPE_SIZE; unsigned long frac1 : _FP_W_TYPE_SIZE;
unsigned long frac2 : _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 long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
unsigned exp : _FP_EXPBITS_Q; unsigned exp : _FP_EXPBITS_Q;
unsigned sign : 1; unsigned sign : 1;
# endif /* not bigendian */ # endif /* not bigendian */
} bits __attribute__((packed)); } bits __attribute__((packed));
}; };
@ -98,61 +98,79 @@ union _FP_UNION_Q
# define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_4(Q,X,val) # 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_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_Q(val,X) _FP_PACK_RAW_4(Q,val,X)
# define FP_PACK_RAW_QP(val,X) \ # define FP_PACK_RAW_QP(val,X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
_FP_PACK_RAW_4_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_4_P(Q,val,X); \
} \
while (0)
# define FP_UNPACK_Q(X,val) \ # define FP_UNPACK_Q(X,val) \
do { \ do \
_FP_UNPACK_RAW_4(Q,X,val); \ { \
_FP_UNPACK_CANONICAL(Q,4,X); \ _FP_UNPACK_RAW_4(Q,X,val); \
} while (0) _FP_UNPACK_CANONICAL(Q,4,X); \
} \
while (0)
# define FP_UNPACK_QP(X,val) \ # define FP_UNPACK_QP(X,val) \
do { \ do \
_FP_UNPACK_RAW_4_P(Q,X,val); \ { \
_FP_UNPACK_CANONICAL(Q,4,X); \ _FP_UNPACK_RAW_4_P(Q,X,val); \
} while (0) _FP_UNPACK_CANONICAL(Q,4,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_Q(X,val) \ # define FP_UNPACK_SEMIRAW_Q(X,val) \
do { \ do \
_FP_UNPACK_RAW_4(Q,X,val); \ { \
_FP_UNPACK_SEMIRAW(Q,4,X); \ _FP_UNPACK_RAW_4(Q,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(Q,4,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_QP(X,val) \ # define FP_UNPACK_SEMIRAW_QP(X,val) \
do { \ do \
_FP_UNPACK_RAW_4_P(Q,X,val); \ { \
_FP_UNPACK_SEMIRAW(Q,4,X); \ _FP_UNPACK_RAW_4_P(Q,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(Q,4,X); \
} \
while (0)
# define FP_PACK_Q(val,X) \ # define FP_PACK_Q(val,X) \
do { \ do \
_FP_PACK_CANONICAL(Q,4,X); \ { \
_FP_PACK_RAW_4(Q,val,X); \ _FP_PACK_CANONICAL(Q,4,X); \
} while (0) _FP_PACK_RAW_4(Q,val,X); \
} \
while (0)
# define FP_PACK_QP(val,X) \ # define FP_PACK_QP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(Q,4,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_CANONICAL(Q,4,X); \
_FP_PACK_RAW_4_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_4_P(Q,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_Q(val,X) \ # define FP_PACK_SEMIRAW_Q(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(Q,4,X); \ { \
_FP_PACK_RAW_4(Q,val,X); \ _FP_PACK_SEMIRAW(Q,4,X); \
} while (0) _FP_PACK_RAW_4(Q,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_QP(val,X) \ # define FP_PACK_SEMIRAW_QP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(Q,4,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_SEMIRAW(Q,4,X); \
_FP_PACK_RAW_4_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_4_P(Q,val,X); \
} \
while (0)
# define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,4,X) # define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,4,X)
# define FP_NEG_Q(R,X) _FP_NEG(Q,4,R,X) # define FP_NEG_Q(R,X) _FP_NEG(Q,4,R,X)
@ -180,10 +198,12 @@ union _FP_UNION_Q
union _FP_UNION_Q union _FP_UNION_Q
{ {
TFtype flt /* __attribute__((mode(TF))) */ ; TFtype flt /* __attribute__((mode(TF))) */ ;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
_FP_W_TYPE a, b; _FP_W_TYPE a, b;
} longs; } longs;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
# if __BYTE_ORDER == __BIG_ENDIAN # if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1; unsigned sign : 1;
unsigned exp : _FP_EXPBITS_Q; unsigned exp : _FP_EXPBITS_Q;
@ -202,61 +222,79 @@ union _FP_UNION_Q
# define FP_UNPACK_RAW_Q(X,val) _FP_UNPACK_RAW_2(Q,X,val) # 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_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_Q(val,X) _FP_PACK_RAW_2(Q,val,X)
# define FP_PACK_RAW_QP(val,X) \ # define FP_PACK_RAW_QP(val,X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
_FP_PACK_RAW_2_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(Q,val,X); \
} \
while (0)
# define FP_UNPACK_Q(X,val) \ # define FP_UNPACK_Q(X,val) \
do { \ do \
_FP_UNPACK_RAW_2(Q,X,val); \ { \
_FP_UNPACK_CANONICAL(Q,2,X); \ _FP_UNPACK_RAW_2(Q,X,val); \
} while (0) _FP_UNPACK_CANONICAL(Q,2,X); \
} \
while (0)
# define FP_UNPACK_QP(X,val) \ # define FP_UNPACK_QP(X,val) \
do { \ do \
_FP_UNPACK_RAW_2_P(Q,X,val); \ { \
_FP_UNPACK_CANONICAL(Q,2,X); \ _FP_UNPACK_RAW_2_P(Q,X,val); \
} while (0) _FP_UNPACK_CANONICAL(Q,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_Q(X,val) \ # define FP_UNPACK_SEMIRAW_Q(X,val) \
do { \ do \
_FP_UNPACK_RAW_2(Q,X,val); \ { \
_FP_UNPACK_SEMIRAW(Q,2,X); \ _FP_UNPACK_RAW_2(Q,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(Q,2,X); \
} \
while (0)
# define FP_UNPACK_SEMIRAW_QP(X,val) \ # define FP_UNPACK_SEMIRAW_QP(X,val) \
do { \ do \
_FP_UNPACK_RAW_2_P(Q,X,val); \ { \
_FP_UNPACK_SEMIRAW(Q,2,X); \ _FP_UNPACK_RAW_2_P(Q,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(Q,2,X); \
} \
while (0)
# define FP_PACK_Q(val,X) \ # define FP_PACK_Q(val,X) \
do { \ do \
_FP_PACK_CANONICAL(Q,2,X); \ { \
_FP_PACK_RAW_2(Q,val,X); \ _FP_PACK_CANONICAL(Q,2,X); \
} while (0) _FP_PACK_RAW_2(Q,val,X); \
} \
while (0)
# define FP_PACK_QP(val,X) \ # define FP_PACK_QP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(Q,2,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_CANONICAL(Q,2,X); \
_FP_PACK_RAW_2_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(Q,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_Q(val,X) \ # define FP_PACK_SEMIRAW_Q(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(Q,2,X); \ { \
_FP_PACK_RAW_2(Q,val,X); \ _FP_PACK_SEMIRAW(Q,2,X); \
} while (0) _FP_PACK_RAW_2(Q,val,X); \
} \
while (0)
# define FP_PACK_SEMIRAW_QP(val,X) \ # define FP_PACK_SEMIRAW_QP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(Q,2,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_SEMIRAW(Q,2,X); \
_FP_PACK_RAW_2_P(Q,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_2_P(Q,val,X); \
} \
while (0)
# define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,2,X) # define FP_ISSIGNAN_Q(X) _FP_ISSIGNAN(Q,2,X)
# define FP_NEG_Q(R,X) _FP_NEG(Q,2,R,X) # define FP_NEG_Q(R,X) _FP_NEG(Q,2,R,X)

View File

@ -68,7 +68,8 @@ typedef float SFtype __attribute__((mode(SF)));
union _FP_UNION_S union _FP_UNION_S
{ {
SFtype flt; SFtype flt;
struct _FP_STRUCT_LAYOUT { struct _FP_STRUCT_LAYOUT
{
#if __BYTE_ORDER == __BIG_ENDIAN #if __BYTE_ORDER == __BIG_ENDIAN
unsigned sign : 1; unsigned sign : 1;
unsigned exp : _FP_EXPBITS_S; unsigned exp : _FP_EXPBITS_S;
@ -85,61 +86,79 @@ union _FP_UNION_S
#define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) #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_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_S(val,X) _FP_PACK_RAW_1(S,val,X)
#define FP_PACK_RAW_SP(val,X) \ #define FP_PACK_RAW_SP(val,X) \
do { \ do \
if (!FP_INHIBIT_RESULTS) \ { \
_FP_PACK_RAW_1_P(S,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(S,val,X); \
} \
while (0)
#define FP_UNPACK_S(X,val) \ #define FP_UNPACK_S(X,val) \
do { \ do \
_FP_UNPACK_RAW_1(S,X,val); \ { \
_FP_UNPACK_CANONICAL(S,1,X); \ _FP_UNPACK_RAW_1(S,X,val); \
} while (0) _FP_UNPACK_CANONICAL(S,1,X); \
} \
while (0)
#define FP_UNPACK_SP(X,val) \ #define FP_UNPACK_SP(X,val) \
do { \ do \
_FP_UNPACK_RAW_1_P(S,X,val); \ { \
_FP_UNPACK_CANONICAL(S,1,X); \ _FP_UNPACK_RAW_1_P(S,X,val); \
} while (0) _FP_UNPACK_CANONICAL(S,1,X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_S(X,val) \ #define FP_UNPACK_SEMIRAW_S(X,val) \
do { \ do \
_FP_UNPACK_RAW_1(S,X,val); \ { \
_FP_UNPACK_SEMIRAW(S,1,X); \ _FP_UNPACK_RAW_1(S,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(S,1,X); \
} \
while (0)
#define FP_UNPACK_SEMIRAW_SP(X,val) \ #define FP_UNPACK_SEMIRAW_SP(X,val) \
do { \ do \
_FP_UNPACK_RAW_1_P(S,X,val); \ { \
_FP_UNPACK_SEMIRAW(S,1,X); \ _FP_UNPACK_RAW_1_P(S,X,val); \
} while (0) _FP_UNPACK_SEMIRAW(S,1,X); \
} \
while (0)
#define FP_PACK_S(val,X) \ #define FP_PACK_S(val,X) \
do { \ do \
_FP_PACK_CANONICAL(S,1,X); \ { \
_FP_PACK_RAW_1(S,val,X); \ _FP_PACK_CANONICAL(S,1,X); \
} while (0) _FP_PACK_RAW_1(S,val,X); \
} \
while (0)
#define FP_PACK_SP(val,X) \ #define FP_PACK_SP(val,X) \
do { \ do \
_FP_PACK_CANONICAL(S,1,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_CANONICAL(S,1,X); \
_FP_PACK_RAW_1_P(S,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(S,val,X); \
} \
while (0)
#define FP_PACK_SEMIRAW_S(val,X) \ #define FP_PACK_SEMIRAW_S(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(S,1,X); \ { \
_FP_PACK_RAW_1(S,val,X); \ _FP_PACK_SEMIRAW(S,1,X); \
} while (0) _FP_PACK_RAW_1(S,val,X); \
} \
while (0)
#define FP_PACK_SEMIRAW_SP(val,X) \ #define FP_PACK_SEMIRAW_SP(val,X) \
do { \ do \
_FP_PACK_SEMIRAW(S,1,X); \ { \
if (!FP_INHIBIT_RESULTS) \ _FP_PACK_SEMIRAW(S,1,X); \
_FP_PACK_RAW_1_P(S,val,X); \ if (!FP_INHIBIT_RESULTS) \
} while (0) _FP_PACK_RAW_1_P(S,val,X); \
} \
while (0)
#define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X) #define FP_ISSIGNAN_S(X) _FP_ISSIGNAN(S,1,X)
#define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) #define FP_NEG_S(R,X) _FP_NEG(S,1,R,X)

View File

@ -166,48 +166,56 @@
#endif #endif
#define _FP_ROUND_NEAREST(wc, X) \ #define _FP_ROUND_NEAREST(wc, X) \
do { \ do \
if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \ { \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
} while (0) _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
} \
while (0)
#define _FP_ROUND_ZERO(wc, X) (void)0 #define _FP_ROUND_ZERO(wc, X) (void)0
#define _FP_ROUND_PINF(wc, X) \ #define _FP_ROUND_PINF(wc, X) \
do { \ do \
if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ { \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
} while (0) _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
} \
while (0)
#define _FP_ROUND_MINF(wc, X) \ #define _FP_ROUND_MINF(wc, X) \
do { \ do \
if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ { \
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
} while (0) _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
} \
while (0)
#define _FP_ROUND(wc, X) \ #define _FP_ROUND(wc, X) \
do { \ do \
if (_FP_FRAC_LOW_##wc(X) & 7) \ { \
{ \ if (_FP_FRAC_LOW_##wc(X) & 7) \
FP_SET_EXCEPTION(FP_EX_INEXACT); \ { \
switch (FP_ROUNDMODE) \ FP_SET_EXCEPTION(FP_EX_INEXACT); \
{ \ switch (FP_ROUNDMODE) \
case FP_RND_NEAREST: \ { \
_FP_ROUND_NEAREST(wc,X); \ case FP_RND_NEAREST: \
break; \ _FP_ROUND_NEAREST(wc,X); \
case FP_RND_ZERO: \ break; \
_FP_ROUND_ZERO(wc,X); \ case FP_RND_ZERO: \
break; \ _FP_ROUND_ZERO(wc,X); \
case FP_RND_PINF: \ break; \
_FP_ROUND_PINF(wc,X); \ case FP_RND_PINF: \
break; \ _FP_ROUND_PINF(wc,X); \
case FP_RND_MINF: \ break; \
_FP_ROUND_MINF(wc,X); \ case FP_RND_MINF: \
break; \ _FP_ROUND_MINF(wc,X); \
} \ break; \
} \ } \
} while (0) } \
} \
while (0)
#define FP_CLS_NORMAL 0 #define FP_CLS_NORMAL 0
#define FP_CLS_ZERO 1 #define FP_CLS_ZERO 1

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __sqrtdf2(DFtype a) DFtype
__sqrtdf2(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(R); FP_DECL_D(A);
FP_DECL_D(R);
DFtype r; DFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __sqrtsf2(SFtype a) SFtype
__sqrtsf2(SFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(R); FP_DECL_S(A);
FP_DECL_S(R);
SFtype r; SFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __sqrttf2(TFtype a) TFtype
__sqrttf2(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(R); FP_DECL_Q(A);
FP_DECL_Q(R);
TFtype r; TFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
DFtype __subdf3(DFtype a, DFtype b) DFtype
__subdf3(DFtype a, DFtype b)
{ {
FP_DECL_EX; 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; DFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
SFtype __subsf3(SFtype a, SFtype b) SFtype
__subsf3(SFtype a, SFtype b)
{ {
FP_DECL_EX; 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; SFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -31,10 +31,13 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
TFtype __subtf3(TFtype a, TFtype b) TFtype
__subtf3(TFtype a, TFtype b)
{ {
FP_DECL_EX; 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; TFtype r;
FP_INIT_ROUNDMODE; FP_INIT_ROUNDMODE;

View File

@ -32,7 +32,8 @@
#include "single.h" #include "single.h"
#include "double.h" #include "double.h"
SFtype __truncdfsf2(DFtype a) SFtype
__truncdfsf2(DFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(A);

View File

@ -32,7 +32,8 @@
#include "double.h" #include "double.h"
#include "quad.h" #include "quad.h"
DFtype __trunctfdf2(TFtype a) DFtype
__trunctfdf2(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -32,7 +32,8 @@
#include "single.h" #include "single.h"
#include "quad.h" #include "quad.h"
SFtype __trunctfsf2(TFtype a) SFtype
__trunctfsf2(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -31,7 +31,8 @@
#include "extended.h" #include "extended.h"
#include "quad.h" #include "quad.h"
XFtype __trunctfxf2(TFtype a) XFtype
__trunctfxf2(TFtype a)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);

View File

@ -30,10 +30,12 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "double.h" #include "double.h"
CMPtype __unorddf2(DFtype a, DFtype b) CMPtype
__unorddf2(DFtype a, DFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(A);
FP_DECL_D(B);
CMPtype r; CMPtype r;
FP_INIT_EXCEPTIONS; FP_INIT_EXCEPTIONS;

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "single.h" #include "single.h"
CMPtype __unordsf2(SFtype a, SFtype b) CMPtype
__unordsf2(SFtype a, SFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_S(A); FP_DECL_S(A);

View File

@ -30,7 +30,8 @@
#include "soft-fp.h" #include "soft-fp.h"
#include "quad.h" #include "quad.h"
CMPtype __unordtf2(TFtype a, TFtype b) CMPtype
__unordtf2(TFtype a, TFtype b)
{ {
FP_DECL_EX; FP_DECL_EX;
FP_DECL_Q(A); FP_DECL_Q(A);