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:
88
ChangeLog
88
ChangeLog
@ -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]
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
114
soft-fp/double.h
114
soft-fp/double.h
@ -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;
|
||||||
@ -93,60 +94,78 @@ union _FP_UNION_D
|
|||||||
# 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) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(D,val,X); \
|
_FP_PACK_RAW_2_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2(D,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(D,2,X); \
|
_FP_UNPACK_CANONICAL(D,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2_P(D,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(D,2,X); \
|
_FP_UNPACK_CANONICAL(D,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2(D,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(D,2,X); \
|
_FP_UNPACK_SEMIRAW(D,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2_P(D,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(D,2,X); \
|
_FP_UNPACK_SEMIRAW(D,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_D(val,X) \
|
# define FP_PACK_D(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(D,2,X); \
|
_FP_PACK_CANONICAL(D,2,X); \
|
||||||
_FP_PACK_RAW_2(D,val,X); \
|
_FP_PACK_RAW_2(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_DP(val,X) \
|
# define FP_PACK_DP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(D,2,X); \
|
_FP_PACK_CANONICAL(D,2,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(D,val,X); \
|
_FP_PACK_RAW_2_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(D,2,X); \
|
||||||
_FP_PACK_RAW_2(D,val,X); \
|
_FP_PACK_RAW_2(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_SEMIRAW_DP(val,X) \
|
# define FP_PACK_SEMIRAW_DP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_SEMIRAW(D,2,X); \
|
_FP_PACK_SEMIRAW(D,2,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(D,val,X); \
|
_FP_PACK_RAW_2_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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;
|
||||||
@ -193,60 +213,78 @@ union _FP_UNION_D
|
|||||||
# 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) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(D,val,X); \
|
_FP_PACK_RAW_1_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1(D,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(D,1,X); \
|
_FP_UNPACK_CANONICAL(D,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1_P(D,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(D,1,X); \
|
_FP_UNPACK_CANONICAL(D,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1(D,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(D,1,X); \
|
_FP_UNPACK_SEMIRAW(D,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1_P(D,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(D,1,X); \
|
_FP_UNPACK_SEMIRAW(D,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_D(val,X) \
|
# define FP_PACK_D(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(D,1,X); \
|
_FP_PACK_CANONICAL(D,1,X); \
|
||||||
_FP_PACK_RAW_1(D,val,X); \
|
_FP_PACK_RAW_1(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_DP(val,X) \
|
# define FP_PACK_DP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(D,1,X); \
|
_FP_PACK_CANONICAL(D,1,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(D,val,X); \
|
_FP_PACK_RAW_1_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(D,1,X); \
|
||||||
_FP_PACK_RAW_1(D,val,X); \
|
_FP_PACK_RAW_1(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_SEMIRAW_DP(val,X) \
|
# define FP_PACK_SEMIRAW_DP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_SEMIRAW(D,1,X); \
|
_FP_PACK_SEMIRAW(D,1,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(D,val,X); \
|
_FP_PACK_RAW_1_P(D,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -92,105 +92,134 @@ union _FP_UNION_E
|
|||||||
# 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; \
|
||||||
|
_flo.flt = (val); \
|
||||||
\
|
\
|
||||||
X##_f[2] = 0; X##_f[3] = 0; \
|
X##_f[2] = 0; \
|
||||||
|
X##_f[3] = 0; \
|
||||||
X##_f[0] = _flo.bits.frac0; \
|
X##_f[0] = _flo.bits.frac0; \
|
||||||
X##_f[1] = _flo.bits.frac1; \
|
X##_f[1] = _flo.bits.frac1; \
|
||||||
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_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[3] = 0; \
|
||||||
X##_f[0] = _flo->bits.frac0; \
|
X##_f[0] = _flo->bits.frac0; \
|
||||||
X##_f[1] = _flo->bits.frac1; \
|
X##_f[1] = _flo->bits.frac1; \
|
||||||
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##_f[1] |= _FP_IMPLBIT_E; \
|
if (X##_e) \
|
||||||
else X##_f[1] &= ~(_FP_IMPLBIT_E); \
|
X##_f[1] |= _FP_IMPLBIT_E; \
|
||||||
|
else \
|
||||||
|
X##_f[1] &= ~(_FP_IMPLBIT_E); \
|
||||||
_flo.bits.frac0 = X##_f[0]; \
|
_flo.bits.frac0 = X##_f[0]; \
|
||||||
_flo.bits.frac1 = X##_f[1]; \
|
_flo.bits.frac1 = X##_f[1]; \
|
||||||
_flo.bits.exp = X##_e; \
|
_flo.bits.exp = X##_e; \
|
||||||
_flo.bits.sign = X##_s; \
|
_flo.bits.sign = X##_s; \
|
||||||
\
|
\
|
||||||
(val) = _flo.flt; \
|
(val) = _flo.flt; \
|
||||||
} while (0)
|
} \
|
||||||
|
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 *_flo = (union _FP_UNION_E *)(val); \
|
||||||
(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; \
|
||||||
|
else \
|
||||||
|
X##_f[1] &= ~(_FP_IMPLBIT_E); \
|
||||||
_flo->bits.frac0 = X##_f[0]; \
|
_flo->bits.frac0 = X##_f[0]; \
|
||||||
_flo->bits.frac1 = X##_f[1]; \
|
_flo->bits.frac1 = X##_f[1]; \
|
||||||
_flo->bits.exp = X##_e; \
|
_flo->bits.exp = X##_e; \
|
||||||
_flo->bits.sign = X##_s; \
|
_flo->bits.sign = X##_s; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_UNPACK_E(X,val) \
|
# define FP_UNPACK_E(X,val) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
FP_UNPACK_RAW_E(X,val); \
|
FP_UNPACK_RAW_E(X,val); \
|
||||||
_FP_UNPACK_CANONICAL(E,4,X); \
|
_FP_UNPACK_CANONICAL(E,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_UNPACK_EP(X,val) \
|
# define FP_UNPACK_EP(X,val) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
FP_UNPACK_RAW_EP(X,val); \
|
FP_UNPACK_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_CANONICAL(E,4,X); \
|
_FP_UNPACK_CANONICAL(E,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_E(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,4,X); \
|
_FP_UNPACK_SEMIRAW(E,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,4,X); \
|
_FP_UNPACK_SEMIRAW(E,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_E(val,X) \
|
# define FP_PACK_E(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(E,4,X); \
|
_FP_PACK_CANONICAL(E,4,X); \
|
||||||
FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_EP(val,X) \
|
# define FP_PACK_EP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(E,4,X); \
|
_FP_PACK_CANONICAL(E,4,X); \
|
||||||
FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(E,4,X); \
|
||||||
FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(E,4,X); \
|
||||||
FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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,7 +242,8 @@ 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); \
|
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
|
||||||
_FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \
|
_FP_FRAC_SRL_4(X, (_FP_WORKBITS)); \
|
||||||
while (q) \
|
while (q) \
|
||||||
@ -233,9 +263,9 @@ union _FP_UNION_E
|
|||||||
{ \
|
{ \
|
||||||
T##_f[0] = S##_f[0] + q; \
|
T##_f[0] = S##_f[0] + q; \
|
||||||
T##_f[1] = S##_f[1]; \
|
T##_f[1] = S##_f[1]; \
|
||||||
if (T##_f[1] < X##_f[1] || \
|
if (T##_f[1] < X##_f[1] \
|
||||||
(T##_f[1] == X##_f[1] && \
|
|| (T##_f[1] == X##_f[1] \
|
||||||
T##_f[0] <= X##_f[0])) \
|
&& T##_f[0] <= X##_f[0])) \
|
||||||
{ \
|
{ \
|
||||||
S##_f[0] = T##_f[0] + q; \
|
S##_f[0] = T##_f[0] + q; \
|
||||||
S##_f[1] += (T##_f[0] > S##_f[0]); \
|
S##_f[1] += (T##_f[0] > S##_f[0]); \
|
||||||
@ -248,13 +278,14 @@ union _FP_UNION_E
|
|||||||
_FP_FRAC_SLL_4(R, (_FP_WORKBITS)); \
|
_FP_FRAC_SLL_4(R, (_FP_WORKBITS)); \
|
||||||
if (X##_f[0] | X##_f[1]) \
|
if (X##_f[0] | X##_f[1]) \
|
||||||
{ \
|
{ \
|
||||||
if (S##_f[1] < X##_f[1] || \
|
if (S##_f[1] < X##_f[1] \
|
||||||
(S##_f[1] == X##_f[1] && \
|
|| (S##_f[1] == X##_f[1] \
|
||||||
S##_f[0] < X##_f[0])) \
|
&& S##_f[0] < X##_f[0])) \
|
||||||
R##_f[0] |= _FP_WORK_ROUND; \
|
R##_f[0] |= _FP_WORK_ROUND; \
|
||||||
R##_f[0] |= _FP_WORK_STICKY; \
|
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;
|
||||||
@ -289,102 +321,129 @@ 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; \
|
||||||
|
_flo.flt = (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_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; \
|
if (X##_e) \
|
||||||
else X##_f0 &= ~(_FP_IMPLBIT_E); \
|
X##_f0 |= _FP_IMPLBIT_E; \
|
||||||
|
else \
|
||||||
|
X##_f0 &= ~(_FP_IMPLBIT_E); \
|
||||||
_flo.bits.frac = X##_f0; \
|
_flo.bits.frac = X##_f0; \
|
||||||
_flo.bits.exp = X##_e; \
|
_flo.bits.exp = X##_e; \
|
||||||
_flo.bits.sign = X##_s; \
|
_flo.bits.sign = X##_s; \
|
||||||
\
|
\
|
||||||
(val) = _flo.flt; \
|
(val) = _flo.flt; \
|
||||||
} while (0)
|
} \
|
||||||
|
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 *_flo = (union _FP_UNION_E *)(val); \
|
||||||
(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; \
|
||||||
|
else \
|
||||||
|
X##_f0 &= ~(_FP_IMPLBIT_E); \
|
||||||
_flo->bits.frac = X##_f0; \
|
_flo->bits.frac = X##_f0; \
|
||||||
_flo->bits.exp = X##_e; \
|
_flo->bits.exp = X##_e; \
|
||||||
_flo->bits.sign = X##_s; \
|
_flo->bits.sign = X##_s; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
# define FP_UNPACK_E(X,val) \
|
# define FP_UNPACK_E(X,val) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
FP_UNPACK_RAW_E(X,val); \
|
FP_UNPACK_RAW_E(X,val); \
|
||||||
_FP_UNPACK_CANONICAL(E,2,X); \
|
_FP_UNPACK_CANONICAL(E,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_UNPACK_EP(X,val) \
|
# define FP_UNPACK_EP(X,val) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
FP_UNPACK_RAW_EP(X,val); \
|
FP_UNPACK_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_CANONICAL(E,2,X); \
|
_FP_UNPACK_CANONICAL(E,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_E(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,2,X); \
|
_FP_UNPACK_SEMIRAW(E,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_EP(X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(E,2,X); \
|
_FP_UNPACK_SEMIRAW(E,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_E(val,X) \
|
# define FP_PACK_E(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(E,2,X); \
|
_FP_PACK_CANONICAL(E,2,X); \
|
||||||
FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_EP(val,X) \
|
# define FP_PACK_EP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(E,2,X); \
|
_FP_PACK_CANONICAL(E,2,X); \
|
||||||
FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(E,2,X); \
|
||||||
FP_PACK_RAW_E(val,X); \
|
FP_PACK_RAW_E(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(E,2,X); \
|
||||||
FP_PACK_RAW_EP(val,X); \
|
FP_PACK_RAW_EP(val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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,7 +463,8 @@ 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); \
|
q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \
|
||||||
_FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \
|
_FP_FRAC_SRL_2(X, (_FP_WORKBITS)); \
|
||||||
while (q) \
|
while (q) \
|
||||||
@ -426,7 +486,8 @@ union _FP_UNION_E
|
|||||||
R##_f0 |= _FP_WORK_ROUND; \
|
R##_f0 |= _FP_WORK_ROUND; \
|
||||||
R##_f0 |= _FP_WORK_STICKY; \
|
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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
111
soft-fp/op-1.h
111
soft-fp/op-1.h
@ -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) \
|
if (__builtin_constant_p(N) && (N) == 1) \
|
||||||
X##_f += X##_f; \
|
X##_f += X##_f; \
|
||||||
else \
|
else \
|
||||||
X##_f <<= (N); \
|
X##_f <<= (N); \
|
||||||
} while (0)
|
} \
|
||||||
|
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 \
|
S = (__builtin_constant_p(N) && (N) == 1 \
|
||||||
? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
|
? X & 1 \
|
||||||
|
: (X << (_FP_W_TYPE_SIZE - (N))) != 0); \
|
||||||
X = X >> (N); \
|
X = X >> (N); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)
|
||||||
@ -87,30 +93,35 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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; \
|
||||||
|
_flo.flt = (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)
|
||||||
|
|
||||||
#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.frac = X##_f; \
|
||||||
@ -118,17 +129,19 @@ do { \
|
|||||||
_flo.bits.sign = X##_s; \
|
_flo.bits.sign = X##_s; \
|
||||||
\
|
\
|
||||||
(val) = _flo.flt; \
|
(val) = _flo.flt; \
|
||||||
} while (0)
|
} \
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -139,28 +152,35 @@ do { \
|
|||||||
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; \
|
R##_f = X##_f * Y##_f; \
|
||||||
} while (0)
|
} \
|
||||||
|
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); \
|
_FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y); \
|
||||||
/* Normalize since we know where the msb of the multiplicands \
|
/* Normalize since we know where the msb of the multiplicands \
|
||||||
were (bit B), we know that the msb of the of the product is \
|
were (bit B), we know that the msb of the of the product is \
|
||||||
at either 2B or 2B-1. */ \
|
at either 2B or 2B-1. */ \
|
||||||
_FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits); \
|
||||||
} while (0)
|
} \
|
||||||
|
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); \
|
doit(R##_f1, R##_f0, X##_f, Y##_f); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_FRAC_DECL_2(_Z); \
|
||||||
_FP_MUL_MEAT_DW_1_wide(wfracbits, _Z, X, Y, doit); \
|
_FP_MUL_MEAT_DW_1_wide(wfracbits, _Z, X, Y, doit); \
|
||||||
/* Normalize since we know where the msb of the multiplicands \
|
/* Normalize since we know where the msb of the multiplicands \
|
||||||
@ -168,12 +188,14 @@ do { \
|
|||||||
at either 2B or 2B-1. */ \
|
at either 2B or 2B-1. */ \
|
||||||
_FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits); \
|
||||||
R##_f = _Z_f0; \
|
R##_f = _Z_f0; \
|
||||||
} while (0)
|
} \
|
||||||
|
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_W_TYPE _xh, _xl, _yh, _yl; \
|
||||||
_FP_FRAC_DECL_2(_a); \
|
_FP_FRAC_DECL_2(_a); \
|
||||||
\
|
\
|
||||||
@ -195,17 +217,20 @@ do { \
|
|||||||
_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_FRAC_DECL_2(_z); \
|
||||||
_FP_MUL_MEAT_DW_1_hard(wfracbits, _z, X, Y); \
|
_FP_MUL_MEAT_DW_1_hard(wfracbits, _z, X, Y); \
|
||||||
\
|
\
|
||||||
/* normalize */ \
|
/* normalize */ \
|
||||||
_FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits); \
|
_FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits); \
|
||||||
R##_f = _z_f0; \
|
R##_f = _z_f0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -218,14 +243,16 @@ do { \
|
|||||||
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; \
|
_FP_W_TYPE _q, _r; \
|
||||||
X##_f <<= (X##_f < Y##_f \
|
X##_f <<= (X##_f < Y##_f \
|
||||||
? R##_e--, _FP_WFRACBITS_##fs \
|
? R##_e--, _FP_WFRACBITS_##fs \
|
||||||
: _FP_WFRACBITS_##fs - 1); \
|
: _FP_WFRACBITS_##fs - 1); \
|
||||||
doit(_q, _r, X##_f, Y##_f); \
|
doit(_q, _r, X##_f, Y##_f); \
|
||||||
R##_f = _q | (_r != 0); \
|
R##_f = _q | (_r != 0); \
|
||||||
} while (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,7 +260,8 @@ 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. */ \
|
||||||
@ -254,10 +282,12 @@ do { \
|
|||||||
\
|
\
|
||||||
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; \
|
_FP_W_TYPE _nh, _nl, _q, _r; \
|
||||||
if (X##_f < Y##_f) \
|
if (X##_f < Y##_f) \
|
||||||
{ \
|
{ \
|
||||||
@ -272,7 +302,8 @@ do { \
|
|||||||
} \
|
} \
|
||||||
udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
|
udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
|
||||||
R##_f = _q | (_r != 0); \
|
R##_f = _q | (_r != 0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -282,7 +313,8 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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; \
|
T##_f = S##_f + q; \
|
||||||
@ -301,7 +333,8 @@ do { \
|
|||||||
R##_f |= _FP_WORK_ROUND; \
|
R##_f |= _FP_WORK_ROUND; \
|
||||||
R##_f |= _FP_WORK_STICKY; \
|
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.
|
||||||
|
182
soft-fp/op-2.h
182
soft-fp/op-2.h
@ -91,15 +91,15 @@
|
|||||||
#define _FP_FRAC_SRS_2(X,N,sz) \
|
#define _FP_FRAC_SRS_2(X,N,sz) \
|
||||||
(void)(((N) < _FP_W_TYPE_SIZE) \
|
(void)(((N) < _FP_W_TYPE_SIZE) \
|
||||||
? ({ \
|
? ({ \
|
||||||
X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \
|
X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) \
|
||||||
(__builtin_constant_p(N) && (N) == 1 \
|
| (__builtin_constant_p(N) && (N) == 1 \
|
||||||
? X##_f0 & 1 \
|
? X##_f0 & 1 \
|
||||||
: (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \
|
: (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \
|
||||||
X##_f1 >>= (N); \
|
X##_f1 >>= (N); \
|
||||||
}) \
|
}) \
|
||||||
: ({ \
|
: ({ \
|
||||||
X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \
|
X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) \
|
||||||
((((N) == _FP_W_TYPE_SIZE \
|
| ((((N) == _FP_W_TYPE_SIZE \
|
||||||
? 0 \
|
? 0 \
|
||||||
: (X##_f1 << (2*_FP_W_TYPE_SIZE - (N)))) \
|
: (X##_f1 << (2*_FP_W_TYPE_SIZE - (N)))) \
|
||||||
| X##_f0) != 0)); \
|
| X##_f0) != 0)); \
|
||||||
@ -119,7 +119,8 @@
|
|||||||
__FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
|
__FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
|
||||||
|
|
||||||
#define _FP_FRAC_CLZ_2(R,X) \
|
#define _FP_FRAC_CLZ_2(R,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (X##_f1) \
|
if (X##_f1) \
|
||||||
__FP_CLZ(R,X##_f1); \
|
__FP_CLZ(R,X##_f1); \
|
||||||
else \
|
else \
|
||||||
@ -127,7 +128,8 @@
|
|||||||
__FP_CLZ(R,X##_f0); \
|
__FP_CLZ(R,X##_f0); \
|
||||||
R += _FP_W_TYPE_SIZE; \
|
R += _FP_W_TYPE_SIZE; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} \
|
||||||
|
while(0)
|
||||||
|
|
||||||
/* Predicates */
|
/* Predicates */
|
||||||
#define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0)
|
#define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0)
|
||||||
@ -153,7 +155,8 @@
|
|||||||
#define __FP_FRAC_SET_2(X,I1,I0) (X##_f0 = I0, X##_f1 = I1)
|
#define __FP_FRAC_SET_2(X,I1,I0) (X##_f0 = I0, X##_f1 = I1)
|
||||||
|
|
||||||
#define __FP_CLZ_2(R, xh, xl) \
|
#define __FP_CLZ_2(R, xh, xl) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (xh) \
|
if (xh) \
|
||||||
__FP_CLZ(R,xh); \
|
__FP_CLZ(R,xh); \
|
||||||
else \
|
else \
|
||||||
@ -161,7 +164,8 @@
|
|||||||
__FP_CLZ(R,xl); \
|
__FP_CLZ(R,xl); \
|
||||||
R += _FP_W_TYPE_SIZE; \
|
R += _FP_W_TYPE_SIZE; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} \
|
||||||
|
while(0)
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
@ -179,10 +183,12 @@
|
|||||||
# endif
|
# endif
|
||||||
# ifndef __FP_FRAC_DEC_2
|
# ifndef __FP_FRAC_DEC_2
|
||||||
# define __FP_FRAC_DEC_2(xh, xl, yh, yl) \
|
# define __FP_FRAC_DEC_2(xh, xl, yh, yl) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
UWtype _t = xl; \
|
UWtype _t = xl; \
|
||||||
xh -= yh + ((xl -= yl) > _t); \
|
xh -= yh + ((xl -= yl) > _t); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -205,25 +211,29 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_UNPACK_RAW_2(fs, X, val) \
|
#define _FP_UNPACK_RAW_2(fs, X, val) \
|
||||||
do { \
|
do \
|
||||||
union _FP_UNION_##fs _flo; _flo.flt = (val); \
|
{ \
|
||||||
|
union _FP_UNION_##fs _flo; \
|
||||||
|
_flo.flt = (val); \
|
||||||
\
|
\
|
||||||
X##_f0 = _flo.bits.frac0; \
|
X##_f0 = _flo.bits.frac0; \
|
||||||
X##_f1 = _flo.bits.frac1; \
|
X##_f1 = _flo.bits.frac1; \
|
||||||
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_UNPACK_RAW_2_P(fs, X, val) \
|
#define _FP_UNPACK_RAW_2_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##_f0 = _flo->bits.frac0; \
|
X##_f0 = _flo->bits.frac0; \
|
||||||
X##_f1 = _flo->bits.frac1; \
|
X##_f1 = _flo->bits.frac1; \
|
||||||
X##_e = _flo->bits.exp; \
|
X##_e = _flo->bits.exp; \
|
||||||
X##_s = _flo->bits.sign; \
|
X##_s = _flo->bits.sign; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -231,7 +241,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_PACK_RAW_2(fs, val, X) \
|
#define _FP_PACK_RAW_2(fs, val, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
union _FP_UNION_##fs _flo; \
|
union _FP_UNION_##fs _flo; \
|
||||||
\
|
\
|
||||||
_flo.bits.frac0 = X##_f0; \
|
_flo.bits.frac0 = X##_f0; \
|
||||||
@ -240,18 +251,20 @@
|
|||||||
_flo.bits.sign = X##_s; \
|
_flo.bits.sign = X##_s; \
|
||||||
\
|
\
|
||||||
(val) = _flo.flt; \
|
(val) = _flo.flt; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_PACK_RAW_2_P(fs, val, X) \
|
#define _FP_PACK_RAW_2_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.frac0 = X##_f0; \
|
_flo->bits.frac0 = X##_f0; \
|
||||||
_flo->bits.frac1 = X##_f1; \
|
_flo->bits.frac1 = X##_f1; \
|
||||||
_flo->bits.exp = X##_e; \
|
_flo->bits.exp = X##_e; \
|
||||||
_flo->bits.sign = X##_s; \
|
_flo->bits.sign = X##_s; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -261,8 +274,10 @@
|
|||||||
/* 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_2_wide(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_DW_2_wide(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
_FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
|
{ \
|
||||||
|
_FP_FRAC_DECL_2(_b); \
|
||||||
|
_FP_FRAC_DECL_2(_c); \
|
||||||
\
|
\
|
||||||
doit(_FP_FRAC_WORD_4(R,1), _FP_FRAC_WORD_4(R,0), X##_f0, Y##_f0); \
|
doit(_FP_FRAC_WORD_4(R,1), _FP_FRAC_WORD_4(R,0), X##_f0, Y##_f0); \
|
||||||
doit(_b_f1, _b_f0, X##_f0, Y##_f1); \
|
doit(_b_f1, _b_f0, X##_f0, Y##_f1); \
|
||||||
@ -277,10 +292,12 @@
|
|||||||
_FP_FRAC_WORD_4(R,1), 0, _c_f1, _c_f0, \
|
_FP_FRAC_WORD_4(R,1), 0, _c_f1, _c_f0, \
|
||||||
_FP_FRAC_WORD_4(R,3),_FP_FRAC_WORD_4(R,2), \
|
_FP_FRAC_WORD_4(R,3),_FP_FRAC_WORD_4(R,2), \
|
||||||
_FP_FRAC_WORD_4(R,1)); \
|
_FP_FRAC_WORD_4(R,1)); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_DECL_4(_z); \
|
_FP_FRAC_DECL_4(_z); \
|
||||||
\
|
\
|
||||||
_FP_MUL_MEAT_DW_2_wide(wfracbits, _z, X, Y, doit); \
|
_FP_MUL_MEAT_DW_2_wide(wfracbits, _z, X, Y, doit); \
|
||||||
@ -291,15 +308,18 @@
|
|||||||
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
||||||
R##_f0 = _FP_FRAC_WORD_4(_z,0); \
|
R##_f0 = _FP_FRAC_WORD_4(_z,0); \
|
||||||
R##_f1 = _FP_FRAC_WORD_4(_z,1); \
|
R##_f1 = _FP_FRAC_WORD_4(_z,1); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Given a 1W * 1W => 2W primitive, do the extended multiplication.
|
/* Given a 1W * 1W => 2W primitive, do the extended multiplication.
|
||||||
Do only 3 multiplications instead of four. This one is for machines
|
Do only 3 multiplications instead of four. This one is for machines
|
||||||
where multiplication is much more expensive than subtraction. */
|
where multiplication is much more expensive than subtraction. */
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
_FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
|
{ \
|
||||||
|
_FP_FRAC_DECL_2(_b); \
|
||||||
|
_FP_FRAC_DECL_2(_c); \
|
||||||
_FP_W_TYPE _d; \
|
_FP_W_TYPE _d; \
|
||||||
int _c1, _c2; \
|
int _c1, _c2; \
|
||||||
\
|
\
|
||||||
@ -328,10 +348,12 @@
|
|||||||
__FP_FRAC_ADD_2(_FP_FRAC_WORD_4(R,3), _FP_FRAC_WORD_4(R,2), \
|
__FP_FRAC_ADD_2(_FP_FRAC_WORD_4(R,3), _FP_FRAC_WORD_4(R,2), \
|
||||||
_c_f1, _c_f0, \
|
_c_f1, _c_f0, \
|
||||||
_FP_FRAC_WORD_4(R,3), _FP_FRAC_WORD_4(R,2)); \
|
_FP_FRAC_WORD_4(R,3), _FP_FRAC_WORD_4(R,2)); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_DECL_4(_z); \
|
_FP_FRAC_DECL_4(_z); \
|
||||||
\
|
\
|
||||||
_FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, _z, X, Y, doit); \
|
_FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, _z, X, Y, doit); \
|
||||||
@ -342,19 +364,25 @@
|
|||||||
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
||||||
R##_f0 = _FP_FRAC_WORD_4(_z,0); \
|
R##_f0 = _FP_FRAC_WORD_4(_z,0); \
|
||||||
R##_f1 = _FP_FRAC_WORD_4(_z,1); \
|
R##_f1 = _FP_FRAC_WORD_4(_z,1); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_DW_2_gmp(wfracbits, R, X, Y) \
|
#define _FP_MUL_MEAT_DW_2_gmp(wfracbits, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _x[2], _y[2]; \
|
_FP_W_TYPE _x[2], _y[2]; \
|
||||||
_x[0] = X##_f0; _x[1] = X##_f1; \
|
_x[0] = X##_f0; \
|
||||||
_y[0] = Y##_f0; _y[1] = Y##_f1; \
|
_x[1] = X##_f1; \
|
||||||
|
_y[0] = Y##_f0; \
|
||||||
|
_y[1] = Y##_f1; \
|
||||||
\
|
\
|
||||||
mpn_mul_n(R##_f, _x, _y, 2); \
|
mpn_mul_n(R##_f, _x, _y, 2); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y) \
|
#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_DECL_4(_z); \
|
_FP_FRAC_DECL_4(_z); \
|
||||||
\
|
\
|
||||||
_FP_MUL_MEAT_DW_2_gmp(wfracbits, _z, X, Y); \
|
_FP_MUL_MEAT_DW_2_gmp(wfracbits, _z, X, Y); \
|
||||||
@ -365,7 +393,8 @@
|
|||||||
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits); \
|
||||||
R##_f0 = _z_f[0]; \
|
R##_f0 = _z_f[0]; \
|
||||||
R##_f1 = _z_f[1]; \
|
R##_f1 = _z_f[1]; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Do at most 120x120=240 bits multiplication using double floating
|
/* Do at most 120x120=240 bits multiplication using double floating
|
||||||
point multiplication. This is useful if floating point
|
point multiplication. This is useful if floating point
|
||||||
@ -377,8 +406,10 @@
|
|||||||
towards zero, RESETFE should optionally reset it back. */
|
towards zero, RESETFE should optionally reset it back. */
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe) \
|
#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe) \
|
||||||
do { \
|
do \
|
||||||
static const double _const[] = { \
|
{ \
|
||||||
|
static const double _const[] = \
|
||||||
|
{ \
|
||||||
/* 2^-24 */ 5.9604644775390625e-08, \
|
/* 2^-24 */ 5.9604644775390625e-08, \
|
||||||
/* 2^-48 */ 3.5527136788005009e-15, \
|
/* 2^-48 */ 3.5527136788005009e-15, \
|
||||||
/* 2^-72 */ 2.1175823681357508e-22, \
|
/* 2^-72 */ 2.1175823681357508e-22, \
|
||||||
@ -389,7 +420,8 @@
|
|||||||
/* 2^-44 */ 5.6843418860808015e-14, \
|
/* 2^-44 */ 5.6843418860808015e-14, \
|
||||||
/* 2^-68 */ 3.3881317890172014e-21, \
|
/* 2^-68 */ 3.3881317890172014e-21, \
|
||||||
/* 2^-92 */ 2.0194839173657902e-28, \
|
/* 2^-92 */ 2.0194839173657902e-28, \
|
||||||
/* 2^-116 */ 1.2037062152420224e-35}; \
|
/* 2^-116 */ 1.2037062152420224e-35 \
|
||||||
|
}; \
|
||||||
double _a240, _b240, _c240, _d240, _e240, _f240, \
|
double _a240, _b240, _c240, _d240, _e240, _f240, \
|
||||||
_g240, _h240, _i240, _j240, _k240; \
|
_g240, _h240, _i240, _j240, _k240; \
|
||||||
union { double d; UDItype i; } _l240, _m240, _n240, _o240, \
|
union { double d; UDItype i; } _l240, _m240, _n240, _o240, \
|
||||||
@ -444,31 +476,37 @@
|
|||||||
_n240.d += _const[6]; \
|
_n240.d += _const[6]; \
|
||||||
_m240.d += _const[5]; \
|
_m240.d += _const[5]; \
|
||||||
_l240.d += _const[4]; \
|
_l240.d += _const[4]; \
|
||||||
if (_s240.d != 0.0) _y240 = 1; \
|
if (_s240.d != 0.0) \
|
||||||
if (_r240.d != 0.0) _y240 = 1; \
|
_y240 = 1; \
|
||||||
if (_q240.d != 0.0) _y240 = 1; \
|
if (_r240.d != 0.0) \
|
||||||
if (_p240.d != 0.0) _y240 = 1; \
|
_y240 = 1; \
|
||||||
|
if (_q240.d != 0.0) \
|
||||||
|
_y240 = 1; \
|
||||||
|
if (_p240.d != 0.0) \
|
||||||
|
_y240 = 1; \
|
||||||
_t240 = (DItype)_k240; \
|
_t240 = (DItype)_k240; \
|
||||||
_u240 = _l240.i; \
|
_u240 = _l240.i; \
|
||||||
_v240 = _m240.i; \
|
_v240 = _m240.i; \
|
||||||
_w240 = _n240.i; \
|
_w240 = _n240.i; \
|
||||||
_x240 = _o240.i; \
|
_x240 = _o240.i; \
|
||||||
R##_f1 = (_t240 << (128 - (wfracbits - 1))) \
|
R##_f1 = ((_t240 << (128 - (wfracbits - 1))) \
|
||||||
| ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104)); \
|
| ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104))); \
|
||||||
R##_f0 = ((_u240 & 0xffffff) << (168 - (wfracbits - 1))) \
|
R##_f0 = (((_u240 & 0xffffff) << (168 - (wfracbits - 1))) \
|
||||||
| ((_v240 & 0xffffff) << (144 - (wfracbits - 1))) \
|
| ((_v240 & 0xffffff) << (144 - (wfracbits - 1))) \
|
||||||
| ((_w240 & 0xffffff) << (120 - (wfracbits - 1))) \
|
| ((_w240 & 0xffffff) << (120 - (wfracbits - 1))) \
|
||||||
| ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96)) \
|
| ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96)) \
|
||||||
| _y240; \
|
| _y240); \
|
||||||
resetfe; \
|
resetfe; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Division algorithms:
|
* Division algorithms:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_DIV_MEAT_2_udiv(fs, R, X, Y) \
|
#define _FP_DIV_MEAT_2_udiv(fs, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0; \
|
_FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0; \
|
||||||
if (_FP_FRAC_GE_2(X, Y)) \
|
if (_FP_FRAC_GE_2(X, Y)) \
|
||||||
{ \
|
{ \
|
||||||
@ -532,26 +570,29 @@
|
|||||||
if (!_FP_FRAC_EQ_2(_r, _m)) \
|
if (!_FP_FRAC_EQ_2(_r, _m)) \
|
||||||
R##_f0 |= _FP_WORK_STICKY; \
|
R##_f0 |= _FP_WORK_STICKY; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y) \
|
#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _x[4], _y[2], _z[4]; \
|
_FP_W_TYPE _x[4], _y[2], _z[4]; \
|
||||||
_y[0] = Y##_f0; _y[1] = Y##_f1; \
|
_y[0] = Y##_f0; \
|
||||||
|
_y[1] = Y##_f1; \
|
||||||
_x[0] = _x[3] = 0; \
|
_x[0] = _x[3] = 0; \
|
||||||
if (_FP_FRAC_GE_2(X, Y)) \
|
if (_FP_FRAC_GE_2(X, Y)) \
|
||||||
{ \
|
{ \
|
||||||
_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) | \
|
_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) \
|
||||||
X##_f1 >> (_FP_W_TYPE_SIZE - \
|
| X##_f1 >> (_FP_W_TYPE_SIZE - \
|
||||||
(_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
|
(_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
|
||||||
_x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE); \
|
_x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
R##_e--; \
|
R##_e--; \
|
||||||
_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) | \
|
_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) \
|
||||||
X##_f1 >> (_FP_W_TYPE_SIZE - \
|
| X##_f1 >> (_FP_W_TYPE_SIZE - \
|
||||||
(_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE))); \
|
(_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE))); \
|
||||||
_x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE); \
|
_x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE); \
|
||||||
} \
|
} \
|
||||||
@ -559,7 +600,8 @@
|
|||||||
(void) mpn_divrem (_z, 0, _x, 4, _y, 2); \
|
(void) mpn_divrem (_z, 0, _x, 4, _y, 2); \
|
||||||
R##_f1 = _z[1]; \
|
R##_f1 = _z[1]; \
|
||||||
R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0); \
|
R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -569,7 +611,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_SQRT_MEAT_2(R, S, T, X, q) \
|
#define _FP_SQRT_MEAT_2(R, S, T, X, q) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
while (q) \
|
while (q) \
|
||||||
{ \
|
{ \
|
||||||
T##_f1 = S##_f1 + q; \
|
T##_f1 = S##_f1 + q; \
|
||||||
@ -587,8 +630,8 @@
|
|||||||
{ \
|
{ \
|
||||||
T##_f0 = S##_f0 + q; \
|
T##_f0 = S##_f0 + q; \
|
||||||
T##_f1 = S##_f1; \
|
T##_f1 = S##_f1; \
|
||||||
if (T##_f1 < X##_f1 || \
|
if (T##_f1 < X##_f1 \
|
||||||
(T##_f1 == X##_f1 && T##_f0 <= X##_f0)) \
|
|| (T##_f1 == X##_f1 && T##_f0 <= X##_f0)) \
|
||||||
{ \
|
{ \
|
||||||
S##_f0 = T##_f0 + q; \
|
S##_f0 = T##_f0 + q; \
|
||||||
S##_f1 += (T##_f0 > S##_f0); \
|
S##_f1 += (T##_f0 > S##_f0); \
|
||||||
@ -600,12 +643,13 @@
|
|||||||
} \
|
} \
|
||||||
if (X##_f0 | X##_f1) \
|
if (X##_f0 | X##_f1) \
|
||||||
{ \
|
{ \
|
||||||
if (S##_f1 < X##_f1 || \
|
if (S##_f1 < X##_f1 \
|
||||||
(S##_f1 == X##_f1 && S##_f0 < X##_f0)) \
|
|| (S##_f1 == X##_f1 && S##_f0 < X##_f0)) \
|
||||||
R##_f0 |= _FP_WORK_ROUND; \
|
R##_f0 |= _FP_WORK_ROUND; \
|
||||||
R##_f0 |= _FP_WORK_STICKY; \
|
R##_f0 |= _FP_WORK_STICKY; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -623,10 +667,12 @@
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \
|
#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
X##_f0 = r; \
|
X##_f0 = r; \
|
||||||
X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
|
X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert FP values between word sizes
|
* Convert FP values between word sizes
|
||||||
|
247
soft-fp/op-4.h
247
soft-fp/op-4.h
@ -40,7 +40,8 @@
|
|||||||
#define _FP_FRAC_WORD_4(X,w) (X##_f[w])
|
#define _FP_FRAC_WORD_4(X,w) (X##_f[w])
|
||||||
|
|
||||||
#define _FP_FRAC_SLL_4(X,N) \
|
#define _FP_FRAC_SLL_4(X,N) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_I_TYPE _up, _down, _skip, _i; \
|
_FP_I_TYPE _up, _down, _skip, _i; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
_up = (N) % _FP_W_TYPE_SIZE; \
|
_up = (N) % _FP_W_TYPE_SIZE; \
|
||||||
@ -51,17 +52,19 @@
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
for (_i = 3; _i > _skip; --_i) \
|
for (_i = 3; _i > _skip; --_i) \
|
||||||
X##_f[_i] = X##_f[_i-_skip] << _up \
|
X##_f[_i] = (X##_f[_i-_skip] << _up \
|
||||||
| X##_f[_i-_skip-1] >> _down; \
|
| X##_f[_i-_skip-1] >> _down); \
|
||||||
X##_f[_i--] = X##_f[0] << _up; \
|
X##_f[_i--] = X##_f[0] << _up; \
|
||||||
} \
|
} \
|
||||||
for (; _i >= 0; --_i) \
|
for (; _i >= 0; --_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* This one was broken too */
|
/* This one was broken too */
|
||||||
#define _FP_FRAC_SRL_4(X,N) \
|
#define _FP_FRAC_SRL_4(X,N) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_I_TYPE _up, _down, _skip, _i; \
|
_FP_I_TYPE _up, _down, _skip, _i; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
_down = (N) % _FP_W_TYPE_SIZE; \
|
_down = (N) % _FP_W_TYPE_SIZE; \
|
||||||
@ -72,13 +75,14 @@
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
for (_i = 0; _i < 3-_skip; ++_i) \
|
for (_i = 0; _i < 3-_skip; ++_i) \
|
||||||
X##_f[_i] = X##_f[_i+_skip] >> _down \
|
X##_f[_i] = (X##_f[_i+_skip] >> _down \
|
||||||
| X##_f[_i+_skip+1] << _up; \
|
| X##_f[_i+_skip+1] << _up); \
|
||||||
X##_f[_i++] = X##_f[3] >> _down; \
|
X##_f[_i++] = X##_f[3] >> _down; \
|
||||||
} \
|
} \
|
||||||
for (; _i < 4; ++_i) \
|
for (; _i < 4; ++_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Right shift with sticky-lsb.
|
/* Right shift with sticky-lsb.
|
||||||
@ -87,7 +91,8 @@
|
|||||||
* were one then we always set the LSbit.
|
* were one then we always set the LSbit.
|
||||||
*/
|
*/
|
||||||
#define _FP_FRAC_SRST_4(X,S,N,size) \
|
#define _FP_FRAC_SRST_4(X,S,N,size) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_I_TYPE _up, _down, _skip, _i; \
|
_FP_I_TYPE _up, _down, _skip, _i; \
|
||||||
_FP_W_TYPE _s; \
|
_FP_W_TYPE _s; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
@ -102,21 +107,24 @@
|
|||||||
{ \
|
{ \
|
||||||
_s |= X##_f[_i] << _up; \
|
_s |= X##_f[_i] << _up; \
|
||||||
for (_i = 0; _i < 3-_skip; ++_i) \
|
for (_i = 0; _i < 3-_skip; ++_i) \
|
||||||
X##_f[_i] = X##_f[_i+_skip] >> _down \
|
X##_f[_i] = (X##_f[_i+_skip] >> _down \
|
||||||
| X##_f[_i+_skip+1] << _up; \
|
| X##_f[_i+_skip+1] << _up); \
|
||||||
X##_f[_i++] = X##_f[3] >> _down; \
|
X##_f[_i++] = X##_f[3] >> _down; \
|
||||||
} \
|
} \
|
||||||
for (; _i < 4; ++_i) \
|
for (; _i < 4; ++_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
S = (_s != 0); \
|
S = (_s != 0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_FRAC_SRS_4(X,N,size) \
|
#define _FP_FRAC_SRS_4(X,N,size) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
int _sticky; \
|
int _sticky; \
|
||||||
_FP_FRAC_SRST_4(X, _sticky, N, size); \
|
_FP_FRAC_SRST_4(X, _sticky, N, size); \
|
||||||
X##_f[0] |= _sticky; \
|
X##_f[0] |= _sticky; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_FRAC_ADD_4(R,X,Y) \
|
#define _FP_FRAC_ADD_4(R,X,Y) \
|
||||||
__FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \
|
__FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \
|
||||||
@ -151,30 +159,29 @@
|
|||||||
&& X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
|
&& X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
|
||||||
|
|
||||||
#define _FP_FRAC_GT_4(X,Y) \
|
#define _FP_FRAC_GT_4(X,Y) \
|
||||||
(X##_f[3] > Y##_f[3] || \
|
(X##_f[3] > Y##_f[3] \
|
||||||
(X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \
|
|| (X##_f[3] == Y##_f[3] \
|
||||||
(X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \
|
&& (X##_f[2] > Y##_f[2] \
|
||||||
(X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0]) \
|
|| (X##_f[2] == Y##_f[2] \
|
||||||
)) \
|
&& (X##_f[1] > Y##_f[1] \
|
||||||
)) \
|
|| (X##_f[1] == Y##_f[1] \
|
||||||
)
|
&& X##_f[0] > Y##_f[0]))))))
|
||||||
|
|
||||||
#define _FP_FRAC_GE_4(X,Y) \
|
#define _FP_FRAC_GE_4(X,Y) \
|
||||||
(X##_f[3] > Y##_f[3] || \
|
(X##_f[3] > Y##_f[3] \
|
||||||
(X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \
|
|| (X##_f[3] == Y##_f[3] \
|
||||||
(X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \
|
&& (X##_f[2] > Y##_f[2] \
|
||||||
(X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0]) \
|
|| (X##_f[2] == Y##_f[2] \
|
||||||
)) \
|
&& (X##_f[1] > Y##_f[1] \
|
||||||
)) \
|
|| (X##_f[1] == Y##_f[1] \
|
||||||
)
|
&& X##_f[0] >= Y##_f[0]))))))
|
||||||
|
|
||||||
|
|
||||||
#define _FP_FRAC_CLZ_4(R,X) \
|
#define _FP_FRAC_CLZ_4(R,X) \
|
||||||
do { \
|
do \
|
||||||
if (X##_f[3]) \
|
|
||||||
{ \
|
{ \
|
||||||
|
if (X##_f[3]) \
|
||||||
__FP_CLZ(R,X##_f[3]); \
|
__FP_CLZ(R,X##_f[3]); \
|
||||||
} \
|
|
||||||
else if (X##_f[2]) \
|
else if (X##_f[2]) \
|
||||||
{ \
|
{ \
|
||||||
__FP_CLZ(R,X##_f[2]); \
|
__FP_CLZ(R,X##_f[2]); \
|
||||||
@ -190,24 +197,28 @@
|
|||||||
__FP_CLZ(R,X##_f[0]); \
|
__FP_CLZ(R,X##_f[0]); \
|
||||||
R += _FP_W_TYPE_SIZE*3; \
|
R += _FP_W_TYPE_SIZE*3; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} \
|
||||||
|
while(0)
|
||||||
|
|
||||||
|
|
||||||
#define _FP_UNPACK_RAW_4(fs, X, val) \
|
#define _FP_UNPACK_RAW_4(fs, X, val) \
|
||||||
do { \
|
do \
|
||||||
union _FP_UNION_##fs _flo; _flo.flt = (val); \
|
{ \
|
||||||
|
union _FP_UNION_##fs _flo; \
|
||||||
|
_flo.flt = (val); \
|
||||||
X##_f[0] = _flo.bits.frac0; \
|
X##_f[0] = _flo.bits.frac0; \
|
||||||
X##_f[1] = _flo.bits.frac1; \
|
X##_f[1] = _flo.bits.frac1; \
|
||||||
X##_f[2] = _flo.bits.frac2; \
|
X##_f[2] = _flo.bits.frac2; \
|
||||||
X##_f[3] = _flo.bits.frac3; \
|
X##_f[3] = _flo.bits.frac3; \
|
||||||
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_UNPACK_RAW_4_P(fs, X, val) \
|
#define _FP_UNPACK_RAW_4_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[0] = _flo->bits.frac0; \
|
X##_f[0] = _flo->bits.frac0; \
|
||||||
X##_f[1] = _flo->bits.frac1; \
|
X##_f[1] = _flo->bits.frac1; \
|
||||||
@ -215,10 +226,12 @@
|
|||||||
X##_f[3] = _flo->bits.frac3; \
|
X##_f[3] = _flo->bits.frac3; \
|
||||||
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_4(fs, val, X) \
|
#define _FP_PACK_RAW_4(fs, val, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
union _FP_UNION_##fs _flo; \
|
union _FP_UNION_##fs _flo; \
|
||||||
_flo.bits.frac0 = X##_f[0]; \
|
_flo.bits.frac0 = X##_f[0]; \
|
||||||
_flo.bits.frac1 = X##_f[1]; \
|
_flo.bits.frac1 = X##_f[1]; \
|
||||||
@ -227,12 +240,13 @@
|
|||||||
_flo.bits.exp = X##_e; \
|
_flo.bits.exp = X##_e; \
|
||||||
_flo.bits.sign = X##_s; \
|
_flo.bits.sign = X##_s; \
|
||||||
(val) = _flo.flt; \
|
(val) = _flo.flt; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_PACK_RAW_4_P(fs, val, X) \
|
#define _FP_PACK_RAW_4_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.frac0 = X##_f[0]; \
|
_flo->bits.frac0 = X##_f[0]; \
|
||||||
_flo->bits.frac1 = X##_f[1]; \
|
_flo->bits.frac1 = X##_f[1]; \
|
||||||
@ -240,7 +254,8 @@
|
|||||||
_flo->bits.frac3 = X##_f[3]; \
|
_flo->bits.frac3 = X##_f[3]; \
|
||||||
_flo->bits.exp = X##_e; \
|
_flo->bits.exp = X##_e; \
|
||||||
_flo->bits.sign = X##_s; \
|
_flo->bits.sign = X##_s; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Multiplication algorithms:
|
* Multiplication algorithms:
|
||||||
@ -249,9 +264,13 @@
|
|||||||
/* 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_4_wide(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_DW_4_wide(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
_FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \
|
{ \
|
||||||
_FP_FRAC_DECL_2(_d); _FP_FRAC_DECL_2(_e); _FP_FRAC_DECL_2(_f); \
|
_FP_FRAC_DECL_2(_b); \
|
||||||
|
_FP_FRAC_DECL_2(_c); \
|
||||||
|
_FP_FRAC_DECL_2(_d); \
|
||||||
|
_FP_FRAC_DECL_2(_e); \
|
||||||
|
_FP_FRAC_DECL_2(_f); \
|
||||||
\
|
\
|
||||||
doit(_FP_FRAC_WORD_8(R,1), _FP_FRAC_WORD_8(R,0), X##_f[0], Y##_f[0]); \
|
doit(_FP_FRAC_WORD_8(R,1), _FP_FRAC_WORD_8(R,0), X##_f[0], Y##_f[0]); \
|
||||||
doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]); \
|
doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]); \
|
||||||
@ -323,10 +342,12 @@
|
|||||||
__FP_FRAC_ADD_2(_FP_FRAC_WORD_8(R,7),_FP_FRAC_WORD_8(R,6), \
|
__FP_FRAC_ADD_2(_FP_FRAC_WORD_8(R,7),_FP_FRAC_WORD_8(R,6), \
|
||||||
_b_f1,_b_f0, \
|
_b_f1,_b_f0, \
|
||||||
_FP_FRAC_WORD_8(R,7),_FP_FRAC_WORD_8(R,6)); \
|
_FP_FRAC_WORD_8(R,7),_FP_FRAC_WORD_8(R,6)); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit) \
|
#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_DECL_8(_z); \
|
_FP_FRAC_DECL_8(_z); \
|
||||||
\
|
\
|
||||||
_FP_MUL_MEAT_DW_4_wide(wfracbits, _z, X, Y, doit); \
|
_FP_MUL_MEAT_DW_4_wide(wfracbits, _z, X, Y, doit); \
|
||||||
@ -337,15 +358,19 @@
|
|||||||
_FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
|
||||||
__FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
|
__FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
|
||||||
_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
|
_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_DW_4_gmp(wfracbits, R, X, Y) \
|
#define _FP_MUL_MEAT_DW_4_gmp(wfracbits, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
mpn_mul_n(R##_f, _x_f, _y_f, 4); \
|
mpn_mul_n(R##_f, _x_f, _y_f, 4); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y) \
|
#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_DECL_8(_z); \
|
_FP_FRAC_DECL_8(_z); \
|
||||||
\
|
\
|
||||||
_FP_MUL_MEAT_DW_4_gmp(wfracbits, _z, X, Y); \
|
_FP_MUL_MEAT_DW_4_gmp(wfracbits, _z, X, Y); \
|
||||||
@ -356,30 +381,35 @@
|
|||||||
_FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
|
_FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits); \
|
||||||
__FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
|
__FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \
|
||||||
_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
|
_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper utility for _FP_DIV_MEAT_4_udiv:
|
* Helper utility for _FP_DIV_MEAT_4_udiv:
|
||||||
* pppp = m * nnn
|
* pppp = m * nnn
|
||||||
*/
|
*/
|
||||||
#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0) \
|
#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
UWtype _t; \
|
UWtype _t; \
|
||||||
umul_ppmm(p1,p0,m,n0); \
|
umul_ppmm(p1,p0,m,n0); \
|
||||||
umul_ppmm(p2,_t,m,n1); \
|
umul_ppmm(p2,_t,m,n1); \
|
||||||
__FP_FRAC_ADDI_2(p2,p1,_t); \
|
__FP_FRAC_ADDI_2(p2,p1,_t); \
|
||||||
umul_ppmm(p3,_t,m,n2); \
|
umul_ppmm(p3,_t,m,n2); \
|
||||||
__FP_FRAC_ADDI_2(p3,p2,_t); \
|
__FP_FRAC_ADDI_2(p3,p2,_t); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Division algorithms:
|
* Division algorithms:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y) \
|
#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
int _i; \
|
int _i; \
|
||||||
_FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m); \
|
_FP_FRAC_DECL_4(_n); \
|
||||||
|
_FP_FRAC_DECL_4(_m); \
|
||||||
_FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4); \
|
_FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4); \
|
||||||
if (_FP_FRAC_GE_4(X, Y)) \
|
if (_FP_FRAC_GE_4(X, Y)) \
|
||||||
{ \
|
{ \
|
||||||
@ -441,7 +471,8 @@
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -451,7 +482,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_SQRT_MEAT_4(R, S, T, X, q) \
|
#define _FP_SQRT_MEAT_4(R, S, T, X, q) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
while (q) \
|
while (q) \
|
||||||
{ \
|
{ \
|
||||||
T##_f[3] = S##_f[3] + q; \
|
T##_f[3] = S##_f[3] + q; \
|
||||||
@ -469,8 +501,8 @@
|
|||||||
{ \
|
{ \
|
||||||
T##_f[2] = S##_f[2] + q; \
|
T##_f[2] = S##_f[2] + q; \
|
||||||
T##_f[3] = S##_f[3]; \
|
T##_f[3] = S##_f[3]; \
|
||||||
if (T##_f[3] < X##_f[3] || \
|
if (T##_f[3] < X##_f[3] \
|
||||||
(T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2])) \
|
|| (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2])) \
|
||||||
{ \
|
{ \
|
||||||
S##_f[2] = T##_f[2] + q; \
|
S##_f[2] = T##_f[2] + q; \
|
||||||
S##_f[3] += (T##_f[2] > S##_f[2]); \
|
S##_f[3] += (T##_f[2] > S##_f[2]); \
|
||||||
@ -487,9 +519,11 @@
|
|||||||
T##_f[1] = S##_f[1] + q; \
|
T##_f[1] = S##_f[1] + q; \
|
||||||
T##_f[2] = S##_f[2]; \
|
T##_f[2] = S##_f[2]; \
|
||||||
T##_f[3] = S##_f[3]; \
|
T##_f[3] = S##_f[3]; \
|
||||||
if (T##_f[3] < X##_f[3] || \
|
if (T##_f[3] < X##_f[3] \
|
||||||
(T##_f[3] == X##_f[3] && (T##_f[2] < X##_f[2] || \
|
|| (T##_f[3] == X##_f[3] \
|
||||||
(T##_f[2] == X##_f[2] && T##_f[1] <= X##_f[1])))) \
|
&& (T##_f[2] < X##_f[2] \
|
||||||
|
|| (T##_f[2] == X##_f[2] \
|
||||||
|
&& T##_f[1] <= X##_f[1])))) \
|
||||||
{ \
|
{ \
|
||||||
S##_f[1] = T##_f[1] + q; \
|
S##_f[1] = T##_f[1] + q; \
|
||||||
S##_f[2] += (T##_f[1] > S##_f[1]); \
|
S##_f[2] += (T##_f[1] > S##_f[1]); \
|
||||||
@ -526,7 +560,8 @@
|
|||||||
R##_f[0] |= _FP_WORK_ROUND; \
|
R##_f[0] |= _FP_WORK_ROUND; \
|
||||||
R##_f[0] |= _FP_WORK_STICKY; \
|
R##_f[0] |= _FP_WORK_STICKY; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -538,7 +573,8 @@
|
|||||||
|
|
||||||
#ifndef __FP_FRAC_ADD_3
|
#ifndef __FP_FRAC_ADD_3
|
||||||
# define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
|
# define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE __FP_FRAC_ADD_3_c1, __FP_FRAC_ADD_3_c2; \
|
_FP_W_TYPE __FP_FRAC_ADD_3_c1, __FP_FRAC_ADD_3_c2; \
|
||||||
r0 = x0 + y0; \
|
r0 = x0 + y0; \
|
||||||
__FP_FRAC_ADD_3_c1 = r0 < x0; \
|
__FP_FRAC_ADD_3_c1 = r0 < x0; \
|
||||||
@ -547,12 +583,14 @@
|
|||||||
r1 += __FP_FRAC_ADD_3_c1; \
|
r1 += __FP_FRAC_ADD_3_c1; \
|
||||||
__FP_FRAC_ADD_3_c2 |= r1 < __FP_FRAC_ADD_3_c1; \
|
__FP_FRAC_ADD_3_c2 |= r1 < __FP_FRAC_ADD_3_c1; \
|
||||||
r2 = x2 + y2 + __FP_FRAC_ADD_3_c2; \
|
r2 = x2 + y2 + __FP_FRAC_ADD_3_c2; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_ADD_4
|
#ifndef __FP_FRAC_ADD_4
|
||||||
# define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
|
# define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _c1, _c2, _c3; \
|
_FP_W_TYPE _c1, _c2, _c3; \
|
||||||
r0 = x0 + y0; \
|
r0 = x0 + y0; \
|
||||||
_c1 = r0 < x0; \
|
_c1 = r0 < x0; \
|
||||||
@ -565,12 +603,14 @@
|
|||||||
r2 += _c2; \
|
r2 += _c2; \
|
||||||
_c3 |= r2 < _c2; \
|
_c3 |= r2 < _c2; \
|
||||||
r3 = x3 + y3 + _c3; \
|
r3 = x3 + y3 + _c3; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_SUB_3
|
#ifndef __FP_FRAC_SUB_3
|
||||||
# define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
|
# define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _c1, _c2; \
|
_FP_W_TYPE _c1, _c2; \
|
||||||
r0 = x0 - y0; \
|
r0 = x0 - y0; \
|
||||||
_c1 = r0 > x0; \
|
_c1 = r0 > x0; \
|
||||||
@ -579,12 +619,14 @@
|
|||||||
r1 -= _c1; \
|
r1 -= _c1; \
|
||||||
_c2 |= _c1 && (y1 == x1); \
|
_c2 |= _c1 && (y1 == x1); \
|
||||||
r2 = x2 - y2 - _c2; \
|
r2 = x2 - y2 - _c2; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_SUB_4
|
#ifndef __FP_FRAC_SUB_4
|
||||||
# define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
|
# define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_W_TYPE _c1, _c2, _c3; \
|
_FP_W_TYPE _c1, _c2, _c3; \
|
||||||
r0 = x0 - y0; \
|
r0 = x0 - y0; \
|
||||||
_c1 = r0 > x0; \
|
_c1 = r0 > x0; \
|
||||||
@ -597,36 +639,45 @@
|
|||||||
r2 -= _c2; \
|
r2 -= _c2; \
|
||||||
_c3 |= _c2 && (y2 == x2); \
|
_c3 |= _c2 && (y2 == x2); \
|
||||||
r3 = x3 - y3 - _c3; \
|
r3 = x3 - y3 - _c3; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_DEC_3
|
#ifndef __FP_FRAC_DEC_3
|
||||||
# define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0) \
|
# define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
UWtype _t0, _t1, _t2; \
|
UWtype _t0, _t1, _t2; \
|
||||||
_t0 = x0, _t1 = x1, _t2 = x2; \
|
_t0 = x0, _t1 = x1, _t2 = x2; \
|
||||||
__FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0); \
|
__FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_DEC_4
|
#ifndef __FP_FRAC_DEC_4
|
||||||
# define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0) \
|
# define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
UWtype _t0, _t1, _t2, _t3; \
|
UWtype _t0, _t1, _t2, _t3; \
|
||||||
_t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3; \
|
_t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3; \
|
||||||
__FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0); \
|
__FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __FP_FRAC_ADDI_4
|
#ifndef __FP_FRAC_ADDI_4
|
||||||
# define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \
|
# define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
UWtype _t; \
|
UWtype _t; \
|
||||||
_t = ((x0 += i) < i); \
|
_t = ((x0 += i) < i); \
|
||||||
x1 += _t; _t = (x1 < _t); \
|
x1 += _t; \
|
||||||
x2 += _t; _t = (x2 < _t); \
|
_t = (x1 < _t); \
|
||||||
|
x2 += _t; \
|
||||||
|
_t = (x2 < _t); \
|
||||||
x3 += _t; \
|
x3 += _t; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Convert FP values between word sizes. This appears to be more
|
/* Convert FP values between word sizes. This appears to be more
|
||||||
@ -639,17 +690,20 @@
|
|||||||
#define _FP_FRAC_COPY_1_4(D, S) (D##_f = S##_f[0])
|
#define _FP_FRAC_COPY_1_4(D, S) (D##_f = S##_f[0])
|
||||||
|
|
||||||
#define _FP_FRAC_COPY_2_4(D, S) \
|
#define _FP_FRAC_COPY_2_4(D, S) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
D##_f0 = S##_f[0]; \
|
D##_f0 = S##_f[0]; \
|
||||||
D##_f1 = S##_f[1]; \
|
D##_f1 = S##_f[1]; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Assembly/disassembly for converting to/from integral types.
|
/* Assembly/disassembly for converting to/from integral types.
|
||||||
* No shifting or overflow handled here.
|
* No shifting or overflow handled here.
|
||||||
*/
|
*/
|
||||||
/* Put the FP value X into r, which is an integer of size rsize. */
|
/* Put the FP value X into r, which is an integer of size rsize. */
|
||||||
#define _FP_FRAC_ASSEMBLE_4(r, X, rsize) \
|
#define _FP_FRAC_ASSEMBLE_4(r, X, rsize) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (rsize <= _FP_W_TYPE_SIZE) \
|
if (rsize <= _FP_W_TYPE_SIZE) \
|
||||||
r = X##_f[0]; \
|
r = X##_f[0]; \
|
||||||
else if (rsize <= 2*_FP_W_TYPE_SIZE) \
|
else if (rsize <= 2*_FP_W_TYPE_SIZE) \
|
||||||
@ -670,7 +724,8 @@ do { \
|
|||||||
r <<= _FP_W_TYPE_SIZE; \
|
r <<= _FP_W_TYPE_SIZE; \
|
||||||
r += X##_f[0]; \
|
r += X##_f[0]; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* "No disassemble Number Five!" */
|
/* "No disassemble Number Five!" */
|
||||||
/* move an integer of size rsize into X's fractional part. We rely on
|
/* move an integer of size rsize into X's fractional part. We rely on
|
||||||
@ -678,24 +733,30 @@ do { \
|
|||||||
* having to mask the values we store into it.
|
* having to mask the values we store into it.
|
||||||
*/
|
*/
|
||||||
#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize) \
|
#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
X##_f[0] = r; \
|
X##_f[0] = r; \
|
||||||
X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
|
X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \
|
||||||
X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
|
X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
|
||||||
X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
|
X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_FRAC_COPY_4_1(D, S) \
|
#define _FP_FRAC_COPY_4_1(D, S) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
D##_f[0] = S##_f; \
|
D##_f[0] = S##_f; \
|
||||||
D##_f[1] = D##_f[2] = D##_f[3] = 0; \
|
D##_f[1] = D##_f[2] = D##_f[3] = 0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_FRAC_COPY_4_2(D, S) \
|
#define _FP_FRAC_COPY_4_2(D, S) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
D##_f[0] = S##_f0; \
|
D##_f[0] = S##_f0; \
|
||||||
D##_f[1] = S##_f1; \
|
D##_f[1] = S##_f1; \
|
||||||
D##_f[2] = D##_f[3] = 0; \
|
D##_f[2] = D##_f[3] = 0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
|
#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
|
||||||
|
@ -37,7 +37,8 @@
|
|||||||
#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; \
|
_FP_I_TYPE _up, _down, _skip, _i; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
_up = (N) % _FP_W_TYPE_SIZE; \
|
_up = (N) % _FP_W_TYPE_SIZE; \
|
||||||
@ -48,16 +49,18 @@
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
for (_i = 7; _i > _skip; --_i) \
|
for (_i = 7; _i > _skip; --_i) \
|
||||||
X##_f[_i] = X##_f[_i-_skip] << _up \
|
X##_f[_i] = (X##_f[_i-_skip] << _up \
|
||||||
| X##_f[_i-_skip-1] >> _down; \
|
| X##_f[_i-_skip-1] >> _down); \
|
||||||
X##_f[_i--] = X##_f[0] << _up; \
|
X##_f[_i--] = X##_f[0] << _up; \
|
||||||
} \
|
} \
|
||||||
for (; _i >= 0; --_i) \
|
for (; _i >= 0; --_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
} while (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; \
|
_FP_I_TYPE _up, _down, _skip, _i; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
_down = (N) % _FP_W_TYPE_SIZE; \
|
_down = (N) % _FP_W_TYPE_SIZE; \
|
||||||
@ -68,13 +71,14 @@
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
for (_i = 0; _i < 7-_skip; ++_i) \
|
for (_i = 0; _i < 7-_skip; ++_i) \
|
||||||
X##_f[_i] = X##_f[_i+_skip] >> _down \
|
X##_f[_i] = (X##_f[_i+_skip] >> _down \
|
||||||
| X##_f[_i+_skip+1] << _up; \
|
| X##_f[_i+_skip+1] << _up); \
|
||||||
X##_f[_i++] = X##_f[7] >> _down; \
|
X##_f[_i++] = X##_f[7] >> _down; \
|
||||||
} \
|
} \
|
||||||
for (; _i < 8; ++_i) \
|
for (; _i < 8; ++_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Right shift with sticky-lsb.
|
/* Right shift with sticky-lsb.
|
||||||
@ -83,7 +87,8 @@
|
|||||||
* 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_I_TYPE _up, _down, _skip, _i; \
|
||||||
_FP_W_TYPE _s; \
|
_FP_W_TYPE _s; \
|
||||||
_skip = (N) / _FP_W_TYPE_SIZE; \
|
_skip = (N) / _FP_W_TYPE_SIZE; \
|
||||||
@ -98,12 +103,14 @@
|
|||||||
{ \
|
{ \
|
||||||
_s |= X##_f[_i] << _up; \
|
_s |= X##_f[_i] << _up; \
|
||||||
for (_i = 0; _i < 7-_skip; ++_i) \
|
for (_i = 0; _i < 7-_skip; ++_i) \
|
||||||
X##_f[_i] = X##_f[_i+_skip] >> _down \
|
X##_f[_i] = (X##_f[_i+_skip] >> _down \
|
||||||
| X##_f[_i+_skip+1] << _up; \
|
| X##_f[_i+_skip+1] << _up); \
|
||||||
X##_f[_i++] = X##_f[7] >> _down; \
|
X##_f[_i++] = X##_f[7] >> _down; \
|
||||||
} \
|
} \
|
||||||
for (; _i < 8; ++_i) \
|
for (; _i < 8; ++_i) \
|
||||||
X##_f[_i] = 0; \
|
X##_f[_i] = 0; \
|
||||||
/* don't fix the LSB until the very end when we're sure f[0] is stable */ \
|
/* don't fix the LSB until the very end when we're sure f[0] is \
|
||||||
|
stable */ \
|
||||||
X##_f[0] |= (_s != 0); \
|
X##_f[0] |= (_s != 0); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
@ -51,7 +51,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_UNPACK_CANONICAL(fs, wc, X) \
|
#define _FP_UNPACK_CANONICAL(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
switch (X##_e) \
|
switch (X##_e) \
|
||||||
{ \
|
{ \
|
||||||
default: \
|
default: \
|
||||||
@ -89,7 +90,8 @@ do { \
|
|||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Finish unpacking an fp value in semi-raw mode: the mantissa is
|
/* Finish unpacking an fp value in semi-raw mode: the mantissa is
|
||||||
shifted by _FP_WORKBITS but the implicit MSB is not inserted and
|
shifted by _FP_WORKBITS but the implicit MSB is not inserted and
|
||||||
@ -99,7 +101,8 @@ do { \
|
|||||||
/* A semi-raw value has overflowed to infinity. Adjust the mantissa
|
/* A semi-raw value has overflowed to infinity. Adjust the mantissa
|
||||||
and exponent appropriately. */
|
and exponent appropriately. */
|
||||||
#define _FP_OVERFLOW_SEMIRAW(fs, wc, X) \
|
#define _FP_OVERFLOW_SEMIRAW(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (FP_ROUNDMODE == FP_RND_NEAREST \
|
if (FP_ROUNDMODE == FP_RND_NEAREST \
|
||||||
|| (FP_ROUNDMODE == FP_RND_PINF && !X##_s) \
|
|| (FP_ROUNDMODE == FP_RND_PINF && !X##_s) \
|
||||||
|| (FP_ROUNDMODE == FP_RND_MINF && X##_s)) \
|
|| (FP_ROUNDMODE == FP_RND_MINF && X##_s)) \
|
||||||
@ -114,34 +117,40 @@ do { \
|
|||||||
} \
|
} \
|
||||||
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
||||||
FP_SET_EXCEPTION(FP_EX_OVERFLOW); \
|
FP_SET_EXCEPTION(FP_EX_OVERFLOW); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Check for a semi-raw value being a signaling NaN and raise the
|
/* Check for a semi-raw value being a signaling NaN and raise the
|
||||||
invalid exception if so. */
|
invalid exception if so. */
|
||||||
#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X) \
|
#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (X##_e == _FP_EXPMAX_##fs \
|
if (X##_e == _FP_EXPMAX_##fs \
|
||||||
&& !_FP_FRAC_ZEROP_##wc(X) \
|
&& !_FP_FRAC_ZEROP_##wc(X) \
|
||||||
&& _FP_FRAC_SNANP_SEMIRAW(fs, X)) \
|
&& _FP_FRAC_SNANP_SEMIRAW(fs, X)) \
|
||||||
FP_SET_EXCEPTION(FP_EX_INVALID); \
|
FP_SET_EXCEPTION(FP_EX_INVALID); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Choose a NaN result from an operation on two semi-raw NaN
|
/* Choose a NaN result from an operation on two semi-raw NaN
|
||||||
values. */
|
values. */
|
||||||
#define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP) \
|
#define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
/* _FP_CHOOSENAN expects raw values, so shift as required. */ \
|
/* _FP_CHOOSENAN expects raw values, so shift as required. */ \
|
||||||
_FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
|
_FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \
|
||||||
_FP_FRAC_SRL_##wc(Y, _FP_WORKBITS); \
|
_FP_FRAC_SRL_##wc(Y, _FP_WORKBITS); \
|
||||||
_FP_CHOOSENAN(fs, wc, R, X, Y, OP); \
|
_FP_CHOOSENAN(fs, wc, R, X, Y, OP); \
|
||||||
_FP_FRAC_SLL_##wc(R, _FP_WORKBITS); \
|
_FP_FRAC_SLL_##wc(R, _FP_WORKBITS); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Make the fractional part a quiet NaN, preserving the payload
|
/* Make the fractional part a quiet NaN, preserving the payload
|
||||||
if possible, otherwise make it the canonical quiet NaN and set
|
if possible, otherwise make it the canonical quiet NaN and set
|
||||||
the sign bit accordingly. */
|
the sign bit accordingly. */
|
||||||
#define _FP_SETQNAN(fs, wc, X) \
|
#define _FP_SETQNAN(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (_FP_QNANNEGATEDP) \
|
if (_FP_QNANNEGATEDP) \
|
||||||
{ \
|
{ \
|
||||||
_FP_FRAC_HIGH_RAW_##fs(X) &= _FP_QNANBIT_##fs - 1; \
|
_FP_FRAC_HIGH_RAW_##fs(X) &= _FP_QNANBIT_##fs - 1; \
|
||||||
@ -153,9 +162,11 @@ do { \
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
_FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
|
_FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#define _FP_SETQNAN_SEMIRAW(fs, wc, X) \
|
#define _FP_SETQNAN_SEMIRAW(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (_FP_QNANNEGATEDP) \
|
if (_FP_QNANNEGATEDP) \
|
||||||
{ \
|
{ \
|
||||||
_FP_FRAC_HIGH_##fs(X) &= _FP_QNANBIT_SH_##fs - 1; \
|
_FP_FRAC_HIGH_##fs(X) &= _FP_QNANBIT_SH_##fs - 1; \
|
||||||
@ -168,7 +179,8 @@ do { \
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
_FP_FRAC_HIGH_##fs(X) |= _FP_QNANBIT_SH_##fs; \
|
_FP_FRAC_HIGH_##fs(X) |= _FP_QNANBIT_SH_##fs; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Test whether a biased exponent is normal (not zero or maximum). */
|
/* Test whether a biased exponent is normal (not zero or maximum). */
|
||||||
#define _FP_EXP_NORMAL(fs, wc, X) (((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
|
#define _FP_EXP_NORMAL(fs, wc, X) (((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
|
||||||
@ -177,7 +189,8 @@ do { \
|
|||||||
rounded and shifted right, with the rounding possibly increasing
|
rounded and shifted right, with the rounding possibly increasing
|
||||||
the exponent (including changing a finite value to infinity). */
|
the exponent (including changing a finite value to infinity). */
|
||||||
#define _FP_PACK_SEMIRAW(fs, wc, X) \
|
#define _FP_PACK_SEMIRAW(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_ROUND(wc, X); \
|
_FP_ROUND(wc, X); \
|
||||||
if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc(X)) \
|
if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
{ \
|
{ \
|
||||||
@ -204,7 +217,8 @@ do { \
|
|||||||
else \
|
else \
|
||||||
_FP_SETQNAN(fs, wc, X); \
|
_FP_SETQNAN(fs, wc, X); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Before packing the bits back into the native fp result, take care
|
* Before packing the bits back into the native fp result, take care
|
||||||
@ -214,7 +228,8 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_PACK_CANONICAL(fs, wc, X) \
|
#define _FP_PACK_CANONICAL(fs, wc, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
switch (X##_c) \
|
switch (X##_c) \
|
||||||
{ \
|
{ \
|
||||||
case FP_CLS_NORMAL: \
|
case FP_CLS_NORMAL: \
|
||||||
@ -237,10 +252,12 @@ do { \
|
|||||||
X##_c = FP_CLS_INF; \
|
X##_c = FP_CLS_INF; \
|
||||||
break; \
|
break; \
|
||||||
case FP_RND_PINF: \
|
case FP_RND_PINF: \
|
||||||
if (!X##_s) X##_c = FP_CLS_INF; \
|
if (!X##_s) \
|
||||||
|
X##_c = FP_CLS_INF; \
|
||||||
break; \
|
break; \
|
||||||
case FP_RND_MINF: \
|
case FP_RND_MINF: \
|
||||||
if (X##_s) X##_c = FP_CLS_INF; \
|
if (X##_s) \
|
||||||
|
X##_c = FP_CLS_INF; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (X##_c == FP_CLS_INF) \
|
if (X##_c == FP_CLS_INF) \
|
||||||
@ -319,7 +336,8 @@ do { \
|
|||||||
_FP_SETQNAN(fs, wc, X); \
|
_FP_SETQNAN(fs, wc, X); \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* This one accepts raw argument and not cooked, returns
|
/* This one accepts raw argument and not cooked, returns
|
||||||
* 1 if X is a signaling NaN.
|
* 1 if X is a signaling NaN.
|
||||||
@ -342,7 +360,8 @@ do { \
|
|||||||
|
|
||||||
/* Addition on semi-raw values. */
|
/* Addition on semi-raw values. */
|
||||||
#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP) \
|
#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (X##_s == Y##_s) \
|
if (X##_s == Y##_s) \
|
||||||
{ \
|
{ \
|
||||||
/* Addition. */ \
|
/* Addition. */ \
|
||||||
@ -760,14 +779,18 @@ do { \
|
|||||||
} \
|
} \
|
||||||
sub_done: ; \
|
sub_done: ; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
|
#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
|
||||||
#define _FP_SUB(fs, wc, R, X, Y) \
|
#define _FP_SUB(fs, wc, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) Y##_s ^= 1; \
|
{ \
|
||||||
|
if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
|
||||||
|
Y##_s ^= 1; \
|
||||||
_FP_ADD_INTERNAL(fs, wc, R, X, Y, '-'); \
|
_FP_ADD_INTERNAL(fs, wc, R, X, Y, '-'); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -775,11 +798,13 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_NEG(fs, wc, R, X) \
|
#define _FP_NEG(fs, wc, R, X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_FRAC_COPY_##wc(R, X); \
|
_FP_FRAC_COPY_##wc(R, X); \
|
||||||
R##_e = X##_e; \
|
R##_e = X##_e; \
|
||||||
R##_s = 1 ^ X##_s; \
|
R##_s = 1 ^ X##_s; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -787,7 +812,8 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_MUL(fs, wc, R, X, Y) \
|
#define _FP_MUL(fs, wc, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
R##_s = X##_s ^ Y##_s; \
|
R##_s = X##_s ^ Y##_s; \
|
||||||
R##_e = X##_e + Y##_e + 1; \
|
R##_e = X##_e + Y##_e + 1; \
|
||||||
switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
|
switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
|
||||||
@ -842,13 +868,15 @@ do { \
|
|||||||
default: \
|
default: \
|
||||||
abort(); \
|
abort(); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Fused multiply-add. The input values should be cooked. */
|
/* Fused multiply-add. The input values should be cooked. */
|
||||||
|
|
||||||
#define _FP_FMA(fs, wc, dwc, R, X, Y, Z) \
|
#define _FP_FMA(fs, wc, dwc, R, X, Y, Z) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
FP_DECL_##fs(T); \
|
FP_DECL_##fs(T); \
|
||||||
T##_s = X##_s ^ Y##_s; \
|
T##_s = X##_s ^ Y##_s; \
|
||||||
T##_e = X##_e + Y##_e + 1; \
|
T##_e = X##_e + Y##_e + 1; \
|
||||||
@ -1053,7 +1081,8 @@ do { \
|
|||||||
abort(); \
|
abort(); \
|
||||||
} \
|
} \
|
||||||
done_fma: ; \
|
done_fma: ; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1061,7 +1090,8 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_DIV(fs, wc, R, X, Y) \
|
#define _FP_DIV(fs, wc, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
R##_s = X##_s ^ Y##_s; \
|
R##_s = X##_s ^ Y##_s; \
|
||||||
R##_e = X##_e - Y##_e; \
|
R##_e = X##_e - Y##_e; \
|
||||||
switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
|
switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \
|
||||||
@ -1116,7 +1146,8 @@ do { \
|
|||||||
default: \
|
default: \
|
||||||
abort(); \
|
abort(); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1125,7 +1156,8 @@ do { \
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_CMP(fs, wc, ret, X, Y, un) \
|
#define _FP_CMP(fs, wc, ret, X, Y, un) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
/* NANs are unordered */ \
|
/* NANs are unordered */ \
|
||||||
if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
|
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
|
||||||
@ -1159,13 +1191,15 @@ do { \
|
|||||||
else \
|
else \
|
||||||
ret = 0; \
|
ret = 0; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Simplification for strict equality. */
|
/* Simplification for strict equality. */
|
||||||
|
|
||||||
#define _FP_CMP_EQ(fs, wc, ret, X, Y) \
|
#define _FP_CMP_EQ(fs, wc, ret, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
/* NANs are unordered */ \
|
/* NANs are unordered */ \
|
||||||
if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
|
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \
|
||||||
@ -1178,23 +1212,28 @@ do { \
|
|||||||
&& _FP_FRAC_EQ_##wc(X, Y) \
|
&& _FP_FRAC_EQ_##wc(X, Y) \
|
||||||
&& (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
|
&& (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Version to test unordered. */
|
/* Version to test unordered. */
|
||||||
|
|
||||||
#define _FP_CMP_UNORD(fs, wc, ret, X, Y) \
|
#define _FP_CMP_UNORD(fs, wc, ret, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))); \
|
|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main square root routine. The input value should be cooked.
|
* Main square root routine. The input value should be cooked.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _FP_SQRT(fs, wc, R, X) \
|
#define _FP_SQRT(fs, wc, R, X) \
|
||||||
do { \
|
do \
|
||||||
_FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S); \
|
{ \
|
||||||
|
_FP_FRAC_DECL_##wc(T); \
|
||||||
|
_FP_FRAC_DECL_##wc(S); \
|
||||||
_FP_W_TYPE q; \
|
_FP_W_TYPE q; \
|
||||||
switch (X##_c) \
|
switch (X##_c) \
|
||||||
{ \
|
{ \
|
||||||
@ -1240,7 +1279,8 @@ do { \
|
|||||||
q = _FP_OVERFLOW_##fs >> 1; \
|
q = _FP_OVERFLOW_##fs >> 1; \
|
||||||
_FP_SQRT_MEAT_##wc(R, S, T, X, q); \
|
_FP_SQRT_MEAT_##wc(R, S, T, X, q); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert from FP to integer. Input is raw.
|
* Convert from FP to integer. Input is raw.
|
||||||
@ -1258,7 +1298,8 @@ do { \
|
|||||||
* depending on the sign in such case.
|
* depending on the sign in such case.
|
||||||
*/
|
*/
|
||||||
#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned) \
|
#define _FP_TO_INT(fs, wc, r, X, rsize, rsigned) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (X##_e < _FP_EXPBIAS_##fs) \
|
if (X##_e < _FP_EXPBIAS_##fs) \
|
||||||
{ \
|
{ \
|
||||||
r = 0; \
|
r = 0; \
|
||||||
@ -1294,9 +1335,12 @@ do { \
|
|||||||
mantissa. */ \
|
mantissa. */ \
|
||||||
int inexact = 0; \
|
int inexact = 0; \
|
||||||
(void)((_FP_FRACBITS_##fs > rsize) \
|
(void)((_FP_FRACBITS_##fs > rsize) \
|
||||||
? ({ _FP_FRAC_SRST_##wc(X, inexact, \
|
? ({ \
|
||||||
|
_FP_FRAC_SRST_##wc(X, inexact, \
|
||||||
_FP_FRACBITS_##fs - rsize, \
|
_FP_FRACBITS_##fs - rsize, \
|
||||||
_FP_FRACBITS_##fs); 0; }) \
|
_FP_FRACBITS_##fs); \
|
||||||
|
0; \
|
||||||
|
}) \
|
||||||
: 0); \
|
: 0); \
|
||||||
if (!_FP_FRAC_ZEROP_##wc(X)) \
|
if (!_FP_FRAC_ZEROP_##wc(X)) \
|
||||||
FP_SET_EXCEPTION(FP_EX_INVALID); \
|
FP_SET_EXCEPTION(FP_EX_INVALID); \
|
||||||
@ -1328,12 +1372,14 @@ do { \
|
|||||||
if (rsigned && X##_s) \
|
if (rsigned && X##_s) \
|
||||||
r = -r; \
|
r = -r; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Convert integer to fp. Output is raw. RTYPE is unsigned even if
|
/* Convert integer to fp. Output is raw. RTYPE is unsigned even if
|
||||||
input is signed. */
|
input is signed. */
|
||||||
#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \
|
#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (r) \
|
if (r) \
|
||||||
{ \
|
{ \
|
||||||
rtype ur_; \
|
rtype ur_; \
|
||||||
@ -1401,13 +1447,15 @@ do { \
|
|||||||
X##_e = 0; \
|
X##_e = 0; \
|
||||||
_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
|
_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Extend from a narrower floating-point format to a wider one. Input
|
/* Extend from a narrower floating-point format to a wider one. Input
|
||||||
and output are raw. */
|
and output are raw. */
|
||||||
#define FP_EXTEND(dfs,sfs,dwc,swc,D,S) \
|
#define FP_EXTEND(dfs,sfs,dwc,swc,D,S) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
|
if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
|
||||||
|| (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
|
|| (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
|
||||||
< _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
|
< _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
|
||||||
@ -1459,12 +1507,14 @@ do { \
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/* Truncate from a wider floating-point format to a narrower one.
|
/* Truncate from a wider floating-point format to a narrower one.
|
||||||
Input and output are semi-raw. */
|
Input and output are semi-raw. */
|
||||||
#define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
|
#define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
|
if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
|
||||||
|| (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
|
|| (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
|
||||||
&& _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs)) \
|
&& _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs)) \
|
||||||
@ -1543,7 +1593,8 @@ do { \
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper primitives.
|
* Helper primitives.
|
||||||
@ -1554,7 +1605,8 @@ do { \
|
|||||||
#ifndef __FP_CLZ
|
#ifndef __FP_CLZ
|
||||||
/* GCC 3.4 and later provide the builtins for us. */
|
/* GCC 3.4 and later provide the builtins for us. */
|
||||||
# define __FP_CLZ(r, x) \
|
# define __FP_CLZ(r, x) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
if (sizeof (_FP_W_TYPE) == sizeof (unsigned int)) \
|
if (sizeof (_FP_W_TYPE) == sizeof (unsigned int)) \
|
||||||
r = __builtin_clz (x); \
|
r = __builtin_clz (x); \
|
||||||
else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long)) \
|
else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long)) \
|
||||||
@ -1563,19 +1615,23 @@ do { \
|
|||||||
r = __builtin_clzll (x); \
|
r = __builtin_clzll (x); \
|
||||||
else \
|
else \
|
||||||
abort (); \
|
abort (); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
#endif /* ndef __FP_CLZ */
|
#endif /* ndef __FP_CLZ */
|
||||||
|
|
||||||
#define _FP_DIV_HELP_imm(q, r, n, d) \
|
#define _FP_DIV_HELP_imm(q, r, n, d) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
q = n / d, r = n % d; \
|
q = n / d, r = n % d; \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
/* A restoring bit-by-bit division primitive. */
|
/* A restoring bit-by-bit division primitive. */
|
||||||
|
|
||||||
#define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y) \
|
#define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
int count = _FP_WFRACBITS_##fs; \
|
int count = _FP_WFRACBITS_##fs; \
|
||||||
_FP_FRAC_DECL_##wc (u); \
|
_FP_FRAC_DECL_##wc (u); \
|
||||||
_FP_FRAC_DECL_##wc (v); \
|
_FP_FRAC_DECL_##wc (v); \
|
||||||
@ -1598,7 +1654,8 @@ do { \
|
|||||||
else \
|
else \
|
||||||
R##_e--; \
|
R##_e--; \
|
||||||
/* Subsequent rounds. */ \
|
/* Subsequent rounds. */ \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0; \
|
int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0; \
|
||||||
_FP_FRAC_SLL_##wc (u, 1); \
|
_FP_FRAC_SLL_##wc (u, 1); \
|
||||||
_FP_FRAC_SLL_##wc (R, 1); \
|
_FP_FRAC_SLL_##wc (R, 1); \
|
||||||
@ -1607,10 +1664,12 @@ do { \
|
|||||||
_FP_FRAC_SUB_##wc (u, u, v); \
|
_FP_FRAC_SUB_##wc (u, u, v); \
|
||||||
_FP_FRAC_LOW_##wc (R) |= 1; \
|
_FP_FRAC_LOW_##wc (R) |= 1; \
|
||||||
} \
|
} \
|
||||||
} while (--count > 0); \
|
} \
|
||||||
|
while (--count > 0); \
|
||||||
/* If there's anything left in U, the result is inexact. */ \
|
/* If there's anything left in U, the result is inexact. */ \
|
||||||
_FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u); \
|
_FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define _FP_DIV_MEAT_1_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
|
#define _FP_DIV_MEAT_1_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
|
||||||
#define _FP_DIV_MEAT_2_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
|
#define _FP_DIV_MEAT_2_loop(fs, R, X, Y) _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
|
||||||
|
114
soft-fp/quad.h
114
soft-fp/quad.h
@ -99,60 +99,78 @@ union _FP_UNION_Q
|
|||||||
# 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) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_4_P(Q,val,X); \
|
_FP_PACK_RAW_4_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_4(Q,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(Q,4,X); \
|
_FP_UNPACK_CANONICAL(Q,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_4_P(Q,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(Q,4,X); \
|
_FP_UNPACK_CANONICAL(Q,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_4(Q,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(Q,4,X); \
|
_FP_UNPACK_SEMIRAW(Q,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_4_P(Q,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(Q,4,X); \
|
_FP_UNPACK_SEMIRAW(Q,4,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_Q(val,X) \
|
# define FP_PACK_Q(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(Q,4,X); \
|
_FP_PACK_CANONICAL(Q,4,X); \
|
||||||
_FP_PACK_RAW_4(Q,val,X); \
|
_FP_PACK_RAW_4(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_QP(val,X) \
|
# define FP_PACK_QP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(Q,4,X); \
|
_FP_PACK_CANONICAL(Q,4,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_4_P(Q,val,X); \
|
_FP_PACK_RAW_4_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(Q,4,X); \
|
||||||
_FP_PACK_RAW_4(Q,val,X); \
|
_FP_PACK_RAW_4(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_SEMIRAW_QP(val,X) \
|
# define FP_PACK_SEMIRAW_QP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_SEMIRAW(Q,4,X); \
|
_FP_PACK_SEMIRAW(Q,4,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_4_P(Q,val,X); \
|
_FP_PACK_RAW_4_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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;
|
||||||
@ -203,60 +223,78 @@ union _FP_UNION_Q
|
|||||||
# 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) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(Q,val,X); \
|
_FP_PACK_RAW_2_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2(Q,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(Q,2,X); \
|
_FP_UNPACK_CANONICAL(Q,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2_P(Q,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(Q,2,X); \
|
_FP_UNPACK_CANONICAL(Q,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2(Q,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(Q,2,X); \
|
_FP_UNPACK_SEMIRAW(Q,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_2_P(Q,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(Q,2,X); \
|
_FP_UNPACK_SEMIRAW(Q,2,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_Q(val,X) \
|
# define FP_PACK_Q(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(Q,2,X); \
|
_FP_PACK_CANONICAL(Q,2,X); \
|
||||||
_FP_PACK_RAW_2(Q,val,X); \
|
_FP_PACK_RAW_2(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_QP(val,X) \
|
# define FP_PACK_QP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(Q,2,X); \
|
_FP_PACK_CANONICAL(Q,2,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(Q,val,X); \
|
_FP_PACK_RAW_2_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(Q,2,X); \
|
||||||
_FP_PACK_RAW_2(Q,val,X); \
|
_FP_PACK_RAW_2(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
# define FP_PACK_SEMIRAW_QP(val,X) \
|
# define FP_PACK_SEMIRAW_QP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_SEMIRAW(Q,2,X); \
|
_FP_PACK_SEMIRAW(Q,2,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_2_P(Q,val,X); \
|
_FP_PACK_RAW_2_P(Q,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)
|
||||||
|
@ -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;
|
||||||
@ -86,60 +87,78 @@ union _FP_UNION_S
|
|||||||
#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) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(S,val,X); \
|
_FP_PACK_RAW_1_P(S,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1(S,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(S,1,X); \
|
_FP_UNPACK_CANONICAL(S,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1_P(S,X,val); \
|
||||||
_FP_UNPACK_CANONICAL(S,1,X); \
|
_FP_UNPACK_CANONICAL(S,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1(S,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(S,1,X); \
|
_FP_UNPACK_SEMIRAW(S,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_RAW_1_P(S,X,val); \
|
||||||
_FP_UNPACK_SEMIRAW(S,1,X); \
|
_FP_UNPACK_SEMIRAW(S,1,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define FP_PACK_S(val,X) \
|
#define FP_PACK_S(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(S,1,X); \
|
_FP_PACK_CANONICAL(S,1,X); \
|
||||||
_FP_PACK_RAW_1(S,val,X); \
|
_FP_PACK_RAW_1(S,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define FP_PACK_SP(val,X) \
|
#define FP_PACK_SP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_CANONICAL(S,1,X); \
|
_FP_PACK_CANONICAL(S,1,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(S,val,X); \
|
_FP_PACK_RAW_1_P(S,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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_SEMIRAW(S,1,X); \
|
||||||
_FP_PACK_RAW_1(S,val,X); \
|
_FP_PACK_RAW_1(S,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define FP_PACK_SEMIRAW_SP(val,X) \
|
#define FP_PACK_SEMIRAW_SP(val,X) \
|
||||||
do { \
|
do \
|
||||||
|
{ \
|
||||||
_FP_PACK_SEMIRAW(S,1,X); \
|
_FP_PACK_SEMIRAW(S,1,X); \
|
||||||
if (!FP_INHIBIT_RESULTS) \
|
if (!FP_INHIBIT_RESULTS) \
|
||||||
_FP_PACK_RAW_1_P(S,val,X); \
|
_FP_PACK_RAW_1_P(S,val,X); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)
|
||||||
|
@ -167,27 +167,34 @@
|
|||||||
#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) \
|
if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
|
||||||
_FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
|
_FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)) \
|
if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
|
||||||
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
|
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
|
||||||
} while (0)
|
} \
|
||||||
|
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)) \
|
if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
|
||||||
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
|
_FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
|
||||||
} while (0)
|
} \
|
||||||
|
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); \
|
FP_SET_EXCEPTION(FP_EX_INEXACT); \
|
||||||
@ -207,7 +214,8 @@ do { \
|
|||||||
break; \
|
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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user