cavatools: initialize repository
[cavatools.git] / softfloat / source / include / primitives.h
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