QuadFloat.st
author Claus Gittinger <cg@exept.de>
Fri, 07 Jun 2019 02:45:19 +0200
changeset 5003 7a48121b7faa
parent 5002 c053e5b6ad82
child 5004 52b4d47d9ea4
permissions -rw-r--r--
#REFACTORING by cg class: QuadFloat changed: #errorUnsupported category of: #errorUnsupported class: QuadFloat class added: #errorUnsupported
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
     1
"{ Encoding: utf8 }"
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
     2
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ Package: 'stx:libbasic2' }"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
"{ NameSpace: Smalltalk }"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
LimitedPrecisionReal variableByteSubclass:#QuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	instanceVariableNames:''
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	classVariableNames:'QuadFloatZero QuadFloatOne Pi E Epsilon NaN PositiveInfinity
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
		NegativeInfinity Halfpi HalfpiNegative'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	poolDictionaries:''
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
	category:'Magnitude-Numbers'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
    15
!QuadFloat primitiveDefinitions!
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
    16
%{
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    17
#if __POINTER_SIZE__ == 8
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    18
# define SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    19
#endif
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    20
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    21
#ifdef SUPPORT_QUADFLOAT
4998
1ed27f918576 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4997
diff changeset
    22
# include <stdint.h>
1ed27f918576 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4997
diff changeset
    23
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    24
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    25
| Software floating-point underflow tininess-detection mode.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    26
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    27
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    28
    softfloat_tininess_beforeRounding = 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    29
    softfloat_tininess_afterRounding  = 1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    30
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    31
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    32
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    33
| Software floating-point exception flags.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    34
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    35
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    36
    softfloat_flag_inexact   =  1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    37
    softfloat_flag_underflow =  2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    38
    softfloat_flag_overflow  =  4,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    39
    softfloat_flag_infinite  =  8,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    40
    softfloat_flag_invalid   = 16
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    41
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    42
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    43
| Software floating-point rounding mode.  (Mode "odd" is supported only if
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    44
| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    45
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    46
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    47
    softfloat_round_near_even   = 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    48
    softfloat_round_minMag      = 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    49
    softfloat_round_min         = 2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    50
    softfloat_round_max         = 3,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    51
    softfloat_round_near_maxMag = 4,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    52
    softfloat_round_odd         = 6
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    53
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    54
#define init_detectTininess softfloat_tininess_afterRounding
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    55
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    56
#if defined(LITTLEENDIAN) || defined(__LSB_FIRST__)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    57
struct uint128          { uint64_t v0, v64; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    58
struct uint64_extra     { uint64_t extra, v; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    59
struct uint128_extra    { uint64_t extra; struct uint128 v; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    60
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    61
struct uint128          { uint64_t v64, v0; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    62
struct uint64_extra     { uint64_t v, extra; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    63
struct uint128_extra    { struct uint128 v; uint64_t extra; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    64
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    65
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    66
typedef unsigned char bool;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    67
typedef double float64_t;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    68
union ui64_f64   { uint64_t ui; float64_t f; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    69
union ui128_f128 { struct uint128 ui; float128_t f; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    70
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    71
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    72
| The bit pattern for a default generated 128-bit floating-point NaN.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    73
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    74
#define defaultNaNF128UI96 0xFFFF8000
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    75
#define defaultNaNF128UI64 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    76
#define defaultNaNF128UI32 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    77
#define defaultNaNF128UI0  0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    78
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    79
struct commonNaN {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    80
    bool sign;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    81
#ifdef LITTLEENDIAN
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    82
    uint64_t v0, v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    83
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    84
    uint64_t v64, v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    85
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    86
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    87
struct exp16_sig64 { int_fast16_t exp; uint_fast64_t sig; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    88
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    89
#endif // SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    90
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    91
%}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    92
! !
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    93
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    94
!QuadFloat primitiveVariables!
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    95
%{
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    96
#ifdef SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    97
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    98
uint_fast8_t softfloat_exceptionFlags;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    99
uint_fast8_t softfloat_roundingMode = softfloat_round_near_even;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   100
uint_fast8_t softfloat_detectTininess = init_detectTininess;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   101
uint_fast8_t softfloat_exceptionFlags = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   102
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   103
const uint_least8_t softfloat_countLeadingZeros8[256] = {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   104
    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   105
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   106
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   107
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   108
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   109
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   110
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   111
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   112
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   113
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   114
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   115
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   116
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   117
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   118
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   119
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   120
};
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   121
#endif // SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   122
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   123
%}
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   124
! !
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   125
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   126
!QuadFloat primitiveFunctions!
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   127
%{
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   128
#ifdef SUPPORT_QUADFLOAT
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   129
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   130
#if defined(LITTLEENDIAN) || defined(__LSB_FIRST__)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   131
#define wordIncr 1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   132
#define indexWord( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   133
#define indexWordHi( total ) ((total) - 1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   134
#define indexWordLo( total ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   135
#define indexMultiword( total, m, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   136
#define indexMultiwordHi( total, n ) ((total) - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   137
#define indexMultiwordLo( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   138
#define indexMultiwordHiBut( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   139
#define indexMultiwordLoBut( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   140
#define INIT_UINTM4( v3, v2, v1, v0 ) { v0, v1, v2, v3 }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   141
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   142
#define wordIncr -1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   143
#define indexWord( total, n ) ((total) - 1 - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   144
#define indexWordHi( total ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   145
#define indexWordLo( total ) ((total) - 1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   146
#define indexMultiword( total, m, n ) ((total) - 1 - (m))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   147
#define indexMultiwordHi( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   148
#define indexMultiwordLo( total, n ) ((total) - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   149
#define indexMultiwordHiBut( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   150
#define indexMultiwordLoBut( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   151
#define INIT_UINTM4( v3, v2, v1, v0 ) { v3, v2, v1, v0 }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   152
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   153
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   154
#define signF64UI( a ) ((bool) ((uint64_t) (a)>>63))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   155
#define expF64UI( a ) ((int_fast16_t) ((a)>>52) & 0x7FF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   156
#define fracF64UI( a ) ((a) & UINT64_C( 0x000FFFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   157
#define softfloat_f64UIToCommonNaN( uiA, zPtr ) if ( ! ((uiA) & UINT64_C( 0x0008000000000000 )) ) softfloat_raiseFlags( softfloat_flag_invalid )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   158
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   159
#define signF128UI64( a64 ) ((bool) ((uint64_t) (a64)>>63))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   160
#define expF128UI64( a64 ) ((int_fast32_t) ((a64)>>48) & 0x7FFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   161
#define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   162
#define packToF128UI64( sign, exp, sig64 ) (((uint_fast64_t) (sign)<<63) + ((uint_fast64_t) (exp)<<48) + (sig64))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   163
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   164
#define signF128UI96( a96 ) ((bool) ((uint32_t) (a96)>>31))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   165
#define expF128UI96( a96 ) ((int32_t) ((a96)>>16) & 0x7FFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   166
#define fracF128UI96( a96 ) ((a96) & 0x0000FFFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   167
#define packToF128UI96( sign, exp, sig96 ) (((uint32_t) (sign)<<31) + ((uint32_t) (exp)<<16) + (sig96))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   168
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   169
#define isNaNF128UI( a64, a0 ) (((~(a64) & UINT64_C( 0x7FFF000000000000 )) == 0) && (a0 || ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   170
#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   171
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   172
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   173
| This function or macro is the same as 'softfloat_shortShiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   174
| 'size_words' = 5 (N = 160).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   175
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   176
#define softfloat_shortShiftLeft160M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 5, aPtr, dist, zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   177
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   178
| This function or macro is the same as 'softfloat_shiftRightJamM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   179
| 'size_words' = 5 (N = 160).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   180
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   181
#define softfloat_shiftRightJam160M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 5, aPtr, dist, zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   182
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   183
| This function or macro is the same as 'softfloat_shortShiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   184
| 'size_words' = 4 (N = 128).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   185
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   186
#define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   187
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   188
static inline void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   189
softfloat_raiseFlags( uint_fast8_t flags ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   190
    softfloat_exceptionFlags |= flags;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   191
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   192
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   193
#if 1
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   194
static inline void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   195
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   196
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   197
    zWPtr[indexWord( 4, 3 )] = defaultNaNF128UI96;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   198
    zWPtr[indexWord( 4, 2 )] = defaultNaNF128UI64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   199
    zWPtr[indexWord( 4, 1 )] = defaultNaNF128UI32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   200
    zWPtr[indexWord( 4, 0 )] = defaultNaNF128UI0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   201
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   202
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   203
# define softfloat_commonNaNToF128M( aPtr, zWPtr ) \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   204
{ \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   205
    (zWPtr)[indexWord( 4, 3 )] = defaultNaNF128UI96; \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   206
    (zWPtr)[indexWord( 4, 2 )] = defaultNaNF128UI64; \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   207
    (zWPtr)[indexWord( 4, 1 )] = defaultNaNF128UI32; \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   208
    (zWPtr)[indexWord( 4, 0 )] = defaultNaNF128UI0; \
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   209
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   210
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   211
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   212
static inline void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   213
softfloat_invalidF128M( uint32_t *zWPtr ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   214
    softfloat_raiseFlags( softfloat_flag_invalid );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   215
    zWPtr[indexWord( 4, 3 )] = defaultNaNF128UI96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   216
    zWPtr[indexWord( 4, 2 )] = defaultNaNF128UI64;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   217
    zWPtr[indexWord( 4, 1 )] = defaultNaNF128UI32;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   218
    zWPtr[indexWord( 4, 0 )] = defaultNaNF128UI0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   219
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   220
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   221
static bool
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   222
f128M_isSignalingNaN( const float128_t *aPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   223
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   224
    const uint32_t *aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   225
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   226
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   227
    aWPtr = (const uint32_t *) aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   228
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   229
    if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   230
    return
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   231
	((uiA96 & 0x00007FFF) != 0)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   232
	    || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   233
		     | aWPtr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   234
		    != 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   235
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   236
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   237
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   238
softfloat_shortShiftRightJamM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   239
      uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   240
      const uint64_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   241
      uint_fast8_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   242
      uint64_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   243
  )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   244
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   245
    uint_fast8_t uNegDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   246
    unsigned int index, lastIndex;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   247
    uint64_t partWordZ, wordA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   248
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   249
    uNegDist = -dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   250
    index = indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   251
    lastIndex = indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   252
    wordA = aPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   253
    partWordZ = wordA>>dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   254
    if ( partWordZ<<dist != wordA ) partWordZ |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   255
    while ( index != lastIndex ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   256
	wordA = aPtr[index + wordIncr];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   257
	zPtr[index] = wordA<<(uNegDist & 63) | partWordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   258
	index += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   259
	partWordZ = wordA>>dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   260
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   261
    zPtr[index] = partWordZ;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   262
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   263
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   264
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   265
softfloat_shiftRightJamM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   266
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   267
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   268
     uint32_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   269
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   270
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   271
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   272
    uint32_t wordJam, wordDist, *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   273
    uint_fast8_t i, innerDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   274
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   275
    wordJam = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   276
    wordDist = dist>>5;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   277
    if ( wordDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   278
	if ( size_words < wordDist ) wordDist = size_words;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   279
	ptr = (uint32_t *) (aPtr + indexMultiwordLo( size_words, wordDist ));
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   280
	i = wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   281
	do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   282
	    wordJam = *ptr++;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   283
	    if ( wordJam ) break;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   284
	    --i;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   285
	} while ( i );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   286
	ptr = zPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   287
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   288
    if ( wordDist < size_words ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   289
	aPtr += indexMultiwordHiBut( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   290
	innerDist = dist & 31;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   291
	if ( innerDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   292
	    softfloat_shortShiftRightJamM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   293
		size_words - wordDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   294
		aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   295
		innerDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   296
		zPtr + indexMultiwordLoBut( size_words, wordDist )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   297
	    );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   298
	    if ( ! wordDist ) goto wordJam;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   299
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   300
	    aPtr += indexWordLo( size_words - wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   301
	    ptr = zPtr + indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   302
	    for ( i = size_words - wordDist; i; --i ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   303
		*ptr = *aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   304
		aPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   305
		ptr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   306
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   307
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   308
	ptr = zPtr + indexMultiwordHi( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   309
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   310
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   311
	*ptr++ = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   312
	--wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   313
    } while ( wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   314
 wordJam:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   315
    if ( wordJam ) zPtr[indexWordLo( size_words )] |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   316
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   317
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   318
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   319
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   320
 softfloat_shortShiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   321
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   322
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   323
     uint_fast8_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   324
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   325
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   326
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   327
    uint_fast8_t uNegDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   328
    unsigned int index, lastIndex;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   329
    uint32_t partWordZ, wordA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   330
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   331
    uNegDist = -dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   332
    index = indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   333
    lastIndex = indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   334
    partWordZ = aPtr[index]<<dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   335
    while ( index != lastIndex ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   336
	wordA = aPtr[index - wordIncr];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   337
	zPtr[index] = partWordZ | wordA>>(uNegDist & 31);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   338
	index -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   339
	partWordZ = wordA<<dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   340
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   341
    zPtr[index] = partWordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   342
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   343
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   344
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   345
softfloat_shiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   346
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   347
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   348
     uint32_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   349
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   350
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   351
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   352
    uint32_t wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   353
    uint_fast8_t innerDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   354
    uint32_t *destPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   355
    uint_fast8_t i;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   356
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   357
    wordDist = dist>>5;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   358
    if ( wordDist < size_words ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   359
	aPtr += indexMultiwordLoBut( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   360
	innerDist = dist & 31;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   361
	if ( innerDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   362
	    softfloat_shortShiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   363
		size_words - wordDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   364
		aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   365
		innerDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   366
		zPtr + indexMultiwordHiBut( size_words, wordDist )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   367
	    );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   368
	    if ( ! wordDist ) return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   369
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   370
	    aPtr += indexWordHi( size_words - wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   371
	    destPtr = zPtr + indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   372
	    for ( i = size_words - wordDist; i; --i ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   373
		*destPtr = *aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   374
		aPtr -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   375
		destPtr -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   376
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   377
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   378
	zPtr += indexMultiwordLo( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   379
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   380
	wordDist = size_words;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   381
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   382
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   383
	*zPtr++ = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   384
	--wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   385
    } while ( wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   386
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   387
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   388
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   389
| This function or macro is the same as 'softfloat_shiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   390
| 'size_words' = 4 (N = 128).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   391
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   392
#define softfloat_shiftLeft128M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 4, aPtr, dist, zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   393
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   394
bool
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   395
softfloat_isNaNF128M( const uint32_t *aWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   396
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   397
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   398
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   399
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   400
    if ( (~uiA96 & 0x7FFF0000) != 0 ) return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   401
    return
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   402
	((uiA96 & 0x0000FFFF) != 0)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   403
	    || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   404
		     | aWPtr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   405
		    != 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   406
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   407
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   408
static inline uint_fast8_t
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   409
softfloat_countLeadingZeros32( uint32_t a ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   410
    return a ? __builtin_clz( a ) : 32;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   411
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   412
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   413
static inline bool
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   414
softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 ){
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   415
    return (a64 == b64) && (a0 == b0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   416
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   417
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   418
static inline bool
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   419
softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 ){
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   420
    return (a64 < b64) || ((a64 == b64) && (a0 < b0));
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   421
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   422
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   423
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   424
softfloat_propagateNaNF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   425
     const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   426
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   427
    bool isSigNaNA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   428
    const uint32_t *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   429
    bool isSigNaNB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   430
    uint32_t uiA96, uiB96, wordMagA, wordMagB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   431
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   432
    isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   433
    ptr = aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   434
    if ( ! bWPtr ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   435
	if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   436
	goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   437
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   438
    isSigNaNB = f128M_isSignalingNaN( (const float128_t *) bWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   439
    if ( isSigNaNA | isSigNaNB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   440
	softfloat_raiseFlags( softfloat_flag_invalid );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   441
	if ( isSigNaNA ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   442
	    if ( isSigNaNB ) goto returnLargerUIMag;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   443
	    if ( softfloat_isNaNF128M( bWPtr ) ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   444
	    goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   445
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   446
	    if ( softfloat_isNaNF128M( aWPtr ) ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   447
	    goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   448
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   449
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   450
 returnLargerUIMag:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   451
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   452
    uiB96 = bWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   453
    wordMagA = uiA96 & 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   454
    wordMagB = uiB96 & 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   455
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   456
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   457
    wordMagA = aWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   458
    wordMagB = bWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   459
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   460
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   461
    wordMagA = aWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   462
    wordMagB = bWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   463
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   464
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   465
    wordMagA = aWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   466
    wordMagB = bWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   467
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   468
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   469
    if ( uiA96 < uiB96 ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   470
 copyB:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   471
    ptr = bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   472
 copy:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   473
    zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   474
    zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   475
    zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   476
    zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   477
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   478
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   479
static inline uint_fast8_t
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   480
softfloat_countLeadingZeros64( uint64_t a )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   481
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   482
    uint_fast8_t count;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   483
    uint32_t a32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   484
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   485
    count = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   486
    a32 = a>>32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   487
    if ( ! a32 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   488
	count = 32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   489
	a32 = a;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   490
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   491
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   492
    | From here, result is current count + count leading zeros of `a32'.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   493
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   494
    if ( a32 < 0x10000 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   495
	count += 16;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   496
	a32 <<= 16;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   497
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   498
    if ( a32 < 0x1000000 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   499
	count += 8;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   500
	a32 <<= 8;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   501
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   502
    count += softfloat_countLeadingZeros8[a32>>24];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   503
    return count;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   504
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   505
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   506
static inline struct exp16_sig64
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   507
softfloat_normSubnormalF64Sig( uint_fast64_t sig )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   508
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   509
    int_fast8_t shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   510
    struct exp16_sig64 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   511
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   512
    shiftDist = softfloat_countLeadingZeros64( sig ) - 11;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   513
    z.exp = 1 - shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   514
    z.sig = sig<<shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   515
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   516
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   517
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   518
static inline struct uint128_extra
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   519
softfloat_shiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   520
     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   521
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   522
    uint_fast8_t u8NegDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   523
    struct uint128_extra z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   524
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   525
    u8NegDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   526
    if ( dist < 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   527
	z.v.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   528
	z.v.v0 = a64<<(u8NegDist & 63) | a0>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   529
	z.extra = a0<<(u8NegDist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   530
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   531
	z.v.v64 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   532
	if ( dist == 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   533
	    z.v.v0 = a64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   534
	    z.extra = a0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   535
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   536
	    extra |= a0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   537
	    if ( dist < 128 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   538
		z.v.v0 = a64>>(dist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   539
		z.extra = a64<<(u8NegDist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   540
	    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   541
		z.v.v0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   542
		z.extra = (dist == 128) ? a64 : (a64 != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   543
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   544
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   545
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   546
    z.extra |= (extra != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   547
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   548
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   549
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   550
static inline struct uint128_extra
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   551
softfloat_shortShiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   552
     uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   553
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   554
    uint_fast8_t negDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   555
    struct uint128_extra z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   556
    z.v.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   557
    z.v.v0 = a64<<(negDist & 63) | a0>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   558
    z.extra = a0<<(negDist & 63) | (extra != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   559
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   560
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   561
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   562
static inline struct uint128
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   563
softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist )
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   564
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   565
    uint_fast8_t u8NegDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   566
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   567
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   568
    if ( dist < 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   569
	u8NegDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   570
	z.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   571
	z.v0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   572
	    a64<<(u8NegDist & 63) | a0>>dist
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   573
		| ((uint64_t) (a0<<(u8NegDist & 63)) != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   574
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   575
	z.v64 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   576
	z.v0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   577
	    (dist < 127)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   578
		? a64>>(dist & 63)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   579
		      | (((a64 & (((uint_fast64_t) 1<<(dist & 63)) - 1)) | a0)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   580
			     != 0)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   581
		: ((a64 | a0) != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   582
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   583
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   584
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   585
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   586
static inline struct uint128
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   587
softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   588
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   589
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   590
    z.v64 = a64<<dist | a0>>(-dist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   591
    z.v0 = a0<<dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   592
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   593
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   594
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   595
static int_fast8_t
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   596
softfloat_compare128M( const uint32_t *aPtr, const uint32_t *bPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   597
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   598
    unsigned int index, lastIndex;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   599
    uint32_t wordA, wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   600
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   601
    index = indexWordHi( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   602
    lastIndex = indexWordLo( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   603
    for (;;) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   604
	wordA = aPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   605
	wordB = bPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   606
	if ( wordA != wordB ) return (wordA < wordB) ? -1 : 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   607
	if ( index == lastIndex ) break;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   608
	index -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   609
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   610
    return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   611
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   612
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   613
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   614
softfloat_roundPackMToF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   615
     bool sign, int32_t exp, uint32_t *extSigPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   616
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   617
    uint_fast8_t roundingMode;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   618
    bool roundNearEven;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   619
    uint32_t sigExtra;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   620
    bool doIncrement, isTiny;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   621
    static const uint32_t maxSig[4] =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   622
	INIT_UINTM4( 0x0001FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   623
    uint32_t ui, uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   624
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   625
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   626
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   627
    roundingMode = softfloat_roundingMode;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   628
    roundNearEven = (roundingMode == softfloat_round_near_even);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   629
    sigExtra = extSigPtr[indexWordLo( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   630
    doIncrement = (0x80000000 <= sigExtra);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   631
    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   632
	doIncrement =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   633
	    (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   634
		 == (sign ? softfloat_round_min : softfloat_round_max))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   635
		&& sigExtra;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   636
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   637
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   638
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   639
    if ( 0x7FFD <= (uint32_t) exp ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   640
	if ( exp < 0 ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   641
	    /*----------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   642
	    *----------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   643
	    isTiny =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   644
		   (softfloat_detectTininess
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   645
			== softfloat_tininess_beforeRounding)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   646
		|| (exp < -1)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   647
		|| ! doIncrement
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   648
		|| (softfloat_compare128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   649
			extSigPtr + indexMultiwordHi( 5, 4 ), maxSig )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   650
			< 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   651
	    softfloat_shiftRightJam160M( extSigPtr, -exp, extSigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   652
	    exp = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   653
	    sigExtra = extSigPtr[indexWordLo( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   654
	    if ( isTiny && sigExtra ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   655
		softfloat_raiseFlags( softfloat_flag_underflow );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   656
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   657
	    doIncrement = (0x80000000 <= sigExtra);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   658
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   659
		   ! roundNearEven
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   660
		&& (roundingMode != softfloat_round_near_maxMag)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   661
	    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   662
		doIncrement =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   663
		    (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   664
			 == (sign ? softfloat_round_min : softfloat_round_max))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   665
			&& sigExtra;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   666
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   667
	} else if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   668
	       (0x7FFD < exp)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   669
	    || ((exp == 0x7FFD) && doIncrement
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   670
		    && (softfloat_compare128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   671
			    extSigPtr + indexMultiwordHi( 5, 4 ), maxSig )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   672
			    == 0))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   673
	) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   674
	    /*----------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   675
	    *----------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   676
	    softfloat_raiseFlags(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   677
		softfloat_flag_overflow | softfloat_flag_inexact );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   678
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   679
		   roundNearEven
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   680
		|| (roundingMode == softfloat_round_near_maxMag)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   681
		|| (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   682
			== (sign ? softfloat_round_min : softfloat_round_max))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   683
	    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   684
		ui = packToF128UI96( sign, 0x7FFF, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   685
		uj = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   686
	    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   687
		ui = packToF128UI96( sign, 0x7FFE, 0x0000FFFF );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   688
		uj = 0xFFFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   689
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   690
	    zWPtr[indexWordHi( 4 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   691
	    zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   692
	    zWPtr[indexWord( 4, 1 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   693
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   694
	    return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   695
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   696
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   697
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   698
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   699
    uj = extSigPtr[indexWord( 5, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   700
    if ( sigExtra ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   701
	softfloat_exceptionFlags |= softfloat_flag_inexact;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   702
#ifdef SOFTFLOAT_ROUND_ODD
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   703
	if ( roundingMode == softfloat_round_odd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   704
	    uj |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   705
	    goto noIncrementPackReturn;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   706
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   707
#endif
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   708
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   709
    if ( doIncrement ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   710
	++uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   711
	if ( uj ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   712
	    if ( ! (sigExtra & 0x7FFFFFFF) && roundNearEven ) uj &= ~1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   713
	    zWPtr[indexWord( 4, 2 )] = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   714
	    zWPtr[indexWord( 4, 1 )] = extSigPtr[indexWord( 5, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   715
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   716
	    ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   717
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   718
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   719
	    ui = extSigPtr[indexWord( 5, 2 )] + 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   720
	    zWPtr[indexWord( 4, 1 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   721
	    uj = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   722
	    if ( ui ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   723
		zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   724
		ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   725
	    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   726
		++uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   727
		zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   728
		ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   729
		if ( ! uj ) ++ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   730
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   731
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   732
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   733
 noIncrementPackReturn:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   734
	zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   735
	ui = extSigPtr[indexWord( 5, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   736
	zWPtr[indexWord( 4, 1 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   737
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   738
	ui = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   739
	zWPtr[indexWord( 4, 2 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   740
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   741
	ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   742
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   743
	if ( ! uj ) exp = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   744
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   745
    zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp, ui );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   746
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   747
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   748
static int
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   749
softfloat_shiftNormSigF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   750
     const uint32_t *wPtr, uint_fast8_t shiftDist, uint32_t *sigPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   751
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   752
    uint32_t wordSig;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   753
    int32_t exp;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   754
    uint32_t leadingBit;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   755
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   756
    wordSig = wPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   757
    exp = expF128UI96( wordSig );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   758
    if ( exp ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   759
	softfloat_shortShiftLeft128M( wPtr, shiftDist, sigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   760
	leadingBit = 0x00010000<<shiftDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   761
	sigPtr[indexWordHi( 4 )] =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   762
	    (sigPtr[indexWordHi( 4 )] & (leadingBit - 1)) | leadingBit;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   763
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   764
	exp = 16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   765
	wordSig &= 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   766
	if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   767
	    exp = -16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   768
	    wordSig = wPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   769
	    if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   770
		exp = -48;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   771
		wordSig = wPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   772
		if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   773
		    wordSig = wPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   774
		    if ( ! wordSig ) return -128;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   775
		    exp = -80;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   776
		}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   777
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   778
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   779
	exp -= softfloat_countLeadingZeros32( wordSig );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   780
	softfloat_shiftLeft128M( wPtr, 1 - exp + shiftDist, sigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   781
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   782
    return exp;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   783
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   784
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   785
bool
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   786
softfloat_tryPropagateNaNF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   787
     const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   788
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   789
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   790
    if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   791
	softfloat_propagateNaNF128M( aWPtr, bWPtr, zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   792
	return 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   793
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   794
    return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   795
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   796
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   797
static inline struct uint128
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   798
softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   799
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   800
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   801
    z.v0 = a0 + b0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   802
    z.v64 = a64 + b64 + (z.v0 < a0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   803
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   804
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   805
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   806
static inline struct uint128
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   807
softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   808
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   809
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   810
    z.v0 = a0 - b0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   811
    z.v64 = a64 - b64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   812
    z.v64 -= (a0 < b0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   813
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   814
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   815
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   816
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   817
softfloat_mul128MTo256M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   818
     const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   819
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   820
    uint32_t *lastZPtr, wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   821
    uint64_t dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   822
    uint32_t wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   823
    uint_fast8_t carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   824
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   825
    bPtr += indexWordLo( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   826
    lastZPtr = zPtr + indexMultiwordHi( 8, 5 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   827
    zPtr += indexMultiwordLo( 8, 5 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   828
    wordB = *bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   829
    dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   830
    zPtr[indexWord( 5, 0 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   831
    dwordProd = (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   832
    zPtr[indexWord( 5, 1 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   833
    dwordProd = (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   834
    zPtr[indexWord( 5, 2 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   835
    dwordProd = (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   836
    zPtr[indexWord( 5, 3 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   837
    zPtr[indexWord( 5, 4 )] = dwordProd>>32;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   838
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   839
	bPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   840
	zPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   841
	wordB = *bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   842
	dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   843
	wordZ = zPtr[indexWord( 5, 0 )] + (uint32_t) dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   844
	zPtr[indexWord( 5, 0 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   845
	carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   846
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   847
	    (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   848
	wordZ = zPtr[indexWord( 5, 1 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   849
	zPtr[indexWord( 5, 1 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   850
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   851
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   852
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   853
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   854
	    (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   855
	wordZ = zPtr[indexWord( 5, 2 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   856
	zPtr[indexWord( 5, 2 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   857
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   858
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   859
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   860
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   861
	    (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   862
	wordZ = zPtr[indexWord( 5, 3 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   863
	zPtr[indexWord( 5, 3 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   864
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   865
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   866
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   867
	zPtr[indexWord( 5, 4 )] = (dwordProd>>32) + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   868
    } while ( zPtr != lastZPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   869
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   870
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   871
float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   872
softfloat_roundPackToF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   873
     bool sign,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   874
     int_fast32_t exp,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   875
     uint_fast64_t sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   876
     uint_fast64_t sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   877
     uint_fast64_t sigExtra
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   878
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   879
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   880
    uint_fast8_t roundingMode;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   881
    bool roundNearEven, doIncrement, isTiny;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   882
    struct uint128_extra sig128Extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   883
    uint_fast64_t uiZ64, uiZ0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   884
    struct uint128 sig128;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   885
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   886
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   887
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   888
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   889
    roundingMode = softfloat_roundingMode;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   890
    roundNearEven = (roundingMode == softfloat_round_near_even);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   891
    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   892
    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   893
	doIncrement =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   894
	    (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   895
		 == (sign ? softfloat_round_min : softfloat_round_max))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   896
		&& sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   897
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   898
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   899
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   900
    if ( 0x7FFD <= (uint32_t) exp ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   901
	if ( exp < 0 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   902
	    /*----------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   903
	    *----------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   904
	    isTiny =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   905
		   (softfloat_detectTininess
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   906
			== softfloat_tininess_beforeRounding)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   907
		|| (exp < -1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   908
		|| ! doIncrement
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   909
		|| softfloat_lt128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   910
		       sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   911
		       sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   912
		       UINT64_C( 0x0001FFFFFFFFFFFF ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   913
		       UINT64_C( 0xFFFFFFFFFFFFFFFF )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   914
		   );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   915
	    sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   916
		softfloat_shiftRightJam128Extra( sig64, sig0, sigExtra, -exp );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   917
	    sig64 = sig128Extra.v.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   918
	    sig0  = sig128Extra.v.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   919
	    sigExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   920
	    exp = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   921
	    if ( isTiny && sigExtra ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   922
		softfloat_raiseFlags( softfloat_flag_underflow );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   923
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   924
	    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   925
	    if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   926
		   ! roundNearEven
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   927
		&& (roundingMode != softfloat_round_near_maxMag)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   928
	    ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   929
		doIncrement =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   930
		    (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   931
			 == (sign ? softfloat_round_min : softfloat_round_max))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   932
			&& sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   933
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   934
	} else if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   935
	       (0x7FFD < exp)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   936
	    || ((exp == 0x7FFD)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   937
		    && softfloat_eq128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   938
			   sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   939
			   sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   940
			   UINT64_C( 0x0001FFFFFFFFFFFF ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   941
			   UINT64_C( 0xFFFFFFFFFFFFFFFF )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   942
		       )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   943
		    && doIncrement)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   944
	) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   945
	    /*----------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   946
	    *----------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   947
	    softfloat_raiseFlags(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   948
		softfloat_flag_overflow | softfloat_flag_inexact );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   949
	    if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   950
		   roundNearEven
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   951
		|| (roundingMode == softfloat_round_near_maxMag)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   952
		|| (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   953
			== (sign ? softfloat_round_min : softfloat_round_max))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   954
	    ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   955
		uiZ64 = packToF128UI64( sign, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   956
		uiZ0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   957
	    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   958
		uiZ64 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   959
		    packToF128UI64(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   960
			sign, 0x7FFE, UINT64_C( 0x0000FFFFFFFFFFFF ) );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   961
		uiZ0 = UINT64_C( 0xFFFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   962
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   963
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   964
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   965
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   966
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   967
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   968
    if ( sigExtra ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   969
	softfloat_exceptionFlags |= softfloat_flag_inexact;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   970
#ifdef SOFTFLOAT_ROUND_ODD
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   971
	if ( roundingMode == softfloat_round_odd ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   972
	    sig0 |= 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   973
	    goto packReturn;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   974
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   975
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   976
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   977
    if ( doIncrement ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   978
	sig128 = softfloat_add128( sig64, sig0, 0, 1 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   979
	sig64 = sig128.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   980
	sig0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   981
	    sig128.v0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   982
		& ~(uint64_t)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   983
		       (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   984
			    & roundNearEven);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   985
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   986
	if ( ! (sig64 | sig0) ) exp = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   987
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   988
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   989
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   990
 packReturn:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   991
    uiZ64 = packToF128UI64( sign, exp, sig64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   992
    uiZ0  = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   993
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   994
    uZ.ui.v64 = uiZ64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   995
    uZ.ui.v0  = uiZ0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   996
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   997
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   998
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   999
float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1000
 softfloat_normRoundPackToF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1001
     bool sign, int_fast32_t exp, uint_fast64_t sig64, uint_fast64_t sig0 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1002
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1003
    int_fast8_t shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1004
    struct uint128 sig128;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1005
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1006
    uint_fast64_t sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1007
    struct uint128_extra sig128Extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1008
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1009
    if ( ! sig64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1010
	exp -= 64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1011
	sig64 = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1012
	sig0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1013
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1014
    shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1015
    exp -= shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1016
    if ( 0 <= shiftDist ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1017
	if ( shiftDist ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1018
	    sig128 = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1019
	    sig64 = sig128.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1020
	    sig0  = sig128.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1021
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1022
	if ( (uint32_t) exp < 0x7FFD ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1023
	    uZ.ui.v64 = packToF128UI64( sign, sig64 | sig0 ? exp : 0, sig64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1024
	    uZ.ui.v0  = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1025
	    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1026
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1027
	sigExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1028
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1029
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1030
	    softfloat_shortShiftRightJam128Extra( sig64, sig0, 0, -shiftDist );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1031
	sig64 = sig128Extra.v.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1032
	sig0  = sig128Extra.v.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1033
	sigExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1034
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1035
    return softfloat_roundPackToF128( sign, exp, sig64, sig0, sigExtra );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1036
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1037
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1038
struct uint128
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1039
softfloat_propagateNaNF128UI(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1040
     uint_fast64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1041
     uint_fast64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1042
     uint_fast64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1043
     uint_fast64_t uiB0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1044
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1045
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1046
    bool isSigNaNA, isSigNaNB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1047
    uint_fast64_t uiNonsigA64, uiNonsigB64, uiMagA64, uiMagB64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1048
    struct uint128 uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1049
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1050
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1051
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1052
    isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1053
    isSigNaNB = softfloat_isSigNaNF128UI( uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1054
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1055
    | Make NaNs non-signaling.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1056
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1057
    uiNonsigA64 = uiA64 | UINT64_C( 0x0000800000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1058
    uiNonsigB64 = uiB64 | UINT64_C( 0x0000800000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1059
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1060
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1061
    if ( isSigNaNA | isSigNaNB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1062
	softfloat_raiseFlags( softfloat_flag_invalid );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1063
	if ( isSigNaNA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1064
	    if ( isSigNaNB ) goto returnLargerMag;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1065
	    if ( isNaNF128UI( uiB64, uiB0 ) ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1066
	    goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1067
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1068
	    if ( isNaNF128UI( uiA64, uiA0 ) ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1069
	    goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1070
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1071
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1072
 returnLargerMag:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1073
    uiMagA64 = uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1074
    uiMagB64 = uiB64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1075
    if ( uiMagA64 < uiMagB64 ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1076
    if ( uiMagB64 < uiMagA64 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1077
    if ( uiA0 < uiB0 ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1078
    if ( uiB0 < uiA0 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1079
    if ( uiNonsigA64 < uiNonsigB64 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1080
 returnB:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1081
    uiZ.v64 = uiNonsigB64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1082
    uiZ.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1083
    return uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1084
 returnA:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1085
    uiZ.v64 = uiNonsigA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1086
    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1087
    return uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1088
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1089
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1090
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1091
void
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1092
f64_to_f128M( float64_t a, float128_t *zPtr )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1093
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1094
    uint32_t *zWPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1095
    union ui64_f64 uA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1096
    uint64_t uiA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1097
    bool sign;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1098
    int_fast16_t exp;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1099
    uint64_t frac;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1100
    struct commonNaN commonNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1101
    uint32_t uiZ96;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1102
    struct exp16_sig64 normExpSig;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1103
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1104
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1105
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1106
    zWPtr = (uint32_t *) zPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1107
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1108
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1109
    uA.f = a;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1110
    uiA = uA.ui;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1111
    sign = signF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1112
    exp  = expF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1113
    frac = fracF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1114
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1115
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1116
    zWPtr[indexWord( 4, 0 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1117
    if ( exp == 0x7FF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1118
	if ( frac ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1119
	    softfloat_f64UIToCommonNaN( uiA, &commonNaN );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1120
	    softfloat_commonNaNToF128M( &commonNaN, zWPtr );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1121
	    return;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1122
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1123
	uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1124
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1125
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1126
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1127
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1128
    if ( ! exp ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1129
	if ( ! frac ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1130
	    uiZ96 = packToF128UI96( sign, 0, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1131
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1132
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1133
	normExpSig = softfloat_normSubnormalF64Sig( frac );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1134
	exp = normExpSig.exp - 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1135
	frac = normExpSig.sig;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1136
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1137
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1138
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1139
    zWPtr[indexWord( 4, 1 )] = (uint32_t) frac<<28;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1140
    frac >>= 4;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1141
    zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp + 0x3C00, frac>>32 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1142
    zWPtr[indexWord( 4, 2 )] = frac;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1143
    return;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1144
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1145
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1146
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1147
    zWPtr[indexWord( 4, 3 )] = uiZ96;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1148
    zWPtr[indexWord( 4, 2 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1149
    zWPtr[indexWord( 4, 1 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1150
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1151
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1152
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1153
static float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1154
softfloat_addMagsF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1155
     uint64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1156
     uint64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1157
     uint64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1158
     uint64_t uiB0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1159
     bool signZ
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1160
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1161
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1162
    int32_t expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1163
    struct uint128 sigA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1164
    int32_t expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1165
    struct uint128 sigB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1166
    int32_t expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1167
    struct uint128 uiZ, sigZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1168
    int32_t expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1169
    uint64_t sigZExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1170
    struct uint128_extra sig128Extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1171
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1172
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1173
    expA = expF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1174
    sigA.v64 = fracF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1175
    sigA.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1176
    expB = expF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1177
    sigB.v64 = fracF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1178
    sigB.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1179
    expDiff = expA - expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1180
    if ( ! expDiff ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1181
	if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1182
	    if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1183
	    uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1184
	    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1185
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1186
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1187
	sigZ = softfloat_add128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1188
	if ( ! expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1189
	    uiZ.v64 = packToF128UI64( signZ, 0, sigZ.v64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1190
	    uiZ.v0  = sigZ.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1191
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1192
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1193
	expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1194
	sigZ.v64 |= UINT64_C( 0x0002000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1195
	sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1196
	goto shiftRight1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1197
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1198
    if ( expDiff < 0 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1199
	if ( expB == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1200
	    if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1201
	    uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1202
	    uiZ.v0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1203
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1204
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1205
	expZ = expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1206
	if ( expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1207
	    sigA.v64 |= UINT64_C( 0x0001000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1208
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1209
	    ++expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1210
	    sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1211
	    if ( ! expDiff ) goto newlyAligned;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1212
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1213
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1214
	    softfloat_shiftRightJam128Extra( sigA.v64, sigA.v0, 0, -expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1215
	sigA = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1216
	sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1217
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1218
	if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1219
	    if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1220
	    uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1221
	    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1222
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1223
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1224
	expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1225
	if ( expB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1226
	    sigB.v64 |= UINT64_C( 0x0001000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1227
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1228
	    --expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1229
	    sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1230
	    if ( ! expDiff ) goto newlyAligned;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1231
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1232
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1233
	    softfloat_shiftRightJam128Extra( sigB.v64, sigB.v0, 0, expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1234
	sigB = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1235
	sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1236
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1237
 newlyAligned:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1238
    sigZ =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1239
	softfloat_add128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1240
	    sigA.v64 | UINT64_C( 0x0001000000000000 ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1241
	    sigA.v0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1242
	    sigB.v64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1243
	    sigB.v0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1244
	);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1245
    --expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1246
    if ( sigZ.v64 < UINT64_C( 0x0002000000000000 ) ) goto roundAndPack;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1247
    ++expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1248
 shiftRight1:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1249
    sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1250
	softfloat_shortShiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1251
	    sigZ.v64, sigZ.v0, sigZExtra, 1 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1252
    sigZ = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1253
    sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1254
 roundAndPack:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1255
    return
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1256
	softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1257
 propagateNaN:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1258
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1259
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1260
    uZ.ui = uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1261
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1262
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1263
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1264
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1265
float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1266
softfloat_subMagsF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1267
     uint_fast64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1268
     uint_fast64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1269
     uint_fast64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1270
     uint_fast64_t uiB0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1271
     bool signZ
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1272
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1273
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1274
    int_fast32_t expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1275
    struct uint128 sigA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1276
    int_fast32_t expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1277
    struct uint128 sigB, sigZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1278
    int_fast32_t expDiff, expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1279
    struct uint128 uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1280
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1281
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1282
    expA = expF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1283
    sigA.v64 = fracF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1284
    sigA.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1285
    expB = expF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1286
    sigB.v64 = fracF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1287
    sigB.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1288
    sigA = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 4 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1289
    sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 4 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1290
    expDiff = expA - expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1291
    if ( 0 < expDiff ) goto expABigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1292
    if ( expDiff < 0 ) goto expBBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1293
    if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1294
	if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1295
	softfloat_raiseFlags( softfloat_flag_invalid );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1296
	uiZ.v64 = defaultNaNF128UI64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1297
	uiZ.v0  = defaultNaNF128UI0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1298
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1299
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1300
    expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1301
    if ( ! expZ ) expZ = 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1302
    if ( sigB.v64 < sigA.v64 ) goto aBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1303
    if ( sigA.v64 < sigB.v64 ) goto bBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1304
    if ( sigB.v0 < sigA.v0 ) goto aBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1305
    if ( sigA.v0 < sigB.v0 ) goto bBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1306
    uiZ.v64 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1307
	packToF128UI64(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1308
	    (softfloat_roundingMode == softfloat_round_min), 0, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1309
    uiZ.v0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1310
    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1311
 expBBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1312
    if ( expB == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1313
	if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1314
	uiZ.v64 = packToF128UI64( signZ ^ 1, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1315
	uiZ.v0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1316
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1317
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1318
    if ( expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1319
	sigA.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1320
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1321
	++expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1322
	if ( ! expDiff ) goto newlyAlignedBBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1323
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1324
    sigA = softfloat_shiftRightJam128( sigA.v64, sigA.v0, -expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1325
 newlyAlignedBBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1326
    expZ = expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1327
    sigB.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1328
 bBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1329
    signZ = ! signZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1330
    sigZ = softfloat_sub128( sigB.v64, sigB.v0, sigA.v64, sigA.v0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1331
    goto normRoundPack;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1332
 expABigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1333
    if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1334
	if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1335
	uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1336
	uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1337
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1338
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1339
    if ( expB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1340
	sigB.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1341
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1342
	--expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1343
	if ( ! expDiff ) goto newlyAlignedABigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1344
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1345
    sigB = softfloat_shiftRightJam128( sigB.v64, sigB.v0, expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1346
 newlyAlignedABigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1347
    expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1348
    sigA.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1349
 aBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1350
    sigZ = softfloat_sub128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1351
 normRoundPack:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1352
    return softfloat_normRoundPackToF128( signZ, expZ - 5, sigZ.v64, sigZ.v0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1353
 propagateNaN:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1354
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1355
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1356
    uZ.ui = uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1357
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1358
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1359
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1360
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1361
void
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1362
f128M_add( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1363
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1364
    const uint64_t *aWPtr, *bWPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1365
    uint64_t uiA64, uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1366
    int signA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1367
    uint64_t uiB64, uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1368
    int signB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1369
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1370
    aWPtr = (const uint64_t *) aPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1371
    bWPtr = (const uint64_t *) bPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1372
    uiA64 = aWPtr[indexWord( 2, 1 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1373
    uiA0  = aWPtr[indexWord( 2, 0 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1374
    signA = signF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1375
    uiB64 = bWPtr[indexWord( 2, 1 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1376
    uiB0  = bWPtr[indexWord( 2, 0 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1377
    signB = signF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1378
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1379
    if ( signA == signB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1380
	*zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1381
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1382
	*zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1383
    }
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1384
}
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1385
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1386
void
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1387
f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1388
{
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1389
    const uint64_t *aWPtr, *bWPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1390
    uint_fast64_t uiA64, uiA0;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1391
    bool signA;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1392
    uint_fast64_t uiB64, uiB0;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1393
    bool signB;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1394
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1395
    aWPtr = (const uint64_t *) aPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1396
    bWPtr = (const uint64_t *) bPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1397
    uiA64 = aWPtr[indexWord( 2, 1 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1398
    uiA0  = aWPtr[indexWord( 2, 0 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1399
    signA = signF128UI64( uiA64 );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1400
    uiB64 = bWPtr[indexWord( 2, 1 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1401
    uiB0  = bWPtr[indexWord( 2, 0 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1402
    signB = signF128UI64( uiB64 );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1403
    if ( signA == signB ) {
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1404
	*zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1405
    } else {
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1406
	*zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1407
    }
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1408
}
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1409
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1410
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1411
f128M_mul( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1412
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1413
    const uint32_t *aWPtr, *bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1414
    uint32_t *zWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1415
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1416
    int32_t expA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1417
    uint32_t uiB96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1418
    int32_t expB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1419
    bool signZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1420
    const uint32_t *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1421
    uint32_t uiZ96, sigA[4];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1422
    uint_fast8_t shiftDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1423
    uint32_t sigB[4];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1424
    int32_t expZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1425
    uint32_t sigProd[8], *extSigZPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1426
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1427
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1428
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1429
    aWPtr = (const uint32_t *) aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1430
    bWPtr = (const uint32_t *) bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1431
    zWPtr = (uint32_t *) zPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1432
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1433
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1434
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1435
    expA = expF128UI96( uiA96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1436
    uiB96 = bWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1437
    expB = expF128UI96( uiB96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1438
    signZ = signF128UI96( uiA96 ) ^ signF128UI96( uiB96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1439
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1440
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1441
    if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1442
	if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1443
	ptr = aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1444
	if ( ! expA ) goto possiblyInvalid;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1445
	if ( ! expB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1446
	    ptr = bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1447
     possiblyInvalid:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1448
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1449
		! fracF128UI96( ptr[indexWordHi( 4 )] )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1450
		    && ! (ptr[indexWord( 4, 2 )] | ptr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1451
			      | ptr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1452
	    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1453
		softfloat_invalidF128M( zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1454
		return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1455
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1456
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1457
	uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1458
	goto uiZ96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1459
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1460
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1461
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1462
    if ( expA ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1463
	sigA[indexWordHi( 4 )] = fracF128UI96( uiA96 ) | 0x00010000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1464
	sigA[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1465
	sigA[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1466
	sigA[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1467
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1468
	expA = softfloat_shiftNormSigF128M( aWPtr, 0, sigA );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1469
	if ( expA == -128 ) goto zero;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1470
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1471
    if ( expB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1472
	sigB[indexWordHi( 4 )] = fracF128UI96( uiB96 ) | 0x00010000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1473
	sigB[indexWord( 4, 2 )] = bWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1474
	sigB[indexWord( 4, 1 )] = bWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1475
	sigB[indexWord( 4, 0 )] = bWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1476
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1477
	expB = softfloat_shiftNormSigF128M( bWPtr, 0, sigB );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1478
	if ( expB == -128 ) goto zero;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1479
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1480
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1481
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1482
    expZ = expA + expB - 0x4000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1483
    softfloat_mul128MTo256M( sigA, sigB, sigProd );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1484
    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1485
	sigProd[indexWord( 8, 2 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1486
	    || (sigProd[indexWord( 8, 1 )] | sigProd[indexWord( 8, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1487
    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1488
	sigProd[indexWord( 8, 3 )] |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1489
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1490
    extSigZPtr = &sigProd[indexMultiwordHi( 8, 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1491
    shiftDist = 16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1492
    if ( extSigZPtr[indexWordHi( 5 )] & 2 ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1493
	++expZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1494
	shiftDist = 15;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1495
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1496
    softfloat_shortShiftLeft160M( extSigZPtr, shiftDist, extSigZPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1497
    softfloat_roundPackMToF128M( signZ, expZ, extSigZPtr, zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1498
    return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1499
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1500
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1501
 zero:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1502
    uiZ96 = packToF128UI96( signZ, 0, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1503
 uiZ96:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1504
    zWPtr[indexWordHi( 4 )] = uiZ96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1505
    zWPtr[indexWord( 4, 2 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1506
    zWPtr[indexWord( 4, 1 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1507
    zWPtr[indexWord( 4, 0 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1508
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1509
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1510
#endif // SUPPORT_QUADFLOAT
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1511
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1512
%}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1513
! !
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1514
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1515
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1516
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1517
documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1518
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1519
    QuadFloats represent rational numbers with limited precision
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1520
    and are mapped to IEEE quadruple precision format (128bit).
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1521
    If the underlying cpu supports them natively, the machine format (long double) is
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1522
    used. Otherwise, a software emulation is done, which is much slower.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1523
    Thus only use them, if you really need the additional precision;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1524
    if not, use Float (which are doubles) or LongFloats which usually have IEEE extended precision (80bit).
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1525
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1526
    QuadFloats give you definite 128 bit quadruple floats,
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1527
    thus, code using quadFloats is guaranteed to be portable from one architecture to another.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1528
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1529
    Representation:
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1530
	    128bit quadruple IEEE floats (16bytes);
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1531
	    112 bit mantissa,
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1532
	    16 bit exponent,
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1533
	    34 decimal digits (approx.)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1534
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1535
    On Sparc CPUs, this is a native supported type (long double) and fast;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1536
    on x86 CPUs, this is emulated and slow.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1537
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1538
    Mixed mode arithmetic:
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1539
	quadFloat op anyFloat    -> longFloat
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1540
	longFloat op complex     -> complex
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1541
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1542
    Range and precision of storage formats: see LimitedPrecisionReal >> documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1543
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1544
    [author:]
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1545
	Claus Gittinger
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1546
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1547
    [see also:]
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1548
	Number
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1549
	Float ShortFloat LongFloat Fraction FixedPoint Integer Complex
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1550
	FloatArray DoubleArray
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1551
	https://en.wikipedia.org/wiki/Extended_precision
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1552
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1553
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1554
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1555
!QuadFloat class methodsFor:'instance creation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1556
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1557
basicNew
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1558
    "return a new quadFloat - here we return 0.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1559
     - QuadFloats are usually NOT created this way ...
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1560
     Its implemented here to allow things like binary store & load
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1561
     of quadFloats.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1562
     (but it is not a good idea to store the bits of a float - the reader might have a
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1563
      totally different representation - so floats should be
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1564
      binary stored in a device independent format)."
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1565
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1566
%{  /* NOCONTEXT */
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1567
#ifdef SUPPORT_QUADFLOAT
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1568
    OBJ newFloat;
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1569
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1570
    if (sizeof(long double) == sizeof(float128_t)) {
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1571
	__qMKLFLOAT(newFloat, 0.0);   /* OBJECT ALLOCATION */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1572
    } else {
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1573
	float128_t qf;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1574
	f64_to_f128M(0.0, &qf);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1575
	__qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1576
    }
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1577
    RETURN (newFloat);
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1578
#endif /* SUPPORT_QUADFLOAT */
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1579
%}.
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1580
    self error:'QuadFloats not supported on this patform'
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1581
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1582
    "Created: / 06-06-2019 / 17:18:58 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1583
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1584
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1585
fromFloat:aFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1586
    "return a new quadFloat, given a float value"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1587
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1588
%{  /* NOCONTEXT */
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1589
#ifdef SUPPORT_QUADFLOAT
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1590
    OBJ newFloat;
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1591
    float128_t f;
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1592
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1593
    if (__isFloatLike(aFloat)) {
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1594
	float64_t f = __floatVal(aFloat);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1595
	float128_t qf;
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1596
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1597
	f64_to_f128M(f, &qf);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1598
	__qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1599
	RETURN (newFloat);
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1600
    }
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1601
#endif /* SUPPORT_QUADFLOAT */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1602
%}.
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1603
    aFloat isFloat ifTrue:[
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  1604
	self errorUnsupported
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  1605
    ].
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  1606
    ArgumentError raise
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1607
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1608
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1609
     QuadFloat fromFloat:123.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1610
     123.0 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1611
     123 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1612
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1613
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1614
    "Created: / 06-06-2019 / 18:01:03 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1615
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1616
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1617
!QuadFloat class methodsFor:'coercing & converting'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1618
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1619
coerce:aNumber
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1620
    "convert the argument aNumber into an instance of the receiver's class and return it."
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1621
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1622
    ^ aNumber asQuadFloat.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1623
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1624
    "Created: / 06-06-2019 / 16:51:01 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1625
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1626
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1627
!QuadFloat class methodsFor:'constants'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1628
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1629
NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1630
    "return a shortFloat which represents not-a-Number (i.e. an invalid number)"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1631
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1632
    NaN isNil ifTrue:[
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1633
	NaN := super NaN
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1634
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1635
    ^ NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1636
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1637
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1638
     self NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1639
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1640
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1641
    "Created: / 06-06-2019 / 16:56:09 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1642
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1643
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1644
e
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1645
    "return the constant e as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1646
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1647
    E isNil ifTrue:[
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1648
	"/ eDigits has enough digits for 128bit IEEE quads
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1649
	"/ do not use as a literal constant here - we cannot depend on the underlying C-compiler here...
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1650
	E  := self readFrom:(Number eDigits)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1651
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1652
    ^ E
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1653
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1654
    "Created: / 06-06-2019 / 17:01:54 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1655
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1656
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1657
pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1658
    "return the constant pi as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1659
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1660
    Pi isNil ifTrue:[
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1661
	"/ piDigits has enough digits for 128bit IEEE quads
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1662
	"/ do not use as a literal constant here - we cannot depend on the underlying C-compiler here...
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  1663
	Pi  := self readFrom:(Number piDigits)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1664
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1665
    ^ Pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1666
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1667
    "Created: / 06-06-2019 / 17:09:51 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1668
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1669
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1670
!QuadFloat class methodsFor:'error reportng'!
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1671
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  1672
errorUnsupported
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  1673
    self error:'QuadFloats not supported on this patform'
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  1674
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1675
    "Created: / 07-06-2019 / 02:44:39 / Claus Gittinger"
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1676
! !
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1677
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1678
!QuadFloat methodsFor:'arithmetic'!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1679
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1680
* aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1681
    "return the product of the receiver and the argument."
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1682
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1683
    ^ aNumber productFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1684
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1685
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1686
+ aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1687
    "return the sum of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1688
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1689
    ^ aNumber sumFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1690
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1691
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1692
- aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1693
    "return the difference of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1694
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1695
    ^ aNumber differenceFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1696
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1697
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1698
/ aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1699
    "return the quotient of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1700
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1701
    aNumber isZero ifTrue:[
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1702
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1703
	 No, you shalt not divide by zero
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1704
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1705
	^ ZeroDivide raiseRequestWith:thisContext.
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1706
    ].
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1707
    ^ aNumber quotientFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1708
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1709
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1710
rem: aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1711
    "return the floating point remainder of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1712
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1713
    aNumber isZero ifTrue:[
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1714
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1715
	 No, you shalt not divide by zero
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1716
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1717
	^ ZeroDivide raiseRequestWith:thisContext.
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1718
    ].
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1719
    ^ aNumber remainderFromLongFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1720
! !
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  1721
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1722
!QuadFloat methodsFor:'double dispatching'!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1723
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1724
differenceFromQuadFloat:aQuadFloat
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1725
%{
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1726
#ifdef SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1727
    OBJ newFloat;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1728
    float128_t result, myVal, argVal;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1729
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1730
    myVal = __quadFloatVal(self);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1731
    argVal = __quadFloatVal(aQuadFloat);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1732
    f128M_sub( &myVal, &argVal, &result );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1733
    __qMKQFLOAT(newFloat, result);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1734
    RETURN ( newFloat );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1735
#endif // SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1736
%}.
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1737
    self errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1738
!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1739
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1740
sumFromQuadFloat:aQuadFloat
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1741
    "sent when aQuadFloat does not know how to add the receiver, self"
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1742
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1743
%{
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1744
#ifdef SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1745
    OBJ newFloat;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1746
    float128_t result, myVal, argVal;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1747
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1748
    myVal = __quadFloatVal(self);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1749
    argVal = __quadFloatVal(aQuadFloat);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1750
    f128M_add( &myVal, &argVal, &result );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1751
    __qMKQFLOAT(newFloat, result);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1752
    RETURN ( newFloat );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1753
#endif // SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1754
%}.
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1755
    self errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1756
! !
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1757
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1758
!QuadFloat methodsFor:'error reportng'!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1759
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1760
errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1761
    self class errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1762
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1763
    "Modified: / 07-06-2019 / 02:44:51 / Claus Gittinger"
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1764
! !
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1765
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1766
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1767
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1768
version_CVS
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1769
    ^ '$Header$'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1770
! !
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  1771