github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/3rd_party/SoftFloat-3e/source/include/primitives.h (about)

     1  
     2  /*============================================================================
     3  
     4  This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
     5  Package, Release 3e, by John R. Hauser.
     6  
     7  Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
     8  University of California.  All rights reserved.
     9  
    10  Redistribution and use in source and binary forms, with or without
    11  modification, are permitted provided that the following conditions are met:
    12  
    13   1. Redistributions of source code must retain the above copyright notice,
    14      this list of conditions, and the following disclaimer.
    15  
    16   2. Redistributions in binary form must reproduce the above copyright notice,
    17      this list of conditions, and the following disclaimer in the documentation
    18      and/or other materials provided with the distribution.
    19  
    20   3. Neither the name of the University nor the names of its contributors may
    21      be used to endorse or promote products derived from this software without
    22      specific prior written permission.
    23  
    24  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
    25  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    26  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
    27  DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
    28  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    29  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    30  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    31  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    32  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    33  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    34  
    35  =============================================================================*/
    36  
    37  #ifndef primitives_h
    38  #define primitives_h 1
    39  
    40  #include <stdbool.h>
    41  #include <stdint.h>
    42  #include "primitiveTypes.h"
    43  
    44  #ifndef softfloat_shortShiftRightJam64
    45  /*----------------------------------------------------------------------------
    46  | Shifts 'a' right by the number of bits given in 'dist', which must be in
    47  | the range 1 to 63.  If any nonzero bits are shifted off, they are "jammed"
    48  | into the least-significant bit of the shifted value by setting the least-
    49  | significant bit to 1.  This shifted-and-jammed value is returned.
    50  *----------------------------------------------------------------------------*/
    51  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
    52  INLINE
    53  uint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist )
    54      { return a>>dist | ((a & (((uint_fast64_t) 1<<dist) - 1)) != 0); }
    55  #else
    56  uint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist );
    57  #endif
    58  #endif
    59  
    60  #ifndef softfloat_shiftRightJam32
    61  /*----------------------------------------------------------------------------
    62  | Shifts 'a' right by the number of bits given in 'dist', which must not
    63  | be zero.  If any nonzero bits are shifted off, they are "jammed" into the
    64  | least-significant bit of the shifted value by setting the least-significant
    65  | bit to 1.  This shifted-and-jammed value is returned.
    66  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
    67  | greater than 32, the result will be either 0 or 1, depending on whether 'a'
    68  | is zero or nonzero.
    69  *----------------------------------------------------------------------------*/
    70  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
    71  INLINE uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist )
    72  {
    73      return
    74          (dist < 31) ? a>>dist | ((uint32_t) (a<<(-dist & 31)) != 0) : (a != 0);
    75  }
    76  #else
    77  uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist );
    78  #endif
    79  #endif
    80  
    81  #ifndef softfloat_shiftRightJam64
    82  /*----------------------------------------------------------------------------
    83  | Shifts 'a' right by the number of bits given in 'dist', which must not
    84  | be zero.  If any nonzero bits are shifted off, they are "jammed" into the
    85  | least-significant bit of the shifted value by setting the least-significant
    86  | bit to 1.  This shifted-and-jammed value is returned.
    87  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
    88  | greater than 64, the result will be either 0 or 1, depending on whether 'a'
    89  | is zero or nonzero.
    90  *----------------------------------------------------------------------------*/
    91  #if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
    92  INLINE uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist )
    93  {
    94      return
    95          (dist < 63) ? a>>dist | ((uint64_t) (a<<(-dist & 63)) != 0) : (a != 0);
    96  }
    97  #else
    98  uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist );
    99  #endif
   100  #endif
   101  
   102  /*----------------------------------------------------------------------------
   103  | A constant table that translates an 8-bit unsigned integer (the array index)
   104  | into the number of leading 0 bits before the most-significant 1 of that
   105  | integer.  For integer zero (index 0), the corresponding table element is 8.
   106  *----------------------------------------------------------------------------*/
   107  extern const uint_least8_t softfloat_countLeadingZeros8[256];
   108  
   109  #ifndef softfloat_countLeadingZeros16
   110  /*----------------------------------------------------------------------------
   111  | Returns the number of leading 0 bits before the most-significant 1 bit of
   112  | 'a'.  If 'a' is zero, 16 is returned.
   113  *----------------------------------------------------------------------------*/
   114  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   115  INLINE uint_fast8_t softfloat_countLeadingZeros16( uint16_t a )
   116  {
   117      uint_fast8_t count = 8;
   118      if ( 0x100 <= a ) {
   119          count = 0;
   120          a >>= 8;
   121      }
   122      count += softfloat_countLeadingZeros8[a];
   123      return count;
   124  }
   125  #else
   126  uint_fast8_t softfloat_countLeadingZeros16( uint16_t a );
   127  #endif
   128  #endif
   129  
   130  #ifndef softfloat_countLeadingZeros32
   131  /*----------------------------------------------------------------------------
   132  | Returns the number of leading 0 bits before the most-significant 1 bit of
   133  | 'a'.  If 'a' is zero, 32 is returned.
   134  *----------------------------------------------------------------------------*/
   135  #if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
   136  INLINE uint_fast8_t softfloat_countLeadingZeros32( uint32_t a )
   137  {
   138      uint_fast8_t count = 0;
   139      if ( a < 0x10000 ) {
   140          count = 16;
   141          a <<= 16;
   142      }
   143      if ( a < 0x1000000 ) {
   144          count += 8;
   145          a <<= 8;
   146      }
   147      count += softfloat_countLeadingZeros8[a>>24];
   148      return count;
   149  }
   150  #else
   151  uint_fast8_t softfloat_countLeadingZeros32( uint32_t a );
   152  #endif
   153  #endif
   154  
   155  #ifndef softfloat_countLeadingZeros64
   156  /*----------------------------------------------------------------------------
   157  | Returns the number of leading 0 bits before the most-significant 1 bit of
   158  | 'a'.  If 'a' is zero, 64 is returned.
   159  *----------------------------------------------------------------------------*/
   160  uint_fast8_t softfloat_countLeadingZeros64( uint64_t a );
   161  #endif
   162  
   163  extern const uint16_t softfloat_approxRecip_1k0s[16];
   164  extern const uint16_t softfloat_approxRecip_1k1s[16];
   165  
   166  #ifndef softfloat_approxRecip32_1
   167  /*----------------------------------------------------------------------------
   168  | Returns an approximation to the reciprocal of the number represented by 'a',
   169  | where 'a' is interpreted as an unsigned fixed-point number with one integer
   170  | bit and 31 fraction bits.  The 'a' input must be "normalized", meaning that
   171  | its most-significant bit (bit 31) must be 1.  Thus, if A is the value of
   172  | the fixed-point interpretation of 'a', then 1 <= A < 2.  The returned value
   173  | is interpreted as a pure unsigned fraction, having no integer bits and 32
   174  | fraction bits.  The approximation returned is never greater than the true
   175  | reciprocal 1/A, and it differs from the true reciprocal by at most 2.006 ulp
   176  | (units in the last place).
   177  *----------------------------------------------------------------------------*/
   178  #ifdef SOFTFLOAT_FAST_DIV64TO32
   179  #define softfloat_approxRecip32_1( a ) ((uint32_t) (UINT64_C( 0x7FFFFFFFFFFFFFFF ) / (uint32_t) (a)))
   180  #else
   181  uint32_t softfloat_approxRecip32_1( uint32_t a );
   182  #endif
   183  #endif
   184  
   185  extern const uint16_t softfloat_approxRecipSqrt_1k0s[16];
   186  extern const uint16_t softfloat_approxRecipSqrt_1k1s[16];
   187  
   188  #ifndef softfloat_approxRecipSqrt32_1
   189  /*----------------------------------------------------------------------------
   190  | Returns an approximation to the reciprocal of the square root of the number
   191  | represented by 'a', where 'a' is interpreted as an unsigned fixed-point
   192  | number either with one integer bit and 31 fraction bits or with two integer
   193  | bits and 30 fraction bits.  The format of 'a' is determined by 'oddExpA',
   194  | which must be either 0 or 1.  If 'oddExpA' is 1, 'a' is interpreted as
   195  | having one integer bit, and if 'oddExpA' is 0, 'a' is interpreted as having
   196  | two integer bits.  The 'a' input must be "normalized", meaning that its
   197  | most-significant bit (bit 31) must be 1.  Thus, if A is the value of the
   198  | fixed-point interpretation of 'a', it follows that 1 <= A < 2 when 'oddExpA'
   199  | is 1, and 2 <= A < 4 when 'oddExpA' is 0.
   200  |   The returned value is interpreted as a pure unsigned fraction, having
   201  | no integer bits and 32 fraction bits.  The approximation returned is never
   202  | greater than the true reciprocal 1/sqrt(A), and it differs from the true
   203  | reciprocal by at most 2.06 ulp (units in the last place).  The approximation
   204  | returned is also always within the range 0.5 to 1; thus, the most-
   205  | significant bit of the result is always set.
   206  *----------------------------------------------------------------------------*/
   207  uint32_t softfloat_approxRecipSqrt32_1( unsigned int oddExpA, uint32_t a );
   208  #endif
   209  
   210  #ifdef SOFTFLOAT_FAST_INT64
   211  
   212  /*----------------------------------------------------------------------------
   213  | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
   214  | defined.
   215  *----------------------------------------------------------------------------*/
   216  
   217  #ifndef softfloat_eq128
   218  /*----------------------------------------------------------------------------
   219  | Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
   220  | and 'a0' is equal to the 128-bit unsigned integer formed by concatenating
   221  | 'b64' and 'b0'.
   222  *----------------------------------------------------------------------------*/
   223  #if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
   224  INLINE
   225  bool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
   226      { return (a64 == b64) && (a0 == b0); }
   227  #else
   228  bool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
   229  #endif
   230  #endif
   231  
   232  #ifndef softfloat_le128
   233  /*----------------------------------------------------------------------------
   234  | Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
   235  | and 'a0' is less than or equal to the 128-bit unsigned integer formed by
   236  | concatenating 'b64' and 'b0'.
   237  *----------------------------------------------------------------------------*/
   238  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   239  INLINE
   240  bool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
   241      { return (a64 < b64) || ((a64 == b64) && (a0 <= b0)); }
   242  #else
   243  bool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
   244  #endif
   245  #endif
   246  
   247  #ifndef softfloat_lt128
   248  /*----------------------------------------------------------------------------
   249  | Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
   250  | and 'a0' is less than the 128-bit unsigned integer formed by concatenating
   251  | 'b64' and 'b0'.
   252  *----------------------------------------------------------------------------*/
   253  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   254  INLINE
   255  bool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
   256      { return (a64 < b64) || ((a64 == b64) && (a0 < b0)); }
   257  #else
   258  bool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
   259  #endif
   260  #endif
   261  
   262  #ifndef softfloat_shortShiftLeft128
   263  /*----------------------------------------------------------------------------
   264  | Shifts the 128 bits formed by concatenating 'a64' and 'a0' left by the
   265  | number of bits given in 'dist', which must be in the range 1 to 63.
   266  *----------------------------------------------------------------------------*/
   267  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   268  INLINE
   269  struct uint128
   270   softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
   271  {
   272      struct uint128 z;
   273      z.v64 = a64<<dist | a0>>(-dist & 63);
   274      z.v0 = a0<<dist;
   275      return z;
   276  }
   277  #else
   278  struct uint128
   279   softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist );
   280  #endif
   281  #endif
   282  
   283  #ifndef softfloat_shortShiftRight128
   284  /*----------------------------------------------------------------------------
   285  | Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
   286  | number of bits given in 'dist', which must be in the range 1 to 63.
   287  *----------------------------------------------------------------------------*/
   288  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   289  INLINE
   290  struct uint128
   291   softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
   292  {
   293      struct uint128 z;
   294      z.v64 = a64>>dist;
   295      z.v0 = a64<<(-dist & 63) | a0>>dist;
   296      return z;
   297  }
   298  #else
   299  struct uint128
   300   softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist );
   301  #endif
   302  #endif
   303  
   304  #ifndef softfloat_shortShiftRightJam64Extra
   305  /*----------------------------------------------------------------------------
   306  | This function is the same as 'softfloat_shiftRightJam64Extra' (below),
   307  | except that 'dist' must be in the range 1 to 63.
   308  *----------------------------------------------------------------------------*/
   309  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   310  INLINE
   311  struct uint64_extra
   312   softfloat_shortShiftRightJam64Extra(
   313       uint64_t a, uint64_t extra, uint_fast8_t dist )
   314  {
   315      struct uint64_extra z;
   316      z.v = a>>dist;
   317      z.extra = a<<(-dist & 63) | (extra != 0);
   318      return z;
   319  }
   320  #else
   321  struct uint64_extra
   322   softfloat_shortShiftRightJam64Extra(
   323       uint64_t a, uint64_t extra, uint_fast8_t dist );
   324  #endif
   325  #endif
   326  
   327  #ifndef softfloat_shortShiftRightJam128
   328  /*----------------------------------------------------------------------------
   329  | Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
   330  | number of bits given in 'dist', which must be in the range 1 to 63.  If any
   331  | nonzero bits are shifted off, they are "jammed" into the least-significant
   332  | bit of the shifted value by setting the least-significant bit to 1.  This
   333  | shifted-and-jammed value is returned.
   334  *----------------------------------------------------------------------------*/
   335  #if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
   336  INLINE
   337  struct uint128
   338   softfloat_shortShiftRightJam128(
   339       uint64_t a64, uint64_t a0, uint_fast8_t dist )
   340  {
   341      uint_fast8_t negDist = -dist;
   342      struct uint128 z;
   343      z.v64 = a64>>dist;
   344      z.v0 =
   345          a64<<(negDist & 63) | a0>>dist
   346              | ((uint64_t) (a0<<(negDist & 63)) != 0);
   347      return z;
   348  }
   349  #else
   350  struct uint128
   351   softfloat_shortShiftRightJam128(
   352       uint64_t a64, uint64_t a0, uint_fast8_t dist );
   353  #endif
   354  #endif
   355  
   356  #ifndef softfloat_shortShiftRightJam128Extra
   357  /*----------------------------------------------------------------------------
   358  | This function is the same as 'softfloat_shiftRightJam128Extra' (below),
   359  | except that 'dist' must be in the range 1 to 63.
   360  *----------------------------------------------------------------------------*/
   361  #if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
   362  INLINE
   363  struct uint128_extra
   364   softfloat_shortShiftRightJam128Extra(
   365       uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist )
   366  {
   367      uint_fast8_t negDist = -dist;
   368      struct uint128_extra z;
   369      z.v.v64 = a64>>dist;
   370      z.v.v0 = a64<<(negDist & 63) | a0>>dist;
   371      z.extra = a0<<(negDist & 63) | (extra != 0);
   372      return z;
   373  }
   374  #else
   375  struct uint128_extra
   376   softfloat_shortShiftRightJam128Extra(
   377       uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist );
   378  #endif
   379  #endif
   380  
   381  #ifndef softfloat_shiftRightJam64Extra
   382  /*----------------------------------------------------------------------------
   383  | Shifts the 128 bits formed by concatenating 'a' and 'extra' right by 64
   384  | _plus_ the number of bits given in 'dist', which must not be zero.  This
   385  | shifted value is at most 64 nonzero bits and is returned in the 'v' field
   386  | of the 'struct uint64_extra' result.  The 64-bit 'extra' field of the result
   387  | contains a value formed as follows from the bits that were shifted off:  The
   388  | _last_ bit shifted off is the most-significant bit of the 'extra' field, and
   389  | the other 63 bits of the 'extra' field are all zero if and only if _all_but_
   390  | _the_last_ bits shifted off were all zero.
   391  |   (This function makes more sense if 'a' and 'extra' are considered to form
   392  | an unsigned fixed-point number with binary point between 'a' and 'extra'.
   393  | This fixed-point value is shifted right by the number of bits given in
   394  | 'dist', and the integer part of this shifted value is returned in the 'v'
   395  | field of the result.  The fractional part of the shifted value is modified
   396  | as described above and returned in the 'extra' field of the result.)
   397  *----------------------------------------------------------------------------*/
   398  #if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
   399  INLINE
   400  struct uint64_extra
   401   softfloat_shiftRightJam64Extra(
   402       uint64_t a, uint64_t extra, uint_fast32_t dist )
   403  {
   404      struct uint64_extra z;
   405      if ( dist < 64 ) {
   406          z.v = a>>dist;
   407          z.extra = a<<(-dist & 63);
   408      } else {
   409          z.v = 0;
   410          z.extra = (dist == 64) ? a : (a != 0);
   411      }
   412      z.extra |= (extra != 0);
   413      return z;
   414  }
   415  #else
   416  struct uint64_extra
   417   softfloat_shiftRightJam64Extra(
   418       uint64_t a, uint64_t extra, uint_fast32_t dist );
   419  #endif
   420  #endif
   421  
   422  #ifndef softfloat_shiftRightJam128
   423  /*----------------------------------------------------------------------------
   424  | Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
   425  | number of bits given in 'dist', which must not be zero.  If any nonzero bits
   426  | are shifted off, they are "jammed" into the least-significant bit of the
   427  | shifted value by setting the least-significant bit to 1.  This shifted-and-
   428  | jammed value is returned.
   429  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
   430  | greater than 128, the result will be either 0 or 1, depending on whether the
   431  | original 128 bits are all zeros.
   432  *----------------------------------------------------------------------------*/
   433  struct uint128
   434   softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist );
   435  #endif
   436  
   437  #ifndef softfloat_shiftRightJam128Extra
   438  /*----------------------------------------------------------------------------
   439  | Shifts the 192 bits formed by concatenating 'a64', 'a0', and 'extra' right
   440  | by 64 _plus_ the number of bits given in 'dist', which must not be zero.
   441  | This shifted value is at most 128 nonzero bits and is returned in the 'v'
   442  | field of the 'struct uint128_extra' result.  The 64-bit 'extra' field of the
   443  | result contains a value formed as follows from the bits that were shifted
   444  | off:  The _last_ bit shifted off is the most-significant bit of the 'extra'
   445  | field, and the other 63 bits of the 'extra' field are all zero if and only
   446  | if _all_but_the_last_ bits shifted off were all zero.
   447  |   (This function makes more sense if 'a64', 'a0', and 'extra' are considered
   448  | to form an unsigned fixed-point number with binary point between 'a0' and
   449  | 'extra'.  This fixed-point value is shifted right by the number of bits
   450  | given in 'dist', and the integer part of this shifted value is returned
   451  | in the 'v' field of the result.  The fractional part of the shifted value
   452  | is modified as described above and returned in the 'extra' field of the
   453  | result.)
   454  *----------------------------------------------------------------------------*/
   455  struct uint128_extra
   456   softfloat_shiftRightJam128Extra(
   457       uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist );
   458  #endif
   459  
   460  #ifndef softfloat_shiftRightJam256M
   461  /*----------------------------------------------------------------------------
   462  | Shifts the 256-bit unsigned integer pointed to by 'aPtr' right by the number
   463  | of bits given in 'dist', which must not be zero.  If any nonzero bits are
   464  | shifted off, they are "jammed" into the least-significant bit of the shifted
   465  | value by setting the least-significant bit to 1.  This shifted-and-jammed
   466  | value is stored at the location pointed to by 'zPtr'.  Each of 'aPtr' and
   467  | 'zPtr' points to an array of four 64-bit elements that concatenate in the
   468  | platform's normal endian order to form a 256-bit integer.
   469  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'
   470  | is greater than 256, the stored result will be either 0 or 1, depending on
   471  | whether the original 256 bits are all zeros.
   472  *----------------------------------------------------------------------------*/
   473  void
   474   softfloat_shiftRightJam256M(
   475       const uint64_t *aPtr, uint_fast32_t dist, uint64_t *zPtr );
   476  #endif
   477  
   478  #ifndef softfloat_add128
   479  /*----------------------------------------------------------------------------
   480  | Returns the sum of the 128-bit integer formed by concatenating 'a64' and
   481  | 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.  The
   482  | addition is modulo 2^128, so any carry out is lost.
   483  *----------------------------------------------------------------------------*/
   484  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   485  INLINE
   486  struct uint128
   487   softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
   488  {
   489      struct uint128 z;
   490      z.v0 = a0 + b0;
   491      z.v64 = a64 + b64 + (z.v0 < a0);
   492      return z;
   493  }
   494  #else
   495  struct uint128
   496   softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
   497  #endif
   498  #endif
   499  
   500  #ifndef softfloat_add256M
   501  /*----------------------------------------------------------------------------
   502  | Adds the two 256-bit integers pointed to by 'aPtr' and 'bPtr'.  The addition
   503  | is modulo 2^256, so any carry out is lost.  The sum is stored at the
   504  | location pointed to by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to
   505  | an array of four 64-bit elements that concatenate in the platform's normal
   506  | endian order to form a 256-bit integer.
   507  *----------------------------------------------------------------------------*/
   508  void
   509   softfloat_add256M(
   510       const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );
   511  #endif
   512  
   513  #ifndef softfloat_sub128
   514  /*----------------------------------------------------------------------------
   515  | Returns the difference of the 128-bit integer formed by concatenating 'a64'
   516  | and 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.
   517  | The subtraction is modulo 2^128, so any borrow out (carry out) is lost.
   518  *----------------------------------------------------------------------------*/
   519  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   520  INLINE
   521  struct uint128
   522   softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
   523  {
   524      struct uint128 z;
   525      z.v0 = a0 - b0;
   526      z.v64 = a64 - b64;
   527      z.v64 -= (a0 < b0);
   528      return z;
   529  }
   530  #else
   531  struct uint128
   532   softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
   533  #endif
   534  #endif
   535  
   536  #ifndef softfloat_sub256M
   537  /*----------------------------------------------------------------------------
   538  | Subtracts the 256-bit integer pointed to by 'bPtr' from the 256-bit integer
   539  | pointed to by 'aPtr'.  The addition is modulo 2^256, so any borrow out
   540  | (carry out) is lost.  The difference is stored at the location pointed to
   541  | by 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to an array of four
   542  | 64-bit elements that concatenate in the platform's normal endian order to
   543  | form a 256-bit integer.
   544  *----------------------------------------------------------------------------*/
   545  void
   546   softfloat_sub256M(
   547       const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );
   548  #endif
   549  
   550  #ifndef softfloat_mul64ByShifted32To128
   551  /*----------------------------------------------------------------------------
   552  | Returns the 128-bit product of 'a', 'b', and 2^32.
   553  *----------------------------------------------------------------------------*/
   554  #if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
   555  INLINE struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )
   556  {
   557      uint_fast64_t mid;
   558      struct uint128 z;
   559      mid = (uint_fast64_t) (uint32_t) a * b;
   560      z.v0 = mid<<32;
   561      z.v64 = (uint_fast64_t) (uint32_t) (a>>32) * b + (mid>>32);
   562      return z;
   563  }
   564  #else
   565  struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b );
   566  #endif
   567  #endif
   568  
   569  #ifndef softfloat_mul64To128
   570  /*----------------------------------------------------------------------------
   571  | Returns the 128-bit product of 'a' and 'b'.
   572  *----------------------------------------------------------------------------*/
   573  struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b );
   574  #endif
   575  
   576  #ifndef softfloat_mul128By32
   577  /*----------------------------------------------------------------------------
   578  | Returns the product of the 128-bit integer formed by concatenating 'a64' and
   579  | 'a0', multiplied by 'b'.  The multiplication is modulo 2^128; any overflow
   580  | bits are discarded.
   581  *----------------------------------------------------------------------------*/
   582  #if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
   583  INLINE
   584  struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )
   585  {
   586      struct uint128 z;
   587      uint_fast64_t mid;
   588      uint_fast32_t carry;
   589      z.v0 = a0 * b;
   590      mid = (uint_fast64_t) (uint32_t) (a0>>32) * b;
   591      carry = (uint32_t) ((uint_fast32_t) (z.v0>>32) - (uint_fast32_t) mid);
   592      z.v64 = a64 * b + (uint_fast32_t) ((mid + carry)>>32);
   593      return z;
   594  }
   595  #else
   596  struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b );
   597  #endif
   598  #endif
   599  
   600  #ifndef softfloat_mul128To256M
   601  /*----------------------------------------------------------------------------
   602  | Multiplies the 128-bit unsigned integer formed by concatenating 'a64' and
   603  | 'a0' by the 128-bit unsigned integer formed by concatenating 'b64' and
   604  | 'b0'.  The 256-bit product is stored at the location pointed to by 'zPtr'.
   605  | Argument 'zPtr' points to an array of four 64-bit elements that concatenate
   606  | in the platform's normal endian order to form a 256-bit integer.
   607  *----------------------------------------------------------------------------*/
   608  void
   609   softfloat_mul128To256M(
   610       uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr );
   611  #endif
   612  
   613  #else
   614  
   615  /*----------------------------------------------------------------------------
   616  | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
   617  | defined.
   618  *----------------------------------------------------------------------------*/
   619  
   620  #ifndef softfloat_compare96M
   621  /*----------------------------------------------------------------------------
   622  | Compares the two 96-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
   623  | Returns -1 if the first integer (A) is less than the second (B); returns 0
   624  | if the two integers are equal; and returns +1 if the first integer (A)
   625  | is greater than the second (B).  (The result is thus the signum of A - B.)
   626  | Each of 'aPtr' and 'bPtr' points to an array of three 32-bit elements that
   627  | concatenate in the platform's normal endian order to form a 96-bit integer.
   628  *----------------------------------------------------------------------------*/
   629  int_fast8_t softfloat_compare96M( const uint32_t *aPtr, const uint32_t *bPtr );
   630  #endif
   631  
   632  #ifndef softfloat_compare128M
   633  /*----------------------------------------------------------------------------
   634  | Compares the two 128-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
   635  | Returns -1 if the first integer (A) is less than the second (B); returns 0
   636  | if the two integers are equal; and returns +1 if the first integer (A)
   637  | is greater than the second (B).  (The result is thus the signum of A - B.)
   638  | Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
   639  | concatenate in the platform's normal endian order to form a 128-bit integer.
   640  *----------------------------------------------------------------------------*/
   641  int_fast8_t
   642   softfloat_compare128M( const uint32_t *aPtr, const uint32_t *bPtr );
   643  #endif
   644  
   645  #ifndef softfloat_shortShiftLeft64To96M
   646  /*----------------------------------------------------------------------------
   647  | Extends 'a' to 96 bits and shifts the value left by the number of bits given
   648  | in 'dist', which must be in the range 1 to 31.  The result is stored at the
   649  | location pointed to by 'zPtr'.  Argument 'zPtr' points to an array of three
   650  | 32-bit elements that concatenate in the platform's normal endian order to
   651  | form a 96-bit integer.
   652  *----------------------------------------------------------------------------*/
   653  #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
   654  INLINE
   655  void
   656   softfloat_shortShiftLeft64To96M(
   657       uint64_t a, uint_fast8_t dist, uint32_t *zPtr )
   658  {
   659      zPtr[indexWord( 3, 0 )] = (uint32_t) a<<dist;
   660      a >>= 32 - dist;
   661      zPtr[indexWord( 3, 2 )] = a>>32;
   662      zPtr[indexWord( 3, 1 )] = a;
   663  }
   664  #else
   665  void
   666   softfloat_shortShiftLeft64To96M(
   667       uint64_t a, uint_fast8_t dist, uint32_t *zPtr );
   668  #endif
   669  #endif
   670  
   671  #ifndef softfloat_shortShiftLeftM
   672  /*----------------------------------------------------------------------------
   673  | Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
   674  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   675  | must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The
   676  | shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each
   677  | of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
   678  | that concatenate in the platform's normal endian order to form an N-bit
   679  | integer.
   680  *----------------------------------------------------------------------------*/
   681  void
   682   softfloat_shortShiftLeftM(
   683       uint_fast8_t size_words,
   684       const uint32_t *aPtr,
   685       uint_fast8_t dist,
   686       uint32_t *zPtr
   687   );
   688  #endif
   689  
   690  #ifndef softfloat_shortShiftLeft96M
   691  /*----------------------------------------------------------------------------
   692  | This function or macro is the same as 'softfloat_shortShiftLeftM' with
   693  | 'size_words' = 3 (N = 96).
   694  *----------------------------------------------------------------------------*/
   695  #define softfloat_shortShiftLeft96M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 3, aPtr, dist, zPtr )
   696  #endif
   697  
   698  #ifndef softfloat_shortShiftLeft128M
   699  /*----------------------------------------------------------------------------
   700  | This function or macro is the same as 'softfloat_shortShiftLeftM' with
   701  | 'size_words' = 4 (N = 128).
   702  *----------------------------------------------------------------------------*/
   703  #define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )
   704  #endif
   705  
   706  #ifndef softfloat_shortShiftLeft160M
   707  /*----------------------------------------------------------------------------
   708  | This function or macro is the same as 'softfloat_shortShiftLeftM' with
   709  | 'size_words' = 5 (N = 160).
   710  *----------------------------------------------------------------------------*/
   711  #define softfloat_shortShiftLeft160M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 5, aPtr, dist, zPtr )
   712  #endif
   713  
   714  #ifndef softfloat_shiftLeftM
   715  /*----------------------------------------------------------------------------
   716  | Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
   717  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   718  | must not be zero.  Any nonzero bits shifted off are lost.  The shifted
   719  | N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'
   720  | and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
   721  | concatenate in the platform's normal endian order to form an N-bit integer.
   722  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
   723  | greater than N, the stored result will be 0.
   724  *----------------------------------------------------------------------------*/
   725  void
   726   softfloat_shiftLeftM(
   727       uint_fast8_t size_words,
   728       const uint32_t *aPtr,
   729       uint32_t dist,
   730       uint32_t *zPtr
   731   );
   732  #endif
   733  
   734  #ifndef softfloat_shiftLeft96M
   735  /*----------------------------------------------------------------------------
   736  | This function or macro is the same as 'softfloat_shiftLeftM' with
   737  | 'size_words' = 3 (N = 96).
   738  *----------------------------------------------------------------------------*/
   739  #define softfloat_shiftLeft96M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 3, aPtr, dist, zPtr )
   740  #endif
   741  
   742  #ifndef softfloat_shiftLeft128M
   743  /*----------------------------------------------------------------------------
   744  | This function or macro is the same as 'softfloat_shiftLeftM' with
   745  | 'size_words' = 4 (N = 128).
   746  *----------------------------------------------------------------------------*/
   747  #define softfloat_shiftLeft128M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 4, aPtr, dist, zPtr )
   748  #endif
   749  
   750  #ifndef softfloat_shiftLeft160M
   751  /*----------------------------------------------------------------------------
   752  | This function or macro is the same as 'softfloat_shiftLeftM' with
   753  | 'size_words' = 5 (N = 160).
   754  *----------------------------------------------------------------------------*/
   755  #define softfloat_shiftLeft160M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 5, aPtr, dist, zPtr )
   756  #endif
   757  
   758  #ifndef softfloat_shortShiftRightM
   759  /*----------------------------------------------------------------------------
   760  | Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
   761  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   762  | must be in the range 1 to 31.  Any nonzero bits shifted off are lost.  The
   763  | shifted N-bit result is stored at the location pointed to by 'zPtr'.  Each
   764  | of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
   765  | that concatenate in the platform's normal endian order to form an N-bit
   766  | integer.
   767  *----------------------------------------------------------------------------*/
   768  void
   769   softfloat_shortShiftRightM(
   770       uint_fast8_t size_words,
   771       const uint32_t *aPtr,
   772       uint_fast8_t dist,
   773       uint32_t *zPtr
   774   );
   775  #endif
   776  
   777  #ifndef softfloat_shortShiftRight128M
   778  /*----------------------------------------------------------------------------
   779  | This function or macro is the same as 'softfloat_shortShiftRightM' with
   780  | 'size_words' = 4 (N = 128).
   781  *----------------------------------------------------------------------------*/
   782  #define softfloat_shortShiftRight128M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 4, aPtr, dist, zPtr )
   783  #endif
   784  
   785  #ifndef softfloat_shortShiftRight160M
   786  /*----------------------------------------------------------------------------
   787  | This function or macro is the same as 'softfloat_shortShiftRightM' with
   788  | 'size_words' = 5 (N = 160).
   789  *----------------------------------------------------------------------------*/
   790  #define softfloat_shortShiftRight160M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 5, aPtr, dist, zPtr )
   791  #endif
   792  
   793  #ifndef softfloat_shortShiftRightJamM
   794  /*----------------------------------------------------------------------------
   795  | Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
   796  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   797  | must be in the range 1 to 31.  If any nonzero bits are shifted off, they are
   798  | "jammed" into the least-significant bit of the shifted value by setting the
   799  | least-significant bit to 1.  This shifted-and-jammed N-bit result is stored
   800  | at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points
   801  | to a 'size_words'-long array of 32-bit elements that concatenate in the
   802  | platform's normal endian order to form an N-bit integer.
   803  *----------------------------------------------------------------------------*/
   804  void
   805   softfloat_shortShiftRightJamM(
   806       uint_fast8_t, const uint32_t *, uint_fast8_t, uint32_t * );
   807  #endif
   808  
   809  #ifndef softfloat_shortShiftRightJam160M
   810  /*----------------------------------------------------------------------------
   811  | This function or macro is the same as 'softfloat_shortShiftRightJamM' with
   812  | 'size_words' = 5 (N = 160).
   813  *----------------------------------------------------------------------------*/
   814  #define softfloat_shortShiftRightJam160M( aPtr, dist, zPtr ) softfloat_shortShiftRightJamM( 5, aPtr, dist, zPtr )
   815  #endif
   816  
   817  #ifndef softfloat_shiftRightM
   818  /*----------------------------------------------------------------------------
   819  | Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
   820  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   821  | must not be zero.  Any nonzero bits shifted off are lost.  The shifted
   822  | N-bit result is stored at the location pointed to by 'zPtr'.  Each of 'aPtr'
   823  | and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
   824  | concatenate in the platform's normal endian order to form an N-bit integer.
   825  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist' is
   826  | greater than N, the stored result will be 0.
   827  *----------------------------------------------------------------------------*/
   828  void
   829   softfloat_shiftRightM(
   830       uint_fast8_t size_words,
   831       const uint32_t *aPtr,
   832       uint32_t dist,
   833       uint32_t *zPtr
   834   );
   835  #endif
   836  
   837  #ifndef softfloat_shiftRight96M
   838  /*----------------------------------------------------------------------------
   839  | This function or macro is the same as 'softfloat_shiftRightM' with
   840  | 'size_words' = 3 (N = 96).
   841  *----------------------------------------------------------------------------*/
   842  #define softfloat_shiftRight96M( aPtr, dist, zPtr ) softfloat_shiftRightM( 3, aPtr, dist, zPtr )
   843  #endif
   844  
   845  #ifndef softfloat_shiftRightJamM
   846  /*----------------------------------------------------------------------------
   847  | Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
   848  | of bits given in 'dist', where N = 'size_words' * 32.  The value of 'dist'
   849  | must not be zero.  If any nonzero bits are shifted off, they are "jammed"
   850  | into the least-significant bit of the shifted value by setting the least-
   851  | significant bit to 1.  This shifted-and-jammed N-bit result is stored
   852  | at the location pointed to by 'zPtr'.  Each of 'aPtr' and 'zPtr' points
   853  | to a 'size_words'-long array of 32-bit elements that concatenate in the
   854  | platform's normal endian order to form an N-bit integer.
   855  |   The value of 'dist' can be arbitrarily large.  In particular, if 'dist'
   856  | is greater than N, the stored result will be either 0 or 1, depending on
   857  | whether the original N bits are all zeros.
   858  *----------------------------------------------------------------------------*/
   859  void
   860   softfloat_shiftRightJamM(
   861       uint_fast8_t size_words,
   862       const uint32_t *aPtr,
   863       uint32_t dist,
   864       uint32_t *zPtr
   865   );
   866  #endif
   867  
   868  #ifndef softfloat_shiftRightJam96M
   869  /*----------------------------------------------------------------------------
   870  | This function or macro is the same as 'softfloat_shiftRightJamM' with
   871  | 'size_words' = 3 (N = 96).
   872  *----------------------------------------------------------------------------*/
   873  #define softfloat_shiftRightJam96M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 3, aPtr, dist, zPtr )
   874  #endif
   875  
   876  #ifndef softfloat_shiftRightJam128M
   877  /*----------------------------------------------------------------------------
   878  | This function or macro is the same as 'softfloat_shiftRightJamM' with
   879  | 'size_words' = 4 (N = 128).
   880  *----------------------------------------------------------------------------*/
   881  #define softfloat_shiftRightJam128M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 4, aPtr, dist, zPtr )
   882  #endif
   883  
   884  #ifndef softfloat_shiftRightJam160M
   885  /*----------------------------------------------------------------------------
   886  | This function or macro is the same as 'softfloat_shiftRightJamM' with
   887  | 'size_words' = 5 (N = 160).
   888  *----------------------------------------------------------------------------*/
   889  #define softfloat_shiftRightJam160M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 5, aPtr, dist, zPtr )
   890  #endif
   891  
   892  #ifndef softfloat_addM
   893  /*----------------------------------------------------------------------------
   894  | Adds the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
   895  | 'size_words' * 32.  The addition is modulo 2^N, so any carry out is lost.
   896  | The N-bit sum is stored at the location pointed to by 'zPtr'.  Each of
   897  | 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long array of 32-bit
   898  | elements that concatenate in the platform's normal endian order to form an
   899  | N-bit integer.
   900  *----------------------------------------------------------------------------*/
   901  void
   902   softfloat_addM(
   903       uint_fast8_t size_words,
   904       const uint32_t *aPtr,
   905       const uint32_t *bPtr,
   906       uint32_t *zPtr
   907   );
   908  #endif
   909  
   910  #ifndef softfloat_add96M
   911  /*----------------------------------------------------------------------------
   912  | This function or macro is the same as 'softfloat_addM' with 'size_words'
   913  | = 3 (N = 96).
   914  *----------------------------------------------------------------------------*/
   915  #define softfloat_add96M( aPtr, bPtr, zPtr ) softfloat_addM( 3, aPtr, bPtr, zPtr )
   916  #endif
   917  
   918  #ifndef softfloat_add128M
   919  /*----------------------------------------------------------------------------
   920  | This function or macro is the same as 'softfloat_addM' with 'size_words'
   921  | = 4 (N = 128).
   922  *----------------------------------------------------------------------------*/
   923  #define softfloat_add128M( aPtr, bPtr, zPtr ) softfloat_addM( 4, aPtr, bPtr, zPtr )
   924  #endif
   925  
   926  #ifndef softfloat_add160M
   927  /*----------------------------------------------------------------------------
   928  | This function or macro is the same as 'softfloat_addM' with 'size_words'
   929  | = 5 (N = 160).
   930  *----------------------------------------------------------------------------*/
   931  #define softfloat_add160M( aPtr, bPtr, zPtr ) softfloat_addM( 5, aPtr, bPtr, zPtr )
   932  #endif
   933  
   934  #ifndef softfloat_addCarryM
   935  /*----------------------------------------------------------------------------
   936  | Adds the two N-bit unsigned integers pointed to by 'aPtr' and 'bPtr', where
   937  | N = 'size_words' * 32, plus 'carry', which must be either 0 or 1.  The N-bit
   938  | sum (modulo 2^N) is stored at the location pointed to by 'zPtr', and any
   939  | carry out is returned as the result.  Each of 'aPtr', 'bPtr', and 'zPtr'
   940  | points to a 'size_words'-long array of 32-bit elements that concatenate in
   941  | the platform's normal endian order to form an N-bit integer.
   942  *----------------------------------------------------------------------------*/
   943  uint_fast8_t
   944   softfloat_addCarryM(
   945       uint_fast8_t size_words,
   946       const uint32_t *aPtr,
   947       const uint32_t *bPtr,
   948       uint_fast8_t carry,
   949       uint32_t *zPtr
   950   );
   951  #endif
   952  
   953  #ifndef softfloat_addComplCarryM
   954  /*----------------------------------------------------------------------------
   955  | This function or macro is the same as 'softfloat_addCarryM', except that
   956  | the value of the unsigned integer pointed to by 'bPtr' is bit-wise completed
   957  | before the addition.
   958  *----------------------------------------------------------------------------*/
   959  uint_fast8_t
   960   softfloat_addComplCarryM(
   961       uint_fast8_t size_words,
   962       const uint32_t *aPtr,
   963       const uint32_t *bPtr,
   964       uint_fast8_t carry,
   965       uint32_t *zPtr
   966   );
   967  #endif
   968  
   969  #ifndef softfloat_addComplCarry96M
   970  /*----------------------------------------------------------------------------
   971  | This function or macro is the same as 'softfloat_addComplCarryM' with
   972  | 'size_words' = 3 (N = 96).
   973  *----------------------------------------------------------------------------*/
   974  #define softfloat_addComplCarry96M( aPtr, bPtr, carry, zPtr ) softfloat_addComplCarryM( 3, aPtr, bPtr, carry, zPtr )
   975  #endif
   976  
   977  #ifndef softfloat_negXM
   978  /*----------------------------------------------------------------------------
   979  | Replaces the N-bit unsigned integer pointed to by 'zPtr' by the
   980  | 2s-complement of itself, where N = 'size_words' * 32.  Argument 'zPtr'
   981  | points to a 'size_words'-long array of 32-bit elements that concatenate in
   982  | the platform's normal endian order to form an N-bit integer.
   983  *----------------------------------------------------------------------------*/
   984  void softfloat_negXM( uint_fast8_t size_words, uint32_t *zPtr );
   985  #endif
   986  
   987  #ifndef softfloat_negX96M
   988  /*----------------------------------------------------------------------------
   989  | This function or macro is the same as 'softfloat_negXM' with 'size_words'
   990  | = 3 (N = 96).
   991  *----------------------------------------------------------------------------*/
   992  #define softfloat_negX96M( zPtr ) softfloat_negXM( 3, zPtr )
   993  #endif
   994  
   995  #ifndef softfloat_negX128M
   996  /*----------------------------------------------------------------------------
   997  | This function or macro is the same as 'softfloat_negXM' with 'size_words'
   998  | = 4 (N = 128).
   999  *----------------------------------------------------------------------------*/
  1000  #define softfloat_negX128M( zPtr ) softfloat_negXM( 4, zPtr )
  1001  #endif
  1002  
  1003  #ifndef softfloat_negX160M
  1004  /*----------------------------------------------------------------------------
  1005  | This function or macro is the same as 'softfloat_negXM' with 'size_words'
  1006  | = 5 (N = 160).
  1007  *----------------------------------------------------------------------------*/
  1008  #define softfloat_negX160M( zPtr ) softfloat_negXM( 5, zPtr )
  1009  #endif
  1010  
  1011  #ifndef softfloat_negX256M
  1012  /*----------------------------------------------------------------------------
  1013  | This function or macro is the same as 'softfloat_negXM' with 'size_words'
  1014  | = 8 (N = 256).
  1015  *----------------------------------------------------------------------------*/
  1016  #define softfloat_negX256M( zPtr ) softfloat_negXM( 8, zPtr )
  1017  #endif
  1018  
  1019  #ifndef softfloat_sub1XM
  1020  /*----------------------------------------------------------------------------
  1021  | Subtracts 1 from the N-bit integer pointed to by 'zPtr', where N =
  1022  | 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry
  1023  | out) is lost.  Argument 'zPtr' points to a 'size_words'-long array of 32-bit
  1024  | elements that concatenate in the platform's normal endian order to form an
  1025  | N-bit integer.
  1026  *----------------------------------------------------------------------------*/
  1027  void softfloat_sub1XM( uint_fast8_t size_words, uint32_t *zPtr );
  1028  #endif
  1029  
  1030  #ifndef softfloat_sub1X96M
  1031  /*----------------------------------------------------------------------------
  1032  | This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
  1033  | = 3 (N = 96).
  1034  *----------------------------------------------------------------------------*/
  1035  #define softfloat_sub1X96M( zPtr ) softfloat_sub1XM( 3, zPtr )
  1036  #endif
  1037  
  1038  #ifndef softfloat_sub1X160M
  1039  /*----------------------------------------------------------------------------
  1040  | This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
  1041  | = 5 (N = 160).
  1042  *----------------------------------------------------------------------------*/
  1043  #define softfloat_sub1X160M( zPtr ) softfloat_sub1XM( 5, zPtr )
  1044  #endif
  1045  
  1046  #ifndef softfloat_subM
  1047  /*----------------------------------------------------------------------------
  1048  | Subtracts the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
  1049  | 'size_words' * 32.  The subtraction is modulo 2^N, so any borrow out (carry
  1050  | out) is lost.  The N-bit difference is stored at the location pointed to by
  1051  | 'zPtr'.  Each of 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long
  1052  | array of 32-bit elements that concatenate in the platform's normal endian
  1053  | order to form an N-bit integer.
  1054  *----------------------------------------------------------------------------*/
  1055  void
  1056   softfloat_subM(
  1057       uint_fast8_t size_words,
  1058       const uint32_t *aPtr,
  1059       const uint32_t *bPtr,
  1060       uint32_t *zPtr
  1061   );
  1062  #endif
  1063  
  1064  #ifndef softfloat_sub96M
  1065  /*----------------------------------------------------------------------------
  1066  | This function or macro is the same as 'softfloat_subM' with 'size_words'
  1067  | = 3 (N = 96).
  1068  *----------------------------------------------------------------------------*/
  1069  #define softfloat_sub96M( aPtr, bPtr, zPtr ) softfloat_subM( 3, aPtr, bPtr, zPtr )
  1070  #endif
  1071  
  1072  #ifndef softfloat_sub128M
  1073  /*----------------------------------------------------------------------------
  1074  | This function or macro is the same as 'softfloat_subM' with 'size_words'
  1075  | = 4 (N = 128).
  1076  *----------------------------------------------------------------------------*/
  1077  #define softfloat_sub128M( aPtr, bPtr, zPtr ) softfloat_subM( 4, aPtr, bPtr, zPtr )
  1078  #endif
  1079  
  1080  #ifndef softfloat_sub160M
  1081  /*----------------------------------------------------------------------------
  1082  | This function or macro is the same as 'softfloat_subM' with 'size_words'
  1083  | = 5 (N = 160).
  1084  *----------------------------------------------------------------------------*/
  1085  #define softfloat_sub160M( aPtr, bPtr, zPtr ) softfloat_subM( 5, aPtr, bPtr, zPtr )
  1086  #endif
  1087  
  1088  #ifndef softfloat_mul64To128M
  1089  /*----------------------------------------------------------------------------
  1090  | Multiplies 'a' and 'b' and stores the 128-bit product at the location
  1091  | pointed to by 'zPtr'.  Argument 'zPtr' points to an array of four 32-bit
  1092  | elements that concatenate in the platform's normal endian order to form a
  1093  | 128-bit integer.
  1094  *----------------------------------------------------------------------------*/
  1095  void softfloat_mul64To128M( uint64_t a, uint64_t b, uint32_t *zPtr );
  1096  #endif
  1097  
  1098  #ifndef softfloat_mul128MTo256M
  1099  /*----------------------------------------------------------------------------
  1100  | Multiplies the two 128-bit unsigned integers pointed to by 'aPtr' and
  1101  | 'bPtr', and stores the 256-bit product at the location pointed to by 'zPtr'.
  1102  | Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
  1103  | concatenate in the platform's normal endian order to form a 128-bit integer.
  1104  | Argument 'zPtr' points to an array of eight 32-bit elements that concatenate
  1105  | to form a 256-bit integer.
  1106  *----------------------------------------------------------------------------*/
  1107  void
  1108   softfloat_mul128MTo256M(
  1109       const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr );
  1110  #endif
  1111  
  1112  #ifndef softfloat_remStepMBy32
  1113  /*----------------------------------------------------------------------------
  1114  | Performs a "remainder reduction step" as follows:  Arguments 'remPtr' and
  1115  | 'bPtr' both point to N-bit unsigned integers, where N = 'size_words' * 32.
  1116  | Defining R and B as the values of those integers, the expression (R<<'dist')
  1117  | - B * q is computed modulo 2^N, and the N-bit result is stored at the
  1118  | location pointed to by 'zPtr'.  Each of 'remPtr', 'bPtr', and 'zPtr' points
  1119  | to a 'size_words'-long array of 32-bit elements that concatenate in the
  1120  | platform's normal endian order to form an N-bit integer.
  1121  *----------------------------------------------------------------------------*/
  1122  void
  1123   softfloat_remStepMBy32(
  1124       uint_fast8_t size_words,
  1125       const uint32_t *remPtr,
  1126       uint_fast8_t dist,
  1127       const uint32_t *bPtr,
  1128       uint32_t q,
  1129       uint32_t *zPtr
  1130   );
  1131  #endif
  1132  
  1133  #ifndef softfloat_remStep96MBy32
  1134  /*----------------------------------------------------------------------------
  1135  | This function or macro is the same as 'softfloat_remStepMBy32' with
  1136  | 'size_words' = 3 (N = 96).
  1137  *----------------------------------------------------------------------------*/
  1138  #define softfloat_remStep96MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 3, remPtr, dist, bPtr, q, zPtr )
  1139  #endif
  1140  
  1141  #ifndef softfloat_remStep128MBy32
  1142  /*----------------------------------------------------------------------------
  1143  | This function or macro is the same as 'softfloat_remStepMBy32' with
  1144  | 'size_words' = 4 (N = 128).
  1145  *----------------------------------------------------------------------------*/
  1146  #define softfloat_remStep128MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 4, remPtr, dist, bPtr, q, zPtr )
  1147  #endif
  1148  
  1149  #ifndef softfloat_remStep160MBy32
  1150  /*----------------------------------------------------------------------------
  1151  | This function or macro is the same as 'softfloat_remStepMBy32' with
  1152  | 'size_words' = 5 (N = 160).
  1153  *----------------------------------------------------------------------------*/
  1154  #define softfloat_remStep160MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 5, remPtr, dist, bPtr, q, zPtr )
  1155  #endif
  1156  
  1157  #endif
  1158  
  1159  #endif
  1160