QuadFloat.st
author Claus Gittinger <cg@exept.de>
Tue, 11 Jun 2019 00:16:03 +0200
changeset 5025 b1d9b71d6937
parent 5024 e8cea2066c05
child 5027 49e378bf72b7
permissions -rw-r--r--
#DOCUMENTATION by cg class: QuadFloat added: #printOn: class: QuadFloat class added: #numBitsInExponent
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5012
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
     1
"{ Encoding: utf8 }"
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
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
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
    20
#if defined(__MSBFIRST__) || defined(__MSB_FIRST__) || defined(MSBFIRST)
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
    21
# undef LITTLEENDIAN
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
    22
#else
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
    23
# define LITTLEENDIAN
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
    24
#endif
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    25
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
    26
#ifdef SUPPORT_QUADFLOAT
4998
1ed27f918576 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4997
diff changeset
    27
# include <stdint.h>
1ed27f918576 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4997
diff changeset
    28
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    29
// The following code is adapted from the Softfloat-3e package,
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    30
// which includes the following license/copyright statement:
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    31
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    32
// License for Berkeley SoftFloat Release 3e
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    33
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    34
// John R. Hauser
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    35
// 2018 January 20
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    36
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    37
// The following applies to the whole of SoftFloat Release 3e as well as to
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    38
// each source file individually.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    39
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    40
// Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    41
// University of California.  All rights reserved.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    42
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    43
// Redistribution and use in source and binary forms, with or without
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    44
// modification, are permitted provided that the following conditions are met:
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    45
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    46
//  1. Redistributions of source code must retain the above copyright notice,
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    47
//     this list of conditions, and the following disclaimer.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    48
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    49
//  2. Redistributions in binary form must reproduce the above copyright
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    50
//     notice, this list of conditions, and the following disclaimer in the
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    51
//     documentation and/or other materials provided with the distribution.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    52
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    53
//  3. Neither the name of the University nor the names of its contributors
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    54
//     may be used to endorse or promote products derived from this software
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    55
//     without specific prior written permission.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    56
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    57
// THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    58
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    59
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    60
// DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    61
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    62
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    63
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    64
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    65
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    66
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    67
//
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
    68
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    69
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    70
| Software floating-point underflow tininess-detection mode.
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
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    73
    softfloat_tininess_beforeRounding = 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    74
    softfloat_tininess_afterRounding  = 1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    75
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    76
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    77
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    78
| Software floating-point exception flags.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    79
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    80
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    81
    softfloat_flag_inexact   =  1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    82
    softfloat_flag_underflow =  2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    83
    softfloat_flag_overflow  =  4,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    84
    softfloat_flag_infinite  =  8,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    85
    softfloat_flag_invalid   = 16
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
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    88
| 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
    89
| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    90
*----------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    91
enum {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    92
    softfloat_round_near_even   = 0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    93
    softfloat_round_minMag      = 1,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    94
    softfloat_round_min         = 2,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    95
    softfloat_round_max         = 3,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    96
    softfloat_round_near_maxMag = 4,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    97
    softfloat_round_odd         = 6
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    98
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
    99
#define init_detectTininess softfloat_tininess_afterRounding
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   100
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   101
typedef unsigned char bool;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   102
typedef double        float64_t;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   103
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   104
#if defined(LITTLEENDIAN)
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   105
struct uint128          { uint64_t v0, v64; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   106
struct uint64_extra     { uint64_t extra, v; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   107
struct uint128_extra    { uint64_t extra; struct uint128 v; };
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   108
struct extFloat80M      { uint64_t signif; uint16_t signExp; };
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   109
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   110
struct uint128          { uint64_t v64, v0; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   111
struct uint64_extra     { uint64_t v, extra; };
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   112
struct uint128_extra    { struct uint128 v; uint64_t extra; };
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   113
struct extFloat80M      { uint16_t signExp; uint64_t signif; };
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   114
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   115
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   116
union ui64_f64          { uint64_t ui; float64_t f; };
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   117
union ui128_f128        { struct uint128 ui; float128_t f; };
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   118
struct exp32_sig128     { int_fast32_t exp; struct uint128 sig; };
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   119
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   120
typedef struct extFloat80M        extFloat80_t;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   121
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   122
/*----------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   123
| 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
   124
*----------------------------------------------------------------------------*/
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   125
#define defaultNaNF128UI96_32 0xFFFF8000
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   126
#define defaultNaNF128UI64_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   127
#define defaultNaNF128UI32_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   128
#define defaultNaNF128UI0_32  0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   129
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   130
// #define defaultNaNF128UI64_64 UINT64_C( 0x7FFF800000000000 )
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   131
// #define defaultNaNF128UI0_64  UINT64_C( 0 )
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   132
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   133
/*----------------------------------------------------------------------------
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   134
| The bit pattern for a default generated 128-bit floating-point +INF.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   135
*----------------------------------------------------------------------------*/
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
   136
#define defaultPInfF128UI96_32 0x7FFF0000
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   137
#define defaultPInfF128UI64_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   138
#define defaultPInfF128UI32_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   139
#define defaultPInfF128UI0_32  0
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   140
/*----------------------------------------------------------------------------
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   141
| The bit pattern for a default generated 128-bit floating-point -INF.
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
   142
*----------------------------------------------------------------------------*/
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
   143
#define defaultNInfF128UI96_32 0xFFFF0000
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   144
#define defaultNInfF128UI64_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   145
#define defaultNInfF128UI32_32 0
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   146
#define defaultNInfF128UI0_32  0
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   147
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   148
struct commonNaN {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   149
    bool sign;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   150
#ifdef LITTLEENDIAN
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   151
    uint64_t v0, v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   152
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   153
    uint64_t v64, v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   154
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   155
};
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   156
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
   157
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   158
#endif // SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   159
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   160
%}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   161
! !
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   162
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   163
!QuadFloat primitiveVariables!
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   164
%{
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   165
#ifdef SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   166
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   167
uint_fast8_t softfloat_exceptionFlags;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   168
uint_fast8_t softfloat_roundingMode = softfloat_round_near_even;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   169
uint_fast8_t softfloat_detectTininess = init_detectTininess;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   170
uint_fast8_t softfloat_exceptionFlags = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   171
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   172
const uint_least8_t softfloat_countLeadingZeros8[256] = {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   173
    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
   174
    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
   175
    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
   176
    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
   177
    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
   178
    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
   179
    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
   180
    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
   181
    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
   182
    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
   183
    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
   184
    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
   185
    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
   186
    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
   187
    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
   188
    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
   189
};
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   190
#endif // SUPPORT_QUADFLOAT
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   191
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   192
%}
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   193
! !
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
   194
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   195
!QuadFloat primitiveFunctions!
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   196
%{
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
   197
#ifdef SUPPORT_QUADFLOAT
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   198
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   199
#if defined(LITTLEENDIAN) || defined(__LSBFIRST__)
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   200
#define wordIncr 1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   201
#define indexWord( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   202
#define indexWordHi( total ) ((total) - 1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   203
#define indexWordLo( total ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   204
#define indexMultiword( total, m, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   205
#define indexMultiwordHi( total, n ) ((total) - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   206
#define indexMultiwordLo( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   207
#define indexMultiwordHiBut( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   208
#define indexMultiwordLoBut( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   209
#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
   210
#else
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   211
#define wordIncr -1
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   212
#define indexWord( total, n ) ((total) - 1 - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   213
#define indexWordHi( total ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   214
#define indexWordLo( total ) ((total) - 1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   215
#define indexMultiword( total, m, n ) ((total) - 1 - (m))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   216
#define indexMultiwordHi( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   217
#define indexMultiwordLo( total, n ) ((total) - (n))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   218
#define indexMultiwordHiBut( total, n ) 0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   219
#define indexMultiwordLoBut( total, n ) (n)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   220
#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
   221
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   222
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   223
#define signF64UI( a ) ((bool) ((uint64_t) (a)>>63))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   224
#define expF64UI( a ) ((int_fast16_t) ((a)>>52) & 0x7FF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   225
#define fracF64UI( a ) ((a) & UINT64_C( 0x000FFFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   226
#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
   227
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   228
#define signF128UI64( a64 ) ((bool) ((uint64_t) (a64)>>63))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   229
#define expF128UI64( a64 ) ((int_fast32_t) ((a64)>>48) & 0x7FFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   230
#define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   231
#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
   232
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   233
#define signF128UI96( a96 ) ((bool) ((uint32_t) (a96)>>31))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   234
#define expF128UI96( a96 ) ((int32_t) ((a96)>>16) & 0x7FFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   235
#define fracF128UI96( a96 ) ((a96) & 0x0000FFFF)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   236
#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
   237
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   238
#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
   239
#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   240
#define softfloat_approxRecip32_1( a ) ((uint32_t) (UINT64_C( 0x7FFFFFFFFFFFFFFF ) / (uint32_t) (a)))
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
   241
#define isInfF128UI( a64, a0 ) (((a64) & UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000))
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   242
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   243
#define signExtF80UI64( a64 ) ((bool) ((uint16_t) (a64)>>15))
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   244
#define expExtF80UI64( a64 ) ((a64) & 0x7FFF)
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   245
#define packToExtF80UI64( sign, exp ) ((uint_fast16_t) (sign)<<15 | (exp))
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   246
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   247
#define isNaNExtF80UI( a64, a0 ) ((((a64) & 0x7FFF) == 0x7FFF) && ((a0) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   248
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   249
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   250
| This function or macro is the same as 'softfloat_shortShiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   251
| 'size_words' = 5 (N = 160).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   252
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   253
#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
   254
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   255
| This function or macro is the same as 'softfloat_shiftRightJamM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   256
| 'size_words' = 5 (N = 160).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   257
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   258
#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
   259
/*----------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   260
| This function or macro is the same as 'softfloat_shortShiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   261
| 'size_words' = 4 (N = 128).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   262
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   263
#define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   264
/*----------------------------------------------------------------------------
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   265
| This function or macro is the same as 'softfloat_shortShiftLeftM' with
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   266
| 'size_words' = 3 (N = 96).
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   267
*----------------------------------------------------------------------------*/
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
   268
#define softfloat_shortShiftLeft96M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 3, aPtr, dist, zPtr )
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   269
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   270
static inline void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   271
softfloat_raiseFlags( uint_fast8_t flags ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   272
    softfloat_exceptionFlags |= flags;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   273
}
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
#if 1
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   276
static inline void
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   277
softfloat_commonNaNToF128M( uint32_t *zWPtr )
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   278
{
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   279
    zWPtr[indexWord( 4, 3 )] = defaultNaNF128UI96_32;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   280
    zWPtr[indexWord( 4, 2 )] = defaultNaNF128UI64_32;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   281
    zWPtr[indexWord( 4, 1 )] = defaultNaNF128UI32_32;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   282
    zWPtr[indexWord( 4, 0 )] = defaultNaNF128UI0_32;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   283
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   284
#else
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   285
# define softfloat_commonNaNToF128M( zWPtr ) \
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   286
{ \
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   287
    (zWPtr)[indexWord( 4, 3 )] = defaultNaNF128UI96_32; \
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   288
    (zWPtr)[indexWord( 4, 2 )] = defaultNaNF128UI64_32; \
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   289
    (zWPtr)[indexWord( 4, 1 )] = defaultNaNF128UI32_32; \
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   290
    (zWPtr)[indexWord( 4, 0 )] = defaultNaNF128UI0_32; \
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   291
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   292
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   293
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   294
/*----------------------------------------------------------------------------
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   295
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   296
| has the bit pattern of an 80-bit extended floating-point NaN, converts
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   297
| this NaN to the common NaN form, and stores the resulting common NaN at the
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   298
| location pointed to by 'zPtr'.  If the NaN is a signaling NaN, the invalid
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   299
| exception is raised.
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   300
*----------------------------------------------------------------------------*/
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   301
#define softfloat_extF80UIToCommonNaN( uiA64, uiA0, zPtr ) if ( ! ((uiA0) & UINT64_C( 0x4000000000000000 )) ) softfloat_raiseFlags( softfloat_flag_invalid )
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   302
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   303
static inline void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   304
softfloat_invalidF128M( uint32_t *zWPtr ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   305
    softfloat_raiseFlags( softfloat_flag_invalid );
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   306
    softfloat_commonNaNToF128M( zWPtr );
5000
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
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   309
static bool
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   310
f128M_isSignalingNaN( const float128_t *aPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   311
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   312
    const uint32_t *aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   313
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   314
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   315
    aWPtr = (const uint32_t *) aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   316
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   317
    if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   318
    return
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   319
	((uiA96 & 0x00007FFF) != 0)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   320
	    || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   321
		     | aWPtr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   322
		    != 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   323
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   324
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   325
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   326
softfloat_shortShiftRightJamM(
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   327
     uint_fast8_t size_words,
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   328
     const uint32_t *aPtr,
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   329
     uint_fast8_t dist,
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   330
     uint32_t *zPtr
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   331
 )
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   332
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   333
    uint_fast8_t uNegDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   334
    unsigned int index, lastIndex;
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   335
    uint32_t partWordZ, wordA;
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   336
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   337
    uNegDist = -dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   338
    index = indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   339
    lastIndex = indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   340
    wordA = aPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   341
    partWordZ = wordA>>dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   342
    if ( partWordZ<<dist != wordA ) partWordZ |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   343
    while ( index != lastIndex ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   344
	wordA = aPtr[index + wordIncr];
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   345
	zPtr[index] = wordA<<(uNegDist & 31) | partWordZ;
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   346
	index += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   347
	partWordZ = wordA>>dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   348
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   349
    zPtr[index] = partWordZ;
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   350
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   351
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   352
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   353
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   354
softfloat_shiftRightJamM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   355
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   356
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   357
     uint32_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   358
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   359
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   360
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   361
    uint32_t wordJam, wordDist, *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   362
    uint_fast8_t i, innerDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   363
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   364
    wordJam = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   365
    wordDist = dist>>5;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   366
    if ( wordDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   367
	if ( size_words < wordDist ) wordDist = size_words;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   368
	ptr = (uint32_t *) (aPtr + indexMultiwordLo( size_words, wordDist ));
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   369
	i = wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   370
	do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   371
	    wordJam = *ptr++;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   372
	    if ( wordJam ) break;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   373
	    --i;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   374
	} while ( i );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   375
	ptr = zPtr;
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
    if ( wordDist < size_words ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   378
	aPtr += indexMultiwordHiBut( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   379
	innerDist = dist & 31;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   380
	if ( innerDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   381
	    softfloat_shortShiftRightJamM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   382
		size_words - wordDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   383
		aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   384
		innerDist,
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
   385
		(zPtr + indexMultiwordLoBut( size_words, wordDist ))
5000
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
	    if ( ! wordDist ) goto wordJam;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   388
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   389
	    aPtr += indexWordLo( size_words - wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   390
	    ptr = zPtr + indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   391
	    for ( i = size_words - wordDist; i; --i ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   392
		*ptr = *aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   393
		aPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   394
		ptr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   395
	    }
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
	ptr = zPtr + indexMultiwordHi( size_words, wordDist );
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
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   400
	*ptr++ = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   401
	--wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   402
    } while ( wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   403
 wordJam:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   404
    if ( wordJam ) zPtr[indexWordLo( size_words )] |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   405
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
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   409
 softfloat_shortShiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   410
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   411
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   412
     uint_fast8_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   413
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   414
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   415
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   416
    uint_fast8_t uNegDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   417
    unsigned int index, lastIndex;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   418
    uint32_t partWordZ, wordA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   419
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   420
    uNegDist = -dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   421
    index = indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   422
    lastIndex = indexWordLo( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   423
    partWordZ = aPtr[index]<<dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   424
    while ( index != lastIndex ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   425
	wordA = aPtr[index - wordIncr];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   426
	zPtr[index] = partWordZ | wordA>>(uNegDist & 31);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   427
	index -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   428
	partWordZ = wordA<<dist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   429
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   430
    zPtr[index] = partWordZ;
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
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   433
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   434
softfloat_shiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   435
     uint_fast8_t size_words,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   436
     const uint32_t *aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   437
     uint32_t dist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   438
     uint32_t *zPtr
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   439
 )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   440
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   441
    uint32_t wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   442
    uint_fast8_t innerDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   443
    uint32_t *destPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   444
    uint_fast8_t i;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   445
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   446
    wordDist = dist>>5;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   447
    if ( wordDist < size_words ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   448
	aPtr += indexMultiwordLoBut( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   449
	innerDist = dist & 31;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   450
	if ( innerDist ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   451
	    softfloat_shortShiftLeftM(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   452
		size_words - wordDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   453
		aPtr,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   454
		innerDist,
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   455
		zPtr + indexMultiwordHiBut( size_words, wordDist )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   456
	    );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   457
	    if ( ! wordDist ) return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   458
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   459
	    aPtr += indexWordHi( size_words - wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   460
	    destPtr = zPtr + indexWordHi( size_words );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   461
	    for ( i = size_words - wordDist; i; --i ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   462
		*destPtr = *aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   463
		aPtr -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   464
		destPtr -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   465
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   466
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   467
	zPtr += indexMultiwordLo( size_words, wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   468
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   469
	wordDist = size_words;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   470
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   471
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   472
	*zPtr++ = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   473
	--wordDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   474
    } while ( wordDist );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   475
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   476
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
| This function or macro is the same as 'softfloat_shiftLeftM' with
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   479
| 'size_words' = 4 (N = 128).
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   480
*----------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   481
#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
   482
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   483
bool
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   484
softfloat_isNaNF128M( const uint32_t *aWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   485
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   486
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   487
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   488
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   489
    if ( (~uiA96 & 0x7FFF0000) != 0 ) return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   490
    return
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   491
	((uiA96 & 0x0000FFFF) != 0)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   492
	    || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   493
		     | aWPtr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   494
		    != 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   495
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   496
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   497
static inline uint_fast8_t
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   498
softfloat_countLeadingZeros32( uint32_t a ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   499
    return a ? __builtin_clz( a ) : 32;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   500
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   501
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   502
static inline bool
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   503
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
   504
    return (a64 == b64) && (a0 == b0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   505
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   506
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   507
static inline bool
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   508
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
   509
    return (a64 < b64) || ((a64 == b64) && (a0 < b0));
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   510
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   511
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   512
static inline bool
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   513
softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 ){
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   514
    return (a64 < b64) || ((a64 == b64) && (a0 <= b0));
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   515
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   516
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   517
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   518
softfloat_propagateNaNF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   519
     const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   520
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   521
    bool isSigNaNA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   522
    const uint32_t *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   523
    bool isSigNaNB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   524
    uint32_t uiA96, uiB96, wordMagA, wordMagB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   525
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   526
    isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   527
    ptr = aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   528
    if ( ! bWPtr ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   529
	if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   530
	goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   531
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   532
    isSigNaNB = f128M_isSignalingNaN( (const float128_t *) bWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   533
    if ( isSigNaNA | isSigNaNB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   534
	softfloat_raiseFlags( softfloat_flag_invalid );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   535
	if ( isSigNaNA ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   536
	    if ( isSigNaNB ) goto returnLargerUIMag;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   537
	    if ( softfloat_isNaNF128M( bWPtr ) ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   538
	    goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   539
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   540
	    if ( softfloat_isNaNF128M( aWPtr ) ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   541
	    goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   542
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   543
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   544
 returnLargerUIMag:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   545
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   546
    uiB96 = bWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   547
    wordMagA = uiA96 & 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   548
    wordMagB = uiB96 & 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   549
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   550
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   551
    wordMagA = aWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   552
    wordMagB = bWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   553
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   554
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   555
    wordMagA = aWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   556
    wordMagB = bWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   557
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   558
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   559
    wordMagA = aWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   560
    wordMagB = bWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   561
    if ( wordMagA < wordMagB ) goto copyB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   562
    if ( wordMagB < wordMagA ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   563
    if ( uiA96 < uiB96 ) goto copy;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   564
 copyB:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   565
    ptr = bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   566
 copy:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   567
    zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   568
    zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   569
    zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   570
    zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   571
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   572
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   573
static inline uint_fast8_t
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   574
softfloat_countLeadingZeros64( uint64_t a )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   575
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   576
    uint_fast8_t count;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   577
    uint32_t a32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   578
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   579
    count = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   580
    a32 = a>>32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   581
    if ( ! a32 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   582
	count = 32;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   583
	a32 = a;
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
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   586
    | 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
   587
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   588
    if ( a32 < 0x10000 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   589
	count += 16;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   590
	a32 <<= 16;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   591
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   592
    if ( a32 < 0x1000000 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   593
	count += 8;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   594
	a32 <<= 8;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   595
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   596
    count += softfloat_countLeadingZeros8[a32>>24];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   597
    return count;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   598
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   599
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   600
static inline struct exp16_sig64
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   601
softfloat_normSubnormalF64Sig( uint_fast64_t sig )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   602
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   603
    int_fast8_t shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   604
    struct exp16_sig64 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   605
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   606
    shiftDist = softfloat_countLeadingZeros64( sig ) - 11;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   607
    z.exp = 1 - shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   608
    z.sig = sig<<shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   609
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   610
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   611
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   612
static inline struct uint128_extra
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   613
softfloat_shiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   614
     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
   615
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   616
    uint_fast8_t u8NegDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   617
    struct uint128_extra z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   618
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   619
    u8NegDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   620
    if ( dist < 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   621
	z.v.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   622
	z.v.v0 = a64<<(u8NegDist & 63) | a0>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   623
	z.extra = a0<<(u8NegDist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   624
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   625
	z.v.v64 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   626
	if ( dist == 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   627
	    z.v.v0 = a64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   628
	    z.extra = a0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   629
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   630
	    extra |= a0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   631
	    if ( dist < 128 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   632
		z.v.v0 = a64>>(dist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   633
		z.extra = a64<<(u8NegDist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   634
	    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   635
		z.v.v0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   636
		z.extra = (dist == 128) ? a64 : (a64 != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   637
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   638
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   639
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   640
    z.extra |= (extra != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   641
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   642
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   643
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   644
static inline struct uint128_extra
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   645
softfloat_shortShiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   646
     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
   647
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   648
    uint_fast8_t negDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   649
    struct uint128_extra z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   650
    z.v.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   651
    z.v.v0 = a64<<(negDist & 63) | a0>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   652
    z.extra = a0<<(negDist & 63) | (extra != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   653
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   654
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   655
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   656
static inline struct uint128
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   657
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
   658
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   659
    uint_fast8_t u8NegDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   660
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   661
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   662
    if ( dist < 64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   663
	u8NegDist = -dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   664
	z.v64 = a64>>dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   665
	z.v0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   666
	    a64<<(u8NegDist & 63) | a0>>dist
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   667
		| ((uint64_t) (a0<<(u8NegDist & 63)) != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   668
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   669
	z.v64 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   670
	z.v0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   671
	    (dist < 127)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   672
		? a64>>(dist & 63)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   673
		      | (((a64 & (((uint_fast64_t) 1<<(dist & 63)) - 1)) | a0)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   674
			     != 0)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   675
		: ((a64 | a0) != 0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   676
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   677
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   678
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   679
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   680
static inline struct uint128
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   681
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
   682
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   683
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   684
    z.v64 = a64<<dist | a0>>(-dist & 63);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   685
    z.v0 = a0<<dist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   686
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   687
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   688
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   689
static int_fast8_t
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   690
softfloat_compare128M( const uint32_t *aPtr, const uint32_t *bPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   691
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   692
    unsigned int index, lastIndex;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   693
    uint32_t wordA, wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   694
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   695
    index = indexWordHi( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   696
    lastIndex = indexWordLo( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   697
    for (;;) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   698
	wordA = aPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   699
	wordB = bPtr[index];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   700
	if ( wordA != wordB ) return (wordA < wordB) ? -1 : 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   701
	if ( index == lastIndex ) break;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   702
	index -= wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   703
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   704
    return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   705
}
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
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   708
softfloat_roundPackMToF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   709
     bool sign, int32_t exp, uint32_t *extSigPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   710
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   711
    uint_fast8_t roundingMode;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   712
    bool roundNearEven;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   713
    uint32_t sigExtra;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   714
    bool doIncrement, isTiny;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   715
    static const uint32_t maxSig[4] =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   716
	INIT_UINTM4( 0x0001FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   717
    uint32_t ui, uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   718
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   719
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   720
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   721
    roundingMode = softfloat_roundingMode;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   722
    roundNearEven = (roundingMode == softfloat_round_near_even);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   723
    sigExtra = extSigPtr[indexWordLo( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   724
    doIncrement = (0x80000000 <= sigExtra);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   725
    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   726
	doIncrement =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   727
	    (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   728
		 == (sign ? softfloat_round_min : softfloat_round_max))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   729
		&& sigExtra;
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
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   733
    if ( 0x7FFD <= (uint32_t) exp ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   734
	if ( exp < 0 ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   735
	    /*----------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   736
	    *----------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   737
	    isTiny =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   738
		   (softfloat_detectTininess
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   739
			== softfloat_tininess_beforeRounding)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   740
		|| (exp < -1)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   741
		|| ! doIncrement
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   742
		|| (softfloat_compare128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   743
			extSigPtr + indexMultiwordHi( 5, 4 ), maxSig )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   744
			< 0);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   745
	    softfloat_shiftRightJam160M( extSigPtr, -exp, extSigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   746
	    exp = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   747
	    sigExtra = extSigPtr[indexWordLo( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   748
	    if ( isTiny && sigExtra ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   749
		softfloat_raiseFlags( softfloat_flag_underflow );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   750
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   751
	    doIncrement = (0x80000000 <= sigExtra);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   752
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   753
		   ! roundNearEven
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   754
		&& (roundingMode != softfloat_round_near_maxMag)
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
		doIncrement =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   757
		    (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   758
			 == (sign ? softfloat_round_min : softfloat_round_max))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   759
			&& sigExtra;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   760
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   761
	} else if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   762
	       (0x7FFD < exp)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   763
	    || ((exp == 0x7FFD) && doIncrement
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   764
		    && (softfloat_compare128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   765
			    extSigPtr + indexMultiwordHi( 5, 4 ), maxSig )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   766
			    == 0))
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   767
	) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   768
	    /*----------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   769
	    *----------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   770
	    softfloat_raiseFlags(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   771
		softfloat_flag_overflow | softfloat_flag_inexact );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   772
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   773
		   roundNearEven
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   774
		|| (roundingMode == softfloat_round_near_maxMag)
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   775
		|| (roundingMode
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   776
			== (sign ? softfloat_round_min : softfloat_round_max))
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
		ui = packToF128UI96( sign, 0x7FFF, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   779
		uj = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   780
	    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   781
		ui = packToF128UI96( sign, 0x7FFE, 0x0000FFFF );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   782
		uj = 0xFFFFFFFF;
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
	    zWPtr[indexWordHi( 4 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   785
	    zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   786
	    zWPtr[indexWord( 4, 1 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   787
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   788
	    return;
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
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   791
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   792
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   793
    uj = extSigPtr[indexWord( 5, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   794
    if ( sigExtra ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   795
	softfloat_exceptionFlags |= softfloat_flag_inexact;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   796
#ifdef SOFTFLOAT_ROUND_ODD
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   797
	if ( roundingMode == softfloat_round_odd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   798
	    uj |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   799
	    goto noIncrementPackReturn;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   800
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   801
#endif
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   802
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   803
    if ( doIncrement ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   804
	++uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   805
	if ( uj ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   806
	    if ( ! (sigExtra & 0x7FFFFFFF) && roundNearEven ) uj &= ~1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   807
	    zWPtr[indexWord( 4, 2 )] = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   808
	    zWPtr[indexWord( 4, 1 )] = extSigPtr[indexWord( 5, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   809
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   810
	    ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   811
	} else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   812
	    zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   813
	    ui = extSigPtr[indexWord( 5, 2 )] + 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   814
	    zWPtr[indexWord( 4, 1 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   815
	    uj = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   816
	    if ( ui ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   817
		zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   818
		ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   819
	    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   820
		++uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   821
		zWPtr[indexWord( 4, 2 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   822
		ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   823
		if ( ! uj ) ++ui;
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
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   826
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   827
 noIncrementPackReturn:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   828
	zWPtr[indexWord( 4, 0 )] = uj;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   829
	ui = extSigPtr[indexWord( 5, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   830
	zWPtr[indexWord( 4, 1 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   831
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   832
	ui = extSigPtr[indexWord( 5, 3 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   833
	zWPtr[indexWord( 4, 2 )] = ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   834
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   835
	ui = extSigPtr[indexWordHi( 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   836
	uj |= ui;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   837
	if ( ! uj ) exp = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   838
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   839
    zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp, ui );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   840
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   841
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   842
static int
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   843
softfloat_shiftNormSigF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   844
     const uint32_t *wPtr, uint_fast8_t shiftDist, uint32_t *sigPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   845
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   846
    uint32_t wordSig;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   847
    int32_t exp;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   848
    uint32_t leadingBit;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   849
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   850
    wordSig = wPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   851
    exp = expF128UI96( wordSig );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   852
    if ( exp ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   853
	softfloat_shortShiftLeft128M( wPtr, shiftDist, sigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   854
	leadingBit = 0x00010000<<shiftDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   855
	sigPtr[indexWordHi( 4 )] =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   856
	    (sigPtr[indexWordHi( 4 )] & (leadingBit - 1)) | leadingBit;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   857
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   858
	exp = 16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   859
	wordSig &= 0x7FFFFFFF;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   860
	if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   861
	    exp = -16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   862
	    wordSig = wPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   863
	    if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   864
		exp = -48;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   865
		wordSig = wPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   866
		if ( ! wordSig ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   867
		    wordSig = wPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   868
		    if ( ! wordSig ) return -128;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   869
		    exp = -80;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   870
		}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   871
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   872
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   873
	exp -= softfloat_countLeadingZeros32( wordSig );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   874
	softfloat_shiftLeft128M( wPtr, 1 - exp + shiftDist, sigPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   875
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   876
    return exp;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   877
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   878
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   879
bool
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   880
softfloat_tryPropagateNaNF128M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   881
     const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   882
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   883
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   884
    if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   885
	softfloat_propagateNaNF128M( aWPtr, bWPtr, zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   886
	return 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   887
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   888
    return 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   889
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   890
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   891
static inline struct uint128
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   892
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
   893
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   894
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   895
    z.v0 = a0 + b0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   896
    z.v64 = a64 + b64 + (z.v0 < a0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   897
    return z;
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
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   900
static inline struct uint128
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   901
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
   902
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   903
    struct uint128 z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   904
    z.v0 = a0 - b0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   905
    z.v64 = a64 - b64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   906
    z.v64 -= (a0 < b0);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   907
    return z;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   908
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   909
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   910
static inline struct uint128
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   911
softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   912
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   913
    union { unsigned __int128 ui; struct uint128 s; } uZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   914
    uZ.ui = ((unsigned __int128) a64<<64 | a0) * b;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   915
    return uZ.s;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   916
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
   917
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   918
static void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   919
softfloat_mul128MTo256M(
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   920
     const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   921
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   922
    uint32_t *lastZPtr, wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   923
    uint64_t dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   924
    uint32_t wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   925
    uint_fast8_t carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   926
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   927
    bPtr += indexWordLo( 4 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   928
    lastZPtr = zPtr + indexMultiwordHi( 8, 5 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   929
    zPtr += indexMultiwordLo( 8, 5 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   930
    wordB = *bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   931
    dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   932
    zPtr[indexWord( 5, 0 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   933
    dwordProd = (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   934
    zPtr[indexWord( 5, 1 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   935
    dwordProd = (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   936
    zPtr[indexWord( 5, 2 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   937
    dwordProd = (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   938
    zPtr[indexWord( 5, 3 )] = dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   939
    zPtr[indexWord( 5, 4 )] = dwordProd>>32;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   940
    do {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   941
	bPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   942
	zPtr += wordIncr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   943
	wordB = *bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   944
	dwordProd = (uint64_t) aPtr[indexWord( 4, 0 )] * wordB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   945
	wordZ = zPtr[indexWord( 5, 0 )] + (uint32_t) dwordProd;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   946
	zPtr[indexWord( 5, 0 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   947
	carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   948
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   949
	    (uint64_t) aPtr[indexWord( 4, 1 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   950
	wordZ = zPtr[indexWord( 5, 1 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   951
	zPtr[indexWord( 5, 1 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   952
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   953
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   954
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   955
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   956
	    (uint64_t) aPtr[indexWord( 4, 2 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   957
	wordZ = zPtr[indexWord( 5, 2 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   958
	zPtr[indexWord( 5, 2 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   959
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   960
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   961
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   962
	dwordProd =
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   963
	    (uint64_t) aPtr[indexWord( 4, 3 )] * wordB + (dwordProd>>32);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   964
	wordZ = zPtr[indexWord( 5, 3 )] + (uint32_t) dwordProd + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   965
	zPtr[indexWord( 5, 3 )] = wordZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   966
	if ( wordZ != (uint32_t) dwordProd ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   967
	    carry = (wordZ < (uint32_t) dwordProd);
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   968
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   969
	zPtr[indexWord( 5, 4 )] = (dwordProd>>32) + carry;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   970
    } while ( zPtr != lastZPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   971
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
   972
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   973
float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   974
softfloat_roundPackToF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   975
     bool sign,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   976
     int_fast32_t exp,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   977
     uint_fast64_t sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   978
     uint_fast64_t sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   979
     uint_fast64_t sigExtra
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   980
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   981
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   982
    uint_fast8_t roundingMode;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   983
    bool roundNearEven, doIncrement, isTiny;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   984
    struct uint128_extra sig128Extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   985
    uint_fast64_t uiZ64, uiZ0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   986
    struct uint128 sig128;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   987
    union ui128_f128 uZ;
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
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   991
    roundingMode = softfloat_roundingMode;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   992
    roundNearEven = (roundingMode == softfloat_round_near_even);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   993
    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   994
    if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   995
	doIncrement =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   996
	    (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   997
		 == (sign ? softfloat_round_min : softfloat_round_max))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   998
		&& sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
   999
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1000
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1001
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1002
    if ( 0x7FFD <= (uint32_t) exp ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1003
	if ( exp < 0 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1004
	    /*----------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1005
	    *----------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1006
	    isTiny =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1007
		   (softfloat_detectTininess
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1008
			== softfloat_tininess_beforeRounding)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1009
		|| (exp < -1)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1010
		|| ! doIncrement
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1011
		|| softfloat_lt128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1012
		       sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1013
		       sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1014
		       UINT64_C( 0x0001FFFFFFFFFFFF ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1015
		       UINT64_C( 0xFFFFFFFFFFFFFFFF )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1016
		   );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1017
	    sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1018
		softfloat_shiftRightJam128Extra( sig64, sig0, sigExtra, -exp );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1019
	    sig64 = sig128Extra.v.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1020
	    sig0  = sig128Extra.v.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1021
	    sigExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1022
	    exp = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1023
	    if ( isTiny && sigExtra ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1024
		softfloat_raiseFlags( softfloat_flag_underflow );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1025
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1026
	    doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1027
	    if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1028
		   ! roundNearEven
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1029
		&& (roundingMode != softfloat_round_near_maxMag)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1030
	    ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1031
		doIncrement =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1032
		    (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1033
			 == (sign ? softfloat_round_min : softfloat_round_max))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1034
			&& sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1035
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1036
	} else if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1037
	       (0x7FFD < exp)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1038
	    || ((exp == 0x7FFD)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1039
		    && softfloat_eq128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1040
			   sig64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1041
			   sig0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1042
			   UINT64_C( 0x0001FFFFFFFFFFFF ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1043
			   UINT64_C( 0xFFFFFFFFFFFFFFFF )
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
		    && doIncrement)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1046
	) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1047
	    /*----------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1048
	    *----------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1049
	    softfloat_raiseFlags(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1050
		softfloat_flag_overflow | softfloat_flag_inexact );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1051
	    if (
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1052
		   roundNearEven
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1053
		|| (roundingMode == softfloat_round_near_maxMag)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1054
		|| (roundingMode
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1055
			== (sign ? softfloat_round_min : softfloat_round_max))
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
		uiZ64 = packToF128UI64( sign, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1058
		uiZ0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1059
	    } else {
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1060
		uiZ64 = packToF128UI64( sign, 0x7FFE, UINT64_C( 0x0000FFFFFFFFFFFF ) );
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1061
		uiZ0 = UINT64_C( 0xFFFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1062
	    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1063
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1064
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1065
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1066
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1067
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1068
    if ( sigExtra ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1069
	softfloat_exceptionFlags |= softfloat_flag_inexact;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1070
#ifdef SOFTFLOAT_ROUND_ODD
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1071
	if ( roundingMode == softfloat_round_odd ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1072
	    sig0 |= 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1073
	    goto packReturn;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1074
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1075
#endif
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1076
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1077
    if ( doIncrement ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1078
	sig128 = softfloat_add128( sig64, sig0, 0, 1 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1079
	sig64 = sig128.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1080
	sig0 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1081
	    sig128.v0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1082
		& ~(uint64_t)
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1083
		       (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1084
			    & roundNearEven);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1085
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1086
	if ( ! (sig64 | sig0) ) exp = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1087
    }
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
 packReturn:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1091
    uiZ64 = packToF128UI64( sign, exp, sig64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1092
    uiZ0  = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1093
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1094
    uZ.ui.v64 = uiZ64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1095
    uZ.ui.v0  = uiZ0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1096
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1097
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1098
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1099
float128_t
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1100
softfloat_normRoundPackToF128(
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1101
     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
  1102
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1103
    int_fast8_t shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1104
    struct uint128 sig128;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1105
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1106
    uint_fast64_t sigExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1107
    struct uint128_extra sig128Extra;
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
    if ( ! sig64 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1110
	exp -= 64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1111
	sig64 = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1112
	sig0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1113
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1114
    shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1115
    exp -= shiftDist;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1116
    if ( 0 <= shiftDist ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1117
	if ( shiftDist ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1118
	    sig128 = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1119
	    sig64 = sig128.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1120
	    sig0  = sig128.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1121
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1122
	if ( (uint32_t) exp < 0x7FFD ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1123
	    uZ.ui.v64 = packToF128UI64( sign, sig64 | sig0 ? exp : 0, sig64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1124
	    uZ.ui.v0  = sig0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1125
	    return uZ.f;
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
	sigExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1128
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1129
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1130
	    softfloat_shortShiftRightJam128Extra( sig64, sig0, 0, -shiftDist );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1131
	sig64 = sig128Extra.v.v64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1132
	sig0  = sig128Extra.v.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1133
	sigExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1134
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1135
    return softfloat_roundPackToF128( sign, exp, sig64, sig0, sigExtra );
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
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1138
struct exp32_sig128
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1139
softfloat_normSubnormalF128Sig( uint_fast64_t sig64, uint_fast64_t sig0 )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1140
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1141
    int_fast8_t shiftDist;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1142
    struct exp32_sig128 z;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1143
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1144
    if ( ! sig64 ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1145
	shiftDist = softfloat_countLeadingZeros64( sig0 ) - 15;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1146
	z.exp = -63 - shiftDist;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1147
	if ( shiftDist < 0 ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1148
	    z.sig.v64 = sig0>>-shiftDist;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1149
	    z.sig.v0  = sig0<<(shiftDist & 63);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1150
	} else {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1151
	    z.sig.v64 = sig0<<shiftDist;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1152
	    z.sig.v0  = 0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1153
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1154
    } else {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1155
	shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1156
	z.exp = 1 - shiftDist;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1157
	z.sig = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1158
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1159
    return z;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1160
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1161
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1162
struct uint128
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1163
softfloat_propagateNaNF128UI(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1164
     uint_fast64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1165
     uint_fast64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1166
     uint_fast64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1167
     uint_fast64_t uiB0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1168
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1169
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1170
    bool isSigNaNA, isSigNaNB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1171
    uint_fast64_t uiNonsigA64, uiNonsigB64, uiMagA64, uiMagB64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1172
    struct uint128 uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1173
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1174
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1175
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1176
    isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1177
    isSigNaNB = softfloat_isSigNaNF128UI( uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1178
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1179
    | Make NaNs non-signaling.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1180
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1181
    uiNonsigA64 = uiA64 | UINT64_C( 0x0000800000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1182
    uiNonsigB64 = uiB64 | UINT64_C( 0x0000800000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1183
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1184
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1185
    if ( isSigNaNA | isSigNaNB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1186
	softfloat_raiseFlags( softfloat_flag_invalid );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1187
	if ( isSigNaNA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1188
	    if ( isSigNaNB ) goto returnLargerMag;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1189
	    if ( isNaNF128UI( uiB64, uiB0 ) ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1190
	    goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1191
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1192
	    if ( isNaNF128UI( uiA64, uiA0 ) ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1193
	    goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1194
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1195
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1196
 returnLargerMag:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1197
    uiMagA64 = uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1198
    uiMagB64 = uiB64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1199
    if ( uiMagA64 < uiMagB64 ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1200
    if ( uiMagB64 < uiMagA64 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1201
    if ( uiA0 < uiB0 ) goto returnB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1202
    if ( uiB0 < uiA0 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1203
    if ( uiNonsigA64 < uiNonsigB64 ) goto returnA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1204
 returnB:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1205
    uiZ.v64 = uiNonsigB64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1206
    uiZ.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1207
    return uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1208
 returnA:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1209
    uiZ.v64 = uiNonsigA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1210
    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1211
    return uiZ;
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
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1214
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1215
#if __POINTER_SIZE__ == 4
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1216
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1217
void
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1218
i32_to_f128M( int32_t a, float128_t *zPtr )
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1219
{
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1220
    uint32_t *zWPtr;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1221
    uint32_t uiZ96, uiZ64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1222
    bool sign;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1223
    uint32_t absA;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1224
    int_fast8_t shiftDist;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1225
    uint64_t normAbsA;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1226
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1227
    zWPtr = (uint32_t *) zPtr;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1228
    uiZ96 = 0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1229
    uiZ64 = 0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1230
    if ( a ) {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1231
	sign = (a < 0);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1232
	absA = sign ? -(uint32_t) a : (uint32_t) a;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1233
	shiftDist = softfloat_countLeadingZeros32( absA ) + 17;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1234
	normAbsA = (uint64_t) absA<<shiftDist;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1235
	uiZ96 = packToF128UI96( sign, 0x402E - shiftDist, normAbsA>>32 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1236
	uiZ64 = normAbsA;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1237
    }
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1238
    zWPtr[indexWord( 4, 3 )] = uiZ96;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1239
    zWPtr[indexWord( 4, 2 )] = uiZ64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1240
    zWPtr[indexWord( 4, 1 )] = 0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1241
    zWPtr[indexWord( 4, 0 )] = 0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1242
}
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1243
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1244
#else
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1245
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1246
void
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1247
i64_to_f128M( int64_t a, float128_t *zPtr )
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1248
{
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1249
    uint32_t *zWPtr;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1250
    uint32_t uiZ96, uiZ64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1251
    bool sign;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1252
    uint64_t absA;
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1253
    uint_fast8_t shiftDist;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1254
    uint32_t *ptr;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1255
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1256
    zWPtr = (uint32_t *) zPtr;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1257
    uiZ96 = 0;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1258
    uiZ64 = 0;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1259
    zWPtr[indexWord( 4, 1 )] = 0;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1260
    zWPtr[indexWord( 4, 0 )] = 0;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1261
    if ( a ) {
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1262
	sign = (a < 0);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1263
	absA = sign ? -(uint64_t) a : (uint64_t) a;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1264
	shiftDist = softfloat_countLeadingZeros64( absA ) + 17;
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1265
	if ( shiftDist < 32 ) {
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1266
	    ptr = zWPtr + indexMultiwordHi( 4, 3 );
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1267
	    ptr[indexWord( 3, 2 )] = 0;
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1268
	    ptr[indexWord( 3, 1 )] = absA>>32;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1269
	    ptr[indexWord( 3, 0 )] = absA;
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1270
	    softfloat_shortShiftLeft96M( ptr, shiftDist, ptr );
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1271
	    ptr[indexWordHi( 3 )] =
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1272
		packToF128UI96(
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1273
		    sign, 0x404E - shiftDist, ptr[indexWordHi( 3 )] );
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1274
	    return;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1275
	}
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1276
	absA <<= shiftDist - 32;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1277
	uiZ96 = packToF128UI96( sign, 0x404E - shiftDist, absA>>32 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1278
	uiZ64 = absA;
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1279
    }
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1280
    zWPtr[indexWord( 4, 3 )] = uiZ96;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1281
    zWPtr[indexWord( 4, 2 )] = uiZ64;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1282
}
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1283
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1284
#endif
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1285
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  1286
void
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1287
f64_to_f128M( float64_t a, float128_t *zPtr )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1288
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1289
    uint32_t *zWPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1290
    union ui64_f64 uA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1291
    uint64_t uiA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1292
    bool sign;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1293
    int_fast16_t exp;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1294
    uint64_t frac;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1295
    struct commonNaN commonNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1296
    uint32_t uiZ96;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1297
    struct exp16_sig64 normExpSig;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1298
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
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1301
    zWPtr = (uint32_t *) zPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1302
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1303
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1304
    uA.f = a;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1305
    uiA = uA.ui;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1306
    sign = signF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1307
    exp  = expF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1308
    frac = fracF64UI( uiA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1309
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1310
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1311
    zWPtr[indexWord( 4, 0 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1312
    if ( exp == 0x7FF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1313
	if ( frac ) {
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1314
	    // NaN
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1315
	    softfloat_commonNaNToF128M( zWPtr );
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1316
	    return;
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
	uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1319
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1320
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1321
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1322
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1323
    if ( ! exp ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1324
	if ( ! frac ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1325
	    uiZ96 = packToF128UI96( sign, 0, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1326
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1327
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1328
	normExpSig = softfloat_normSubnormalF64Sig( frac );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1329
	exp = normExpSig.exp - 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1330
	frac = normExpSig.sig;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1331
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1332
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1333
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1334
    zWPtr[indexWord( 4, 1 )] = (uint32_t) frac<<28;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1335
    frac >>= 4;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1336
    zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp + 0x3C00, frac>>32 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1337
    zWPtr[indexWord( 4, 2 )] = frac;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1338
    return;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1339
    /*------------------------------------------------------------------------
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1340
    *------------------------------------------------------------------------*/
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1341
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1342
    zWPtr[indexWord( 4, 3 )] = uiZ96;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1343
    zWPtr[indexWord( 4, 2 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1344
    zWPtr[indexWord( 4, 1 )] = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1345
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1346
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1347
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1348
float128_t
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1349
extF80_to_f128( extFloat80_t a )
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1350
{
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1351
    union { struct extFloat80M s; extFloat80_t f; } uA;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1352
    uint_fast16_t uiA64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1353
    uint_fast64_t uiA0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1354
    uint_fast16_t exp;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1355
    uint_fast64_t frac;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1356
    struct commonNaN commonNaN;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1357
    struct uint128 uiZ;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1358
    bool sign;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1359
    struct uint128 frac128;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1360
    union ui128_f128 uZ;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1361
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1362
    uA.f = a;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1363
    uiA64 = uA.s.signExp;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1364
    uiA0  = uA.s.signif;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1365
    exp = expExtF80UI64( uiA64 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1366
    frac = uiA0 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1367
    if ( (exp == 0x7FFF) && frac ) {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1368
	softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1369
	softfloat_commonNaNToF128M( (uint32_t*) &uiZ );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1370
    } else {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1371
	sign = signExtF80UI64( uiA64 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1372
	frac128 = softfloat_shortShiftLeft128( 0, frac, 49 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1373
	uiZ.v64 = packToF128UI64( sign, exp, frac128.v64 );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1374
	uiZ.v0  = frac128.v0;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1375
    }
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1376
    uZ.ui = uiZ;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1377
    return uZ.f;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1378
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1379
}
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1380
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1381
static float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1382
softfloat_addMagsF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1383
     uint64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1384
     uint64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1385
     uint64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1386
     uint64_t uiB0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1387
     bool signZ
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1388
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1389
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1390
    int32_t expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1391
    struct uint128 sigA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1392
    int32_t expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1393
    struct uint128 sigB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1394
    int32_t expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1395
    struct uint128 uiZ, sigZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1396
    int32_t expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1397
    uint64_t sigZExtra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1398
    struct uint128_extra sig128Extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1399
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1400
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1401
    expA = expF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1402
    sigA.v64 = fracF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1403
    sigA.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1404
    expB = expF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1405
    sigB.v64 = fracF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1406
    sigB.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1407
    expDiff = expA - expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1408
    if ( ! expDiff ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1409
	if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1410
	    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
  1411
	    uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1412
	    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1413
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1414
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1415
	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
  1416
	if ( ! expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1417
	    uiZ.v64 = packToF128UI64( signZ, 0, sigZ.v64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1418
	    uiZ.v0  = sigZ.v0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1419
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1420
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1421
	expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1422
	sigZ.v64 |= UINT64_C( 0x0002000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1423
	sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1424
	goto shiftRight1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1425
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1426
    if ( expDiff < 0 ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1427
	if ( expB == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1428
	    if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1429
	    uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1430
	    uiZ.v0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1431
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1432
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1433
	expZ = expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1434
	if ( expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1435
	    sigA.v64 |= UINT64_C( 0x0001000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1436
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1437
	    ++expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1438
	    sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1439
	    if ( ! expDiff ) goto newlyAligned;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1440
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1441
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1442
	    softfloat_shiftRightJam128Extra( sigA.v64, sigA.v0, 0, -expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1443
	sigA = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1444
	sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1445
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1446
	if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1447
	    if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1448
	    uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1449
	    uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1450
	    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1451
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1452
	expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1453
	if ( expB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1454
	    sigB.v64 |= UINT64_C( 0x0001000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1455
	} else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1456
	    --expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1457
	    sigZExtra = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1458
	    if ( ! expDiff ) goto newlyAligned;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1459
	}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1460
	sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1461
	    softfloat_shiftRightJam128Extra( sigB.v64, sigB.v0, 0, expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1462
	sigB = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1463
	sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1464
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1465
 newlyAligned:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1466
    sigZ =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1467
	softfloat_add128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1468
	    sigA.v64 | UINT64_C( 0x0001000000000000 ),
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1469
	    sigA.v0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1470
	    sigB.v64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1471
	    sigB.v0
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1472
	);
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1473
    --expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1474
    if ( sigZ.v64 < UINT64_C( 0x0002000000000000 ) ) goto roundAndPack;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1475
    ++expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1476
 shiftRight1:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1477
    sig128Extra =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1478
	softfloat_shortShiftRightJam128Extra(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1479
	    sigZ.v64, sigZ.v0, sigZExtra, 1 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1480
    sigZ = sig128Extra.v;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1481
    sigZExtra = sig128Extra.extra;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1482
 roundAndPack:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1483
    return
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1484
	softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1485
 propagateNaN:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1486
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1487
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1488
    uZ.ui = uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1489
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1490
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1491
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1492
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1493
float128_t
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1494
softfloat_subMagsF128(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1495
     uint_fast64_t uiA64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1496
     uint_fast64_t uiA0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1497
     uint_fast64_t uiB64,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1498
     uint_fast64_t uiB0,
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1499
     bool signZ
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1500
 )
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1501
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1502
    int_fast32_t expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1503
    struct uint128 sigA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1504
    int_fast32_t expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1505
    struct uint128 sigB, sigZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1506
    int_fast32_t expDiff, expZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1507
    struct uint128 uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1508
    union ui128_f128 uZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1509
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1510
    expA = expF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1511
    sigA.v64 = fracF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1512
    sigA.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1513
    expB = expF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1514
    sigB.v64 = fracF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1515
    sigB.v0  = uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1516
    sigA = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 4 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1517
    sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 4 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1518
    expDiff = expA - expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1519
    if ( 0 < expDiff ) goto expABigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1520
    if ( expDiff < 0 ) goto expBBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1521
    if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1522
	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
  1523
	softfloat_raiseFlags( softfloat_flag_invalid );
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1524
	softfloat_commonNaNToF128M( (uint32_t*)&uiZ );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1525
	// uiZ.v64 = defaultNaNF128UI64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1526
	// uiZ.v0  = defaultNaNF128UI0;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1527
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1528
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1529
    expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1530
    if ( ! expZ ) expZ = 1;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1531
    if ( sigB.v64 < sigA.v64 ) goto aBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1532
    if ( sigA.v64 < sigB.v64 ) goto bBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1533
    if ( sigB.v0 < sigA.v0 ) goto aBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1534
    if ( sigA.v0 < sigB.v0 ) goto bBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1535
    uiZ.v64 =
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1536
	packToF128UI64(
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1537
	    (softfloat_roundingMode == softfloat_round_min), 0, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1538
    uiZ.v0 = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1539
    goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1540
 expBBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1541
    if ( expB == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1542
	if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1543
	uiZ.v64 = packToF128UI64( signZ ^ 1, 0x7FFF, 0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1544
	uiZ.v0  = 0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1545
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1546
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1547
    if ( expA ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1548
	sigA.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1549
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1550
	++expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1551
	if ( ! expDiff ) goto newlyAlignedBBigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1552
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1553
    sigA = softfloat_shiftRightJam128( sigA.v64, sigA.v0, -expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1554
 newlyAlignedBBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1555
    expZ = expB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1556
    sigB.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1557
 bBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1558
    signZ = ! signZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1559
    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
  1560
    goto normRoundPack;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1561
 expABigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1562
    if ( expA == 0x7FFF ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1563
	if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1564
	uiZ.v64 = uiA64;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1565
	uiZ.v0  = uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1566
	goto uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1567
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1568
    if ( expB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1569
	sigB.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1570
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1571
	--expDiff;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1572
	if ( ! expDiff ) goto newlyAlignedABigger;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1573
    }
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1574
    sigB = softfloat_shiftRightJam128( sigB.v64, sigB.v0, expDiff );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1575
 newlyAlignedABigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1576
    expZ = expA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1577
    sigA.v64 |= UINT64_C( 0x0010000000000000 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1578
 aBigger:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1579
    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
  1580
 normRoundPack:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1581
    return softfloat_normRoundPackToF128( signZ, expZ - 5, sigZ.v64, sigZ.v0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1582
 propagateNaN:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1583
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1584
 uiZ:
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1585
    uZ.ui = uiZ;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1586
    return uZ.f;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1587
}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1588
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1589
void
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1590
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
  1591
{
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1592
    const uint64_t *aWPtr, *bWPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1593
    uint64_t uiA64, uiA0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1594
    int signA;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1595
    uint64_t uiB64, uiB0;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1596
    int signB;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1597
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1598
    aWPtr = (const uint64_t *) aPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1599
    bWPtr = (const uint64_t *) bPtr;
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1600
    uiA64 = aWPtr[indexWord( 2, 1 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1601
    uiA0  = aWPtr[indexWord( 2, 0 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1602
    signA = signF128UI64( uiA64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1603
    uiB64 = bWPtr[indexWord( 2, 1 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1604
    uiB0  = bWPtr[indexWord( 2, 0 )];
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1605
    signB = signF128UI64( uiB64 );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1606
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1607
    if ( signA == signB ) {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1608
	*zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1609
    } else {
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1610
	*zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1611
    }
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1612
}
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1613
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1614
void
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1615
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
  1616
{
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1617
    const uint64_t *aWPtr, *bWPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1618
    uint_fast64_t uiA64, uiA0;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1619
    bool signA;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1620
    uint_fast64_t uiB64, uiB0;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1621
    bool signB;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1622
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1623
    aWPtr = (const uint64_t *) aPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1624
    bWPtr = (const uint64_t *) bPtr;
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1625
    uiA64 = aWPtr[indexWord( 2, 1 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1626
    uiA0  = aWPtr[indexWord( 2, 0 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1627
    signA = signF128UI64( uiA64 );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1628
    uiB64 = bWPtr[indexWord( 2, 1 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1629
    uiB0  = bWPtr[indexWord( 2, 0 )];
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1630
    signB = signF128UI64( uiB64 );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1631
    if ( signA == signB ) {
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1632
	*zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1633
    } else {
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1634
	*zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1635
    }
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  1636
}
4999
fd4435d4e583 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4998
diff changeset
  1637
5000
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1638
void
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1639
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
  1640
{
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1641
    const uint32_t *aWPtr, *bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1642
    uint32_t *zWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1643
    uint32_t uiA96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1644
    int32_t expA;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1645
    uint32_t uiB96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1646
    int32_t expB;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1647
    bool signZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1648
    const uint32_t *ptr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1649
    uint32_t uiZ96, sigA[4];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1650
    uint_fast8_t shiftDist;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1651
    uint32_t sigB[4];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1652
    int32_t expZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1653
    uint32_t sigProd[8], *extSigZPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1654
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1655
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1656
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1657
    aWPtr = (const uint32_t *) aPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1658
    bWPtr = (const uint32_t *) bPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1659
    zWPtr = (uint32_t *) zPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1660
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1661
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1662
    uiA96 = aWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1663
    expA = expF128UI96( uiA96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1664
    uiB96 = bWPtr[indexWordHi( 4 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1665
    expB = expF128UI96( uiB96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1666
    signZ = signF128UI96( uiA96 ) ^ signF128UI96( uiB96 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1667
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1668
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1669
    if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1670
	if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1671
	ptr = aWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1672
	if ( ! expA ) goto possiblyInvalid;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1673
	if ( ! expB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1674
	    ptr = bWPtr;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1675
     possiblyInvalid:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1676
	    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1677
		! fracF128UI96( ptr[indexWordHi( 4 )] )
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1678
		    && ! (ptr[indexWord( 4, 2 )] | ptr[indexWord( 4, 1 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1679
			      | ptr[indexWord( 4, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1680
	    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1681
		softfloat_invalidF128M( zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1682
		return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1683
	    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1684
	}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1685
	uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1686
	goto uiZ96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1687
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1688
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1689
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1690
    if ( expA ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1691
	sigA[indexWordHi( 4 )] = fracF128UI96( uiA96 ) | 0x00010000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1692
	sigA[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1693
	sigA[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1694
	sigA[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1695
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1696
	expA = softfloat_shiftNormSigF128M( aWPtr, 0, sigA );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1697
	if ( expA == -128 ) goto zero;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1698
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1699
    if ( expB ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1700
	sigB[indexWordHi( 4 )] = fracF128UI96( uiB96 ) | 0x00010000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1701
	sigB[indexWord( 4, 2 )] = bWPtr[indexWord( 4, 2 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1702
	sigB[indexWord( 4, 1 )] = bWPtr[indexWord( 4, 1 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1703
	sigB[indexWord( 4, 0 )] = bWPtr[indexWord( 4, 0 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1704
    } else {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1705
	expB = softfloat_shiftNormSigF128M( bWPtr, 0, sigB );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1706
	if ( expB == -128 ) goto zero;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1707
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1708
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1709
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1710
    expZ = expA + expB - 0x4000;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1711
    softfloat_mul128MTo256M( sigA, sigB, sigProd );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1712
    if (
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1713
	sigProd[indexWord( 8, 2 )]
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1714
	    || (sigProd[indexWord( 8, 1 )] | sigProd[indexWord( 8, 0 )])
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1715
    ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1716
	sigProd[indexWord( 8, 3 )] |= 1;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1717
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1718
    extSigZPtr = &sigProd[indexMultiwordHi( 8, 5 )];
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1719
    shiftDist = 16;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1720
    if ( extSigZPtr[indexWordHi( 5 )] & 2 ) {
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1721
	++expZ;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1722
	shiftDist = 15;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1723
    }
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1724
    softfloat_shortShiftLeft160M( extSigZPtr, shiftDist, extSigZPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1725
    softfloat_roundPackMToF128M( signZ, expZ, extSigZPtr, zWPtr );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1726
    return;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1727
    /*------------------------------------------------------------------------
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1728
    *------------------------------------------------------------------------*/
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1729
 zero:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1730
    uiZ96 = packToF128UI96( signZ, 0, 0 );
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1731
 uiZ96:
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1732
    zWPtr[indexWordHi( 4 )] = uiZ96;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1733
    zWPtr[indexWord( 4, 2 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1734
    zWPtr[indexWord( 4, 1 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1735
    zWPtr[indexWord( 4, 0 )] = 0;
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1736
}
608e4912b5cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4999
diff changeset
  1737
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1738
float128_t
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1739
f128_div( float128_t a, float128_t b )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1740
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1741
    union ui128_f128 uA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1742
    uint_fast64_t uiA64, uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1743
    bool signA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1744
    int_fast32_t expA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1745
    struct uint128 sigA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1746
    union ui128_f128 uB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1747
    uint_fast64_t uiB64, uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1748
    bool signB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1749
    int_fast32_t expB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1750
    struct uint128 sigB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1751
    bool signZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1752
    struct exp32_sig128 normExpSig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1753
    int_fast32_t expZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1754
    struct uint128 rem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1755
    uint_fast32_t recip32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1756
    int ix;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1757
    uint_fast64_t q64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1758
    uint_fast32_t q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1759
    struct uint128 term;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1760
    uint_fast32_t qs[3];
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1761
    uint_fast64_t sigZExtra;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1762
    struct uint128 sigZ, uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1763
    union ui128_f128 uZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1764
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1765
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1766
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1767
    uA.f = a;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1768
    uiA64 = uA.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1769
    uiA0  = uA.ui.v0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1770
    signA = signF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1771
    expA  = expF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1772
    sigA.v64 = fracF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1773
    sigA.v0  = uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1774
    uB.f = b;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1775
    uiB64 = uB.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1776
    uiB0  = uB.ui.v0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1777
    signB = signF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1778
    expB  = expF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1779
    sigB.v64 = fracF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1780
    sigB.v0  = uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1781
    signZ = signA ^ signB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1782
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1783
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1784
    if ( expA == 0x7FFF ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1785
	if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1786
	if ( expB == 0x7FFF ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1787
	    if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1788
	    goto invalid;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1789
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1790
	goto infinity;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1791
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1792
    if ( expB == 0x7FFF ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1793
	if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1794
	goto zero;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1795
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1796
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1797
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1798
    if ( ! expB ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1799
	if ( ! (sigB.v64 | sigB.v0) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1800
	    if ( ! (expA | sigA.v64 | sigA.v0) ) goto invalid;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1801
	    softfloat_raiseFlags( softfloat_flag_infinite );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1802
	    goto infinity;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1803
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1804
	normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1805
	expB = normExpSig.exp;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1806
	sigB = normExpSig.sig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1807
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1808
    if ( ! expA ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1809
	if ( ! (sigA.v64 | sigA.v0) ) goto zero;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1810
	normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1811
	expA = normExpSig.exp;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1812
	sigA = normExpSig.sig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1813
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1814
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1815
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1816
    expZ = expA - expB + 0x3FFE;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1817
    sigA.v64 |= UINT64_C( 0x0001000000000000 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1818
    sigB.v64 |= UINT64_C( 0x0001000000000000 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1819
    rem = sigA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1820
    if ( softfloat_lt128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1821
	--expZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1822
	rem = softfloat_add128( sigA.v64, sigA.v0, sigA.v64, sigA.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1823
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1824
    recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1825
    ix = 3;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1826
    for (;;) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1827
	q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1828
	q = (q64 + 0x80000000)>>32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1829
	--ix;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1830
	if ( ix < 0 ) break;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1831
	rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1832
	term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1833
	rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1834
	if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1835
	    --q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1836
	    rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1837
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1838
	qs[ix] = q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1839
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1840
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1841
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1842
    if ( ((q + 1) & 7) < 2 ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1843
	rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1844
	term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1845
	rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1846
	if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1847
	    --q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1848
	    rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1849
	} else if ( softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1850
	    ++q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1851
	    rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1852
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1853
	if ( rem.v64 | rem.v0 ) q |= 1;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1854
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1855
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1856
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1857
    sigZExtra = (uint64_t) ((uint_fast64_t) q<<60);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1858
    term = softfloat_shortShiftLeft128( 0, qs[1], 54 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1859
    sigZ =
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1860
	softfloat_add128(
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1861
	    (uint_fast64_t) qs[2]<<19, ((uint_fast64_t) qs[0]<<25) + (q>>4),
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1862
	    term.v64, term.v0
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1863
	);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1864
    return
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1865
	softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1866
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1867
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1868
 propagateNaN:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1869
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1870
    goto uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1871
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1872
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1873
 invalid:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1874
    softfloat_raiseFlags( softfloat_flag_invalid );
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1875
    softfloat_commonNaNToF128M( (uint32_t*)&uiZ );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1876
    // uiZ.v64 = defaultNaNF128UI64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  1877
    // uiZ.v0  = defaultNaNF128UI0;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1878
    goto uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1879
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1880
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1881
 infinity:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1882
    uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1883
    goto uiZ0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1884
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1885
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1886
 zero:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1887
    uiZ.v64 = packToF128UI64( signZ, 0, 0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1888
 uiZ0:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1889
    uiZ.v0 = 0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1890
 uiZ:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1891
    uZ.ui = uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1892
    return uZ.f;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1893
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1894
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1895
static float128_t
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1896
f128_rem( float128_t a, float128_t b )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1897
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1898
    union ui128_f128 uA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1899
    uint_fast64_t uiA64, uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1900
    bool signA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1901
    int_fast32_t expA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1902
    struct uint128 sigA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1903
    union ui128_f128 uB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1904
    uint_fast64_t uiB64, uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1905
    int_fast32_t expB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1906
    struct uint128 sigB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1907
    struct exp32_sig128 normExpSig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1908
    struct uint128 rem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1909
    int_fast32_t expDiff;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1910
    uint_fast32_t q, recip32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1911
    uint_fast64_t q64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1912
    struct uint128 term, altRem, meanRem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1913
    bool signRem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1914
    struct uint128 uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1915
    union ui128_f128 uZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1916
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1917
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1918
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1919
    uA.f = a;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1920
    uiA64 = uA.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1921
    uiA0  = uA.ui.v0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1922
    signA = signF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1923
    expA  = expF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1924
    sigA.v64 = fracF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1925
    sigA.v0  = uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1926
    uB.f = b;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1927
    uiB64 = uB.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1928
    uiB0  = uB.ui.v0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1929
    expB  = expF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1930
    sigB.v64 = fracF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1931
    sigB.v0  = uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1932
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1933
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1934
    if ( expA == 0x7FFF ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1935
	if (
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1936
	    (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1937
	) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1938
	    goto propagateNaN;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1939
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1940
	goto invalid;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1941
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1942
    if ( expB == 0x7FFF ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1943
	if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1944
	return a;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1945
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1946
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1947
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1948
    if ( ! expB ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1949
	if ( ! (sigB.v64 | sigB.v0) ) goto invalid;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1950
	normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1951
	expB = normExpSig.exp;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1952
	sigB = normExpSig.sig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1953
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1954
    if ( ! expA ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1955
	if ( ! (sigA.v64 | sigA.v0) ) return a;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1956
	normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1957
	expA = normExpSig.exp;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1958
	sigA = normExpSig.sig;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1959
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1960
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1961
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1962
    sigA.v64 |= UINT64_C( 0x0001000000000000 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1963
    sigB.v64 |= UINT64_C( 0x0001000000000000 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1964
    rem = sigA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1965
    expDiff = expA - expB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1966
    if ( expDiff < 1 ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1967
	if ( expDiff < -1 ) return a;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1968
	if ( expDiff ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1969
	    --expB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1970
	    sigB = softfloat_add128( sigB.v64, sigB.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1971
	    q = 0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1972
	} else {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1973
	    q = softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1974
	    if ( q ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1975
		rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1976
	    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1977
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1978
    } else {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1979
	recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1980
	expDiff -= 30;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1981
	for (;;) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1982
	    q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1983
	    if ( expDiff < 0 ) break;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1984
	    q = (q64 + 0x80000000)>>32;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1985
	    rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1986
	    term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1987
	    rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1988
	    if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1989
		rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1990
	    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1991
	    expDiff -= 29;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1992
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1993
	/*--------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1994
	| (`expDiff' cannot be less than -29 here.)
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1995
	*--------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1996
	q = (uint32_t) (q64>>32)>>(~expDiff & 31);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1997
	rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1998
	term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  1999
	rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2000
	if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2001
	    altRem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2002
	    goto selectRem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2003
	}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2004
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2005
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2006
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2007
    do {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2008
	altRem = rem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2009
	++q;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2010
	rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2011
    } while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2012
 selectRem:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2013
    meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2014
    if (
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2015
	(meanRem.v64 & UINT64_C( 0x8000000000000000 ))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2016
	    || (! (meanRem.v64 | meanRem.v0) && (q & 1))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2017
    ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2018
	rem = altRem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2019
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2020
    signRem = signA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2021
    if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2022
	signRem = ! signRem;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2023
	rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2024
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2025
    return softfloat_normRoundPackToF128( signRem, expB - 1, rem.v64, rem.v0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2026
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2027
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2028
 propagateNaN:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2029
    uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2030
    goto uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2031
    /*------------------------------------------------------------------------
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2032
    *------------------------------------------------------------------------*/
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2033
 invalid:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2034
    softfloat_raiseFlags( softfloat_flag_invalid );
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2035
    softfloat_commonNaNToF128M( (uint32_t*)&uiZ );
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2036
    // uiZ.v64 = defaultNaNF128UI64;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2037
    // uiZ.v0  = defaultNaNF128UI0;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2038
 uiZ:
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2039
    uZ.ui = uiZ;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2040
    return uZ.f;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2041
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2042
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2043
bool
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2044
f128_isNan( float128_t a) {
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2045
    int_fast32_t expA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2046
    struct uint128 sigA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2047
    uint_fast64_t uiA64, uiA0;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2048
    union ui128_f128 uA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2049
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2050
    uA.f = a;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2051
    uiA64 = uA.ui.v64;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2052
    uiA0  = uA.ui.v0;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2053
    return isNaNF128UI( uiA64, uiA0 );
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2054
}
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2055
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2056
bool
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2057
f128_isInf( float128_t a) {
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2058
    int_fast32_t expA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2059
    struct uint128 sigA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2060
    uint_fast64_t uiA64, uiA0;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2061
    union ui128_f128 uA;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2062
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2063
    uA.f = a;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2064
    uiA64 = uA.ui.v64;
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2065
    uiA0  = uA.ui.v0;
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2066
    return isInfF128UI( uiA64, uiA0 );
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2067
//    expA  = expF128UI64( uiA64 );
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2068
//    sigA.v64 = fracF128UI64( uiA64 );
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2069
//    sigA.v0  = uiA0;
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2070
//
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2071
//    if ( expA == 0x7FFF ) {
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2072
//        if ( sigA.v64 == 0 ) return 1;
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2073
//    }
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2074
//    return 0;
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2075
}
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2076
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2077
static bool
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2078
f128M_eq( float128_t* aPtr, float128_t* bPtr )
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2079
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2080
    union ui128_f128 uA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2081
    uint_fast64_t uiA64, uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2082
    union ui128_f128 uB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2083
    uint_fast64_t uiB64, uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2084
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2085
    uA.f = *aPtr;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2086
    uiA64 = uA.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2087
    uiA0  = uA.ui.v0;
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2088
    uB.f = *bPtr;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2089
    uiB64 = uB.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2090
    uiB0  = uB.ui.v0;
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2091
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2092
    fprintf(stderr, "isNaNF128UI(a): %d\n", isNaNF128UI( uiA64, uiA0 ));
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2093
    fprintf(stderr, "isNaNF128UI(a): %d\n", isNaNF128UI( uiB64, uiB0 ));
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2094
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2095
    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2096
	if (
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2097
	       softfloat_isSigNaNF128UI( uiA64, uiA0 )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2098
	    || softfloat_isSigNaNF128UI( uiB64, uiB0 )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2099
	) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2100
	    softfloat_raiseFlags( softfloat_flag_invalid );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2101
	}
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2102
	return 0;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2103
    }
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2104
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2105
    fprintf(stderr, "uiA0 == uiB0: %d\n", (uiA0 == uiB0));
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2106
    fprintf(stderr, "uiA64 == uiB64: %d\n", (uiA64 == uiB64));
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2107
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2108
    return
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2109
	   (uiA0 == uiB0)
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2110
	&& (   (uiA64 == uiB64)
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2111
	    || (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2112
	   );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2113
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2114
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2115
static bool
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2116
f128M_lt( float128_t* aPtr, float128_t* bPtr )
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2117
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2118
    union ui128_f128 uA;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2119
    uint_fast64_t uiA64, uiA0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2120
    union ui128_f128 uB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2121
    uint_fast64_t uiB64, uiB0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2122
    bool signA, signB;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2123
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2124
    uA.f = *aPtr;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2125
    uiA64 = uA.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2126
    uiA0  = uA.ui.v0;
5019
0407e5639fa3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5018
diff changeset
  2127
    uB.f = *bPtr;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2128
    uiB64 = uB.ui.v64;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2129
    uiB0  = uB.ui.v0;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2130
    if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2131
	softfloat_raiseFlags( softfloat_flag_invalid );
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2132
	return 0;
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2133
    }
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2134
    signA = signF128UI64( uiA64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2135
    signB = signF128UI64( uiB64 );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2136
    return
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2137
	(signA != signB)
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2138
	    ? signA
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2139
		  && (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2140
			  | uiA0 | uiB0)
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2141
	    : ((uiA64 != uiB64) || (uiA0 != uiB0))
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2142
		  && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2143
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2144
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2145
static inline void
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2146
f128M_div( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2147
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2148
    *zPtr = f128_div( *aPtr, *bPtr );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2149
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2150
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2151
static inline void
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2152
f128M_rem( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2153
{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2154
    *zPtr = f128_rem( *aPtr, *bPtr );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2155
}
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2156
5021
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2157
static inline float128_t
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2158
f128_negate( float128_t a) {
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2159
    struct uint128 sigA;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2160
    uint_fast64_t uiA64, uiA0;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2161
    union ui128_f128 uA;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2162
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2163
    uA.f = a;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2164
    uiA64 = uA.ui.v64;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2165
    uiA0  = uA.ui.v0;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2166
    if (isNaNF128UI( uiA64, uiA0 )) return a;
5024
e8cea2066c05 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5023
diff changeset
  2167
    uA.ui.v64 ^= UINT64_C(0x8000000000000000);
5021
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2168
    return uA.f;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2169
}
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2170
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2171
static inline void
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2172
f128M_negate( const float128_t *aPtr, float128_t *zPtr )
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2173
{
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2174
    *zPtr = f128_negate( *aPtr );
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2175
}
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2176
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2177
#endif // SUPPORT_QUADFLOAT
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2178
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2179
%}
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2180
! !
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2181
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2182
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2183
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2184
documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2185
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2186
    QuadFloats represent rational numbers with limited precision
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2187
    and are mapped to IEEE quadruple precision format (128bit),
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2188
    also called binary128.
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2189
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2190
    If the underlying cpu supports them natively, the machine format (long double) is
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2191
    used. Otherwise, a software emulation is done, which is much slower.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2192
    Thus only use them, if you really need the additional precision;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2193
    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
  2194
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2195
    QuadFloats give you definite 128 bit quadruple floats,
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2196
    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
  2197
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2198
    Representation:
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2199
	    128bit quadruple IEEE floats (16bytes);
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2200
	    112 bit mantissa,
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2201
	    16 bit exponent,
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2202
	    34 decimal digits (approx.)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2203
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2204
    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
  2205
    on x86 CPUs, this is emulated and slow.
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2206
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2207
    Mixed mode arithmetic:
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2208
	quadFloat op anyFloat    -> quadFloat
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2209
	anyFloat op quadFloat    -> quadFloat
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2210
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2211
    Range and precision of storage formats: see LimitedPrecisionReal >> documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2212
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2213
    [author:]
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2214
	Claus Gittinger
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2215
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2216
    [see also:]
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2217
	Number
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2218
	Float ShortFloat LongFloat Fraction FixedPoint Integer Complex
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2219
	FloatArray DoubleArray
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2220
	https://en.wikipedia.org/wiki/Extended_precision
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2221
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2222
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2223
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2224
!QuadFloat class methodsFor:'instance creation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2225
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2226
basicNew
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2227
    "return a new quadFloat - here we return 0.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2228
     - QuadFloats are usually NOT created this way ...
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2229
     Its implemented here to allow things like binary store & load
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2230
     of quadFloats.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2231
     (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
  2232
      totally different representation - so floats should be
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2233
      binary stored in a device independent format)."
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2234
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2235
%{  /* NOCONTEXT */
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2236
#ifdef SUPPORT_QUADFLOAT
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2237
    OBJ newFloat;
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2238
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2239
    if (sizeof(long double) == sizeof(float128_t)) {
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2240
	__qMKLFLOAT(newFloat, 0.0);   /* OBJECT ALLOCATION */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2241
    } else {
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2242
	float128_t qf;
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2243
	f64_to_f128M(0.0, &qf);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2244
	__qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2245
    }
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2246
    RETURN (newFloat);
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2247
#endif /* SUPPORT_QUADFLOAT */
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2248
%}.
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2249
    self error:'QuadFloats not supported on this patform'
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2250
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2251
    "Created: / 06-06-2019 / 17:18:58 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2252
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2253
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2254
fromFloat:aFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2255
    "return a new quadFloat, given a float value"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2256
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2257
%{  /* NOCONTEXT */
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2258
#ifdef SUPPORT_QUADFLOAT
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2259
    OBJ newFloat;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2260
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2261
    if (__isFloatLike(aFloat)) {
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2262
	float64_t f = __floatVal(aFloat);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2263
	float128_t qf;
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2264
4992
ee1d80769d4c first code for add
Claus Gittinger <cg@exept.de>
parents: 4991
diff changeset
  2265
	f64_to_f128M(f, &qf);
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2266
	__qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2267
	RETURN (newFloat);
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2268
    }
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2269
#endif /* SUPPORT_QUADFLOAT */
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2270
%}.
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2271
    aFloat isFloat ifTrue:[
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  2272
	self errorUnsupported
4993
c7956a3ab780 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4992
diff changeset
  2273
    ].
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  2274
    ArgumentError raise
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2275
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2276
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2277
     QuadFloat fromFloat:123.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2278
     123.0 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2279
     123 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2280
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2281
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2282
    "Created: / 06-06-2019 / 18:01:03 / Claus Gittinger"
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2283
!
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2284
5017
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2285
fromInteger:anInteger
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2286
    "return a new quadFloat, given an integer value"
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2287
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2288
%{  /* NOCONTEXT */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2289
#ifdef SUPPORT_QUADFLOAT
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2290
    OBJ newFloat;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2291
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2292
    if (__isSmallInteger(anInteger)) {
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2293
	INT iVal = __intVal(anInteger);
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2294
	float128_t qf;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2295
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2296
#if __POINTER_SIZE__ == 4
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2297
	i32_to_f128M( iVal, &qf );
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2298
else
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2299
	i64_to_f128M( iVal, &qf );
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2300
#endif
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2301
	__qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2302
	RETURN (newFloat);
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2303
    }
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2304
#endif /* SUPPORT_QUADFLOAT */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2305
%}.
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2306
    ^ super fromInteger:anInteger
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2307
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2308
    "
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2309
     QuadFloat fromInteger:123
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2310
     123 asQuadFloat
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2311
    "
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2312
!
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2313
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2314
fromLongFloat:aFloat
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2315
    "return a new quadFloat, given a long float value"
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2316
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2317
%{  /* NOCONTEXT */
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2318
#ifdef SUPPORT_QUADFLOAT
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2319
    OBJ newFloat;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2320
    union {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2321
	LONGFLOAT_t lf;         // is long double
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2322
	extFloat80_t ef;        // is 80bit ext
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2323
	float128_t qf;          // is 128bit quad
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2324
    } u;
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2325
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2326
    if (__isLongFloat(aFloat)) {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2327
	u.lf = __longFloatVal(aFloat);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2328
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2329
	if (sizeof(LONGFLOAT_t) == 16) {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2330
	    // longFloat is already 128 bits in size (sparc)
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2331
	    __qMKQFLOAT(newFloat, u.qf);   /* OBJECT ALLOCATION */
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2332
	    RETURN (newFloat);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2333
	}
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2334
	if (sizeof(LONGFLOAT_t) < 16) {
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2335
	    // assume 80bit extended float format (amd64, x86_64)
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2336
	    u.qf = extF80_to_f128( u.ef);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2337
	    __qMKQFLOAT(newFloat, u.qf);   /* OBJECT ALLOCATION */
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2338
	    RETURN (newFloat);
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2339
	}
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2340
	// fall into error case
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2341
    }
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2342
#endif /* SUPPORT_QUADFLOAT */
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2343
%}.
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2344
    aFloat isLongFloat ifTrue:[
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2345
	self errorUnsupported
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2346
    ].
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2347
    ArgumentError raise
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2348
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2349
    "
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2350
     QuadFloat fromLongFloat:123.0 asLongFloat
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2351
    "
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2352
!
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2353
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2354
fromShortFloat:aShortFloat
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2355
    "return a new quadFloat, given a float value"
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2356
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2357
    ^ self fromFloat:(aShortFloat asFloat)
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2358
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2359
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2360
     QuadFloat fromShortFloat:123.0 asShortFloat
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2361
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2362
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2363
    "Created: / 08-06-2019 / 03:28:37 / Claus Gittinger"
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2364
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2365
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2366
!QuadFloat class methodsFor:'coercing & converting'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2367
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2368
coerce:aNumber
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2369
    "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
  2370
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2371
    ^ aNumber asQuadFloat.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2372
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2373
    "Created: / 06-06-2019 / 16:51:01 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2374
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2375
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2376
!QuadFloat class methodsFor:'constants'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2377
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2378
NaN
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2379
    "return a quadFloat which represents not-a-Number (i.e. an invalid number)"
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2380
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2381
    |nan|
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2382
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2383
    NaN isNil ifTrue:[
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2384
%{  /* NOCONTEXT */
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2385
#ifdef SUPPORT_QUADFLOAT
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2386
	{
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2387
	    OBJ newFloat;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2388
	    float128_t qf;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2389
5014
eb02b6118108 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5013
diff changeset
  2390
	    softfloat_commonNaNToF128M( (uint32_t*)(&qf) );
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2391
	    __qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2392
	    nan = newFloat;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2393
	}
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2394
#endif /* SUPPORT_QUADFLOAT */
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2395
%}.
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2396
	NaN := nan
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2397
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2398
    ^ NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2399
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2400
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2401
e
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2402
    "return the constant e as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2403
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2404
    E isNil ifTrue:[
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2405
	"/ eDigits has enough digits for 128bit IEEE quads
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2406
	"/ 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
  2407
	E  := self readFrom:(Number eDigits)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2408
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2409
    ^ E
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2410
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2411
    "Created: / 06-06-2019 / 17:01:54 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2412
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2413
5017
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2414
infinity
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2415
    "return a quadFloat which represents +INF"
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2416
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2417
    |inf|
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2418
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2419
    PositiveInfinity isNil ifTrue:[
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2420
%{  /* NOCONTEXT */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2421
#ifdef SUPPORT_QUADFLOAT
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2422
	{
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2423
	    OBJ newFloat;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2424
	    struct uint128 uiZ;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2425
	    union ui128_f128 uZ;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2426
	    float128_t qf;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2427
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2428
	    uiZ.v64 = packToF128UI64( 0, 0x7FFF, 0 );
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2429
	    uiZ.v0 = 0;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2430
	    uZ.ui = uiZ;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2431
	    qf = uZ.f;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2432
	    __qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2433
	    inf = newFloat;
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2434
	}
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2435
#endif /* SUPPORT_QUADFLOAT */
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2436
%}.
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2437
	PositiveInfinity := inf
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2438
    ].
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2439
    ^ PositiveInfinity
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2440
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2441
    "Created: / 08-06-2019 / 14:05:26 / Claus Gittinger"
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2442
!
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2443
5012
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2444
negativeInfinity
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2445
    "return a quadFloat which represents -INF"
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2446
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2447
    |inf|
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2448
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2449
    NegativeInfinity isNil ifTrue:[
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2450
%{  /* NOCONTEXT */
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2451
#ifdef SUPPORT_QUADFLOAT
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2452
	{
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2453
	    OBJ newFloat;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2454
	    struct uint128 uiZ;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2455
	    union ui128_f128 uZ;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2456
	    float128_t qf;
5012
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2457
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2458
	    uiZ.v64 = packToF128UI64( 1, 0x7FFF, 0 );
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2459
	    uiZ.v0 = 0;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2460
	    uZ.ui = uiZ;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2461
	    qf = uZ.f;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2462
	    __qMKQFLOAT(newFloat, qf);   /* OBJECT ALLOCATION */
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2463
	    inf = newFloat;
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2464
	}
5012
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2465
#endif /* SUPPORT_QUADFLOAT */
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2466
%}.
5013
00262ae1cef1 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5012
diff changeset
  2467
	NegativeInfinity := inf
5012
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2468
    ].
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2469
    ^ NegativeInfinity
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2470
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2471
    "Created: / 08-06-2019 / 14:05:50 / Claus Gittinger"
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2472
!
bd4e0475f9ea #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5011
diff changeset
  2473
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2474
pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2475
    "return the constant pi as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2476
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2477
    Pi isNil ifTrue:[
4991
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2478
	"/ piDigits has enough digits for 128bit IEEE quads
9d86d1eb2a65 compilable, at least
Claus Gittinger <cg@exept.de>
parents: 4983
diff changeset
  2479
	"/ 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
  2480
	Pi  := self readFrom:(Number piDigits)
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2481
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2482
    ^ Pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2483
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2484
    "Created: / 06-06-2019 / 17:09:51 / Claus Gittinger"
5006
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2485
!
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2486
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2487
unity
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2488
    "return the neutral element for multiplication (1.0) as QuadFloat"
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2489
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2490
    QuadFloatOne isNil ifTrue:[
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2491
	QuadFloatOne := 1.0 asQuadFloat.
5006
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2492
    ].
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2493
    ^ QuadFloatOne
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2494
be75f4702e37 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5005
diff changeset
  2495
    "Created: / 07-06-2019 / 03:26:38 / Claus Gittinger"
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2496
!
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2497
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2498
zero
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2499
    "return the neutral element for addition (0.0) as QuadFloat"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2500
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2501
    QuadFloatZero isNil ifTrue:[
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2502
	QuadFloatZero := 0.0 asQuadFloat
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2503
    ].
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2504
    ^ QuadFloatZero
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2505
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2506
    "Created: / 07-06-2019 / 09:22:56 / Claus Gittinger"
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2507
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2508
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2509
!QuadFloat class methodsFor:'error reportng'!
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2510
4997
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  2511
errorUnsupported
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  2512
    self error:'QuadFloats not supported on this patform'
55c76587b49c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4994
diff changeset
  2513
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2514
    "Created: / 07-06-2019 / 02:44:39 / Claus Gittinger"
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2515
! !
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2516
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2517
!QuadFloat class methodsFor:'queries'!
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2518
5017
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2519
epsilon
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2520
    "return the maximum relative spacing of instances of mySelf
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2521
     (i.e. the value-delta of the least significant bit)"
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2522
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2523
    Epsilon isNil ifTrue:[
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2524
	Epsilon := self computeEpsilon.
5017
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2525
    ].
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2526
    ^ Epsilon
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2527
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2528
    "
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2529
     self epsilon
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2530
    "
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2531
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2532
    "Created: / 10-06-2019 / 21:21:18 / Claus Gittinger"
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2533
!
47f09d7ee9b1 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5016
diff changeset
  2534
5018
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2535
exponentCharacter
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2536
    "return the character used to print between mantissa an exponent.
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2537
     Also used by the scanner when reading numbers."
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2538
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2539
    ^ $Q
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2540
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2541
    "Created: / 10-06-2019 / 21:28:04 / Claus Gittinger"
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2542
!
ce2e00107844 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5017
diff changeset
  2543
5025
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2544
numBitsInExponent
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2545
    "answer the number of bits in the exponent
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2546
     the hidden bit is not counted here:
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2547
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2548
     This is an 128bit quadfloat,
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2549
           where 15 bits are available in the exponent:
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2550
        seeeeeee eeeeeeee mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm...
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2551
    "
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2552
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2553
    ^ 15
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2554
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2555
    "
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2556
     1.0 class numBitsInExponent -> 11
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2557
     1.0 asShortFloat class numBitsInExponent -> 8
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2558
     1.0 asLongFloat class numBitsInExponent -> 15
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2559
     1.0 asQuadFloat class numBitsInExponent -> 15
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2560
    "
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2561
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2562
    "Created: / 11-06-2019 / 00:14:55 / Claus Gittinger"
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2563
!
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2564
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2565
numBitsInMantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2566
    "answer the number of bits in the mantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2567
     the hidden bit is not counted here:
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2568
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2569
     This is an 128bit quadfloat,
5007
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2570
	   where 112 bits are available in the mantissa:
97def4a232e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5006
diff changeset
  2571
	seeeeeee eeeeeeee mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm...
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2572
    "
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2573
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2574
    ^ 112
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2575
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2576
    "
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2577
     1.0 class numBitsInMantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2578
     1.0 asShortFloat class numBitsInMantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2579
     1.0 asLongFloat class numBitsInMantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2580
     1.0 asQuadFloat class numBitsInMantissa
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2581
    "
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2582
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2583
    "Created: / 07-06-2019 / 03:24:20 / Claus Gittinger"
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2584
! !
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2585
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2586
!QuadFloat methodsFor:'arithmetic'!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2587
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2588
* aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2589
    "return the product of the receiver and the argument."
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2590
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2591
thisContext isRecursive ifTrue:[self halt].
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2592
    ^ aNumber productFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2593
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2594
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2595
+ aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2596
    "return the sum of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2597
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2598
    ^ aNumber sumFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2599
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2600
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2601
- aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2602
    "return the difference of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2603
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2604
    ^ aNumber differenceFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2605
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2606
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2607
/ aNumber
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2608
    "return the quotient of the receiver and the argument, aNumber"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2609
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2610
    aNumber isZero ifTrue:[
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2611
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2612
	 No, you shalt not divide by zero
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2613
	"
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2614
	^ ZeroDivide raiseRequestWith:thisContext.
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2615
    ].
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2616
    ^ aNumber quotientFromQuadFloat:self
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2617
!
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2618
5021
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2619
negated
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2620
    "return the receiver negated"
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2621
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2622
%{  /* NOCONTEXT */
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2623
#ifdef SUPPORT_QUADFLOAT
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2624
    OBJ newFloat;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2625
    float128_t result, myVal;
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2626
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2627
    myVal = __quadFloatVal(self);
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2628
    f128M_negate( &myVal, &result );
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2629
    __qMKQFLOAT(newFloat, result);
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2630
    RETURN ( newFloat );
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2631
#endif
073ff185359b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5020
diff changeset
  2632
%}.
5025
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2633
!
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2634
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2635
rem: aNumber
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2636
    "return the floating point remainder of the receiver and the argument, aNumber"
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2637
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2638
    aNumber isZero ifTrue:[
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2639
	"
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2640
	 No, you shalt not divide by zero
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2641
	"
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2642
	^ ZeroDivide raiseRequestWith:thisContext.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2643
    ].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2644
    ^ aNumber remainderFromLongFloat:self
4994
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2645
! !
246159e1784d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4993
diff changeset
  2646
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2647
!QuadFloat methodsFor:'coercing & converting'!
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2648
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2649
generality
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2650
    "return the generality value - see ArithmeticValue>>retry:coercing:"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2651
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2652
    ^ 93
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2653
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2654
    "Created: / 07-06-2019 / 09:30:58 / Claus Gittinger"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2655
! !
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2656
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2657
!QuadFloat methodsFor:'comparing'!
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2658
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2659
< aNumber
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2660
    "return true, if the argument is greater"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2661
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2662
    ^ aNumber lessFromQuadFloat:self
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2663
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2664
    "Created: / 07-06-2019 / 09:25:47 / Claus Gittinger"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2665
!
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2666
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2667
= aNumber
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2668
    "return true, if the argument represents the same numeric value
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2669
     as the receiver, false otherwise"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2670
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2671
    ^ aNumber equalFromQuadFloat:self
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2672
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2673
    "Created: / 07-06-2019 / 09:25:27 / Claus Gittinger"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2674
!
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2675
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2676
hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2677
    "return a number for hashing; redefined, since floats compare
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2678
     by numeric value (i.e. 3.0 = 3), therefore 3.0 hash must be the same
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2679
     as 3 hash."
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2680
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2681
    |i|
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2682
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2683
    (self >= SmallInteger minVal and:[self <= SmallInteger maxVal]) ifTrue:[
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2684
	i := self asInteger.
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2685
	self = i ifTrue:[
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2686
	    ^ i hash
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2687
	].
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2688
    ].
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2689
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2690
    ^ self asFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2691
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2692
    "
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2693
     1.2345 hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2694
     1.2345 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2695
     1.2345 asLongFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2696
     1.2345 asQuadFloat hash
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2697
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2698
     1.0 hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2699
     1.0 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2700
     1.0 asLongFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2701
     1.0 asQuadFloat hash
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2702
5008
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2703
     0.5 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2704
     0.5 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2705
     0.5 asLongFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2706
     0.5 asQuadFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2707
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2708
     0.25 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2709
     0.25 asShortFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2710
     0.25 asLongFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2711
     0.25 asQuadFloat hash
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2712
    "
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2713
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2714
    "Created: / 07-06-2019 / 09:28:07 / Claus Gittinger"
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2715
! !
9eb7df4b6ce0 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5007
diff changeset
  2716
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2717
!QuadFloat methodsFor:'double dispatching'!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2718
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2719
differenceFromQuadFloat:aQuadFloat
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2720
%{
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2721
#ifdef SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2722
    OBJ newFloat;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2723
    float128_t result, myVal, argVal;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2724
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2725
    myVal = __quadFloatVal(self);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2726
    argVal = __quadFloatVal(aQuadFloat);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2727
    f128M_sub( &myVal, &argVal, &result );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2728
    __qMKQFLOAT(newFloat, result);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2729
    RETURN ( newFloat );
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2730
#endif // SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2731
%}.
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2732
    self errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2733
!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2734
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2735
equalFromQuadFloat:aQuadFloat
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2736
    "sent when aQuadFloat does not know how to compare agaist the receiver, self"
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2737
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2738
%{
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2739
#ifdef SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2740
    OBJ newFloat;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2741
    float128_t result, myVal, argVal;
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2742
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2743
    myVal = __quadFloatVal(self);
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2744
    argVal = __quadFloatVal(aQuadFloat);
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2745
    RETURN (f128M_eq( &argVal, &myVal ) ? true : false);
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2746
#endif // SUPPORT_QUADFLOAT
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2747
%}.
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2748
    self errorUnsupported
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2749
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2750
    "Modified: / 08-06-2019 / 13:31:48 / Claus Gittinger"
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2751
!
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2752
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2753
lessFromQuadFloat:aQuadFloat
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2754
    "sent when aQuadFloat does not know how to compare agaist the receiver, self"
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2755
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2756
%{
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2757
#ifdef SUPPORT_QUADFLOAT
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2758
    OBJ newFloat;
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2759
    float128_t result, myVal, argVal;
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2760
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2761
    myVal = __quadFloatVal(self);
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2762
    argVal = __quadFloatVal(aQuadFloat);
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2763
    RETURN (f128M_lt( &argVal, &myVal ) ? true : false);
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2764
#endif // SUPPORT_QUADFLOAT
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2765
%}.
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2766
    self errorUnsupported
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2767
!
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2768
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2769
productFromQuadFloat:aQuadFloat
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2770
    "sent when aQuadFloat does not know how to multiply the receiver, self"
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2771
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2772
%{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2773
#ifdef SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2774
    OBJ newFloat;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2775
    float128_t result, myVal, argVal;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2776
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2777
    myVal = __quadFloatVal(self);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2778
    argVal = __quadFloatVal(aQuadFloat);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2779
    f128M_mul( &myVal, &argVal, &result );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2780
    __qMKQFLOAT(newFloat, result);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2781
    RETURN ( newFloat );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2782
#endif // SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2783
%}.
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2784
    self errorUnsupported
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2785
!
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2786
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2787
quotientFromQuadFloat:aQuadFloat
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2788
    "sent when aQuadFloat does not know how to multiply the receiver, self"
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2789
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2790
%{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2791
#ifdef SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2792
    OBJ newFloat;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2793
    float128_t result, myVal, argVal;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2794
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2795
    myVal = __quadFloatVal(self);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2796
    argVal = __quadFloatVal(aQuadFloat);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2797
    f128M_div( &myVal, &argVal, &result );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2798
    __qMKQFLOAT(newFloat, result);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2799
    RETURN ( newFloat );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2800
#endif // SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2801
%}.
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2802
    self errorUnsupported
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2803
!
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2804
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2805
sumFromQuadFloat:aQuadFloat
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2806
    "sent when aQuadFloat does not know how to add the receiver, self"
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2807
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2808
%{
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2809
#ifdef SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2810
    OBJ newFloat;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2811
    float128_t result, myVal, argVal;
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2812
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2813
    myVal = __quadFloatVal(self);
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2814
    argVal = __quadFloatVal(aQuadFloat);
5005
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2815
    f128M_add( &myVal, &argVal, &result );
37632dff5141 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5004
diff changeset
  2816
    __qMKQFLOAT(newFloat, result);
5004
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2817
    RETURN ( newFloat );
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2818
#endif // SUPPORT_QUADFLOAT
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2819
%}.
52b4d47d9ea4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5003
diff changeset
  2820
    self errorUnsupported
5003
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2821
! !
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2822
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2823
!QuadFloat methodsFor:'error reportng'!
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2824
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2825
errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2826
    self class errorUnsupported
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2827
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2828
    "Modified: / 07-06-2019 / 02:44:51 / Claus Gittinger"
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2829
! !
7a48121b7faa #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 5002
diff changeset
  2830
5025
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2831
!QuadFloat methodsFor:'printing'!
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2832
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2833
printOn:aStream
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2834
    |mantissa exponent|
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2835
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2836
    mantissa := self mantissa.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2837
    exponent := self exponent.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2838
    
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2839
    self exponent == 0 ifTrue:[
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2840
        mantissa printOn:aStream.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2841
        aStream nextPutAll:'.0'.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2842
        ^ self
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2843
    ].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2844
    mantissa == 0 ifTrue:[
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2845
        "/ a zero mantissa is impossible - except for zero and a few others
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2846
        exponent == 0 ifTrue:[ aStream nextPutAll:'0.0'. ^ self].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2847
        self == NaN ifTrue:[ aStream nextPutAll:'NAN'. ^ self ].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2848
        self == NegativeInfinity ifTrue:[ aStream nextPutAll:'-INF'. ^ self].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2849
        self == PositiveInfinity ifTrue:[ aStream nextPutAll:'INF'. ^ self].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2850
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2851
        self error:'invalid largeFloat' mayProceed:true.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2852
        aStream nextPutAll:'Invalid'. ^ self.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2853
    ].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2854
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2855
    exponent >= 0 ifTrue:[
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2856
        (mantissa bitShift:exponent) printOn:aStream.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2857
        aStream nextPutAll:'.0'.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2858
        ^ self
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2859
    ].
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2860
    ((mantissa / (1 bitShift:exponent negated)) asFixedPoint:6) printOn:aStream.
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2861
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2862
    "Created: / 11-06-2019 / 00:13:00 / Claus Gittinger"
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2863
! !
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2864
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2865
!QuadFloat methodsFor:'queries'!
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2866
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2867
isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2868
    "return true, if the receiver is a finite float
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2869
     i.e. not NaN and not infinite."
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2870
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2871
%{  /* NOCONTEXT */
5016
fe5e7a43b7f0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5014
diff changeset
  2872
#ifdef SUPPORT_QUADFLOAT
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2873
    float128_t myVal;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2874
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2875
    myVal = __quadFloatVal(self);
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2876
    RETURN ((f128_isInf(myVal) || f128_isNan(myVal)) ? false : true);
5016
fe5e7a43b7f0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5014
diff changeset
  2877
#endif // SUPPORT_QUADFLOAT
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2878
%}.
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2879
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2880
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2881
	1.0 isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2882
	self NaN isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2883
	self infinity isFinite
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2884
	self negativeInfinity isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2885
	(0.0 uncheckedDivide: 0.0) isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2886
	(1.0 uncheckedDivide: 0.0) isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2887
    "
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2888
!
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2889
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2890
isInfinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2891
    "return true, if the receiver is an infinite float.
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2892
     i.e. +Inf or -Inf."
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2893
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2894
%{  /* NOCONTEXT */
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2895
#ifdef SUPPORT_QUADFLOAT
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2896
    float128_t myVal;
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2897
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2898
    myVal = __quadFloatVal(self);
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2899
    RETURN (f128_isInf(myVal) ? true : false);
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2900
#endif // SUPPORT_QUADFLOAT
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2901
%}.
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2902
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2903
    "
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2904
	1.0 isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2905
	1.0 isInfinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2906
	self NaN isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2907
	self NaN isInfinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2908
	self infinity isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2909
	self infinity isInfinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2910
	self negativeInfinity isFinite
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2911
	self negativeInfinity isInfinite
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2912
	(0.0 uncheckedDivide: 0.0) isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2913
	(1.0 uncheckedDivide: 0.0) isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2914
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2915
!
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2916
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2917
isNaN
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2918
    "return true, if the receiver is a finite float
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2919
     i.e. not NaN and not infinite."
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2920
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2921
%{  /* NOCONTEXT */
5016
fe5e7a43b7f0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5014
diff changeset
  2922
#ifdef SUPPORT_QUADFLOAT
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2923
    float128_t myVal;
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2924
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2925
    myVal = __quadFloatVal(self);
5020
9d9c46a3c1b1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5019
diff changeset
  2926
    RETURN (f128_isNan(myVal) ? true : false);
5016
fe5e7a43b7f0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5014
diff changeset
  2927
#endif // SUPPORT_QUADFLOAT
5011
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2928
%}.
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2929
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2930
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2931
	1.0 isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2932
	self NaN isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2933
	self infinity isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2934
	(0.0 uncheckedDivide: 0.0) isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2935
	(1.0 uncheckedDivide: 0.0) isFinite
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2936
    "
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2937
! !
889548e8808e #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5008
diff changeset
  2938
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2939
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2940
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2941
version_CVS
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2942
    ^ '$Header$'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2943
! !
5025
b1d9b71d6937 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5024
diff changeset
  2944