Added Berkeley softfloat library
(http://www.jhauser.us/arithmetic/SoftFloat.html) with RISCV specialization and cmake build
This commit is contained in:
		
							
								
								
									
										278
									
								
								softfloat/source/include/internals.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								softfloat/source/include/internals.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,278 @@ | ||||
|  | ||||
| /*============================================================================ | ||||
|  | ||||
| This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic | ||||
| Package, Release 3e, by John R. Hauser. | ||||
|  | ||||
| Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the | ||||
| University of California.  All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
|  1. Redistributions of source code must retain the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer. | ||||
|  | ||||
|  2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer in the documentation | ||||
|     and/or other materials provided with the distribution. | ||||
|  | ||||
|  3. Neither the name of the University nor the names of its contributors may | ||||
|     be used to endorse or promote products derived from this software without | ||||
|     specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY | ||||
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE | ||||
| DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| =============================================================================*/ | ||||
|  | ||||
| #ifndef internals_h | ||||
| #define internals_h 1 | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include "primitives.h" | ||||
| #include "softfloat_types.h" | ||||
|  | ||||
| union ui16_f16 { uint16_t ui; float16_t f; }; | ||||
| union ui32_f32 { uint32_t ui; float32_t f; }; | ||||
| union ui64_f64 { uint64_t ui; float64_t f; }; | ||||
|  | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| union extF80M_extF80 { struct extFloat80M fM; extFloat80_t f; }; | ||||
| union ui128_f128 { struct uint128 ui; float128_t f; }; | ||||
| #endif | ||||
|  | ||||
| enum { | ||||
|     softfloat_mulAdd_subC    = 1, | ||||
|     softfloat_mulAdd_subProd = 2 | ||||
| }; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| uint_fast32_t softfloat_roundToUI32( bool, uint_fast64_t, uint_fast8_t, bool ); | ||||
|  | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| uint_fast64_t | ||||
|  softfloat_roundToUI64( | ||||
|      bool, uint_fast64_t, uint_fast64_t, uint_fast8_t, bool ); | ||||
| #else | ||||
| uint_fast64_t softfloat_roundMToUI64( bool, uint32_t *, uint_fast8_t, bool ); | ||||
| #endif | ||||
|  | ||||
| int_fast32_t softfloat_roundToI32( bool, uint_fast64_t, uint_fast8_t, bool ); | ||||
|  | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| int_fast64_t | ||||
|  softfloat_roundToI64( | ||||
|      bool, uint_fast64_t, uint_fast64_t, uint_fast8_t, bool ); | ||||
| #else | ||||
| int_fast64_t softfloat_roundMToI64( bool, uint32_t *, uint_fast8_t, bool ); | ||||
| #endif | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signF16UI( a ) ((bool) ((uint16_t) (a)>>15)) | ||||
| #define expF16UI( a ) ((int_fast8_t) ((a)>>10) & 0x1F) | ||||
| #define fracF16UI( a ) ((a) & 0x03FF) | ||||
| #define packToF16UI( sign, exp, sig ) (((uint16_t) (sign)<<15) + ((uint16_t) (exp)<<10) + (sig)) | ||||
|  | ||||
| #define isNaNF16UI( a ) (((~(a) & 0x7C00) == 0) && ((a) & 0x03FF)) | ||||
|  | ||||
| struct exp8_sig16 { int_fast8_t exp; uint_fast16_t sig; }; | ||||
| struct exp8_sig16 softfloat_normSubnormalF16Sig( uint_fast16_t ); | ||||
|  | ||||
| float16_t softfloat_roundPackToF16( bool, int_fast16_t, uint_fast16_t ); | ||||
| float16_t softfloat_normRoundPackToF16( bool, int_fast16_t, uint_fast16_t ); | ||||
|  | ||||
| float16_t softfloat_addMagsF16( uint_fast16_t, uint_fast16_t ); | ||||
| float16_t softfloat_subMagsF16( uint_fast16_t, uint_fast16_t ); | ||||
| float16_t | ||||
|  softfloat_mulAddF16( | ||||
|      uint_fast16_t, uint_fast16_t, uint_fast16_t, uint_fast8_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signF32UI( a ) ((bool) ((uint32_t) (a)>>31)) | ||||
| #define expF32UI( a ) ((int_fast16_t) ((a)>>23) & 0xFF) | ||||
| #define fracF32UI( a ) ((a) & 0x007FFFFF) | ||||
| #define packToF32UI( sign, exp, sig ) (((uint32_t) (sign)<<31) + ((uint32_t) (exp)<<23) + (sig)) | ||||
|  | ||||
| #define isNaNF32UI( a ) (((~(a) & 0x7F800000) == 0) && ((a) & 0x007FFFFF)) | ||||
|  | ||||
| struct exp16_sig32 { int_fast16_t exp; uint_fast32_t sig; }; | ||||
| struct exp16_sig32 softfloat_normSubnormalF32Sig( uint_fast32_t ); | ||||
|  | ||||
| float32_t softfloat_roundPackToF32( bool, int_fast16_t, uint_fast32_t ); | ||||
| float32_t softfloat_normRoundPackToF32( bool, int_fast16_t, uint_fast32_t ); | ||||
|  | ||||
| float32_t softfloat_addMagsF32( uint_fast32_t, uint_fast32_t ); | ||||
| float32_t softfloat_subMagsF32( uint_fast32_t, uint_fast32_t ); | ||||
| float32_t | ||||
|  softfloat_mulAddF32( | ||||
|      uint_fast32_t, uint_fast32_t, uint_fast32_t, uint_fast8_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signF64UI( a ) ((bool) ((uint64_t) (a)>>63)) | ||||
| #define expF64UI( a ) ((int_fast16_t) ((a)>>52) & 0x7FF) | ||||
| #define fracF64UI( a ) ((a) & UINT64_C( 0x000FFFFFFFFFFFFF )) | ||||
| #define packToF64UI( sign, exp, sig ) ((uint64_t) (((uint_fast64_t) (sign)<<63) + ((uint_fast64_t) (exp)<<52) + (sig))) | ||||
|  | ||||
| #define isNaNF64UI( a ) (((~(a) & UINT64_C( 0x7FF0000000000000 )) == 0) && ((a) & UINT64_C( 0x000FFFFFFFFFFFFF ))) | ||||
|  | ||||
| struct exp16_sig64 { int_fast16_t exp; uint_fast64_t sig; }; | ||||
| struct exp16_sig64 softfloat_normSubnormalF64Sig( uint_fast64_t ); | ||||
|  | ||||
| float64_t softfloat_roundPackToF64( bool, int_fast16_t, uint_fast64_t ); | ||||
| float64_t softfloat_normRoundPackToF64( bool, int_fast16_t, uint_fast64_t ); | ||||
|  | ||||
| float64_t softfloat_addMagsF64( uint_fast64_t, uint_fast64_t, bool ); | ||||
| float64_t softfloat_subMagsF64( uint_fast64_t, uint_fast64_t, bool ); | ||||
| float64_t | ||||
|  softfloat_mulAddF64( | ||||
|      uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast8_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signExtF80UI64( a64 ) ((bool) ((uint16_t) (a64)>>15)) | ||||
| #define expExtF80UI64( a64 ) ((a64) & 0x7FFF) | ||||
| #define packToExtF80UI64( sign, exp ) ((uint_fast16_t) (sign)<<15 | (exp)) | ||||
|  | ||||
| #define isNaNExtF80UI( a64, a0 ) ((((a64) & 0x7FFF) == 0x7FFF) && ((a0) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))) | ||||
|  | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
|  | ||||
| struct exp32_sig64 { int_fast32_t exp; uint64_t sig; }; | ||||
| struct exp32_sig64 softfloat_normSubnormalExtF80Sig( uint_fast64_t ); | ||||
|  | ||||
| extFloat80_t | ||||
|  softfloat_roundPackToExtF80( | ||||
|      bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast8_t ); | ||||
| extFloat80_t | ||||
|  softfloat_normRoundPackToExtF80( | ||||
|      bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast8_t ); | ||||
|  | ||||
| extFloat80_t | ||||
|  softfloat_addMagsExtF80( | ||||
|      uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); | ||||
| extFloat80_t | ||||
|  softfloat_subMagsExtF80( | ||||
|      uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signF128UI64( a64 ) ((bool) ((uint64_t) (a64)>>63)) | ||||
| #define expF128UI64( a64 ) ((int_fast32_t) ((a64)>>48) & 0x7FFF) | ||||
| #define fracF128UI64( a64 ) ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF )) | ||||
| #define packToF128UI64( sign, exp, sig64 ) (((uint_fast64_t) (sign)<<63) + ((uint_fast64_t) (exp)<<48) + (sig64)) | ||||
|  | ||||
| #define isNaNF128UI( a64, a0 ) (((~(a64) & UINT64_C( 0x7FFF000000000000 )) == 0) && (a0 || ((a64) & UINT64_C( 0x0000FFFFFFFFFFFF )))) | ||||
|  | ||||
| struct exp32_sig128 { int_fast32_t exp; struct uint128 sig; }; | ||||
| struct exp32_sig128 | ||||
|  softfloat_normSubnormalF128Sig( uint_fast64_t, uint_fast64_t ); | ||||
|  | ||||
| float128_t | ||||
|  softfloat_roundPackToF128( | ||||
|      bool, int_fast32_t, uint_fast64_t, uint_fast64_t, uint_fast64_t ); | ||||
| float128_t | ||||
|  softfloat_normRoundPackToF128( | ||||
|      bool, int_fast32_t, uint_fast64_t, uint_fast64_t ); | ||||
|  | ||||
| float128_t | ||||
|  softfloat_addMagsF128( | ||||
|      uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); | ||||
| float128_t | ||||
|  softfloat_subMagsF128( | ||||
|      uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); | ||||
| float128_t | ||||
|  softfloat_mulAddF128( | ||||
|      uint_fast64_t, | ||||
|      uint_fast64_t, | ||||
|      uint_fast64_t, | ||||
|      uint_fast64_t, | ||||
|      uint_fast64_t, | ||||
|      uint_fast64_t, | ||||
|      uint_fast8_t | ||||
|  ); | ||||
|  | ||||
| #else | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
|  | ||||
| bool | ||||
|  softfloat_tryPropagateNaNExtF80M( | ||||
|      const struct extFloat80M *, | ||||
|      const struct extFloat80M *, | ||||
|      struct extFloat80M * | ||||
|  ); | ||||
| void softfloat_invalidExtF80M( struct extFloat80M * ); | ||||
|  | ||||
| int softfloat_normExtF80SigM( uint64_t * ); | ||||
|  | ||||
| void | ||||
|  softfloat_roundPackMToExtF80M( | ||||
|      bool, int32_t, uint32_t *, uint_fast8_t, struct extFloat80M * ); | ||||
| void | ||||
|  softfloat_normRoundPackMToExtF80M( | ||||
|      bool, int32_t, uint32_t *, uint_fast8_t, struct extFloat80M * ); | ||||
|  | ||||
| void | ||||
|  softfloat_addExtF80M( | ||||
|      const struct extFloat80M *, | ||||
|      const struct extFloat80M *, | ||||
|      struct extFloat80M *, | ||||
|      bool | ||||
|  ); | ||||
|  | ||||
| int | ||||
|  softfloat_compareNonnormExtF80M( | ||||
|      const struct extFloat80M *, const struct extFloat80M * ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #define signF128UI96( a96 ) ((bool) ((uint32_t) (a96)>>31)) | ||||
| #define expF128UI96( a96 ) ((int32_t) ((a96)>>16) & 0x7FFF) | ||||
| #define fracF128UI96( a96 ) ((a96) & 0x0000FFFF) | ||||
| #define packToF128UI96( sign, exp, sig96 ) (((uint32_t) (sign)<<31) + ((uint32_t) (exp)<<16) + (sig96)) | ||||
|  | ||||
| bool softfloat_isNaNF128M( const uint32_t * ); | ||||
|  | ||||
| bool | ||||
|  softfloat_tryPropagateNaNF128M( | ||||
|      const uint32_t *, const uint32_t *, uint32_t * ); | ||||
| void softfloat_invalidF128M( uint32_t * ); | ||||
|  | ||||
| int softfloat_shiftNormSigF128M( const uint32_t *, uint_fast8_t, uint32_t * ); | ||||
|  | ||||
| void softfloat_roundPackMToF128M( bool, int32_t, uint32_t *, uint32_t * ); | ||||
| void softfloat_normRoundPackMToF128M( bool, int32_t, uint32_t *, uint32_t * ); | ||||
|  | ||||
| void | ||||
|  softfloat_addF128M( const uint32_t *, const uint32_t *, uint32_t *, bool ); | ||||
| void | ||||
|  softfloat_mulAddF128M( | ||||
|      const uint32_t *, | ||||
|      const uint32_t *, | ||||
|      const uint32_t *, | ||||
|      uint32_t *, | ||||
|      uint_fast8_t | ||||
|  ); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										114
									
								
								softfloat/source/include/opts-GCC.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								softfloat/source/include/opts-GCC.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
|  | ||||
| /*============================================================================ | ||||
|  | ||||
| This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic | ||||
| Package, Release 3e, by John R. Hauser. | ||||
|  | ||||
| Copyright 2017 The Regents of the University of California.  All rights | ||||
| reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
|  1. Redistributions of source code must retain the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer. | ||||
|  | ||||
|  2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer in the documentation | ||||
|     and/or other materials provided with the distribution. | ||||
|  | ||||
|  3. Neither the name of the University nor the names of its contributors may | ||||
|     be used to endorse or promote products derived from this software without | ||||
|     specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY | ||||
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE | ||||
| DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| =============================================================================*/ | ||||
|  | ||||
| #ifndef opts_GCC_h | ||||
| #define opts_GCC_h 1 | ||||
|  | ||||
| #ifdef INLINE | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include "primitiveTypes.h" | ||||
|  | ||||
| #ifdef SOFTFLOAT_BUILTIN_CLZ | ||||
|  | ||||
| INLINE uint_fast8_t softfloat_countLeadingZeros16( uint16_t a ) | ||||
|     { return a ? __builtin_clz( a ) - 16 : 16; } | ||||
| #define softfloat_countLeadingZeros16 softfloat_countLeadingZeros16 | ||||
|  | ||||
| INLINE uint_fast8_t softfloat_countLeadingZeros32( uint32_t a ) | ||||
|     { return a ? __builtin_clz( a ) : 32; } | ||||
| #define softfloat_countLeadingZeros32 softfloat_countLeadingZeros32 | ||||
|  | ||||
| INLINE uint_fast8_t softfloat_countLeadingZeros64( uint64_t a ) | ||||
|     { return a ? __builtin_clzll( a ) : 64; } | ||||
| #define softfloat_countLeadingZeros64 softfloat_countLeadingZeros64 | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef SOFTFLOAT_INTRINSIC_INT128 | ||||
|  | ||||
| INLINE struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b ) | ||||
| { | ||||
|     union { unsigned __int128 ui; struct uint128 s; } uZ; | ||||
|     uZ.ui = (unsigned __int128) a * ((uint_fast64_t) b<<32); | ||||
|     return uZ.s; | ||||
| } | ||||
| #define softfloat_mul64ByShifted32To128 softfloat_mul64ByShifted32To128 | ||||
|  | ||||
| INLINE struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b ) | ||||
| { | ||||
|     union { unsigned __int128 ui; struct uint128 s; } uZ; | ||||
|     uZ.ui = (unsigned __int128) a * b; | ||||
|     return uZ.s; | ||||
| } | ||||
| #define softfloat_mul64To128 softfloat_mul64To128 | ||||
|  | ||||
| INLINE | ||||
| struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b ) | ||||
| { | ||||
|     union { unsigned __int128 ui; struct uint128 s; } uZ; | ||||
|     uZ.ui = ((unsigned __int128) a64<<64 | a0) * b; | ||||
|     return uZ.s; | ||||
| } | ||||
| #define softfloat_mul128By32 softfloat_mul128By32 | ||||
|  | ||||
| INLINE | ||||
| void | ||||
|  softfloat_mul128To256M( | ||||
|      uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr ) | ||||
| { | ||||
|     unsigned __int128 z0, mid1, mid, z128; | ||||
|     z0 = (unsigned __int128) a0 * b0; | ||||
|     mid1 = (unsigned __int128) a64 * b0; | ||||
|     mid = mid1 + (unsigned __int128) a0 * b64; | ||||
|     z128 = (unsigned __int128) a64 * b64; | ||||
|     z128 += (unsigned __int128) (mid < mid1)<<64 | mid>>64; | ||||
|     mid <<= 64; | ||||
|     z0 += mid; | ||||
|     z128 += (z0 < mid); | ||||
|     zPtr[indexWord( 4, 0 )] = z0; | ||||
|     zPtr[indexWord( 4, 1 )] = z0>>64; | ||||
|     zPtr[indexWord( 4, 2 )] = z128; | ||||
|     zPtr[indexWord( 4, 3 )] = z128>>64; | ||||
| } | ||||
| #define softfloat_mul128To256M softfloat_mul128To256M | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										85
									
								
								softfloat/source/include/primitiveTypes.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								softfloat/source/include/primitiveTypes.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
|  | ||||
| /*============================================================================ | ||||
|  | ||||
| This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic | ||||
| Package, Release 3e, by John R. Hauser. | ||||
|  | ||||
| Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. | ||||
| All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
|  1. Redistributions of source code must retain the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer. | ||||
|  | ||||
|  2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer in the documentation | ||||
|     and/or other materials provided with the distribution. | ||||
|  | ||||
|  3. Neither the name of the University nor the names of its contributors may | ||||
|     be used to endorse or promote products derived from this software without | ||||
|     specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY | ||||
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE | ||||
| DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| =============================================================================*/ | ||||
|  | ||||
| #ifndef primitiveTypes_h | ||||
| #define primitiveTypes_h 1 | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
|  | ||||
| #ifdef LITTLEENDIAN | ||||
| struct uint128 { uint64_t v0, v64; }; | ||||
| struct uint64_extra { uint64_t extra, v; }; | ||||
| struct uint128_extra { uint64_t extra; struct uint128 v; }; | ||||
| #else | ||||
| struct uint128 { uint64_t v64, v0; }; | ||||
| struct uint64_extra { uint64_t v, extra; }; | ||||
| struct uint128_extra { struct uint128 v; uint64_t extra; }; | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | These macros are used to isolate the differences in word order between big- | ||||
| | endian and little-endian platforms. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #ifdef LITTLEENDIAN | ||||
| #define wordIncr 1 | ||||
| #define indexWord( total, n ) (n) | ||||
| #define indexWordHi( total ) ((total) - 1) | ||||
| #define indexWordLo( total ) 0 | ||||
| #define indexMultiword( total, m, n ) (n) | ||||
| #define indexMultiwordHi( total, n ) ((total) - (n)) | ||||
| #define indexMultiwordLo( total, n ) 0 | ||||
| #define indexMultiwordHiBut( total, n ) (n) | ||||
| #define indexMultiwordLoBut( total, n ) 0 | ||||
| #define INIT_UINTM4( v3, v2, v1, v0 ) { v0, v1, v2, v3 } | ||||
| #else | ||||
| #define wordIncr -1 | ||||
| #define indexWord( total, n ) ((total) - 1 - (n)) | ||||
| #define indexWordHi( total ) 0 | ||||
| #define indexWordLo( total ) ((total) - 1) | ||||
| #define indexMultiword( total, m, n ) ((total) - 1 - (m)) | ||||
| #define indexMultiwordHi( total, n ) 0 | ||||
| #define indexMultiwordLo( total, n ) ((total) - (n)) | ||||
| #define indexMultiwordHiBut( total, n ) 0 | ||||
| #define indexMultiwordLoBut( total, n ) (n) | ||||
| #define INIT_UINTM4( v3, v2, v1, v0 ) { v3, v2, v1, v0 } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										1160
									
								
								softfloat/source/include/primitives.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1160
									
								
								softfloat/source/include/primitives.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										372
									
								
								softfloat/source/include/softfloat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										372
									
								
								softfloat/source/include/softfloat.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,372 @@ | ||||
|  | ||||
| /*============================================================================ | ||||
|  | ||||
| This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic | ||||
| Package, Release 3e, by John R. Hauser. | ||||
|  | ||||
| Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the | ||||
| University of California.  All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
|  1. Redistributions of source code must retain the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer. | ||||
|  | ||||
|  2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer in the documentation | ||||
|     and/or other materials provided with the distribution. | ||||
|  | ||||
|  3. Neither the name of the University nor the names of its contributors may | ||||
|     be used to endorse or promote products derived from this software without | ||||
|     specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY | ||||
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE | ||||
| DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| =============================================================================*/ | ||||
|  | ||||
|  | ||||
| /*============================================================================ | ||||
| | Note:  If SoftFloat is made available as a general library for programs to | ||||
| | use, it is strongly recommended that a platform-specific version of this | ||||
| | header, "softfloat.h", be created that folds in "softfloat_types.h" and that | ||||
| | eliminates all dependencies on compile-time macros. | ||||
| *============================================================================*/ | ||||
|  | ||||
|  | ||||
| #ifndef softfloat_h | ||||
| #define softfloat_h 1 | ||||
|  | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include "softfloat_types.h" | ||||
|  | ||||
| #ifndef THREAD_LOCAL | ||||
| #define THREAD_LOCAL | ||||
| #endif | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Software floating-point underflow tininess-detection mode. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| extern THREAD_LOCAL uint_fast8_t softfloat_detectTininess; | ||||
| enum { | ||||
|     softfloat_tininess_beforeRounding = 0, | ||||
|     softfloat_tininess_afterRounding  = 1 | ||||
| }; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Software floating-point rounding mode.  (Mode "odd" is supported only if | ||||
| | SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.) | ||||
| *----------------------------------------------------------------------------*/ | ||||
| extern THREAD_LOCAL uint_fast8_t softfloat_roundingMode; | ||||
| enum { | ||||
|     softfloat_round_near_even   = 0, | ||||
|     softfloat_round_minMag      = 1, | ||||
|     softfloat_round_min         = 2, | ||||
|     softfloat_round_max         = 3, | ||||
|     softfloat_round_near_maxMag = 4, | ||||
|     softfloat_round_odd         = 6 | ||||
| }; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Software floating-point exception flags. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| extern THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags; | ||||
| enum { | ||||
|     softfloat_flag_inexact   =  1, | ||||
|     softfloat_flag_underflow =  2, | ||||
|     softfloat_flag_overflow  =  4, | ||||
|     softfloat_flag_infinite  =  8, | ||||
|     softfloat_flag_invalid   = 16 | ||||
| }; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Routine to raise any or all of the software floating-point exception flags. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| void softfloat_raiseFlags( uint_fast8_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Integer-to-floating-point conversion routines. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| float16_t ui32_to_f16( uint32_t ); | ||||
| float32_t ui32_to_f32( uint32_t ); | ||||
| float64_t ui32_to_f64( uint32_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t ui32_to_extF80( uint32_t ); | ||||
| float128_t ui32_to_f128( uint32_t ); | ||||
| #endif | ||||
| void ui32_to_extF80M( uint32_t, extFloat80_t * ); | ||||
| void ui32_to_f128M( uint32_t, float128_t * ); | ||||
| float16_t ui64_to_f16( uint64_t ); | ||||
| float32_t ui64_to_f32( uint64_t ); | ||||
| float64_t ui64_to_f64( uint64_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t ui64_to_extF80( uint64_t ); | ||||
| float128_t ui64_to_f128( uint64_t ); | ||||
| #endif | ||||
| void ui64_to_extF80M( uint64_t, extFloat80_t * ); | ||||
| void ui64_to_f128M( uint64_t, float128_t * ); | ||||
| float16_t i32_to_f16( int32_t ); | ||||
| float32_t i32_to_f32( int32_t ); | ||||
| float64_t i32_to_f64( int32_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t i32_to_extF80( int32_t ); | ||||
| float128_t i32_to_f128( int32_t ); | ||||
| #endif | ||||
| void i32_to_extF80M( int32_t, extFloat80_t * ); | ||||
| void i32_to_f128M( int32_t, float128_t * ); | ||||
| float16_t i64_to_f16( int64_t ); | ||||
| float32_t i64_to_f32( int64_t ); | ||||
| float64_t i64_to_f64( int64_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t i64_to_extF80( int64_t ); | ||||
| float128_t i64_to_f128( int64_t ); | ||||
| #endif | ||||
| void i64_to_extF80M( int64_t, extFloat80_t * ); | ||||
| void i64_to_f128M( int64_t, float128_t * ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | 16-bit (half-precision) floating-point operations. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| uint_fast32_t f16_to_ui32( float16_t, uint_fast8_t, bool ); | ||||
| uint_fast64_t f16_to_ui64( float16_t, uint_fast8_t, bool ); | ||||
| int_fast32_t f16_to_i32( float16_t, uint_fast8_t, bool ); | ||||
| int_fast64_t f16_to_i64( float16_t, uint_fast8_t, bool ); | ||||
| uint_fast32_t f16_to_ui32_r_minMag( float16_t, bool ); | ||||
| uint_fast64_t f16_to_ui64_r_minMag( float16_t, bool ); | ||||
| int_fast32_t f16_to_i32_r_minMag( float16_t, bool ); | ||||
| int_fast64_t f16_to_i64_r_minMag( float16_t, bool ); | ||||
| float32_t f16_to_f32( float16_t ); | ||||
| float64_t f16_to_f64( float16_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t f16_to_extF80( float16_t ); | ||||
| float128_t f16_to_f128( float16_t ); | ||||
| #endif | ||||
| void f16_to_extF80M( float16_t, extFloat80_t * ); | ||||
| void f16_to_f128M( float16_t, float128_t * ); | ||||
| float16_t f16_roundToInt( float16_t, uint_fast8_t, bool ); | ||||
| float16_t f16_add( float16_t, float16_t ); | ||||
| float16_t f16_sub( float16_t, float16_t ); | ||||
| float16_t f16_mul( float16_t, float16_t ); | ||||
| float16_t f16_mulAdd( float16_t, float16_t, float16_t ); | ||||
| float16_t f16_div( float16_t, float16_t ); | ||||
| float16_t f16_rem( float16_t, float16_t ); | ||||
| float16_t f16_sqrt( float16_t ); | ||||
| bool f16_eq( float16_t, float16_t ); | ||||
| bool f16_le( float16_t, float16_t ); | ||||
| bool f16_lt( float16_t, float16_t ); | ||||
| bool f16_eq_signaling( float16_t, float16_t ); | ||||
| bool f16_le_quiet( float16_t, float16_t ); | ||||
| bool f16_lt_quiet( float16_t, float16_t ); | ||||
| bool f16_isSignalingNaN( float16_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | 32-bit (single-precision) floating-point operations. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| uint_fast32_t f32_to_ui32( float32_t, uint_fast8_t, bool ); | ||||
| uint_fast64_t f32_to_ui64( float32_t, uint_fast8_t, bool ); | ||||
| int_fast32_t f32_to_i32( float32_t, uint_fast8_t, bool ); | ||||
| int_fast64_t f32_to_i64( float32_t, uint_fast8_t, bool ); | ||||
| uint_fast32_t f32_to_ui32_r_minMag( float32_t, bool ); | ||||
| uint_fast64_t f32_to_ui64_r_minMag( float32_t, bool ); | ||||
| int_fast32_t f32_to_i32_r_minMag( float32_t, bool ); | ||||
| int_fast64_t f32_to_i64_r_minMag( float32_t, bool ); | ||||
| float16_t f32_to_f16( float32_t ); | ||||
| float64_t f32_to_f64( float32_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t f32_to_extF80( float32_t ); | ||||
| float128_t f32_to_f128( float32_t ); | ||||
| #endif | ||||
| void f32_to_extF80M( float32_t, extFloat80_t * ); | ||||
| void f32_to_f128M( float32_t, float128_t * ); | ||||
| float32_t f32_roundToInt( float32_t, uint_fast8_t, bool ); | ||||
| float32_t f32_add( float32_t, float32_t ); | ||||
| float32_t f32_sub( float32_t, float32_t ); | ||||
| float32_t f32_mul( float32_t, float32_t ); | ||||
| float32_t f32_mulAdd( float32_t, float32_t, float32_t ); | ||||
| float32_t f32_div( float32_t, float32_t ); | ||||
| float32_t f32_rem( float32_t, float32_t ); | ||||
| float32_t f32_sqrt( float32_t ); | ||||
| bool f32_eq( float32_t, float32_t ); | ||||
| bool f32_le( float32_t, float32_t ); | ||||
| bool f32_lt( float32_t, float32_t ); | ||||
| bool f32_eq_signaling( float32_t, float32_t ); | ||||
| bool f32_le_quiet( float32_t, float32_t ); | ||||
| bool f32_lt_quiet( float32_t, float32_t ); | ||||
| bool f32_isSignalingNaN( float32_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | 64-bit (double-precision) floating-point operations. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| uint_fast32_t f64_to_ui32( float64_t, uint_fast8_t, bool ); | ||||
| uint_fast64_t f64_to_ui64( float64_t, uint_fast8_t, bool ); | ||||
| int_fast32_t f64_to_i32( float64_t, uint_fast8_t, bool ); | ||||
| int_fast64_t f64_to_i64( float64_t, uint_fast8_t, bool ); | ||||
| uint_fast32_t f64_to_ui32_r_minMag( float64_t, bool ); | ||||
| uint_fast64_t f64_to_ui64_r_minMag( float64_t, bool ); | ||||
| int_fast32_t f64_to_i32_r_minMag( float64_t, bool ); | ||||
| int_fast64_t f64_to_i64_r_minMag( float64_t, bool ); | ||||
| float16_t f64_to_f16( float64_t ); | ||||
| float32_t f64_to_f32( float64_t ); | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| extFloat80_t f64_to_extF80( float64_t ); | ||||
| float128_t f64_to_f128( float64_t ); | ||||
| #endif | ||||
| void f64_to_extF80M( float64_t, extFloat80_t * ); | ||||
| void f64_to_f128M( float64_t, float128_t * ); | ||||
| float64_t f64_roundToInt( float64_t, uint_fast8_t, bool ); | ||||
| float64_t f64_add( float64_t, float64_t ); | ||||
| float64_t f64_sub( float64_t, float64_t ); | ||||
| float64_t f64_mul( float64_t, float64_t ); | ||||
| float64_t f64_mulAdd( float64_t, float64_t, float64_t ); | ||||
| float64_t f64_div( float64_t, float64_t ); | ||||
| float64_t f64_rem( float64_t, float64_t ); | ||||
| float64_t f64_sqrt( float64_t ); | ||||
| bool f64_eq( float64_t, float64_t ); | ||||
| bool f64_le( float64_t, float64_t ); | ||||
| bool f64_lt( float64_t, float64_t ); | ||||
| bool f64_eq_signaling( float64_t, float64_t ); | ||||
| bool f64_le_quiet( float64_t, float64_t ); | ||||
| bool f64_lt_quiet( float64_t, float64_t ); | ||||
| bool f64_isSignalingNaN( float64_t ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Rounding precision for 80-bit extended double-precision floating-point. | ||||
| | Valid values are 32, 64, and 80. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| extern THREAD_LOCAL uint_fast8_t extF80_roundingPrecision; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | 80-bit extended double-precision floating-point operations. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| uint_fast32_t extF80_to_ui32( extFloat80_t, uint_fast8_t, bool ); | ||||
| uint_fast64_t extF80_to_ui64( extFloat80_t, uint_fast8_t, bool ); | ||||
| int_fast32_t extF80_to_i32( extFloat80_t, uint_fast8_t, bool ); | ||||
| int_fast64_t extF80_to_i64( extFloat80_t, uint_fast8_t, bool ); | ||||
| uint_fast32_t extF80_to_ui32_r_minMag( extFloat80_t, bool ); | ||||
| uint_fast64_t extF80_to_ui64_r_minMag( extFloat80_t, bool ); | ||||
| int_fast32_t extF80_to_i32_r_minMag( extFloat80_t, bool ); | ||||
| int_fast64_t extF80_to_i64_r_minMag( extFloat80_t, bool ); | ||||
| float16_t extF80_to_f16( extFloat80_t ); | ||||
| float32_t extF80_to_f32( extFloat80_t ); | ||||
| float64_t extF80_to_f64( extFloat80_t ); | ||||
| float128_t extF80_to_f128( extFloat80_t ); | ||||
| extFloat80_t extF80_roundToInt( extFloat80_t, uint_fast8_t, bool ); | ||||
| extFloat80_t extF80_add( extFloat80_t, extFloat80_t ); | ||||
| extFloat80_t extF80_sub( extFloat80_t, extFloat80_t ); | ||||
| extFloat80_t extF80_mul( extFloat80_t, extFloat80_t ); | ||||
| extFloat80_t extF80_div( extFloat80_t, extFloat80_t ); | ||||
| extFloat80_t extF80_rem( extFloat80_t, extFloat80_t ); | ||||
| extFloat80_t extF80_sqrt( extFloat80_t ); | ||||
| bool extF80_eq( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_le( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_lt( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_eq_signaling( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_le_quiet( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_lt_quiet( extFloat80_t, extFloat80_t ); | ||||
| bool extF80_isSignalingNaN( extFloat80_t ); | ||||
| #endif | ||||
| uint_fast32_t extF80M_to_ui32( const extFloat80_t *, uint_fast8_t, bool ); | ||||
| uint_fast64_t extF80M_to_ui64( const extFloat80_t *, uint_fast8_t, bool ); | ||||
| int_fast32_t extF80M_to_i32( const extFloat80_t *, uint_fast8_t, bool ); | ||||
| int_fast64_t extF80M_to_i64( const extFloat80_t *, uint_fast8_t, bool ); | ||||
| uint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *, bool ); | ||||
| uint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *, bool ); | ||||
| int_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *, bool ); | ||||
| int_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *, bool ); | ||||
| float16_t extF80M_to_f16( const extFloat80_t * ); | ||||
| float32_t extF80M_to_f32( const extFloat80_t * ); | ||||
| float64_t extF80M_to_f64( const extFloat80_t * ); | ||||
| void extF80M_to_f128M( const extFloat80_t *, float128_t * ); | ||||
| void | ||||
|  extF80M_roundToInt( | ||||
|      const extFloat80_t *, uint_fast8_t, bool, extFloat80_t * ); | ||||
| void extF80M_add( const extFloat80_t *, const extFloat80_t *, extFloat80_t * ); | ||||
| void extF80M_sub( const extFloat80_t *, const extFloat80_t *, extFloat80_t * ); | ||||
| void extF80M_mul( const extFloat80_t *, const extFloat80_t *, extFloat80_t * ); | ||||
| void extF80M_div( const extFloat80_t *, const extFloat80_t *, extFloat80_t * ); | ||||
| void extF80M_rem( const extFloat80_t *, const extFloat80_t *, extFloat80_t * ); | ||||
| void extF80M_sqrt( const extFloat80_t *, extFloat80_t * ); | ||||
| bool extF80M_eq( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_le( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_lt( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_eq_signaling( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_le_quiet( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_lt_quiet( const extFloat80_t *, const extFloat80_t * ); | ||||
| bool extF80M_isSignalingNaN( const extFloat80_t * ); | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | 128-bit (quadruple-precision) floating-point operations. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #ifdef SOFTFLOAT_FAST_INT64 | ||||
| uint_fast32_t f128_to_ui32( float128_t, uint_fast8_t, bool ); | ||||
| uint_fast64_t f128_to_ui64( float128_t, uint_fast8_t, bool ); | ||||
| int_fast32_t f128_to_i32( float128_t, uint_fast8_t, bool ); | ||||
| int_fast64_t f128_to_i64( float128_t, uint_fast8_t, bool ); | ||||
| uint_fast32_t f128_to_ui32_r_minMag( float128_t, bool ); | ||||
| uint_fast64_t f128_to_ui64_r_minMag( float128_t, bool ); | ||||
| int_fast32_t f128_to_i32_r_minMag( float128_t, bool ); | ||||
| int_fast64_t f128_to_i64_r_minMag( float128_t, bool ); | ||||
| float16_t f128_to_f16( float128_t ); | ||||
| float32_t f128_to_f32( float128_t ); | ||||
| float64_t f128_to_f64( float128_t ); | ||||
| extFloat80_t f128_to_extF80( float128_t ); | ||||
| float128_t f128_roundToInt( float128_t, uint_fast8_t, bool ); | ||||
| float128_t f128_add( float128_t, float128_t ); | ||||
| float128_t f128_sub( float128_t, float128_t ); | ||||
| float128_t f128_mul( float128_t, float128_t ); | ||||
| float128_t f128_mulAdd( float128_t, float128_t, float128_t ); | ||||
| float128_t f128_div( float128_t, float128_t ); | ||||
| float128_t f128_rem( float128_t, float128_t ); | ||||
| float128_t f128_sqrt( float128_t ); | ||||
| bool f128_eq( float128_t, float128_t ); | ||||
| bool f128_le( float128_t, float128_t ); | ||||
| bool f128_lt( float128_t, float128_t ); | ||||
| bool f128_eq_signaling( float128_t, float128_t ); | ||||
| bool f128_le_quiet( float128_t, float128_t ); | ||||
| bool f128_lt_quiet( float128_t, float128_t ); | ||||
| bool f128_isSignalingNaN( float128_t ); | ||||
| #endif | ||||
| uint_fast32_t f128M_to_ui32( const float128_t *, uint_fast8_t, bool ); | ||||
| uint_fast64_t f128M_to_ui64( const float128_t *, uint_fast8_t, bool ); | ||||
| int_fast32_t f128M_to_i32( const float128_t *, uint_fast8_t, bool ); | ||||
| int_fast64_t f128M_to_i64( const float128_t *, uint_fast8_t, bool ); | ||||
| uint_fast32_t f128M_to_ui32_r_minMag( const float128_t *, bool ); | ||||
| uint_fast64_t f128M_to_ui64_r_minMag( const float128_t *, bool ); | ||||
| int_fast32_t f128M_to_i32_r_minMag( const float128_t *, bool ); | ||||
| int_fast64_t f128M_to_i64_r_minMag( const float128_t *, bool ); | ||||
| float16_t f128M_to_f16( const float128_t * ); | ||||
| float32_t f128M_to_f32( const float128_t * ); | ||||
| float64_t f128M_to_f64( const float128_t * ); | ||||
| void f128M_to_extF80M( const float128_t *, extFloat80_t * ); | ||||
| void f128M_roundToInt( const float128_t *, uint_fast8_t, bool, float128_t * ); | ||||
| void f128M_add( const float128_t *, const float128_t *, float128_t * ); | ||||
| void f128M_sub( const float128_t *, const float128_t *, float128_t * ); | ||||
| void f128M_mul( const float128_t *, const float128_t *, float128_t * ); | ||||
| void | ||||
|  f128M_mulAdd( | ||||
|      const float128_t *, const float128_t *, const float128_t *, float128_t * | ||||
|  ); | ||||
| void f128M_div( const float128_t *, const float128_t *, float128_t * ); | ||||
| void f128M_rem( const float128_t *, const float128_t *, float128_t * ); | ||||
| void f128M_sqrt( const float128_t *, float128_t * ); | ||||
| bool f128M_eq( const float128_t *, const float128_t * ); | ||||
| bool f128M_le( const float128_t *, const float128_t * ); | ||||
| bool f128M_lt( const float128_t *, const float128_t * ); | ||||
| bool f128M_eq_signaling( const float128_t *, const float128_t * ); | ||||
| bool f128M_le_quiet( const float128_t *, const float128_t * ); | ||||
| bool f128M_lt_quiet( const float128_t *, const float128_t * ); | ||||
| bool f128M_isSignalingNaN( const float128_t * ); | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										81
									
								
								softfloat/source/include/softfloat_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								softfloat/source/include/softfloat_types.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
|  | ||||
| /*============================================================================ | ||||
|  | ||||
| This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic | ||||
| Package, Release 3e, by John R. Hauser. | ||||
|  | ||||
| Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of | ||||
| California.  All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
|  | ||||
|  1. Redistributions of source code must retain the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer. | ||||
|  | ||||
|  2. Redistributions in binary form must reproduce the above copyright notice, | ||||
|     this list of conditions, and the following disclaimer in the documentation | ||||
|     and/or other materials provided with the distribution. | ||||
|  | ||||
|  3. Neither the name of the University nor the names of its contributors may | ||||
|     be used to endorse or promote products derived from this software without | ||||
|     specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY | ||||
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE | ||||
| DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY | ||||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| =============================================================================*/ | ||||
|  | ||||
| #ifndef softfloat_types_h | ||||
| #define softfloat_types_h 1 | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | Types used to pass 16-bit, 32-bit, 64-bit, and 128-bit floating-point | ||||
| | arguments and results to/from functions.  These types must be exactly | ||||
| | 16 bits, 32 bits, 64 bits, and 128 bits in size, respectively.  Where a | ||||
| | platform has "native" support for IEEE-Standard floating-point formats, | ||||
| | the types below may, if desired, be defined as aliases for the native types | ||||
| | (typically 'float' and 'double', and possibly 'long double'). | ||||
| *----------------------------------------------------------------------------*/ | ||||
| typedef struct { uint16_t v; } float16_t; | ||||
| typedef struct { uint32_t v; } float32_t; | ||||
| typedef struct { uint64_t v; } float64_t; | ||||
| typedef struct { uint64_t v[2]; } float128_t; | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | The format of an 80-bit extended floating-point number in memory.  This | ||||
| | structure must contain a 16-bit field named 'signExp' and a 64-bit field | ||||
| | named 'signif'. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| #ifdef LITTLEENDIAN | ||||
| struct extFloat80M { uint64_t signif; uint16_t signExp; }; | ||||
| #else | ||||
| struct extFloat80M { uint16_t signExp; uint64_t signif; }; | ||||
| #endif | ||||
|  | ||||
| /*---------------------------------------------------------------------------- | ||||
| | The type used to pass 80-bit extended floating-point arguments and | ||||
| | results to/from functions.  This type must have size identical to | ||||
| | 'struct extFloat80M'.  Type 'extFloat80_t' can be defined as an alias for | ||||
| | 'struct extFloat80M'.  Alternatively, if a platform has "native" support | ||||
| | for IEEE-Standard 80-bit extended floating-point, it may be possible, | ||||
| | if desired, to define 'extFloat80_t' as an alias for the native type | ||||
| | (presumably either 'long double' or a nonstandard compiler-intrinsic type). | ||||
| | In that case, the 'signif' and 'signExp' fields of 'struct extFloat80M' | ||||
| | must align exactly with the locations in memory of the sign, exponent, and | ||||
| | significand of the native type. | ||||
| *----------------------------------------------------------------------------*/ | ||||
| typedef struct extFloat80M extFloat80_t; | ||||
|  | ||||
| #endif | ||||
|  | ||||
		Reference in New Issue
	
	Block a user