|
@@ -0,0 +1,32501 @@
|
|
|
+/**** start inlining ../../source/8086-SSE/softfloat_raiseFlags.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+/**** start inlining platform.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define LITTLEENDIAN 1
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#ifdef __GNUC_STDC_INLINE__
|
|
|
+#define INLINE inline
|
|
|
+#else
|
|
|
+#define INLINE extern inline
|
|
|
+#endif
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define SOFTFLOAT_BUILTIN_CLZ 1
|
|
|
+#define SOFTFLOAT_INTRINSIC_INT128 1
|
|
|
+/**** start inlining opts-GCC.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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>
|
|
|
+/**** start inlining primitiveTypes.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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
|
|
|
+
|
|
|
+/**** ended inlining 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
|
|
|
+
|
|
|
+/**** ended inlining opts-GCC.h ****/
|
|
|
+
|
|
|
+/**** ended inlining platform.h ****/
|
|
|
+/**** start inlining softfloat.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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>
|
|
|
+/**** start inlining softfloat_types.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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
|
|
|
+
|
|
|
+/**** ended inlining 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
|
|
|
+
|
|
|
+/**** ended inlining softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Raises the exceptions specified by `flags'. Floating-point traps can be
|
|
|
+| defined here if desired. It is currently not possible for such a trap
|
|
|
+| to substitute a result value. If traps are not implemented, this routine
|
|
|
+| should be simply `softfloat_exceptionFlags |= flags;'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_raiseFlags( uint_fast8_t flags )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_exceptionFlags |= flags;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/softfloat_raiseFlags.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_f16UIToCommonNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** start inlining specialize.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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, 2018 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 specialize_h
|
|
|
+#define specialize_h 1
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Default value for 'softfloat_detectTininess'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define init_detectTininess softfloat_tininess_afterRounding
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The values to return on conversions to 32-bit integer formats that raise an
|
|
|
+| invalid exception.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define ui32_fromPosOverflow 0xFFFFFFFF
|
|
|
+#define ui32_fromNegOverflow 0xFFFFFFFF
|
|
|
+#define ui32_fromNaN 0xFFFFFFFF
|
|
|
+#define i32_fromPosOverflow (-0x7FFFFFFF - 1)
|
|
|
+#define i32_fromNegOverflow (-0x7FFFFFFF - 1)
|
|
|
+#define i32_fromNaN (-0x7FFFFFFF - 1)
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The values to return on conversions to 64-bit integer formats that raise an
|
|
|
+| invalid exception.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define ui64_fromPosOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
|
|
+#define ui64_fromNegOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
|
|
+#define ui64_fromNaN UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
|
|
+#define i64_fromPosOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
|
|
+#define i64_fromNegOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
|
|
+#define i64_fromNaN (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| "Common NaN" structure, used to transfer NaN representations from one format
|
|
|
+| to another.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct commonNaN {
|
|
|
+ bool sign;
|
|
|
+#ifdef LITTLEENDIAN
|
|
|
+ uint64_t v0, v64;
|
|
|
+#else
|
|
|
+ uint64_t v64, v0;
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 16-bit floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNF16UI 0xFE00
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
|
|
|
+| 16-bit floating-point signaling NaN.
|
|
|
+| Note: This macro evaluates its argument more than once.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_isSigNaNF16UI( uiA ) ((((uiA) & 0x7E00) == 0x7C00) && ((uiA) & 0x01FF))
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast16_t
|
|
|
+ softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 32-bit floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNF32UI 0xFFC00000
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
|
|
|
+| 32-bit floating-point signaling NaN.
|
|
|
+| Note: This macro evaluates its argument more than once.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast32_t
|
|
|
+ softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 64-bit floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
|
|
|
+| 64-bit floating-point signaling NaN.
|
|
|
+| Note: This macro evaluates its argument more than once.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_isSigNaNF64UI( uiA ) ((((uiA) & UINT64_C( 0x7FF8000000000000 )) == UINT64_C( 0x7FF0000000000000 )) && ((uiA) & UINT64_C( 0x0007FFFFFFFFFFFF )))
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast64_t
|
|
|
+ softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 80-bit extended floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNExtF80UI64 0xFFFF
|
|
|
+#define defaultNaNExtF80UI0 UINT64_C( 0xC000000000000000 )
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true when the 80-bit unsigned integer formed from concatenating
|
|
|
+| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
|
|
|
+| floating-point signaling NaN.
|
|
|
+| Note: This macro evaluates its arguments more than once.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
|
|
|
+| defined.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
|
|
|
+| has the bit pattern of an 80-bit extended floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_extF80UIToCommonNaN(
|
|
|
+ uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
|
|
|
+| floating-point NaN, and returns the bit pattern of this value as an unsigned
|
|
|
+| integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
|
|
+| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
|
|
+| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
|
|
|
+| 80-bit extended floating-point value, and assuming at least on of these
|
|
|
+| floating-point values is a NaN, returns the bit pattern of the combined NaN
|
|
|
+| result. If either original floating-point value is a signaling NaN, the
|
|
|
+| invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128
|
|
|
+ softfloat_propagateNaNExtF80UI(
|
|
|
+ uint_fast16_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast16_t uiB64,
|
|
|
+ uint_fast64_t uiB0
|
|
|
+ );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 128-bit floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )
|
|
|
+#define defaultNaNF128UI0 UINT64_C( 0 )
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true when the 128-bit unsigned integer formed from concatenating
|
|
|
+| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-
|
|
|
+| point signaling NaN.
|
|
|
+| Note: This macro evaluates its arguments more than once.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
|
|
|
+| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
|
|
|
+| the common NaN form, and stores the resulting common NaN at the location
|
|
|
+| pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception
|
|
|
+| is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_f128UIToCommonNaN(
|
|
|
+ uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
|
|
+| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
|
|
+| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
|
|
|
+| 128-bit floating-point value, and assuming at least on of these floating-
|
|
|
+| point values is a NaN, returns the bit pattern of the combined NaN result.
|
|
|
+| If either original floating-point value is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128
|
|
|
+ softfloat_propagateNaNF128UI(
|
|
|
+ uint_fast64_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast64_t uiB64,
|
|
|
+ uint_fast64_t uiB0
|
|
|
+ );
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
|
|
|
+| defined.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is
|
|
|
+| a NaN, converts this NaN to the common NaN form, and stores the resulting
|
|
|
+| common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling
|
|
|
+| NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_extF80MToCommonNaN(
|
|
|
+ const struct extFloat80M *aSPtr, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
|
|
|
+| floating-point NaN, and stores this NaN at the location pointed to by
|
|
|
+| 'zSPtr'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_commonNaNToExtF80M(
|
|
|
+ const struct commonNaN *aPtr, struct extFloat80M *zSPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming at least one of the two 80-bit extended floating-point values
|
|
|
+| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result
|
|
|
+| at the location pointed to by 'zSPtr'. If either original floating-point
|
|
|
+| value is a signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_propagateNaNExtF80M(
|
|
|
+ const struct extFloat80M *aSPtr,
|
|
|
+ const struct extFloat80M *bSPtr,
|
|
|
+ struct extFloat80M *zSPtr
|
|
|
+ );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The bit pattern for a default generated 128-bit floating-point NaN.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define defaultNaNF128UI96 0xFFFF8000
|
|
|
+#define defaultNaNF128UI64 0
|
|
|
+#define defaultNaNF128UI32 0
|
|
|
+#define defaultNaNF128UI0 0
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,
|
|
|
+| converts this NaN to the common NaN form, and stores the resulting common
|
|
|
+| NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN,
|
|
|
+| the invalid exception is raised. Argument 'aWPtr' points to an array of
|
|
|
+| four 32-bit elements that concatenate in the platform's normal endian order
|
|
|
+| to form a 128-bit floating-point value.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
|
|
|
+| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
|
|
|
+| 'zWPtr' points to an array of four 32-bit elements that concatenate in the
|
|
|
+| platform's normal endian order to form a 128-bit floating-point value.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr );
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming at least one of the two 128-bit floating-point values pointed to by
|
|
|
+| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
|
|
|
+| pointed to by 'zWPtr'. If either original floating-point value is a
|
|
|
+| signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr',
|
|
|
+| and 'zWPtr' points to an array of four 32-bit elements that concatenate in
|
|
|
+| the platform's normal endian order to form a 128-bit floating-point value.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_propagateNaNF128M(
|
|
|
+ const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr );
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ if ( softfloat_isSigNaNF16UI( uiA ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ zPtr->sign = uiA>>15;
|
|
|
+ zPtr->v64 = (uint_fast64_t) uiA<<54;
|
|
|
+ zPtr->v0 = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_f16UIToCommonNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_commonNaNToF16UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_commonNaNToF16UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_propagateNaNF16UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** start inlining internals.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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>
|
|
|
+/**** start inlining primitives.h ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+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 primitives_h
|
|
|
+#define primitives_h 1
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam64
|
|
|
+#define softfloat_shortShiftRightJam64 softfloat_shortShiftRightJam64
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts 'a' right by the number of bits given in 'dist', which must be in
|
|
|
+| the range 1 to 63. If any nonzero bits are shifted off, they are "jammed"
|
|
|
+| into the least-significant bit of the shifted value by setting the least-
|
|
|
+| significant bit to 1. This shifted-and-jammed value is returned.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+uint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist )
|
|
|
+ { return a>>dist | ((a & (((uint_fast64_t) 1<<dist) - 1)) != 0); }
|
|
|
+#else
|
|
|
+uint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam32
|
|
|
+#define softfloat_shiftRightJam32 softfloat_shiftRightJam32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts 'a' right by the number of bits given in 'dist', which must not
|
|
|
+| be zero. If any nonzero bits are shifted off, they are "jammed" into the
|
|
|
+| least-significant bit of the shifted value by setting the least-significant
|
|
|
+| bit to 1. This shifted-and-jammed value is returned.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist' is
|
|
|
+| greater than 32, the result will be either 0 or 1, depending on whether 'a'
|
|
|
+| is zero or nonzero.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist )
|
|
|
+{
|
|
|
+ return
|
|
|
+ (dist < 31) ? a>>dist | ((uint32_t) (a<<(-dist & 31)) != 0) : (a != 0);
|
|
|
+}
|
|
|
+#else
|
|
|
+uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam64
|
|
|
+#define softfloat_shiftRightJam64 softfloat_shiftRightJam64
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts 'a' right by the number of bits given in 'dist', which must not
|
|
|
+| be zero. If any nonzero bits are shifted off, they are "jammed" into the
|
|
|
+| least-significant bit of the shifted value by setting the least-significant
|
|
|
+| bit to 1. This shifted-and-jammed value is returned.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist' is
|
|
|
+| greater than 64, the result will be either 0 or 1, depending on whether 'a'
|
|
|
+| is zero or nonzero.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
|
|
|
+INLINE uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist )
|
|
|
+{
|
|
|
+ return
|
|
|
+ (dist < 63) ? a>>dist | ((uint64_t) (a<<(-dist & 63)) != 0) : (a != 0);
|
|
|
+}
|
|
|
+#else
|
|
|
+uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| A constant table that translates an 8-bit unsigned integer (the array index)
|
|
|
+| into the number of leading 0 bits before the most-significant 1 of that
|
|
|
+| integer. For integer zero (index 0), the corresponding table element is 8.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+extern const uint_least8_t softfloat_countLeadingZeros8[256];
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros16
|
|
|
+#define softfloat_countLeadingZeros16 softfloat_countLeadingZeros16
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the number of leading 0 bits before the most-significant 1 bit of
|
|
|
+| 'a'. If 'a' is zero, 16 is returned.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE uint_fast8_t softfloat_countLeadingZeros16( uint16_t a )
|
|
|
+{
|
|
|
+ uint_fast8_t count = 8;
|
|
|
+ if ( 0x100 <= a ) {
|
|
|
+ count = 0;
|
|
|
+ a >>= 8;
|
|
|
+ }
|
|
|
+ count += softfloat_countLeadingZeros8[a];
|
|
|
+ return count;
|
|
|
+}
|
|
|
+#else
|
|
|
+uint_fast8_t softfloat_countLeadingZeros16( uint16_t a );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros32
|
|
|
+#define softfloat_countLeadingZeros32 softfloat_countLeadingZeros32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the number of leading 0 bits before the most-significant 1 bit of
|
|
|
+| 'a'. If 'a' is zero, 32 is returned.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
|
|
|
+INLINE uint_fast8_t softfloat_countLeadingZeros32( uint32_t a )
|
|
|
+{
|
|
|
+ uint_fast8_t count = 0;
|
|
|
+ if ( a < 0x10000 ) {
|
|
|
+ count = 16;
|
|
|
+ a <<= 16;
|
|
|
+ }
|
|
|
+ if ( a < 0x1000000 ) {
|
|
|
+ count += 8;
|
|
|
+ a <<= 8;
|
|
|
+ }
|
|
|
+ count += softfloat_countLeadingZeros8[a>>24];
|
|
|
+ return count;
|
|
|
+}
|
|
|
+#else
|
|
|
+uint_fast8_t softfloat_countLeadingZeros32( uint32_t a );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros64
|
|
|
+#define softfloat_countLeadingZeros64 softfloat_countLeadingZeros64
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the number of leading 0 bits before the most-significant 1 bit of
|
|
|
+| 'a'. If 'a' is zero, 64 is returned.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast8_t softfloat_countLeadingZeros64( uint64_t a );
|
|
|
+#endif
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecip_1k0s[16];
|
|
|
+extern const uint16_t softfloat_approxRecip_1k1s[16];
|
|
|
+
|
|
|
+#ifndef softfloat_approxRecip32_1
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns an approximation to the reciprocal of the number represented by 'a',
|
|
|
+| where 'a' is interpreted as an unsigned fixed-point number with one integer
|
|
|
+| bit and 31 fraction bits. The 'a' input must be "normalized", meaning that
|
|
|
+| its most-significant bit (bit 31) must be 1. Thus, if A is the value of
|
|
|
+| the fixed-point interpretation of 'a', then 1 <= A < 2. The returned value
|
|
|
+| is interpreted as a pure unsigned fraction, having no integer bits and 32
|
|
|
+| fraction bits. The approximation returned is never greater than the true
|
|
|
+| reciprocal 1/A, and it differs from the true reciprocal by at most 2.006 ulp
|
|
|
+| (units in the last place).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#ifdef SOFTFLOAT_FAST_DIV64TO32
|
|
|
+#define softfloat_approxRecip32_1( a ) ((uint32_t) (UINT64_C( 0x7FFFFFFFFFFFFFFF ) / (uint32_t) (a)))
|
|
|
+#else
|
|
|
+uint32_t softfloat_approxRecip32_1( uint32_t a );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k0s[16];
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k1s[16];
|
|
|
+
|
|
|
+#ifndef softfloat_approxRecipSqrt32_1
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns an approximation to the reciprocal of the square root of the number
|
|
|
+| represented by 'a', where 'a' is interpreted as an unsigned fixed-point
|
|
|
+| number either with one integer bit and 31 fraction bits or with two integer
|
|
|
+| bits and 30 fraction bits. The format of 'a' is determined by 'oddExpA',
|
|
|
+| which must be either 0 or 1. If 'oddExpA' is 1, 'a' is interpreted as
|
|
|
+| having one integer bit, and if 'oddExpA' is 0, 'a' is interpreted as having
|
|
|
+| two integer bits. The 'a' input must be "normalized", meaning that its
|
|
|
+| most-significant bit (bit 31) must be 1. Thus, if A is the value of the
|
|
|
+| fixed-point interpretation of 'a', it follows that 1 <= A < 2 when 'oddExpA'
|
|
|
+| is 1, and 2 <= A < 4 when 'oddExpA' is 0.
|
|
|
+| The returned value is interpreted as a pure unsigned fraction, having
|
|
|
+| no integer bits and 32 fraction bits. The approximation returned is never
|
|
|
+| greater than the true reciprocal 1/sqrt(A), and it differs from the true
|
|
|
+| reciprocal by at most 2.06 ulp (units in the last place). The approximation
|
|
|
+| returned is also always within the range 0.5 to 1; thus, the most-
|
|
|
+| significant bit of the result is always set.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint32_t softfloat_approxRecipSqrt32_1( unsigned int oddExpA, uint32_t a );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
|
|
|
+| defined.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+#ifndef softfloat_eq128
|
|
|
+#define softfloat_eq128 softfloat_eq128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
|
|
|
+| and 'a0' is equal to the 128-bit unsigned integer formed by concatenating
|
|
|
+| 'b64' and 'b0'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+bool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+ { return (a64 == b64) && (a0 == b0); }
|
|
|
+#else
|
|
|
+bool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_le128
|
|
|
+#define softfloat_le128 softfloat_le128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
|
|
|
+| and 'a0' is less than or equal to the 128-bit unsigned integer formed by
|
|
|
+| concatenating 'b64' and 'b0'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+bool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+ { return (a64 < b64) || ((a64 == b64) && (a0 <= b0)); }
|
|
|
+#else
|
|
|
+bool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_lt128
|
|
|
+#define softfloat_lt128 softfloat_lt128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns true if the 128-bit unsigned integer formed by concatenating 'a64'
|
|
|
+| and 'a0' is less than the 128-bit unsigned integer formed by concatenating
|
|
|
+| 'b64' and 'b0'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+bool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+ { return (a64 < b64) || ((a64 == b64) && (a0 < b0)); }
|
|
|
+#else
|
|
|
+bool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft128
|
|
|
+#define softfloat_shortShiftLeft128 softfloat_shortShiftLeft128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 128 bits formed by concatenating 'a64' and 'a0' left by the
|
|
|
+| number of bits given in 'dist', which must be in the range 1 to 63.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ z.v64 = a64<<dist | a0>>(-dist & 63);
|
|
|
+ z.v0 = a0<<dist;
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRight128
|
|
|
+#define softfloat_shortShiftRight128 softfloat_shortShiftRight128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
|
|
|
+| number of bits given in 'dist', which must be in the range 1 to 63.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ z.v64 = a64>>dist;
|
|
|
+ z.v0 = a64<<(-dist & 63) | a0>>dist;
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam64Extra
|
|
|
+#define softfloat_shortShiftRightJam64Extra softfloat_shortShiftRightJam64Extra
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function is the same as 'softfloat_shiftRightJam64Extra' (below),
|
|
|
+| except that 'dist' must be in the range 1 to 63.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shortShiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint64_extra z;
|
|
|
+ z.v = a>>dist;
|
|
|
+ z.extra = a<<(-dist & 63) | (extra != 0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shortShiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam128
|
|
|
+#define softfloat_shortShiftRightJam128 softfloat_shortShiftRightJam128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
|
|
|
+| number of bits given in 'dist', which must be in the range 1 to 63. If any
|
|
|
+| nonzero bits are shifted off, they are "jammed" into the least-significant
|
|
|
+| bit of the shifted value by setting the least-significant bit to 1. This
|
|
|
+| shifted-and-jammed value is returned.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRightJam128(
|
|
|
+ uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t negDist = -dist;
|
|
|
+ struct uint128 z;
|
|
|
+ z.v64 = a64>>dist;
|
|
|
+ z.v0 =
|
|
|
+ a64<<(negDist & 63) | a0>>dist
|
|
|
+ | ((uint64_t) (a0<<(negDist & 63)) != 0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRightJam128(
|
|
|
+ uint64_t a64, uint64_t a0, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam128Extra
|
|
|
+#define softfloat_shortShiftRightJam128Extra softfloat_shortShiftRightJam128Extra
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function is the same as 'softfloat_shiftRightJam128Extra' (below),
|
|
|
+| except that 'dist' must be in the range 1 to 63.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128_extra
|
|
|
+ softfloat_shortShiftRightJam128Extra(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t negDist = -dist;
|
|
|
+ struct uint128_extra z;
|
|
|
+ z.v.v64 = a64>>dist;
|
|
|
+ z.v.v0 = a64<<(negDist & 63) | a0>>dist;
|
|
|
+ z.extra = a0<<(negDist & 63) | (extra != 0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128_extra
|
|
|
+ softfloat_shortShiftRightJam128Extra(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam64Extra
|
|
|
+#define softfloat_shiftRightJam64Extra softfloat_shiftRightJam64Extra
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 128 bits formed by concatenating 'a' and 'extra' right by 64
|
|
|
+| _plus_ the number of bits given in 'dist', which must not be zero. This
|
|
|
+| shifted value is at most 64 nonzero bits and is returned in the 'v' field
|
|
|
+| of the 'struct uint64_extra' result. The 64-bit 'extra' field of the result
|
|
|
+| contains a value formed as follows from the bits that were shifted off: The
|
|
|
+| _last_ bit shifted off is the most-significant bit of the 'extra' field, and
|
|
|
+| the other 63 bits of the 'extra' field are all zero if and only if _all_but_
|
|
|
+| _the_last_ bits shifted off were all zero.
|
|
|
+| (This function makes more sense if 'a' and 'extra' are considered to form
|
|
|
+| an unsigned fixed-point number with binary point between 'a' and 'extra'.
|
|
|
+| This fixed-point value is shifted right by the number of bits given in
|
|
|
+| 'dist', and the integer part of this shifted value is returned in the 'v'
|
|
|
+| field of the result. The fractional part of the shifted value is modified
|
|
|
+| as described above and returned in the 'extra' field of the result.)
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast32_t dist )
|
|
|
+{
|
|
|
+ struct uint64_extra z;
|
|
|
+ if ( dist < 64 ) {
|
|
|
+ z.v = a>>dist;
|
|
|
+ z.extra = a<<(-dist & 63);
|
|
|
+ } else {
|
|
|
+ z.v = 0;
|
|
|
+ z.extra = (dist == 64) ? a : (a != 0);
|
|
|
+ }
|
|
|
+ z.extra |= (extra != 0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast32_t dist );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam128
|
|
|
+//#define softfloat_shiftRightJam128 softfloat_shiftRightJam128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 128 bits formed by concatenating 'a64' and 'a0' right by the
|
|
|
+| number of bits given in 'dist', which must not be zero. If any nonzero bits
|
|
|
+| are shifted off, they are "jammed" into the least-significant bit of the
|
|
|
+| shifted value by setting the least-significant bit to 1. This shifted-and-
|
|
|
+| jammed value is returned.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist' is
|
|
|
+| greater than 128, the result will be either 0 or 1, depending on whether the
|
|
|
+| original 128 bits are all zeros.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128
|
|
|
+ softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam128Extra
|
|
|
+#define softfloat_shiftRightJam128Extra softfloat_shiftRightJam128Extra
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 192 bits formed by concatenating 'a64', 'a0', and 'extra' right
|
|
|
+| by 64 _plus_ the number of bits given in 'dist', which must not be zero.
|
|
|
+| This shifted value is at most 128 nonzero bits and is returned in the 'v'
|
|
|
+| field of the 'struct uint128_extra' result. The 64-bit 'extra' field of the
|
|
|
+| result contains a value formed as follows from the bits that were shifted
|
|
|
+| off: The _last_ bit shifted off is the most-significant bit of the 'extra'
|
|
|
+| field, and the other 63 bits of the 'extra' field are all zero if and only
|
|
|
+| if _all_but_the_last_ bits shifted off were all zero.
|
|
|
+| (This function makes more sense if 'a64', 'a0', and 'extra' are considered
|
|
|
+| to form an unsigned fixed-point number with binary point between 'a0' and
|
|
|
+| 'extra'. This fixed-point value is shifted right by the number of bits
|
|
|
+| given in 'dist', and the integer part of this shifted value is returned
|
|
|
+| in the 'v' field of the result. The fractional part of the shifted value
|
|
|
+| is modified as described above and returned in the 'extra' field of the
|
|
|
+| result.)
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128_extra
|
|
|
+ softfloat_shiftRightJam128Extra(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam256M
|
|
|
+#define softfloat_shiftRightJam256M softfloat_shiftRightJam256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the 256-bit unsigned integer pointed to by 'aPtr' right by the number
|
|
|
+| of bits given in 'dist', which must not be zero. If any nonzero bits are
|
|
|
+| shifted off, they are "jammed" into the least-significant bit of the shifted
|
|
|
+| value by setting the least-significant bit to 1. This shifted-and-jammed
|
|
|
+| value is stored at the location pointed to by 'zPtr'. Each of 'aPtr' and
|
|
|
+| 'zPtr' points to an array of four 64-bit elements that concatenate in the
|
|
|
+| platform's normal endian order to form a 256-bit integer.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist'
|
|
|
+| is greater than 256, the stored result will be either 0 or 1, depending on
|
|
|
+| whether the original 256 bits are all zeros.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shiftRightJam256M(
|
|
|
+ const uint64_t *aPtr, uint_fast32_t dist, uint64_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_add128
|
|
|
+#define softfloat_add128 softfloat_add128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the sum of the 128-bit integer formed by concatenating 'a64' and
|
|
|
+| 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'. The
|
|
|
+| addition is modulo 2^128, so any carry out is lost.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128
|
|
|
+ softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ z.v0 = a0 + b0;
|
|
|
+ z.v64 = a64 + b64 + (z.v0 < a0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128
|
|
|
+ softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_add256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Adds the two 256-bit integers pointed to by 'aPtr' and 'bPtr'. The addition
|
|
|
+| is modulo 2^256, so any carry out is lost. The sum is stored at the
|
|
|
+| location pointed to by 'zPtr'. Each of 'aPtr', 'bPtr', and 'zPtr' points to
|
|
|
+| an array of four 64-bit elements that concatenate in the platform's normal
|
|
|
+| endian order to form a 256-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_add256M(
|
|
|
+ const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub128
|
|
|
+#define softfloat_sub128 softfloat_sub128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the difference of the 128-bit integer formed by concatenating 'a64'
|
|
|
+| and 'a0' and the 128-bit integer formed by concatenating 'b64' and 'b0'.
|
|
|
+| The subtraction is modulo 2^128, so any borrow out (carry out) is lost.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128
|
|
|
+ softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ z.v0 = a0 - b0;
|
|
|
+ z.v64 = a64 - b64;
|
|
|
+ z.v64 -= (a0 < b0);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128
|
|
|
+ softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Subtracts the 256-bit integer pointed to by 'bPtr' from the 256-bit integer
|
|
|
+| pointed to by 'aPtr'. The addition is modulo 2^256, so any borrow out
|
|
|
+| (carry out) is lost. The difference is stored at the location pointed to
|
|
|
+| by 'zPtr'. Each of 'aPtr', 'bPtr', and 'zPtr' points to an array of four
|
|
|
+| 64-bit elements that concatenate in the platform's normal endian order to
|
|
|
+| form a 256-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_sub256M(
|
|
|
+ const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul64ByShifted32To128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the 128-bit product of 'a', 'b', and 2^32.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (3 <= INLINE_LEVEL)
|
|
|
+INLINE struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )
|
|
|
+{
|
|
|
+ uint_fast64_t mid;
|
|
|
+ struct uint128 z;
|
|
|
+ mid = (uint_fast64_t) (uint32_t) a * b;
|
|
|
+ z.v0 = mid<<32;
|
|
|
+ z.v64 = (uint_fast64_t) (uint32_t) (a>>32) * b + (mid>>32);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul64To128
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the 128-bit product of 'a' and 'b'.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul128By32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Returns the product of the 128-bit integer formed by concatenating 'a64' and
|
|
|
+| 'a0', multiplied by 'b'. The multiplication is modulo 2^128; any overflow
|
|
|
+| bits are discarded.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (4 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ uint_fast64_t mid;
|
|
|
+ uint_fast32_t carry;
|
|
|
+ z.v0 = a0 * b;
|
|
|
+ mid = (uint_fast64_t) (uint32_t) (a0>>32) * b;
|
|
|
+ carry = (uint32_t) ((uint_fast32_t) (z.v0>>32) - (uint_fast32_t) mid);
|
|
|
+ z.v64 = a64 * b + (uint_fast32_t) ((mid + carry)>>32);
|
|
|
+ return z;
|
|
|
+}
|
|
|
+#else
|
|
|
+struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul128To256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Multiplies the 128-bit unsigned integer formed by concatenating 'a64' and
|
|
|
+| 'a0' by the 128-bit unsigned integer formed by concatenating 'b64' and
|
|
|
+| 'b0'. The 256-bit product is stored at the location pointed to by 'zPtr'.
|
|
|
+| Argument 'zPtr' points to an array of four 64-bit elements that concatenate
|
|
|
+| in the platform's normal endian order to form a 256-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_mul128To256M(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
|
|
|
+| defined.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+#ifndef softfloat_compare96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Compares the two 96-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
|
|
|
+| Returns -1 if the first integer (A) is less than the second (B); returns 0
|
|
|
+| if the two integers are equal; and returns +1 if the first integer (A)
|
|
|
+| is greater than the second (B). (The result is thus the signum of A - B.)
|
|
|
+| Each of 'aPtr' and 'bPtr' points to an array of three 32-bit elements that
|
|
|
+| concatenate in the platform's normal endian order to form a 96-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+int_fast8_t softfloat_compare96M( const uint32_t *aPtr, const uint32_t *bPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_compare128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Compares the two 128-bit unsigned integers pointed to by 'aPtr' and 'bPtr'.
|
|
|
+| Returns -1 if the first integer (A) is less than the second (B); returns 0
|
|
|
+| if the two integers are equal; and returns +1 if the first integer (A)
|
|
|
+| is greater than the second (B). (The result is thus the signum of A - B.)
|
|
|
+| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
|
|
|
+| concatenate in the platform's normal endian order to form a 128-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+int_fast8_t
|
|
|
+ softfloat_compare128M( const uint32_t *aPtr, const uint32_t *bPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft64To96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Extends 'a' to 96 bits and shifts the value left by the number of bits given
|
|
|
+| in 'dist', which must be in the range 1 to 31. The result is stored at the
|
|
|
+| location pointed to by 'zPtr'. Argument 'zPtr' points to an array of three
|
|
|
+| 32-bit elements that concatenate in the platform's normal endian order to
|
|
|
+| form a 96-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+INLINE
|
|
|
+void
|
|
|
+ softfloat_shortShiftLeft64To96M(
|
|
|
+ uint64_t a, uint_fast8_t dist, uint32_t *zPtr )
|
|
|
+{
|
|
|
+ zPtr[indexWord( 3, 0 )] = (uint32_t) a<<dist;
|
|
|
+ a >>= 32 - dist;
|
|
|
+ zPtr[indexWord( 3, 2 )] = a>>32;
|
|
|
+ zPtr[indexWord( 3, 1 )] = a;
|
|
|
+}
|
|
|
+#else
|
|
|
+void
|
|
|
+ softfloat_shortShiftLeft64To96M(
|
|
|
+ uint64_t a, uint_fast8_t dist, uint32_t *zPtr );
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeftM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must be in the range 1 to 31. Any nonzero bits shifted off are lost. The
|
|
|
+| shifted N-bit result is stored at the location pointed to by 'zPtr'. Each
|
|
|
+| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
|
|
|
+| that concatenate in the platform's normal endian order to form an N-bit
|
|
|
+| integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shortShiftLeftM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ uint_fast8_t dist,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftLeftM' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftLeft96M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 3, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftLeftM' with
|
|
|
+| 'size_words' = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftLeft128M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 4, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftLeftM' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftLeft160M( aPtr, dist, zPtr ) softfloat_shortShiftLeftM( 5, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftLeftM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' left by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must not be zero. Any nonzero bits shifted off are lost. The shifted
|
|
|
+| N-bit result is stored at the location pointed to by 'zPtr'. Each of 'aPtr'
|
|
|
+| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
|
|
|
+| concatenate in the platform's normal endian order to form an N-bit integer.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist' is
|
|
|
+| greater than N, the stored result will be 0.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shiftLeftM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ uint32_t dist,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftLeft96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftLeftM' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftLeft96M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 3, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftLeft128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftLeftM' with
|
|
|
+| 'size_words' = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftLeft128M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 4, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftLeft160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftLeftM' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftLeft160M( aPtr, dist, zPtr ) softfloat_shiftLeftM( 5, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must be in the range 1 to 31. Any nonzero bits shifted off are lost. The
|
|
|
+| shifted N-bit result is stored at the location pointed to by 'zPtr'. Each
|
|
|
+| of 'aPtr' and 'zPtr' points to a 'size_words'-long array of 32-bit elements
|
|
|
+| that concatenate in the platform's normal endian order to form an N-bit
|
|
|
+| integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shortShiftRightM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ uint_fast8_t dist,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRight128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftRightM' with
|
|
|
+| 'size_words' = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftRight128M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 4, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRight160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftRightM' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftRight160M( aPtr, dist, zPtr ) softfloat_shortShiftRightM( 5, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJamM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must be in the range 1 to 31. If any nonzero bits are shifted off, they are
|
|
|
+| "jammed" into the least-significant bit of the shifted value by setting the
|
|
|
+| least-significant bit to 1. This shifted-and-jammed N-bit result is stored
|
|
|
+| at the location pointed to by 'zPtr'. Each of 'aPtr' and 'zPtr' points
|
|
|
+| to a 'size_words'-long array of 32-bit elements that concatenate in the
|
|
|
+| platform's normal endian order to form an N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shortShiftRightJamM(
|
|
|
+ uint_fast8_t, const uint32_t *, uint_fast8_t, uint32_t * );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shortShiftRightJamM' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shortShiftRightJam160M( aPtr, dist, zPtr ) softfloat_shortShiftRightJamM( 5, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must not be zero. Any nonzero bits shifted off are lost. The shifted
|
|
|
+| N-bit result is stored at the location pointed to by 'zPtr'. Each of 'aPtr'
|
|
|
+| and 'zPtr' points to a 'size_words'-long array of 32-bit elements that
|
|
|
+| concatenate in the platform's normal endian order to form an N-bit integer.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist' is
|
|
|
+| greater than N, the stored result will be 0.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shiftRightM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ uint32_t dist,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRight96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftRightM' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftRight96M( aPtr, dist, zPtr ) softfloat_shiftRightM( 3, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJamM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Shifts the N-bit unsigned integer pointed to by 'aPtr' right by the number
|
|
|
+| of bits given in 'dist', where N = 'size_words' * 32. The value of 'dist'
|
|
|
+| must not be zero. If any nonzero bits are shifted off, they are "jammed"
|
|
|
+| into the least-significant bit of the shifted value by setting the least-
|
|
|
+| significant bit to 1. This shifted-and-jammed N-bit result is stored
|
|
|
+| at the location pointed to by 'zPtr'. Each of 'aPtr' and 'zPtr' points
|
|
|
+| to a 'size_words'-long array of 32-bit elements that concatenate in the
|
|
|
+| platform's normal endian order to form an N-bit integer.
|
|
|
+| The value of 'dist' can be arbitrarily large. In particular, if 'dist'
|
|
|
+| is greater than N, the stored result will be either 0 or 1, depending on
|
|
|
+| whether the original N bits are all zeros.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_shiftRightJamM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ uint32_t dist,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftRightJamM' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftRightJam96M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 3, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftRightJamM' with
|
|
|
+| 'size_words' = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftRightJam128M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 4, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_shiftRightJamM' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_shiftRightJam160M( aPtr, dist, zPtr ) softfloat_shiftRightJamM( 5, aPtr, dist, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_addM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Adds the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
|
|
|
+| 'size_words' * 32. The addition is modulo 2^N, so any carry out is lost.
|
|
|
+| The N-bit sum is stored at the location pointed to by 'zPtr'. Each of
|
|
|
+| 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long array of 32-bit
|
|
|
+| elements that concatenate in the platform's normal endian order to form an
|
|
|
+| N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_addM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ const uint32_t *bPtr,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_add96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_addM' with 'size_words'
|
|
|
+| = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_add96M( aPtr, bPtr, zPtr ) softfloat_addM( 3, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_add128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_addM' with 'size_words'
|
|
|
+| = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_add128M( aPtr, bPtr, zPtr ) softfloat_addM( 4, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_add160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_addM' with 'size_words'
|
|
|
+| = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_add160M( aPtr, bPtr, zPtr ) softfloat_addM( 5, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_addCarryM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Adds the two N-bit unsigned integers pointed to by 'aPtr' and 'bPtr', where
|
|
|
+| N = 'size_words' * 32, plus 'carry', which must be either 0 or 1. The N-bit
|
|
|
+| sum (modulo 2^N) is stored at the location pointed to by 'zPtr', and any
|
|
|
+| carry out is returned as the result. Each of 'aPtr', 'bPtr', and 'zPtr'
|
|
|
+| points to a 'size_words'-long array of 32-bit elements that concatenate in
|
|
|
+| the platform's normal endian order to form an N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast8_t
|
|
|
+ softfloat_addCarryM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ const uint32_t *bPtr,
|
|
|
+ uint_fast8_t carry,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_addComplCarryM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_addCarryM', except that
|
|
|
+| the value of the unsigned integer pointed to by 'bPtr' is bit-wise completed
|
|
|
+| before the addition.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast8_t
|
|
|
+ softfloat_addComplCarryM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ const uint32_t *bPtr,
|
|
|
+ uint_fast8_t carry,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_addComplCarry96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_addComplCarryM' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_addComplCarry96M( aPtr, bPtr, carry, zPtr ) softfloat_addComplCarryM( 3, aPtr, bPtr, carry, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_negXM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Replaces the N-bit unsigned integer pointed to by 'zPtr' by the
|
|
|
+| 2s-complement of itself, where N = 'size_words' * 32. Argument 'zPtr'
|
|
|
+| points to a 'size_words'-long array of 32-bit elements that concatenate in
|
|
|
+| the platform's normal endian order to form an N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_negXM( uint_fast8_t size_words, uint32_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_negX96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_negXM' with 'size_words'
|
|
|
+| = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_negX96M( zPtr ) softfloat_negXM( 3, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_negX128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_negXM' with 'size_words'
|
|
|
+| = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_negX128M( zPtr ) softfloat_negXM( 4, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_negX160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_negXM' with 'size_words'
|
|
|
+| = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_negX160M( zPtr ) softfloat_negXM( 5, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_negX256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_negXM' with 'size_words'
|
|
|
+| = 8 (N = 256).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_negX256M( zPtr ) softfloat_negXM( 8, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub1XM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Subtracts 1 from the N-bit integer pointed to by 'zPtr', where N =
|
|
|
+| 'size_words' * 32. The subtraction is modulo 2^N, so any borrow out (carry
|
|
|
+| out) is lost. Argument 'zPtr' points to a 'size_words'-long array of 32-bit
|
|
|
+| elements that concatenate in the platform's normal endian order to form an
|
|
|
+| N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_sub1XM( uint_fast8_t size_words, uint32_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub1X96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
|
|
|
+| = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_sub1X96M( zPtr ) softfloat_sub1XM( 3, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub1X160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_sub1XM' with 'size_words'
|
|
|
+| = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_sub1X160M( zPtr ) softfloat_sub1XM( 5, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_subM
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Subtracts the two N-bit integers pointed to by 'aPtr' and 'bPtr', where N =
|
|
|
+| 'size_words' * 32. The subtraction is modulo 2^N, so any borrow out (carry
|
|
|
+| out) is lost. The N-bit difference is stored at the location pointed to by
|
|
|
+| 'zPtr'. Each of 'aPtr', 'bPtr', and 'zPtr' points to a 'size_words'-long
|
|
|
+| array of 32-bit elements that concatenate in the platform's normal endian
|
|
|
+| order to form an N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_subM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *aPtr,
|
|
|
+ const uint32_t *bPtr,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub96M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_subM' with 'size_words'
|
|
|
+| = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_sub96M( aPtr, bPtr, zPtr ) softfloat_subM( 3, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_subM' with 'size_words'
|
|
|
+| = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_sub128M( aPtr, bPtr, zPtr ) softfloat_subM( 4, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_sub160M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_subM' with 'size_words'
|
|
|
+| = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_sub160M( aPtr, bPtr, zPtr ) softfloat_subM( 5, aPtr, bPtr, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul64To128M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Multiplies 'a' and 'b' and stores the 128-bit product at the location
|
|
|
+| pointed to by 'zPtr'. Argument 'zPtr' points to an array of four 32-bit
|
|
|
+| elements that concatenate in the platform's normal endian order to form a
|
|
|
+| 128-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_mul64To128M( uint64_t a, uint64_t b, uint32_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_mul128MTo256M
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Multiplies the two 128-bit unsigned integers pointed to by 'aPtr' and
|
|
|
+| 'bPtr', and stores the 256-bit product at the location pointed to by 'zPtr'.
|
|
|
+| Each of 'aPtr' and 'bPtr' points to an array of four 32-bit elements that
|
|
|
+| concatenate in the platform's normal endian order to form a 128-bit integer.
|
|
|
+| Argument 'zPtr' points to an array of eight 32-bit elements that concatenate
|
|
|
+| to form a 256-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_mul128MTo256M(
|
|
|
+ const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_remStepMBy32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Performs a "remainder reduction step" as follows: Arguments 'remPtr' and
|
|
|
+| 'bPtr' both point to N-bit unsigned integers, where N = 'size_words' * 32.
|
|
|
+| Defining R and B as the values of those integers, the expression (R<<'dist')
|
|
|
+| - B * q is computed modulo 2^N, and the N-bit result is stored at the
|
|
|
+| location pointed to by 'zPtr'. Each of 'remPtr', 'bPtr', and 'zPtr' points
|
|
|
+| to a 'size_words'-long array of 32-bit elements that concatenate in the
|
|
|
+| platform's normal endian order to form an N-bit integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_remStepMBy32(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint32_t *remPtr,
|
|
|
+ uint_fast8_t dist,
|
|
|
+ const uint32_t *bPtr,
|
|
|
+ uint32_t q,
|
|
|
+ uint32_t *zPtr
|
|
|
+ );
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_remStep96MBy32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_remStepMBy32' with
|
|
|
+| 'size_words' = 3 (N = 96).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_remStep96MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 3, remPtr, dist, bPtr, q, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_remStep128MBy32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_remStepMBy32' with
|
|
|
+| 'size_words' = 4 (N = 128).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_remStep128MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 4, remPtr, dist, bPtr, q, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef softfloat_remStep160MBy32
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| This function or macro is the same as 'softfloat_remStepMBy32' with
|
|
|
+| 'size_words' = 5 (N = 160).
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+#define softfloat_remStep160MBy32( remPtr, dist, bPtr, q, zPtr ) softfloat_remStepMBy32( 5, remPtr, dist, bPtr, q, zPtr )
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining primitives.h ****/
|
|
|
+/**** skipping file: 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
|
|
|
+
|
|
|
+/**** ended inlining internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting `uiA' and `uiB' as the bit patterns of two 16-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast16_t
|
|
|
+ softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB )
|
|
|
+{
|
|
|
+ bool isSigNaNA;
|
|
|
+
|
|
|
+ isSigNaNA = softfloat_isSigNaNF16UI( uiA );
|
|
|
+ if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ if ( isSigNaNA ) return uiA | 0x0200;
|
|
|
+ }
|
|
|
+ return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_propagateNaNF16UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_f32UIToCommonNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ if ( softfloat_isSigNaNF32UI( uiA ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ zPtr->sign = uiA>>31;
|
|
|
+ zPtr->v64 = (uint_fast64_t) uiA<<41;
|
|
|
+ zPtr->v0 = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_f32UIToCommonNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_commonNaNToF32UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_commonNaNToF32UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_propagateNaNF32UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast32_t
|
|
|
+ softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
|
|
|
+{
|
|
|
+ bool isSigNaNA;
|
|
|
+
|
|
|
+ isSigNaNA = softfloat_isSigNaNF32UI( uiA );
|
|
|
+ if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ if ( isSigNaNA ) return uiA | 0x00400000;
|
|
|
+ }
|
|
|
+ return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_propagateNaNF32UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_f64UIToCommonNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ if ( softfloat_isSigNaNF64UI( uiA ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ zPtr->sign = uiA>>63;
|
|
|
+ zPtr->v64 = uiA<<12;
|
|
|
+ zPtr->v0 = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_f64UIToCommonNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_commonNaNToF64UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return
|
|
|
+ (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
|
|
|
+ | aPtr->v64>>12;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_commonNaNToF64UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_propagateNaNF64UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating-
|
|
|
+| point values, at least one of which is a NaN, returns the bit pattern of
|
|
|
+| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
|
|
+| signaling NaN, the invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+uint_fast64_t
|
|
|
+ softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
|
|
|
+{
|
|
|
+ bool isSigNaNA;
|
|
|
+
|
|
|
+ isSigNaNA = softfloat_isSigNaNF64UI( uiA );
|
|
|
+ if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 );
|
|
|
+ }
|
|
|
+ return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_propagateNaNF64UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/extF80M_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint64_t uiA0;
|
|
|
+
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ return
|
|
|
+ ! (uiA0 & UINT64_C( 0x4000000000000000 ))
|
|
|
+ && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/extF80M_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_extF80UIToCommonNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
|
|
+| has the bit pattern of an 80-bit extended floating-point NaN, converts
|
|
|
+| this NaN to the common NaN form, and stores the resulting common NaN at the
|
|
|
+| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_extF80UIToCommonNaN(
|
|
|
+ uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ zPtr->sign = uiA64>>15;
|
|
|
+ zPtr->v64 = uiA0<<1;
|
|
|
+ zPtr->v0 = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_extF80UIToCommonNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_commonNaNToExtF80UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by `aPtr' into an 80-bit extended
|
|
|
+| floating-point NaN, and returns the bit pattern of this value as an unsigned
|
|
|
+| integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
|
|
|
+{
|
|
|
+ struct uint128 uiZ;
|
|
|
+
|
|
|
+ uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
|
|
|
+ uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
|
|
+ return uiZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_commonNaNToExtF80UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_propagateNaNExtF80UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2018 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
|
|
+| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
|
|
+| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
|
|
|
+| 80-bit extended floating-point value, and assuming at least on of these
|
|
|
+| floating-point values is a NaN, returns the bit pattern of the combined NaN
|
|
|
+| result. If either original floating-point value is a signaling NaN, the
|
|
|
+| invalid exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128
|
|
|
+ softfloat_propagateNaNExtF80UI(
|
|
|
+ uint_fast16_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast16_t uiB64,
|
|
|
+ uint_fast64_t uiB0
|
|
|
+ )
|
|
|
+{
|
|
|
+ bool isSigNaNA, isSigNaNB;
|
|
|
+ uint_fast64_t uiNonsigA0, uiNonsigB0;
|
|
|
+ uint_fast16_t uiMagA64, uiMagB64;
|
|
|
+ struct uint128 uiZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
|
|
|
+ isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | Make NaNs non-signaling.
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );
|
|
|
+ uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isSigNaNA | isSigNaNB ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ if ( isSigNaNA ) {
|
|
|
+ if ( isSigNaNB ) goto returnLargerMag;
|
|
|
+ if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
|
|
|
+ goto returnA;
|
|
|
+ } else {
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
|
|
|
+ goto returnB;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ returnLargerMag:
|
|
|
+ uiMagA64 = uiA64 & 0x7FFF;
|
|
|
+ uiMagB64 = uiB64 & 0x7FFF;
|
|
|
+ if ( uiMagA64 < uiMagB64 ) goto returnB;
|
|
|
+ if ( uiMagB64 < uiMagA64 ) goto returnA;
|
|
|
+ if ( uiA0 < uiB0 ) goto returnB;
|
|
|
+ if ( uiB0 < uiA0 ) goto returnA;
|
|
|
+ if ( uiA64 < uiB64 ) goto returnA;
|
|
|
+ returnB:
|
|
|
+ uiZ.v64 = uiB64;
|
|
|
+ uiZ.v0 = uiNonsigB0;
|
|
|
+ return uiZ;
|
|
|
+ returnA:
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiNonsigA0;
|
|
|
+ return uiZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_propagateNaNExtF80UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/f128M_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+bool f128M_isSignalingNaN( const float128_t *aPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
|
|
|
+ return
|
|
|
+ ((uiA96 & 0x00007FFF) != 0)
|
|
|
+ || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )])
|
|
|
+ != 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/f128M_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_f128UIToCommonNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
|
|
+| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
|
|
|
+| the common NaN form, and stores the resulting common NaN at the location
|
|
|
+| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
|
|
|
+| is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+void
|
|
|
+ softfloat_f128UIToCommonNaN(
|
|
|
+ uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
|
|
+{
|
|
|
+ struct uint128 NaNSig;
|
|
|
+
|
|
|
+ if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
|
|
|
+ zPtr->sign = uiA64>>63;
|
|
|
+ zPtr->v64 = NaNSig.v64;
|
|
|
+ zPtr->v0 = NaNSig.v0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_f128UIToCommonNaN.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_commonNaNToF128UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
|
|
|
+| NaN, and returns the bit pattern of this value as an unsigned integer.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
|
|
|
+{
|
|
|
+ struct uint128 uiZ;
|
|
|
+
|
|
|
+ uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
|
|
|
+ uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
|
|
|
+ return uiZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_commonNaNToF128UI.c ****/
|
|
|
+/**** start inlining ../../source/8086-SSE/s_propagateNaNF128UI.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
|
|
+| `uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
|
|
+| unsigned integer formed from concatenating `uiB64' and `uiB0' as another
|
|
|
+| 128-bit floating-point value, and assuming at least on of these floating-
|
|
|
+| point values is a NaN, returns the bit pattern of the combined NaN result.
|
|
|
+| If either original floating-point value is a signaling NaN, the invalid
|
|
|
+| exception is raised.
|
|
|
+*----------------------------------------------------------------------------*/
|
|
|
+struct uint128
|
|
|
+ softfloat_propagateNaNF128UI(
|
|
|
+ uint_fast64_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast64_t uiB64,
|
|
|
+ uint_fast64_t uiB0
|
|
|
+ )
|
|
|
+{
|
|
|
+ bool isSigNaNA;
|
|
|
+ struct uint128 uiZ;
|
|
|
+
|
|
|
+ isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
|
|
|
+ if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ if ( isSigNaNA ) goto returnNonsigA;
|
|
|
+ }
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) ) {
|
|
|
+ returnNonsigA:
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiA0;
|
|
|
+ } else {
|
|
|
+ uiZ.v64 = uiB64;
|
|
|
+ uiZ.v0 = uiB0;
|
|
|
+ }
|
|
|
+ uiZ.v64 |= UINT64_C( 0x0000800000000000 );
|
|
|
+ return uiZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/8086-SSE/s_propagateNaNF128UI.c ****/
|
|
|
+
|
|
|
+/**** start inlining ../../source/s_eq128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_eq128
|
|
|
+#define softfloat_eq128 softfloat_eq128
|
|
|
+
|
|
|
+bool softfloat_eq128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+
|
|
|
+ return (a64 == b64) && (a0 == b0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_eq128.c ****/
|
|
|
+/**** start inlining ../../source/s_le128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_le128
|
|
|
+#define softfloat_le128 softfloat_le128
|
|
|
+
|
|
|
+bool softfloat_le128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+
|
|
|
+ return (a64 < b64) || ((a64 == b64) && (a0 <= b0));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_le128.c ****/
|
|
|
+/**** start inlining ../../source/s_lt128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_lt128
|
|
|
+#define softfloat_lt128 softfloat_lt128
|
|
|
+
|
|
|
+bool softfloat_lt128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+
|
|
|
+ return (a64 < b64) || ((a64 == b64) && (a0 < b0));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_lt128.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftLeft128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftLeft128
|
|
|
+#define softfloat_shortShiftLeft128 softfloat_shortShiftLeft128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftLeft128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ z.v64 = a64<<dist | a0>>(-dist & 63);
|
|
|
+ z.v0 = a0<<dist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftLeft128.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftRight128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRight128
|
|
|
+#define softfloat_shortShiftRight128 softfloat_shortShiftRight128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRight128( uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ z.v64 = a64>>dist;
|
|
|
+ z.v0 = a64<<(-dist & 63) | a0>>dist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftRight128.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftRightJam64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam64
|
|
|
+#define softfloat_shortShiftRightJam64 softfloat_shortShiftRightJam64
|
|
|
+
|
|
|
+uint64_t softfloat_shortShiftRightJam64( uint64_t a, uint_fast8_t dist )
|
|
|
+{
|
|
|
+
|
|
|
+ return a>>dist | ((a & (((uint_fast64_t) 1<<dist) - 1)) != 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftRightJam64.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftRightJam64Extra.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam64Extra
|
|
|
+#define softfloat_shortShiftRightJam64Extra softfloat_shortShiftRightJam64Extra
|
|
|
+
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shortShiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ struct uint64_extra z;
|
|
|
+
|
|
|
+ z.v = a>>dist;
|
|
|
+ z.extra = a<<(-dist & 63) | (extra != 0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftRightJam64Extra.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftRightJam128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam128
|
|
|
+#define softfloat_shortShiftRightJam128 softfloat_shortShiftRightJam128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_shortShiftRightJam128(
|
|
|
+ uint64_t a64, uint64_t a0, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t uNegDist;
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ uNegDist = -dist;
|
|
|
+ z.v64 = a64>>dist;
|
|
|
+ z.v0 =
|
|
|
+ a64<<(uNegDist & 63) | a0>>dist
|
|
|
+ | ((uint64_t) (a0<<(uNegDist & 63)) != 0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftRightJam128.c ****/
|
|
|
+/**** start inlining ../../source/s_shortShiftRightJam128Extra.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shortShiftRightJam128Extra
|
|
|
+#define softfloat_shortShiftRightJam128Extra softfloat_shortShiftRightJam128Extra
|
|
|
+
|
|
|
+struct uint128_extra
|
|
|
+ softfloat_shortShiftRightJam128Extra(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t extra, uint_fast8_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t uNegDist;
|
|
|
+ struct uint128_extra z;
|
|
|
+
|
|
|
+ uNegDist = -dist;
|
|
|
+ z.v.v64 = a64>>dist;
|
|
|
+ z.v.v0 = a64<<(uNegDist & 63) | a0>>dist;
|
|
|
+ z.extra = a0<<(uNegDist & 63) | (extra != 0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shortShiftRightJam128Extra.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam32
|
|
|
+#define softfloat_shiftRightJam32 softfloat_shiftRightJam32
|
|
|
+
|
|
|
+uint32_t softfloat_shiftRightJam32( uint32_t a, uint_fast16_t dist )
|
|
|
+{
|
|
|
+
|
|
|
+ return
|
|
|
+ (dist < 31) ? a>>dist | ((uint32_t) (a<<(-dist & 31)) != 0) : (a != 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam32.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam64
|
|
|
+#define softfloat_shiftRightJam64 softfloat_shiftRightJam64
|
|
|
+
|
|
|
+uint64_t softfloat_shiftRightJam64( uint64_t a, uint_fast32_t dist )
|
|
|
+{
|
|
|
+
|
|
|
+ return
|
|
|
+ (dist < 63) ? a>>dist | ((uint64_t) (a<<(-dist & 63)) != 0) : (a != 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam64.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam64Extra.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam64Extra
|
|
|
+#define softfloat_shiftRightJam64Extra softfloat_shiftRightJam64Extra
|
|
|
+
|
|
|
+struct uint64_extra
|
|
|
+ softfloat_shiftRightJam64Extra(
|
|
|
+ uint64_t a, uint64_t extra, uint_fast32_t dist )
|
|
|
+{
|
|
|
+ struct uint64_extra z;
|
|
|
+
|
|
|
+ if ( dist < 64 ) {
|
|
|
+ z.v = a>>dist;
|
|
|
+ z.extra = a<<(-dist & 63);
|
|
|
+ } else {
|
|
|
+ z.v = 0;
|
|
|
+ z.extra = (dist == 64) ? a : (a != 0);
|
|
|
+ }
|
|
|
+ z.extra |= (extra != 0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam64Extra.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_shiftRightJam128( uint64_t a64, uint64_t a0, uint_fast32_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t u8NegDist;
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ if ( dist < 64 ) {
|
|
|
+ u8NegDist = -dist;
|
|
|
+ z.v64 = a64>>dist;
|
|
|
+ z.v0 =
|
|
|
+ a64<<(u8NegDist & 63) | a0>>dist
|
|
|
+ | ((uint64_t) (a0<<(u8NegDist & 63)) != 0);
|
|
|
+ } else {
|
|
|
+ z.v64 = 0;
|
|
|
+ z.v0 =
|
|
|
+ (dist < 127)
|
|
|
+ ? a64>>(dist & 63)
|
|
|
+ | (((a64 & (((uint_fast64_t) 1<<(dist & 63)) - 1)) | a0)
|
|
|
+ != 0)
|
|
|
+ : ((a64 | a0) != 0);
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam128.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam128Extra.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam128Extra
|
|
|
+
|
|
|
+struct uint128_extra
|
|
|
+ softfloat_shiftRightJam128Extra(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t extra, uint_fast32_t dist )
|
|
|
+{
|
|
|
+ uint_fast8_t u8NegDist;
|
|
|
+ struct uint128_extra z;
|
|
|
+
|
|
|
+ u8NegDist = -dist;
|
|
|
+ if ( dist < 64 ) {
|
|
|
+ z.v.v64 = a64>>dist;
|
|
|
+ z.v.v0 = a64<<(u8NegDist & 63) | a0>>dist;
|
|
|
+ z.extra = a0<<(u8NegDist & 63);
|
|
|
+ } else {
|
|
|
+ z.v.v64 = 0;
|
|
|
+ if ( dist == 64 ) {
|
|
|
+ z.v.v0 = a64;
|
|
|
+ z.extra = a0;
|
|
|
+ } else {
|
|
|
+ extra |= a0;
|
|
|
+ if ( dist < 128 ) {
|
|
|
+ z.v.v0 = a64>>(dist & 63);
|
|
|
+ z.extra = a64<<(u8NegDist & 63);
|
|
|
+ } else {
|
|
|
+ z.v.v0 = 0;
|
|
|
+ z.extra = (dist == 128) ? a64 : (a64 != 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ z.extra |= (extra != 0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam128Extra.c ****/
|
|
|
+/**** start inlining ../../source/s_shiftRightJam256M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_shiftRightJam256M
|
|
|
+
|
|
|
+static
|
|
|
+ void
|
|
|
+ softfloat_shortShiftRightJamM(
|
|
|
+ uint_fast8_t size_words,
|
|
|
+ const uint64_t *aPtr,
|
|
|
+ uint_fast8_t dist,
|
|
|
+ uint64_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+ uint_fast8_t uNegDist;
|
|
|
+ unsigned int index, lastIndex;
|
|
|
+ uint64_t partWordZ, wordA;
|
|
|
+
|
|
|
+ uNegDist = -dist;
|
|
|
+ index = indexWordLo( size_words );
|
|
|
+ lastIndex = indexWordHi( size_words );
|
|
|
+ wordA = aPtr[index];
|
|
|
+ partWordZ = wordA>>dist;
|
|
|
+ if ( partWordZ<<dist != wordA ) partWordZ |= 1;
|
|
|
+ while ( index != lastIndex ) {
|
|
|
+ wordA = aPtr[index + wordIncr];
|
|
|
+ zPtr[index] = wordA<<(uNegDist & 63) | partWordZ;
|
|
|
+ index += wordIncr;
|
|
|
+ partWordZ = wordA>>dist;
|
|
|
+ }
|
|
|
+ zPtr[index] = partWordZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+ softfloat_shiftRightJam256M(
|
|
|
+ const uint64_t *aPtr, uint_fast32_t dist, uint64_t *zPtr )
|
|
|
+{
|
|
|
+ uint64_t wordJam;
|
|
|
+ uint_fast32_t wordDist;
|
|
|
+ uint64_t *ptr;
|
|
|
+ uint_fast8_t i, innerDist;
|
|
|
+
|
|
|
+ wordJam = 0;
|
|
|
+ wordDist = dist>>6;
|
|
|
+ if ( wordDist ) {
|
|
|
+ if ( 4 < wordDist ) wordDist = 4;
|
|
|
+ ptr = (uint64_t *) (aPtr + indexMultiwordLo( 4, wordDist ));
|
|
|
+ i = wordDist;
|
|
|
+ do {
|
|
|
+ wordJam = *ptr++;
|
|
|
+ if ( wordJam ) break;
|
|
|
+ --i;
|
|
|
+ } while ( i );
|
|
|
+ ptr = zPtr;
|
|
|
+ }
|
|
|
+ if ( wordDist < 4 ) {
|
|
|
+ aPtr += indexMultiwordHiBut( 4, wordDist );
|
|
|
+ innerDist = dist & 63;
|
|
|
+ if ( innerDist ) {
|
|
|
+ softfloat_shortShiftRightJamM(
|
|
|
+ 4 - wordDist,
|
|
|
+ aPtr,
|
|
|
+ innerDist,
|
|
|
+ zPtr + indexMultiwordLoBut( 4, wordDist )
|
|
|
+ );
|
|
|
+ if ( ! wordDist ) goto wordJam;
|
|
|
+ } else {
|
|
|
+ aPtr += indexWordLo( 4 - wordDist );
|
|
|
+ ptr = zPtr + indexWordLo( 4 );
|
|
|
+ for ( i = 4 - wordDist; i; --i ) {
|
|
|
+ *ptr = *aPtr;
|
|
|
+ aPtr += wordIncr;
|
|
|
+ ptr += wordIncr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ptr = zPtr + indexMultiwordHi( 4, wordDist );
|
|
|
+ }
|
|
|
+ do {
|
|
|
+ *ptr++ = 0;
|
|
|
+ --wordDist;
|
|
|
+ } while ( wordDist );
|
|
|
+ wordJam:
|
|
|
+ if ( wordJam ) zPtr[indexWordLo( 4 )] |= 1;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_shiftRightJam256M.c ****/
|
|
|
+/**** start inlining ../../source/s_countLeadingZeros8.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+const uint_least8_t softfloat_countLeadingZeros8[256] = {
|
|
|
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
|
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
|
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
|
+};
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_countLeadingZeros8.c ****/
|
|
|
+/**** start inlining ../../source/s_countLeadingZeros16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros16
|
|
|
+
|
|
|
+#define softfloat_countLeadingZeros16 softfloat_countLeadingZeros16
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+uint_fast8_t softfloat_countLeadingZeros16( uint16_t a )
|
|
|
+{
|
|
|
+ uint_fast8_t count;
|
|
|
+
|
|
|
+ count = 8;
|
|
|
+ if ( 0x100 <= a ) {
|
|
|
+ count = 0;
|
|
|
+ a >>= 8;
|
|
|
+ }
|
|
|
+ count += softfloat_countLeadingZeros8[a];
|
|
|
+ return count;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_countLeadingZeros16.c ****/
|
|
|
+/**** start inlining ../../source/s_countLeadingZeros32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros32
|
|
|
+
|
|
|
+#define softfloat_countLeadingZeros32 softfloat_countLeadingZeros32
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+uint_fast8_t softfloat_countLeadingZeros32( uint32_t a )
|
|
|
+{
|
|
|
+ uint_fast8_t count;
|
|
|
+
|
|
|
+ count = 0;
|
|
|
+ if ( a < 0x10000 ) {
|
|
|
+ count = 16;
|
|
|
+ a <<= 16;
|
|
|
+ }
|
|
|
+ if ( a < 0x1000000 ) {
|
|
|
+ count += 8;
|
|
|
+ a <<= 8;
|
|
|
+ }
|
|
|
+ count += softfloat_countLeadingZeros8[a>>24];
|
|
|
+ return count;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_countLeadingZeros32.c ****/
|
|
|
+/**** start inlining ../../source/s_countLeadingZeros64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_countLeadingZeros64
|
|
|
+
|
|
|
+#define softfloat_countLeadingZeros64 softfloat_countLeadingZeros64
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+uint_fast8_t softfloat_countLeadingZeros64( uint64_t a )
|
|
|
+{
|
|
|
+ uint_fast8_t count;
|
|
|
+ uint32_t a32;
|
|
|
+
|
|
|
+ count = 0;
|
|
|
+ a32 = a>>32;
|
|
|
+ if ( ! a32 ) {
|
|
|
+ count = 32;
|
|
|
+ a32 = a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | From here, result is current count + count leading zeros of `a32'.
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( a32 < 0x10000 ) {
|
|
|
+ count += 16;
|
|
|
+ a32 <<= 16;
|
|
|
+ }
|
|
|
+ if ( a32 < 0x1000000 ) {
|
|
|
+ count += 8;
|
|
|
+ a32 <<= 8;
|
|
|
+ }
|
|
|
+ count += softfloat_countLeadingZeros8[a32>>24];
|
|
|
+ return count;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_countLeadingZeros64.c ****/
|
|
|
+/**** start inlining ../../source/s_add128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_add128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_add128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ z.v0 = a0 + b0;
|
|
|
+ z.v64 = a64 + b64 + (z.v0 < a0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_add128.c ****/
|
|
|
+/**** start inlining ../../source/s_add256M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_add256M
|
|
|
+
|
|
|
+void
|
|
|
+ softfloat_add256M(
|
|
|
+ const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr )
|
|
|
+{
|
|
|
+ unsigned int index;
|
|
|
+ uint_fast8_t carry;
|
|
|
+ uint64_t wordA, wordZ;
|
|
|
+
|
|
|
+ index = indexWordLo( 4 );
|
|
|
+ carry = 0;
|
|
|
+ for (;;) {
|
|
|
+ wordA = aPtr[index];
|
|
|
+ wordZ = wordA + bPtr[index] + carry;
|
|
|
+ zPtr[index] = wordZ;
|
|
|
+ if ( index == indexWordHi( 4 ) ) break;
|
|
|
+ if ( wordZ != wordA ) carry = (wordZ < wordA);
|
|
|
+ index += wordIncr;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_add256M.c ****/
|
|
|
+/**** start inlining ../../source/s_sub128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_sub128
|
|
|
+#define softfloat_sub128 softfloat_sub128
|
|
|
+
|
|
|
+struct uint128
|
|
|
+ softfloat_sub128( uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0 )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ z.v0 = a0 - b0;
|
|
|
+ z.v64 = a64 - b64 - (a0 < b0);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_sub128.c ****/
|
|
|
+/**** start inlining ../../source/s_sub256M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_sub256M
|
|
|
+
|
|
|
+void
|
|
|
+ softfloat_sub256M(
|
|
|
+ const uint64_t *aPtr, const uint64_t *bPtr, uint64_t *zPtr )
|
|
|
+{
|
|
|
+ unsigned int index;
|
|
|
+ uint_fast8_t borrow;
|
|
|
+ uint64_t wordA, wordB;
|
|
|
+
|
|
|
+ index = indexWordLo( 4 );
|
|
|
+ borrow = 0;
|
|
|
+ for (;;) {
|
|
|
+ wordA = aPtr[index];
|
|
|
+ wordB = bPtr[index];
|
|
|
+ zPtr[index] = wordA - wordB - borrow;
|
|
|
+ if ( index == indexWordHi( 4 ) ) break;
|
|
|
+ borrow = borrow ? (wordA <= wordB) : (wordA < wordB);
|
|
|
+ index += wordIncr;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_sub256M.c ****/
|
|
|
+/**** start inlining ../../source/s_mul64ByShifted32To128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_mul64ByShifted32To128
|
|
|
+
|
|
|
+struct uint128 softfloat_mul64ByShifted32To128( uint64_t a, uint32_t b )
|
|
|
+{
|
|
|
+ uint_fast64_t mid;
|
|
|
+ struct uint128 z;
|
|
|
+
|
|
|
+ mid = (uint_fast64_t) (uint32_t) a * b;
|
|
|
+ z.v0 = mid<<32;
|
|
|
+ z.v64 = (uint_fast64_t) (uint32_t) (a>>32) * b + (mid>>32);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mul64ByShifted32To128.c ****/
|
|
|
+/**** start inlining ../../source/s_mul64To128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_mul64To128
|
|
|
+
|
|
|
+struct uint128 softfloat_mul64To128( uint64_t a, uint64_t b )
|
|
|
+{
|
|
|
+ uint32_t a32, a0, b32, b0;
|
|
|
+ struct uint128 z;
|
|
|
+ uint64_t mid1, mid;
|
|
|
+
|
|
|
+ a32 = a>>32;
|
|
|
+ a0 = a;
|
|
|
+ b32 = b>>32;
|
|
|
+ b0 = b;
|
|
|
+ z.v0 = (uint_fast64_t) a0 * b0;
|
|
|
+ mid1 = (uint_fast64_t) a32 * b0;
|
|
|
+ mid = mid1 + (uint_fast64_t) a0 * b32;
|
|
|
+ z.v64 = (uint_fast64_t) a32 * b32;
|
|
|
+ z.v64 += (uint_fast64_t) (mid < mid1)<<32 | mid>>32;
|
|
|
+ mid <<= 32;
|
|
|
+ z.v0 += mid;
|
|
|
+ z.v64 += (z.v0 < mid);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mul64To128.c ****/
|
|
|
+/**** start inlining ../../source/s_mul128By32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitiveTypes.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_mul128By32
|
|
|
+
|
|
|
+struct uint128 softfloat_mul128By32( uint64_t a64, uint64_t a0, uint32_t b )
|
|
|
+{
|
|
|
+ struct uint128 z;
|
|
|
+ uint_fast64_t mid;
|
|
|
+ uint_fast32_t carry;
|
|
|
+
|
|
|
+ z.v0 = a0 * b;
|
|
|
+ mid = (uint_fast64_t) (uint32_t) (a0>>32) * b;
|
|
|
+ carry = (uint32_t) ((uint_fast32_t) (z.v0>>32) - (uint_fast32_t) mid);
|
|
|
+ z.v64 = a64 * b + (uint_fast32_t) ((mid + carry)>>32);
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mul128By32.c ****/
|
|
|
+/**** start inlining ../../source/s_mul128To256M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_mul128To256M
|
|
|
+
|
|
|
+#define softfloat_mul128To256M softfloat_mul128To256M
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+void
|
|
|
+ softfloat_mul128To256M(
|
|
|
+ uint64_t a64, uint64_t a0, uint64_t b64, uint64_t b0, uint64_t *zPtr )
|
|
|
+{
|
|
|
+ struct uint128 p0, p64, p128;
|
|
|
+ uint_fast64_t z64, z128, z192;
|
|
|
+
|
|
|
+ p0 = softfloat_mul64To128( a0, b0 );
|
|
|
+ zPtr[indexWord( 4, 0 )] = p0.v0;
|
|
|
+ p64 = softfloat_mul64To128( a64, b0 );
|
|
|
+ z64 = p64.v0 + p0.v64;
|
|
|
+ z128 = p64.v64 + (z64 < p64.v0);
|
|
|
+ p128 = softfloat_mul64To128( a64, b64 );
|
|
|
+ z128 += p128.v0;
|
|
|
+ z192 = p128.v64 + (z128 < p128.v0);
|
|
|
+ p64 = softfloat_mul64To128( a0, b64 );
|
|
|
+ z64 += p64.v0;
|
|
|
+ zPtr[indexWord( 4, 1 )] = z64;
|
|
|
+ p64.v64 += (z64 < p64.v0);
|
|
|
+ z128 += p64.v64;
|
|
|
+ zPtr[indexWord( 4, 2 )] = z128;
|
|
|
+ zPtr[indexWord( 4, 3 )] = z192 + (z128 < p64.v64);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mul128To256M.c ****/
|
|
|
+/**** start inlining ../../source/s_approxRecip_1Ks.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+const uint16_t softfloat_approxRecip_1k0s[16] = {
|
|
|
+ 0xFFC4, 0xF0BE, 0xE363, 0xD76F, 0xCCAD, 0xC2F0, 0xBA16, 0xB201,
|
|
|
+ 0xAA97, 0xA3C6, 0x9D7A, 0x97A6, 0x923C, 0x8D32, 0x887E, 0x8417
|
|
|
+};
|
|
|
+const uint16_t softfloat_approxRecip_1k1s[16] = {
|
|
|
+ 0xF0F1, 0xD62C, 0xBFA1, 0xAC77, 0x9C0A, 0x8DDB, 0x8185, 0x76BA,
|
|
|
+ 0x6D3B, 0x64D4, 0x5D5C, 0x56B1, 0x50B6, 0x4B55, 0x4679, 0x4211
|
|
|
+};
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_approxRecip_1Ks.c ****/
|
|
|
+/**** start inlining ../../source/s_approxRecip32_1.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_approxRecip32_1
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecip_1k0s[16];
|
|
|
+extern const uint16_t softfloat_approxRecip_1k1s[16];
|
|
|
+
|
|
|
+uint32_t softfloat_approxRecip32_1( uint32_t a )
|
|
|
+{
|
|
|
+ int index;
|
|
|
+ uint16_t eps, r0;
|
|
|
+ uint32_t sigma0;
|
|
|
+ uint_fast32_t r;
|
|
|
+ uint32_t sqrSigma0;
|
|
|
+
|
|
|
+ index = a>>27 & 0xF;
|
|
|
+ eps = (uint16_t) (a>>11);
|
|
|
+ r0 = softfloat_approxRecip_1k0s[index]
|
|
|
+ - ((softfloat_approxRecip_1k1s[index] * (uint_fast32_t) eps)>>20);
|
|
|
+ sigma0 = ~(uint_fast32_t) ((r0 * (uint_fast64_t) a)>>7);
|
|
|
+ r = ((uint_fast32_t) r0<<16) + ((r0 * (uint_fast64_t) sigma0)>>24);
|
|
|
+ sqrSigma0 = ((uint_fast64_t) sigma0 * sigma0)>>32;
|
|
|
+ r += ((uint32_t) r * (uint_fast64_t) sqrSigma0)>>48;
|
|
|
+ return r;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_approxRecip32_1.c ****/
|
|
|
+/**** start inlining ../../source/s_approxRecipSqrt_1Ks.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: primitives.h ****/
|
|
|
+
|
|
|
+const uint16_t softfloat_approxRecipSqrt_1k0s[16] = {
|
|
|
+ 0xB4C9, 0xFFAB, 0xAA7D, 0xF11C, 0xA1C5, 0xE4C7, 0x9A43, 0xDA29,
|
|
|
+ 0x93B5, 0xD0E5, 0x8DED, 0xC8B7, 0x88C6, 0xC16D, 0x8424, 0xBAE1
|
|
|
+};
|
|
|
+const uint16_t softfloat_approxRecipSqrt_1k1s[16] = {
|
|
|
+ 0xA5A5, 0xEA42, 0x8C21, 0xC62D, 0x788F, 0xAA7F, 0x6928, 0x94B6,
|
|
|
+ 0x5CC7, 0x8335, 0x52A6, 0x74E2, 0x4A3E, 0x68FE, 0x432B, 0x5EFD
|
|
|
+};
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_approxRecipSqrt_1Ks.c ****/
|
|
|
+/**** start inlining ../../source/s_approxRecipSqrt32_1.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+
|
|
|
+#ifndef softfloat_approxRecipSqrt32_1
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k0s[];
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k1s[];
|
|
|
+
|
|
|
+uint32_t softfloat_approxRecipSqrt32_1( unsigned int oddExpA, uint32_t a )
|
|
|
+{
|
|
|
+ int index;
|
|
|
+ uint16_t eps, r0;
|
|
|
+ uint_fast32_t ESqrR0;
|
|
|
+ uint32_t sigma0;
|
|
|
+ uint_fast32_t r;
|
|
|
+ uint32_t sqrSigma0;
|
|
|
+
|
|
|
+ index = (a>>27 & 0xE) + oddExpA;
|
|
|
+ eps = (uint16_t) (a>>12);
|
|
|
+ r0 = softfloat_approxRecipSqrt_1k0s[index]
|
|
|
+ - ((softfloat_approxRecipSqrt_1k1s[index] * (uint_fast32_t) eps)
|
|
|
+ >>20);
|
|
|
+ ESqrR0 = (uint_fast32_t) r0 * r0;
|
|
|
+ if ( ! oddExpA ) ESqrR0 <<= 1;
|
|
|
+ sigma0 = ~(uint_fast32_t) (((uint32_t) ESqrR0 * (uint_fast64_t) a)>>23);
|
|
|
+ r = ((uint_fast32_t) r0<<16) + ((r0 * (uint_fast64_t) sigma0)>>25);
|
|
|
+ sqrSigma0 = ((uint_fast64_t) sigma0 * sigma0)>>32;
|
|
|
+ r += ((uint32_t) ((r>>1) + (r>>3) - ((uint_fast32_t) r0<<14))
|
|
|
+ * (uint_fast64_t) sqrSigma0)
|
|
|
+ >>48;
|
|
|
+ if ( ! (r & 0x80000000) ) r = 0x80000000;
|
|
|
+ return r;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_approxRecipSqrt32_1.c ****/
|
|
|
+/**** start inlining ../../source/s_roundToUI32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ softfloat_roundToUI32(
|
|
|
+ bool sign, uint_fast64_t sig, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ uint_fast16_t roundIncrement, roundBits;
|
|
|
+ uint_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundIncrement = 0x800;
|
|
|
+ if (
|
|
|
+ (roundingMode != softfloat_round_near_maxMag)
|
|
|
+ && (roundingMode != softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ roundIncrement = 0;
|
|
|
+ if ( sign ) {
|
|
|
+ if ( !sig ) return 0;
|
|
|
+ if ( roundingMode == softfloat_round_min ) goto invalid;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) goto invalid;
|
|
|
+#endif
|
|
|
+ } else {
|
|
|
+ if ( roundingMode == softfloat_round_max ) roundIncrement = 0xFFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ roundBits = sig & 0xFFF;
|
|
|
+ sig += roundIncrement;
|
|
|
+ if ( sig & UINT64_C( 0xFFFFF00000000000 ) ) goto invalid;
|
|
|
+ z = sig>>12;
|
|
|
+ if (
|
|
|
+ (roundBits == 0x800) && (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ z &= ~(uint_fast32_t) 1;
|
|
|
+ }
|
|
|
+ if ( sign && z ) goto invalid;
|
|
|
+ if ( roundBits ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) z |= 1;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundToUI32.c ****/
|
|
|
+/**** start inlining ../../source/s_roundToUI64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ softfloat_roundToUI64(
|
|
|
+ bool sign,
|
|
|
+ uint_fast64_t sig,
|
|
|
+ uint_fast64_t sigExtra,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact
|
|
|
+ )
|
|
|
+{
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if (
|
|
|
+ (roundingMode == softfloat_round_near_maxMag)
|
|
|
+ || (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ if ( UINT64_C( 0x8000000000000000 ) <= sigExtra ) goto increment;
|
|
|
+ } else {
|
|
|
+ if ( sign ) {
|
|
|
+ if ( !(sig | sigExtra) ) return 0;
|
|
|
+ if ( roundingMode == softfloat_round_min ) goto invalid;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) goto invalid;
|
|
|
+#endif
|
|
|
+ } else {
|
|
|
+ if ( (roundingMode == softfloat_round_max) && sigExtra ) {
|
|
|
+ increment:
|
|
|
+ ++sig;
|
|
|
+ if ( !sig ) goto invalid;
|
|
|
+ if (
|
|
|
+ (sigExtra == UINT64_C( 0x8000000000000000 ))
|
|
|
+ && (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ sig &= ~(uint_fast64_t) 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( sign && sig ) goto invalid;
|
|
|
+ if ( sigExtra ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) sig |= 1;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sig;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundToUI64.c ****/
|
|
|
+/**** start inlining ../../source/s_roundToI32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ softfloat_roundToI32(
|
|
|
+ bool sign, uint_fast64_t sig, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ uint_fast16_t roundIncrement, roundBits;
|
|
|
+ uint_fast32_t sig32;
|
|
|
+ union { uint32_t ui; int32_t i; } uZ;
|
|
|
+ int_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundIncrement = 0x800;
|
|
|
+ if (
|
|
|
+ (roundingMode != softfloat_round_near_maxMag)
|
|
|
+ && (roundingMode != softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ roundIncrement = 0;
|
|
|
+ if (
|
|
|
+ sign
|
|
|
+ ? (roundingMode == softfloat_round_min)
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ || (roundingMode == softfloat_round_odd)
|
|
|
+#endif
|
|
|
+ : (roundingMode == softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ roundIncrement = 0xFFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ roundBits = sig & 0xFFF;
|
|
|
+ sig += roundIncrement;
|
|
|
+ if ( sig & UINT64_C( 0xFFFFF00000000000 ) ) goto invalid;
|
|
|
+ sig32 = sig>>12;
|
|
|
+ if (
|
|
|
+ (roundBits == 0x800) && (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ sig32 &= ~(uint_fast32_t) 1;
|
|
|
+ }
|
|
|
+ uZ.ui = sign ? -sig32 : sig32;
|
|
|
+ z = uZ.i;
|
|
|
+ if ( z && ((z < 0) ^ sign) ) goto invalid;
|
|
|
+ if ( roundBits ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) z |= 1;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundToI32.c ****/
|
|
|
+/**** start inlining ../../source/s_roundToI64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ softfloat_roundToI64(
|
|
|
+ bool sign,
|
|
|
+ uint_fast64_t sig,
|
|
|
+ uint_fast64_t sigExtra,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact
|
|
|
+ )
|
|
|
+{
|
|
|
+ union { uint64_t ui; int64_t i; } uZ;
|
|
|
+ int_fast64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if (
|
|
|
+ (roundingMode == softfloat_round_near_maxMag)
|
|
|
+ || (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ if ( UINT64_C( 0x8000000000000000 ) <= sigExtra ) goto increment;
|
|
|
+ } else {
|
|
|
+ if (
|
|
|
+ sigExtra
|
|
|
+ && (sign
|
|
|
+ ? (roundingMode == softfloat_round_min)
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ || (roundingMode == softfloat_round_odd)
|
|
|
+#endif
|
|
|
+ : (roundingMode == softfloat_round_max))
|
|
|
+ ) {
|
|
|
+ increment:
|
|
|
+ ++sig;
|
|
|
+ if ( !sig ) goto invalid;
|
|
|
+ if (
|
|
|
+ (sigExtra == UINT64_C( 0x8000000000000000 ))
|
|
|
+ && (roundingMode == softfloat_round_near_even)
|
|
|
+ ) {
|
|
|
+ sig &= ~(uint_fast64_t) 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uZ.ui = sign ? -sig : sig;
|
|
|
+ z = uZ.i;
|
|
|
+ if ( z && ((z < 0) ^ sign) ) goto invalid;
|
|
|
+ if ( sigExtra ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) z |= 1;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundToI64.c ****/
|
|
|
+/**** start inlining ../../source/s_normSubnormalF16Sig.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+struct exp8_sig16 softfloat_normSubnormalF16Sig( uint_fast16_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct exp8_sig16 z;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros16( sig ) - 5;
|
|
|
+ z.exp = 1 - shiftDist;
|
|
|
+ z.sig = sig<<shiftDist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normSubnormalF16Sig.c ****/
|
|
|
+/**** start inlining ../../source/s_roundPackToF16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t
|
|
|
+ softfloat_roundPackToF16( bool sign, int_fast16_t exp, uint_fast16_t sig )
|
|
|
+{
|
|
|
+ uint_fast8_t roundingMode;
|
|
|
+ bool roundNearEven;
|
|
|
+ uint_fast8_t roundIncrement, roundBits;
|
|
|
+ bool isTiny;
|
|
|
+ uint_fast16_t uiZ;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ roundIncrement = 0x8;
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ roundIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ? 0xF
|
|
|
+ : 0;
|
|
|
+ }
|
|
|
+ roundBits = sig & 0xF;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x1D <= (unsigned int) exp ) {
|
|
|
+ if ( exp < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < -1) || (sig + roundIncrement < 0x8000);
|
|
|
+ sig = softfloat_shiftRightJam32( sig, -exp );
|
|
|
+ exp = 0;
|
|
|
+ roundBits = sig & 0xF;
|
|
|
+ if ( isTiny && roundBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ }
|
|
|
+ } else if ( (0x1D < exp) || (0x8000 <= sig + roundIncrement) ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 ) - ! roundIncrement;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = (sig + roundIncrement)>>4;
|
|
|
+ if ( roundBits ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ sig &= ~(uint_fast16_t) (! (roundBits ^ 8) & roundNearEven);
|
|
|
+ if ( ! sig ) exp = 0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ packReturn:
|
|
|
+ uiZ = packToF16UI( sign, exp, sig );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundPackToF16.c ****/
|
|
|
+/**** start inlining ../../source/s_normRoundPackToF16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+float16_t
|
|
|
+ softfloat_normRoundPackToF16( bool sign, int_fast16_t exp, uint_fast16_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros16( sig ) - 1;
|
|
|
+ exp -= shiftDist;
|
|
|
+ if ( (4 <= shiftDist) && ((unsigned int) exp < 0x1D) ) {
|
|
|
+ uZ.ui = packToF16UI( sign, sig ? exp : 0, sig<<(shiftDist - 4) );
|
|
|
+ return uZ.f;
|
|
|
+ } else {
|
|
|
+ return softfloat_roundPackToF16( sign, exp, sig<<shiftDist );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normRoundPackToF16.c ****/
|
|
|
+/**** start inlining ../../source/s_addMagsF16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t softfloat_addMagsF16( uint_fast16_t uiA, uint_fast16_t uiB )
|
|
|
+{
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ int_fast8_t expDiff;
|
|
|
+ uint_fast16_t uiZ;
|
|
|
+ bool signZ;
|
|
|
+ int_fast8_t expZ;
|
|
|
+ uint_fast16_t sigZ;
|
|
|
+ uint_fast16_t sigX, sigY;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ uint_fast32_t sig32Z;
|
|
|
+ int_fast8_t roundingMode;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ uiZ = uiA + sigB;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ signZ = signF16UI( uiA );
|
|
|
+ expZ = expA;
|
|
|
+ sigZ = 0x0800 + sigA + sigB;
|
|
|
+ if ( ! (sigZ & 1) && (expZ < 0x1E) ) {
|
|
|
+ sigZ >>= 1;
|
|
|
+ goto pack;
|
|
|
+ }
|
|
|
+ sigZ <<= 3;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ signZ = signF16UI( uiA );
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF16UI( signZ, 0x1F, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expDiff <= -13 ) {
|
|
|
+ uiZ = packToF16UI( signZ, expB, sigB );
|
|
|
+ if ( expA | sigA ) goto addEpsilon;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB;
|
|
|
+ sigX = sigB | 0x0400;
|
|
|
+ sigY = sigA + (expA ? 0x0400 : sigA);
|
|
|
+ shiftDist = 19 + expDiff;
|
|
|
+ } else {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ uiZ = uiA;
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( 13 <= expDiff ) {
|
|
|
+ if ( expB | sigB ) goto addEpsilon;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ sigX = sigA | 0x0400;
|
|
|
+ sigY = sigB + (expB ? 0x0400 : sigB);
|
|
|
+ shiftDist = 19 - expDiff;
|
|
|
+ }
|
|
|
+ sig32Z =
|
|
|
+ ((uint_fast32_t) sigX<<19) + ((uint_fast32_t) sigY<<shiftDist);
|
|
|
+ if ( sig32Z < 0x40000000 ) {
|
|
|
+ --expZ;
|
|
|
+ sig32Z <<= 1;
|
|
|
+ }
|
|
|
+ sigZ = sig32Z>>16;
|
|
|
+ if ( sig32Z & 0xFFFF ) {
|
|
|
+ sigZ |= 1;
|
|
|
+ } else {
|
|
|
+ if ( ! (sigZ & 0xF) && (expZ < 0x1E) ) {
|
|
|
+ sigZ >>= 4;
|
|
|
+ goto pack;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ addEpsilon:
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ if ( roundingMode != softfloat_round_near_even ) {
|
|
|
+ if (
|
|
|
+ roundingMode
|
|
|
+ == (signF16UI( uiZ ) ? softfloat_round_min
|
|
|
+ : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ ++uiZ;
|
|
|
+ if ( (uint16_t) (uiZ<<1) == 0xF800 ) {
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ }
|
|
|
+ }
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ else if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ uiZ |= 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ pack:
|
|
|
+ uiZ = packToF16UI( signZ, expZ, sigZ );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_addMagsF16.c ****/
|
|
|
+/**** start inlining ../../source/s_subMagsF16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t softfloat_subMagsF16( uint_fast16_t uiA, uint_fast16_t uiB )
|
|
|
+{
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ int_fast8_t expDiff;
|
|
|
+ uint_fast16_t uiZ;
|
|
|
+ int_fast16_t sigDiff;
|
|
|
+ bool signZ;
|
|
|
+ int_fast8_t shiftDist, expZ;
|
|
|
+ uint_fast16_t sigZ, sigX, sigY;
|
|
|
+ uint_fast32_t sig32Z;
|
|
|
+ int_fast8_t roundingMode;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigDiff = sigA - sigB;
|
|
|
+ if ( ! sigDiff ) {
|
|
|
+ uiZ =
|
|
|
+ packToF16UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA ) --expA;
|
|
|
+ signZ = signF16UI( uiA );
|
|
|
+ if ( sigDiff < 0 ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sigDiff = -sigDiff;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros16( sigDiff ) - 5;
|
|
|
+ expZ = expA - shiftDist;
|
|
|
+ if ( expZ < 0 ) {
|
|
|
+ shiftDist = expA;
|
|
|
+ expZ = 0;
|
|
|
+ }
|
|
|
+ sigZ = sigDiff<<shiftDist;
|
|
|
+ goto pack;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ signZ = signF16UI( uiA );
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ signZ = ! signZ;
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF16UI( signZ, 0x1F, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expDiff <= -13 ) {
|
|
|
+ uiZ = packToF16UI( signZ, expB, sigB );
|
|
|
+ if ( expA | sigA ) goto subEpsilon;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA + 19;
|
|
|
+ sigX = sigB | 0x0400;
|
|
|
+ sigY = sigA + (expA ? 0x0400 : sigA);
|
|
|
+ expDiff = -expDiff;
|
|
|
+ } else {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ uiZ = uiA;
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( 13 <= expDiff ) {
|
|
|
+ if ( expB | sigB ) goto subEpsilon;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB + 19;
|
|
|
+ sigX = sigA | 0x0400;
|
|
|
+ sigY = sigB + (expB ? 0x0400 : sigB);
|
|
|
+ }
|
|
|
+ sig32Z = ((uint_fast32_t) sigX<<expDiff) - sigY;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( sig32Z ) - 1;
|
|
|
+ sig32Z <<= shiftDist;
|
|
|
+ expZ -= shiftDist;
|
|
|
+ sigZ = sig32Z>>16;
|
|
|
+ if ( sig32Z & 0xFFFF ) {
|
|
|
+ sigZ |= 1;
|
|
|
+ } else {
|
|
|
+ if ( ! (sigZ & 0xF) && ((unsigned int) expZ < 0x1E) ) {
|
|
|
+ sigZ >>= 4;
|
|
|
+ goto pack;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( signZ, expZ, sigZ );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ subEpsilon:
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ if ( roundingMode != softfloat_round_near_even ) {
|
|
|
+ if (
|
|
|
+ (roundingMode == softfloat_round_minMag)
|
|
|
+ || (roundingMode
|
|
|
+ == (signF16UI( uiZ ) ? softfloat_round_max
|
|
|
+ : softfloat_round_min))
|
|
|
+ ) {
|
|
|
+ --uiZ;
|
|
|
+ }
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ else if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ uiZ = (uiZ - 1) | 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ pack:
|
|
|
+ uiZ = packToF16UI( signZ, expZ, sigZ );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_subMagsF16.c ****/
|
|
|
+/**** start inlining ../../source/s_mulAddF16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t
|
|
|
+ softfloat_mulAddF16(
|
|
|
+ uint_fast16_t uiA, uint_fast16_t uiB, uint_fast16_t uiC, uint_fast8_t op )
|
|
|
+{
|
|
|
+ bool signA;
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ bool signB;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ bool signC;
|
|
|
+ int_fast8_t expC;
|
|
|
+ uint_fast16_t sigC;
|
|
|
+ bool signProd;
|
|
|
+ uint_fast16_t magBits, uiZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ int_fast8_t expProd;
|
|
|
+ uint_fast32_t sigProd;
|
|
|
+ bool signZ;
|
|
|
+ int_fast8_t expZ;
|
|
|
+ uint_fast16_t sigZ;
|
|
|
+ int_fast8_t expDiff;
|
|
|
+ uint_fast32_t sig32Z, sig32C;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ signC = signF16UI( uiC ) ^ (op == softfloat_mulAdd_subC);
|
|
|
+ expC = expF16UI( uiC );
|
|
|
+ sigC = fracF16UI( uiC );
|
|
|
+ signProd = signA ^ signB ^ (op == softfloat_mulAdd_subProd);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA || ((expB == 0x1F) && sigB) ) goto propagateNaN_ABC;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN_ABC;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expC == 0x1F ) {
|
|
|
+ if ( sigC ) {
|
|
|
+ uiZ = 0;
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ }
|
|
|
+ uiZ = uiC;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expProd = expA + expB - 0xE;
|
|
|
+ sigA = (sigA | 0x0400)<<4;
|
|
|
+ sigB = (sigB | 0x0400)<<4;
|
|
|
+ sigProd = (uint_fast32_t) sigA * sigB;
|
|
|
+ if ( sigProd < 0x20000000 ) {
|
|
|
+ --expProd;
|
|
|
+ sigProd <<= 1;
|
|
|
+ }
|
|
|
+ signZ = signProd;
|
|
|
+ if ( ! expC ) {
|
|
|
+ if ( ! sigC ) {
|
|
|
+ expZ = expProd - 1;
|
|
|
+ sigZ = sigProd>>15 | ((sigProd & 0x7FFF) != 0);
|
|
|
+ goto roundPack;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigC );
|
|
|
+ expC = normExpSig.exp;
|
|
|
+ sigC = normExpSig.sig;
|
|
|
+ }
|
|
|
+ sigC = (sigC | 0x0400)<<3;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expProd - expC;
|
|
|
+ if ( signProd == signC ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff <= 0 ) {
|
|
|
+ expZ = expC;
|
|
|
+ sigZ = sigC + softfloat_shiftRightJam32( sigProd, 16 - expDiff );
|
|
|
+ } else {
|
|
|
+ expZ = expProd;
|
|
|
+ sig32Z =
|
|
|
+ sigProd
|
|
|
+ + softfloat_shiftRightJam32(
|
|
|
+ (uint_fast32_t) sigC<<16, expDiff );
|
|
|
+ sigZ = sig32Z>>16 | ((sig32Z & 0xFFFF) != 0 );
|
|
|
+ }
|
|
|
+ if ( sigZ < 0x4000 ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig32C = (uint_fast32_t) sigC<<16;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ signZ = signC;
|
|
|
+ expZ = expC;
|
|
|
+ sig32Z = sig32C - softfloat_shiftRightJam32( sigProd, -expDiff );
|
|
|
+ } else if ( ! expDiff ) {
|
|
|
+ expZ = expProd;
|
|
|
+ sig32Z = sigProd - sig32C;
|
|
|
+ if ( ! sig32Z ) goto completeCancellation;
|
|
|
+ if ( sig32Z & 0x80000000 ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sig32Z = -sig32Z;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ expZ = expProd;
|
|
|
+ sig32Z = sigProd - softfloat_shiftRightJam32( sig32C, expDiff );
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( sig32Z ) - 1;
|
|
|
+ expZ -= shiftDist;
|
|
|
+ shiftDist -= 16;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ sigZ =
|
|
|
+ sig32Z>>(-shiftDist)
|
|
|
+ | ((uint32_t) (sig32Z<<(shiftDist & 31)) != 0);
|
|
|
+ } else {
|
|
|
+ sigZ = (uint_fast16_t) sig32Z<<shiftDist;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ roundPack:
|
|
|
+ return softfloat_roundPackToF16( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN_ABC:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infProdArg:
|
|
|
+ if ( magBits ) {
|
|
|
+ uiZ = packToF16UI( signProd, 0x1F, 0 );
|
|
|
+ if ( expC != 0x1F ) goto uiZ;
|
|
|
+ if ( sigC ) goto propagateNaN_ZC;
|
|
|
+ if ( signProd == signC ) goto uiZ;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ propagateNaN_ZC:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiZ, uiC );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zeroProd:
|
|
|
+ uiZ = uiC;
|
|
|
+ if ( ! (expC | sigC) && (signProd != signC) ) {
|
|
|
+ completeCancellation:
|
|
|
+ uiZ =
|
|
|
+ packToF16UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mulAddF16.c ****/
|
|
|
+/**** start inlining ../../source/s_normSubnormalF32Sig.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+struct exp16_sig32 softfloat_normSubnormalF32Sig( uint_fast32_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct exp16_sig32 z;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( sig ) - 8;
|
|
|
+ z.exp = 1 - shiftDist;
|
|
|
+ z.sig = sig<<shiftDist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normSubnormalF32Sig.c ****/
|
|
|
+/**** start inlining ../../source/s_roundPackToF32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t
|
|
|
+ softfloat_roundPackToF32( bool sign, int_fast16_t exp, uint_fast32_t sig )
|
|
|
+{
|
|
|
+ uint_fast8_t roundingMode;
|
|
|
+ bool roundNearEven;
|
|
|
+ uint_fast8_t roundIncrement, roundBits;
|
|
|
+ bool isTiny;
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ roundIncrement = 0x40;
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ roundIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ? 0x7F
|
|
|
+ : 0;
|
|
|
+ }
|
|
|
+ roundBits = sig & 0x7F;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0xFD <= (unsigned int) exp ) {
|
|
|
+ if ( exp < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < -1) || (sig + roundIncrement < 0x80000000);
|
|
|
+ sig = softfloat_shiftRightJam32( sig, -exp );
|
|
|
+ exp = 0;
|
|
|
+ roundBits = sig & 0x7F;
|
|
|
+ if ( isTiny && roundBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ }
|
|
|
+ } else if ( (0xFD < exp) || (0x80000000 <= sig + roundIncrement) ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 ) - ! roundIncrement;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = (sig + roundIncrement)>>7;
|
|
|
+ if ( roundBits ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ sig &= ~(uint_fast32_t) (! (roundBits ^ 0x40) & roundNearEven);
|
|
|
+ if ( ! sig ) exp = 0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ packReturn:
|
|
|
+ uiZ = packToF32UI( sign, exp, sig );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundPackToF32.c ****/
|
|
|
+/**** start inlining ../../source/s_normRoundPackToF32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+float32_t
|
|
|
+ softfloat_normRoundPackToF32( bool sign, int_fast16_t exp, uint_fast32_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( sig ) - 1;
|
|
|
+ exp -= shiftDist;
|
|
|
+ if ( (7 <= shiftDist) && ((unsigned int) exp < 0xFD) ) {
|
|
|
+ uZ.ui = packToF32UI( sign, sig ? exp : 0, sig<<(shiftDist - 7) );
|
|
|
+ return uZ.f;
|
|
|
+ } else {
|
|
|
+ return softfloat_roundPackToF32( sign, exp, sig<<shiftDist );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normRoundPackToF32.c ****/
|
|
|
+/**** start inlining ../../source/s_addMagsF32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+float32_t softfloat_addMagsF32( uint_fast32_t uiA, uint_fast32_t uiB )
|
|
|
+{
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ bool signZ;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast32_t sigZ;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ uiZ = uiA + sigB;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ signZ = signF32UI( uiA );
|
|
|
+ expZ = expA;
|
|
|
+ sigZ = 0x01000000 + sigA + sigB;
|
|
|
+ if ( ! (sigZ & 1) && (expZ < 0xFE) ) {
|
|
|
+ uiZ = packToF32UI( signZ, expZ, sigZ>>1 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigZ <<= 6;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ signZ = signF32UI( uiA );
|
|
|
+ sigA <<= 6;
|
|
|
+ sigB <<= 6;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF32UI( signZ, 0xFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB;
|
|
|
+ sigA += expA ? 0x20000000 : sigA;
|
|
|
+ sigA = softfloat_shiftRightJam32( sigA, -expDiff );
|
|
|
+ } else {
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ sigB += expB ? 0x20000000 : sigB;
|
|
|
+ sigB = softfloat_shiftRightJam32( sigB, expDiff );
|
|
|
+ }
|
|
|
+ sigZ = 0x20000000 + sigA + sigB;
|
|
|
+ if ( sigZ < 0x40000000 ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_addMagsF32.c ****/
|
|
|
+/**** start inlining ../../source/s_subMagsF32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t softfloat_subMagsF32( uint_fast32_t uiA, uint_fast32_t uiB )
|
|
|
+{
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ int_fast32_t sigDiff;
|
|
|
+ bool signZ;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast32_t sigX, sigY;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigDiff = sigA - sigB;
|
|
|
+ if ( ! sigDiff ) {
|
|
|
+ uiZ =
|
|
|
+ packToF32UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA ) --expA;
|
|
|
+ signZ = signF32UI( uiA );
|
|
|
+ if ( sigDiff < 0 ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sigDiff = -sigDiff;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( sigDiff ) - 8;
|
|
|
+ expZ = expA - shiftDist;
|
|
|
+ if ( expZ < 0 ) {
|
|
|
+ shiftDist = expA;
|
|
|
+ expZ = 0;
|
|
|
+ }
|
|
|
+ uiZ = packToF32UI( signZ, expZ, sigDiff<<shiftDist );
|
|
|
+ goto uiZ;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ signZ = signF32UI( uiA );
|
|
|
+ sigA <<= 7;
|
|
|
+ sigB <<= 7;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ signZ = ! signZ;
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF32UI( signZ, 0xFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB - 1;
|
|
|
+ sigX = sigB | 0x40000000;
|
|
|
+ sigY = sigA + (expA ? 0x40000000 : sigA);
|
|
|
+ expDiff = -expDiff;
|
|
|
+ } else {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA - 1;
|
|
|
+ sigX = sigA | 0x40000000;
|
|
|
+ sigY = sigB + (expB ? 0x40000000 : sigB);
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_normRoundPackToF32(
|
|
|
+ signZ, expZ, sigX - softfloat_shiftRightJam32( sigY, expDiff )
|
|
|
+ );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_subMagsF32.c ****/
|
|
|
+/**** start inlining ../../source/s_mulAddF32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t
|
|
|
+ softfloat_mulAddF32(
|
|
|
+ uint_fast32_t uiA, uint_fast32_t uiB, uint_fast32_t uiC, uint_fast8_t op )
|
|
|
+{
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ bool signC;
|
|
|
+ int_fast16_t expC;
|
|
|
+ uint_fast32_t sigC;
|
|
|
+ bool signProd;
|
|
|
+ uint_fast32_t magBits, uiZ;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ int_fast16_t expProd;
|
|
|
+ uint_fast64_t sigProd;
|
|
|
+ bool signZ;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast32_t sigZ;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint_fast64_t sig64Z, sig64C;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ signC = signF32UI( uiC ) ^ (op == softfloat_mulAdd_subC);
|
|
|
+ expC = expF32UI( uiC );
|
|
|
+ sigC = fracF32UI( uiC );
|
|
|
+ signProd = signA ^ signB ^ (op == softfloat_mulAdd_subProd);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN_ABC;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN_ABC;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expC == 0xFF ) {
|
|
|
+ if ( sigC ) {
|
|
|
+ uiZ = 0;
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ }
|
|
|
+ uiZ = uiC;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expProd = expA + expB - 0x7E;
|
|
|
+ sigA = (sigA | 0x00800000)<<7;
|
|
|
+ sigB = (sigB | 0x00800000)<<7;
|
|
|
+ sigProd = (uint_fast64_t) sigA * sigB;
|
|
|
+ if ( sigProd < UINT64_C( 0x2000000000000000 ) ) {
|
|
|
+ --expProd;
|
|
|
+ sigProd <<= 1;
|
|
|
+ }
|
|
|
+ signZ = signProd;
|
|
|
+ if ( ! expC ) {
|
|
|
+ if ( ! sigC ) {
|
|
|
+ expZ = expProd - 1;
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( sigProd, 31 );
|
|
|
+ goto roundPack;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigC );
|
|
|
+ expC = normExpSig.exp;
|
|
|
+ sigC = normExpSig.sig;
|
|
|
+ }
|
|
|
+ sigC = (sigC | 0x00800000)<<6;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expProd - expC;
|
|
|
+ if ( signProd == signC ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff <= 0 ) {
|
|
|
+ expZ = expC;
|
|
|
+ sigZ = sigC + softfloat_shiftRightJam64( sigProd, 32 - expDiff );
|
|
|
+ } else {
|
|
|
+ expZ = expProd;
|
|
|
+ sig64Z =
|
|
|
+ sigProd
|
|
|
+ + softfloat_shiftRightJam64(
|
|
|
+ (uint_fast64_t) sigC<<32, expDiff );
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( sig64Z, 32 );
|
|
|
+ }
|
|
|
+ if ( sigZ < 0x40000000 ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64C = (uint_fast64_t) sigC<<32;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ signZ = signC;
|
|
|
+ expZ = expC;
|
|
|
+ sig64Z = sig64C - softfloat_shiftRightJam64( sigProd, -expDiff );
|
|
|
+ } else if ( ! expDiff ) {
|
|
|
+ expZ = expProd;
|
|
|
+ sig64Z = sigProd - sig64C;
|
|
|
+ if ( ! sig64Z ) goto completeCancellation;
|
|
|
+ if ( sig64Z & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sig64Z = -sig64Z;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ expZ = expProd;
|
|
|
+ sig64Z = sigProd - softfloat_shiftRightJam64( sig64C, expDiff );
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig64Z ) - 1;
|
|
|
+ expZ -= shiftDist;
|
|
|
+ shiftDist -= 32;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( sig64Z, -shiftDist );
|
|
|
+ } else {
|
|
|
+ sigZ = (uint_fast32_t) sig64Z<<shiftDist;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ roundPack:
|
|
|
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN_ABC:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infProdArg:
|
|
|
+ if ( magBits ) {
|
|
|
+ uiZ = packToF32UI( signProd, 0xFF, 0 );
|
|
|
+ if ( expC != 0xFF ) goto uiZ;
|
|
|
+ if ( sigC ) goto propagateNaN_ZC;
|
|
|
+ if ( signProd == signC ) goto uiZ;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ propagateNaN_ZC:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiZ, uiC );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zeroProd:
|
|
|
+ uiZ = uiC;
|
|
|
+ if ( ! (expC | sigC) && (signProd != signC) ) {
|
|
|
+ completeCancellation:
|
|
|
+ uiZ =
|
|
|
+ packToF32UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mulAddF32.c ****/
|
|
|
+/**** start inlining ../../source/s_normSubnormalF64Sig.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+struct exp16_sig64 softfloat_normSubnormalF64Sig( uint_fast64_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct exp16_sig64 z;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig ) - 11;
|
|
|
+ z.exp = 1 - shiftDist;
|
|
|
+ z.sig = sig<<shiftDist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normSubnormalF64Sig.c ****/
|
|
|
+/**** start inlining ../../source/s_roundPackToF64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_roundPackToF64( bool sign, int_fast16_t exp, uint_fast64_t sig )
|
|
|
+{
|
|
|
+ uint_fast8_t roundingMode;
|
|
|
+ bool roundNearEven;
|
|
|
+ uint_fast16_t roundIncrement, roundBits;
|
|
|
+ bool isTiny;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ roundIncrement = 0x200;
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ roundIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ? 0x3FF
|
|
|
+ : 0;
|
|
|
+ }
|
|
|
+ roundBits = sig & 0x3FF;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x7FD <= (uint16_t) exp ) {
|
|
|
+ if ( exp < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < -1)
|
|
|
+ || (sig + roundIncrement < UINT64_C( 0x8000000000000000 ));
|
|
|
+ sig = softfloat_shiftRightJam64( sig, -exp );
|
|
|
+ exp = 0;
|
|
|
+ roundBits = sig & 0x3FF;
|
|
|
+ if ( isTiny && roundBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ }
|
|
|
+ } else if (
|
|
|
+ (0x7FD < exp)
|
|
|
+ || (UINT64_C( 0x8000000000000000 ) <= sig + roundIncrement)
|
|
|
+ ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 ) - ! roundIncrement;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = (sig + roundIncrement)>>10;
|
|
|
+ if ( roundBits ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ sig &= ~(uint_fast64_t) (! (roundBits ^ 0x200) & roundNearEven);
|
|
|
+ if ( ! sig ) exp = 0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ packReturn:
|
|
|
+ uiZ = packToF64UI( sign, exp, sig );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundPackToF64.c ****/
|
|
|
+/**** start inlining ../../source/s_normRoundPackToF64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_normRoundPackToF64( bool sign, int_fast16_t exp, uint_fast64_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig ) - 1;
|
|
|
+ exp -= shiftDist;
|
|
|
+ if ( (10 <= shiftDist) && ((unsigned int) exp < 0x7FD) ) {
|
|
|
+ uZ.ui = packToF64UI( sign, sig ? exp : 0, sig<<(shiftDist - 10) );
|
|
|
+ return uZ.f;
|
|
|
+ } else {
|
|
|
+ return softfloat_roundPackToF64( sign, exp, sig<<shiftDist );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normRoundPackToF64.c ****/
|
|
|
+/**** start inlining ../../source/s_addMagsF64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_addMagsF64( uint_fast64_t uiA, uint_fast64_t uiB, bool signZ )
|
|
|
+{
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ uiZ = uiA + sigB;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ sigZ = UINT64_C( 0x0020000000000000 ) + sigA + sigB;
|
|
|
+ sigZ <<= 9;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigA <<= 9;
|
|
|
+ sigB <<= 9;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB;
|
|
|
+ if ( expA ) {
|
|
|
+ sigA += UINT64_C( 0x2000000000000000 );
|
|
|
+ } else {
|
|
|
+ sigA <<= 1;
|
|
|
+ }
|
|
|
+ sigA = softfloat_shiftRightJam64( sigA, -expDiff );
|
|
|
+ } else {
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ if ( expB ) {
|
|
|
+ sigB += UINT64_C( 0x2000000000000000 );
|
|
|
+ } else {
|
|
|
+ sigB <<= 1;
|
|
|
+ }
|
|
|
+ sigB = softfloat_shiftRightJam64( sigB, expDiff );
|
|
|
+ }
|
|
|
+ sigZ = UINT64_C( 0x2000000000000000 ) + sigA + sigB;
|
|
|
+ if ( sigZ < UINT64_C( 0x4000000000000000 ) ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_addMagsF64.c ****/
|
|
|
+/**** start inlining ../../source/s_subMagsF64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_subMagsF64( uint_fast64_t uiA, uint_fast64_t uiB, bool signZ )
|
|
|
+{
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ int_fast64_t sigDiff;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA | sigB ) goto propagateNaN;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigDiff = sigA - sigB;
|
|
|
+ if ( ! sigDiff ) {
|
|
|
+ uiZ =
|
|
|
+ packToF64UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA ) --expA;
|
|
|
+ if ( sigDiff < 0 ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sigDiff = -sigDiff;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sigDiff ) - 11;
|
|
|
+ expZ = expA - shiftDist;
|
|
|
+ if ( expZ < 0 ) {
|
|
|
+ shiftDist = expA;
|
|
|
+ expZ = 0;
|
|
|
+ }
|
|
|
+ uiZ = packToF64UI( signZ, expZ, sigDiff<<shiftDist );
|
|
|
+ goto uiZ;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigA <<= 10;
|
|
|
+ sigB <<= 10;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ signZ = ! signZ;
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigA += expA ? UINT64_C( 0x4000000000000000 ) : sigA;
|
|
|
+ sigA = softfloat_shiftRightJam64( sigA, -expDiff );
|
|
|
+ sigB |= UINT64_C( 0x4000000000000000 );
|
|
|
+ expZ = expB;
|
|
|
+ sigZ = sigB - sigA;
|
|
|
+ } else {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ uiZ = uiA;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigB += expB ? UINT64_C( 0x4000000000000000 ) : sigB;
|
|
|
+ sigB = softfloat_shiftRightJam64( sigB, expDiff );
|
|
|
+ sigA |= UINT64_C( 0x4000000000000000 );
|
|
|
+ expZ = expA;
|
|
|
+ sigZ = sigA - sigB;
|
|
|
+ }
|
|
|
+ return softfloat_normRoundPackToF64( signZ, expZ - 1, sigZ );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_subMagsF64.c ****/
|
|
|
+/**** start inlining ../../source/s_mulAddF64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_mulAddF64(
|
|
|
+ uint_fast64_t uiA, uint_fast64_t uiB, uint_fast64_t uiC, uint_fast8_t op )
|
|
|
+{
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ bool signC;
|
|
|
+ int_fast16_t expC;
|
|
|
+ uint_fast64_t sigC;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast64_t magBits, uiZ;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ struct uint128 sig128Z;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ struct uint128 sig128C;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ signC = signF64UI( uiC ) ^ (op == softfloat_mulAdd_subC);
|
|
|
+ expC = expF64UI( uiC );
|
|
|
+ sigC = fracF64UI( uiC );
|
|
|
+ signZ = signA ^ signB ^ (op == softfloat_mulAdd_subProd);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA || ((expB == 0x7FF) && sigB) ) goto propagateNaN_ABC;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN_ABC;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expC == 0x7FF ) {
|
|
|
+ if ( sigC ) {
|
|
|
+ uiZ = 0;
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ }
|
|
|
+ uiZ = uiC;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FE;
|
|
|
+ sigA = (sigA | UINT64_C( 0x0010000000000000 ))<<10;
|
|
|
+ sigB = (sigB | UINT64_C( 0x0010000000000000 ))<<10;
|
|
|
+ sig128Z = softfloat_mul64To128( sigA, sigB );
|
|
|
+ if ( sig128Z.v64 < UINT64_C( 0x2000000000000000 ) ) {
|
|
|
+ --expZ;
|
|
|
+ sig128Z =
|
|
|
+ softfloat_add128(
|
|
|
+ sig128Z.v64, sig128Z.v0, sig128Z.v64, sig128Z.v0 );
|
|
|
+ }
|
|
|
+ if ( ! expC ) {
|
|
|
+ if ( ! sigC ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ = sig128Z.v64<<1 | (sig128Z.v0 != 0);
|
|
|
+ goto roundPack;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigC );
|
|
|
+ expC = normExpSig.exp;
|
|
|
+ sigC = normExpSig.sig;
|
|
|
+ }
|
|
|
+ sigC = (sigC | UINT64_C( 0x0010000000000000 ))<<9;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expZ - expC;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ expZ = expC;
|
|
|
+ if ( (signZ == signC) || (expDiff < -1) ) {
|
|
|
+ sig128Z.v64 = softfloat_shiftRightJam64( sig128Z.v64, -expDiff );
|
|
|
+ } else {
|
|
|
+ sig128Z =
|
|
|
+ softfloat_shortShiftRightJam128( sig128Z.v64, sig128Z.v0, 1 );
|
|
|
+ }
|
|
|
+ } else if ( expDiff ) {
|
|
|
+ sig128C = softfloat_shiftRightJam128( sigC, 0, expDiff );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signZ == signC ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff <= 0 ) {
|
|
|
+ sigZ = (sigC + sig128Z.v64) | (sig128Z.v0 != 0);
|
|
|
+ } else {
|
|
|
+ sig128Z =
|
|
|
+ softfloat_add128(
|
|
|
+ sig128Z.v64, sig128Z.v0, sig128C.v64, sig128C.v0 );
|
|
|
+ sigZ = sig128Z.v64 | (sig128Z.v0 != 0);
|
|
|
+ }
|
|
|
+ if ( sigZ < UINT64_C( 0x4000000000000000 ) ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ signZ = signC;
|
|
|
+ sig128Z = softfloat_sub128( sigC, 0, sig128Z.v64, sig128Z.v0 );
|
|
|
+ } else if ( ! expDiff ) {
|
|
|
+ sig128Z.v64 = sig128Z.v64 - sigC;
|
|
|
+ if ( ! (sig128Z.v64 | sig128Z.v0) ) goto completeCancellation;
|
|
|
+ if ( sig128Z.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ sig128Z = softfloat_sub128( 0, 0, sig128Z.v64, sig128Z.v0 );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sig128Z =
|
|
|
+ softfloat_sub128(
|
|
|
+ sig128Z.v64, sig128Z.v0, sig128C.v64, sig128C.v0 );
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! sig128Z.v64 ) {
|
|
|
+ expZ -= 64;
|
|
|
+ sig128Z.v64 = sig128Z.v0;
|
|
|
+ sig128Z.v0 = 0;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig128Z.v64 ) - 1;
|
|
|
+ expZ -= shiftDist;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( sig128Z.v64, -shiftDist );
|
|
|
+ } else {
|
|
|
+ sig128Z =
|
|
|
+ softfloat_shortShiftLeft128(
|
|
|
+ sig128Z.v64, sig128Z.v0, shiftDist );
|
|
|
+ sigZ = sig128Z.v64;
|
|
|
+ }
|
|
|
+ sigZ |= (sig128Z.v0 != 0);
|
|
|
+ }
|
|
|
+ roundPack:
|
|
|
+ return softfloat_roundPackToF64( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN_ABC:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infProdArg:
|
|
|
+ if ( magBits ) {
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ if ( expC != 0x7FF ) goto uiZ;
|
|
|
+ if ( sigC ) goto propagateNaN_ZC;
|
|
|
+ if ( signZ == signC ) goto uiZ;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ propagateNaN_ZC:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiZ, uiC );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zeroProd:
|
|
|
+ uiZ = uiC;
|
|
|
+ if ( ! (expC | sigC) && (signZ != signC) ) {
|
|
|
+ completeCancellation:
|
|
|
+ uiZ =
|
|
|
+ packToF64UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float64_t
|
|
|
+ softfloat_mulAddF64(
|
|
|
+ uint_fast64_t uiA, uint_fast64_t uiB, uint_fast64_t uiC, uint_fast8_t op )
|
|
|
+{
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint64_t sigA;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint64_t sigB;
|
|
|
+ bool signC;
|
|
|
+ int_fast16_t expC;
|
|
|
+ uint64_t sigC;
|
|
|
+ bool signZ;
|
|
|
+ uint64_t magBits, uiZ;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint32_t sig128Z[4];
|
|
|
+ uint64_t sigZ;
|
|
|
+ int_fast16_t shiftDist, expDiff;
|
|
|
+ uint32_t sig128C[4];
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ signC = signF64UI( uiC ) ^ (op == softfloat_mulAdd_subC);
|
|
|
+ expC = expF64UI( uiC );
|
|
|
+ sigC = fracF64UI( uiC );
|
|
|
+ signZ = signA ^ signB ^ (op == softfloat_mulAdd_subProd);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA || ((expB == 0x7FF) && sigB) ) goto propagateNaN_ABC;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN_ABC;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expC == 0x7FF ) {
|
|
|
+ if ( sigC ) {
|
|
|
+ uiZ = 0;
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ }
|
|
|
+ uiZ = uiC;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FE;
|
|
|
+ sigA = (sigA | UINT64_C( 0x0010000000000000 ))<<10;
|
|
|
+ sigB = (sigB | UINT64_C( 0x0010000000000000 ))<<11;
|
|
|
+ softfloat_mul64To128M( sigA, sigB, sig128Z );
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32 | sig128Z[indexWord( 4, 2 )];
|
|
|
+ shiftDist = 0;
|
|
|
+ if ( ! (sigZ & UINT64_C( 0x4000000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ shiftDist = -1;
|
|
|
+ }
|
|
|
+ if ( ! expC ) {
|
|
|
+ if ( ! sigC ) {
|
|
|
+ if ( shiftDist ) sigZ <<= 1;
|
|
|
+ goto sigZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigC );
|
|
|
+ expC = normExpSig.exp;
|
|
|
+ sigC = normExpSig.sig;
|
|
|
+ }
|
|
|
+ sigC = (sigC | UINT64_C( 0x0010000000000000 ))<<10;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expZ - expC;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ expZ = expC;
|
|
|
+ if ( (signZ == signC) || (expDiff < -1) ) {
|
|
|
+ shiftDist -= expDiff;
|
|
|
+ if ( shiftDist) {
|
|
|
+ sigZ = softfloat_shiftRightJam64( sigZ, shiftDist );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( ! shiftDist ) {
|
|
|
+ softfloat_shortShiftRight128M( sig128Z, 1, sig128Z );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( shiftDist ) softfloat_add128M( sig128Z, sig128Z, sig128Z );
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 2 )];
|
|
|
+ } else {
|
|
|
+ sig128C[indexWord( 4, 3 )] = sigC>>32;
|
|
|
+ sig128C[indexWord( 4, 2 )] = sigC;
|
|
|
+ sig128C[indexWord( 4, 1 )] = 0;
|
|
|
+ sig128C[indexWord( 4, 0 )] = 0;
|
|
|
+ softfloat_shiftRightJam128M( sig128C, expDiff, sig128C );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signZ == signC ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff <= 0 ) {
|
|
|
+ sigZ += sigC;
|
|
|
+ } else {
|
|
|
+ softfloat_add128M( sig128Z, sig128C, sig128Z );
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 2 )];
|
|
|
+ }
|
|
|
+ if ( sigZ & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ ++expZ;
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( sigZ, 1 );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ signZ = signC;
|
|
|
+ if ( expDiff < -1 ) {
|
|
|
+ sigZ = sigC - sigZ;
|
|
|
+ if (
|
|
|
+ sig128Z[indexWord( 4, 1 )] || sig128Z[indexWord( 4, 0 )]
|
|
|
+ ) {
|
|
|
+ sigZ = (sigZ - 1) | 1;
|
|
|
+ }
|
|
|
+ if ( ! (sigZ & UINT64_C( 0x4000000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ goto roundPack;
|
|
|
+ } else {
|
|
|
+ sig128C[indexWord( 4, 3 )] = sigC>>32;
|
|
|
+ sig128C[indexWord( 4, 2 )] = sigC;
|
|
|
+ sig128C[indexWord( 4, 1 )] = 0;
|
|
|
+ sig128C[indexWord( 4, 0 )] = 0;
|
|
|
+ softfloat_sub128M( sig128C, sig128Z, sig128Z );
|
|
|
+ }
|
|
|
+ } else if ( ! expDiff ) {
|
|
|
+ sigZ -= sigC;
|
|
|
+ if (
|
|
|
+ ! sigZ && ! sig128Z[indexWord( 4, 1 )]
|
|
|
+ && ! sig128Z[indexWord( 4, 0 )]
|
|
|
+ ) {
|
|
|
+ goto completeCancellation;
|
|
|
+ }
|
|
|
+ sig128Z[indexWord( 4, 3 )] = sigZ>>32;
|
|
|
+ sig128Z[indexWord( 4, 2 )] = sigZ;
|
|
|
+ if ( sigZ & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ softfloat_negX128M( sig128Z );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ softfloat_sub128M( sig128Z, sig128C, sig128Z );
|
|
|
+ if ( 1 < expDiff ) {
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 2 )];
|
|
|
+ if ( ! (sigZ & UINT64_C( 0x4000000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ goto sigZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0;
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 2 )];
|
|
|
+ if ( ! sigZ ) {
|
|
|
+ shiftDist = 64;
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 1 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 0 )];
|
|
|
+ }
|
|
|
+ shiftDist += softfloat_countLeadingZeros64( sigZ ) - 1;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ expZ -= shiftDist;
|
|
|
+ softfloat_shiftLeft128M( sig128Z, shiftDist, sig128Z );
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32
|
|
|
+ | sig128Z[indexWord( 4, 2 )];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sigZ:
|
|
|
+ if ( sig128Z[indexWord( 4, 1 )] || sig128Z[indexWord( 4, 0 )] ) sigZ |= 1;
|
|
|
+ roundPack:
|
|
|
+ return softfloat_roundPackToF64( signZ, expZ - 1, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN_ABC:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infProdArg:
|
|
|
+ if ( magBits ) {
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ if ( expC != 0x7FF ) goto uiZ;
|
|
|
+ if ( sigC ) goto propagateNaN_ZC;
|
|
|
+ if ( signZ == signC ) goto uiZ;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ propagateNaN_ZC:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiZ, uiC );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zeroProd:
|
|
|
+ uiZ = uiC;
|
|
|
+ if ( ! (expC | sigC) && (signZ != signC) ) {
|
|
|
+ completeCancellation:
|
|
|
+ uiZ =
|
|
|
+ packToF64UI(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mulAddF64.c ****/
|
|
|
+/**** start inlining ../../source/s_normSubnormalExtF80Sig.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+struct exp32_sig64 softfloat_normSubnormalExtF80Sig( uint_fast64_t sig )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct exp32_sig64 z;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig );
|
|
|
+ z.exp = -shiftDist;
|
|
|
+ z.sig = sig<<shiftDist;
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normSubnormalExtF80Sig.c ****/
|
|
|
+/**** start inlining ../../source/s_roundPackToExtF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ bool sign,
|
|
|
+ int_fast32_t exp,
|
|
|
+ uint_fast64_t sig,
|
|
|
+ uint_fast64_t sigExtra,
|
|
|
+ uint_fast8_t roundingPrecision
|
|
|
+ )
|
|
|
+{
|
|
|
+ uint_fast8_t roundingMode;
|
|
|
+ bool roundNearEven;
|
|
|
+ uint_fast64_t roundIncrement, roundMask, roundBits;
|
|
|
+ bool isTiny, doIncrement;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ if ( roundingPrecision == 80 ) goto precision80;
|
|
|
+ if ( roundingPrecision == 64 ) {
|
|
|
+ roundIncrement = UINT64_C( 0x0000000000000400 );
|
|
|
+ roundMask = UINT64_C( 0x00000000000007FF );
|
|
|
+ } else if ( roundingPrecision == 32 ) {
|
|
|
+ roundIncrement = UINT64_C( 0x0000008000000000 );
|
|
|
+ roundMask = UINT64_C( 0x000000FFFFFFFFFF );
|
|
|
+ } else {
|
|
|
+ goto precision80;
|
|
|
+ }
|
|
|
+ sig |= (sigExtra != 0);
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ roundIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ? roundMask
|
|
|
+ : 0;
|
|
|
+ }
|
|
|
+ roundBits = sig & roundMask;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x7FFD <= (uint32_t) (exp - 1) ) {
|
|
|
+ if ( exp <= 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess
|
|
|
+ == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < 0)
|
|
|
+ || (sig <= (uint64_t) (sig + roundIncrement));
|
|
|
+ sig = softfloat_shiftRightJam64( sig, 1 - exp );
|
|
|
+ roundBits = sig & roundMask;
|
|
|
+ if ( roundBits ) {
|
|
|
+ if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= roundMask + 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ sig += roundIncrement;
|
|
|
+ exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);
|
|
|
+ roundIncrement = roundMask + 1;
|
|
|
+ if ( roundNearEven && (roundBits<<1 == roundIncrement) ) {
|
|
|
+ roundMask |= roundIncrement;
|
|
|
+ }
|
|
|
+ sig &= ~roundMask;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ (0x7FFE < exp)
|
|
|
+ || ((exp == 0x7FFE) && ((uint64_t) (sig + roundIncrement) < sig))
|
|
|
+ ) {
|
|
|
+ goto overflow;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( roundBits ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig = (sig & ~roundMask) | (roundMask + 1);
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ sig = (uint64_t) (sig + roundIncrement);
|
|
|
+ if ( sig < roundIncrement ) {
|
|
|
+ ++exp;
|
|
|
+ sig = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ roundIncrement = roundMask + 1;
|
|
|
+ if ( roundNearEven && (roundBits<<1 == roundIncrement) ) {
|
|
|
+ roundMask |= roundIncrement;
|
|
|
+ }
|
|
|
+ sig &= ~roundMask;
|
|
|
+ goto packReturn;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ precision80:
|
|
|
+ doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ doIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ && sigExtra;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x7FFD <= (uint32_t) (exp - 1) ) {
|
|
|
+ if ( exp <= 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess
|
|
|
+ == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < 0)
|
|
|
+ || ! doIncrement
|
|
|
+ || (sig < UINT64_C( 0xFFFFFFFFFFFFFFFF ));
|
|
|
+ sig64Extra =
|
|
|
+ softfloat_shiftRightJam64Extra( sig, sigExtra, 1 - exp );
|
|
|
+ exp = 0;
|
|
|
+ sig = sig64Extra.v;
|
|
|
+ sigExtra = sig64Extra.extra;
|
|
|
+ if ( sigExtra ) {
|
|
|
+ if ( isTiny ) softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
|
|
|
+ if (
|
|
|
+ ! roundNearEven
|
|
|
+ && (roundingMode != softfloat_round_near_maxMag)
|
|
|
+ ) {
|
|
|
+ doIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ && sigExtra;
|
|
|
+ }
|
|
|
+ if ( doIncrement ) {
|
|
|
+ ++sig;
|
|
|
+ sig &=
|
|
|
+ ~(uint_fast64_t)
|
|
|
+ (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ & roundNearEven);
|
|
|
+ exp = ((sig & UINT64_C( 0x8000000000000000 )) != 0);
|
|
|
+ }
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ (0x7FFE < exp)
|
|
|
+ || ((exp == 0x7FFE) && (sig == UINT64_C( 0xFFFFFFFFFFFFFFFF ))
|
|
|
+ && doIncrement)
|
|
|
+ ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ roundMask = 0;
|
|
|
+ overflow:
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ if (
|
|
|
+ roundNearEven
|
|
|
+ || (roundingMode == softfloat_round_near_maxMag)
|
|
|
+ || (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ) {
|
|
|
+ exp = 0x7FFF;
|
|
|
+ sig = UINT64_C( 0x8000000000000000 );
|
|
|
+ } else {
|
|
|
+ exp = 0x7FFE;
|
|
|
+ sig = ~roundMask;
|
|
|
+ }
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( sigExtra ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ if ( doIncrement ) {
|
|
|
+ ++sig;
|
|
|
+ if ( ! sig ) {
|
|
|
+ ++exp;
|
|
|
+ sig = UINT64_C( 0x8000000000000000 );
|
|
|
+ } else {
|
|
|
+ sig &=
|
|
|
+ ~(uint_fast64_t)
|
|
|
+ (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ & roundNearEven);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ packReturn:
|
|
|
+ uZ.s.signExp = packToExtF80UI64( sign, exp );
|
|
|
+ uZ.s.signif = sig;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundPackToExtF80.c ****/
|
|
|
+/**** start inlining ../../source/s_normRoundPackToExtF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+extFloat80_t
|
|
|
+ softfloat_normRoundPackToExtF80(
|
|
|
+ bool sign,
|
|
|
+ int_fast32_t exp,
|
|
|
+ uint_fast64_t sig,
|
|
|
+ uint_fast64_t sigExtra,
|
|
|
+ uint_fast8_t roundingPrecision
|
|
|
+ )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct uint128 sig128;
|
|
|
+
|
|
|
+ if ( ! sig ) {
|
|
|
+ exp -= 64;
|
|
|
+ sig = sigExtra;
|
|
|
+ sigExtra = 0;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig );
|
|
|
+ exp -= shiftDist;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig128 = softfloat_shortShiftLeft128( sig, sigExtra, shiftDist );
|
|
|
+ sig = sig128.v64;
|
|
|
+ sigExtra = sig128.v0;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ sign, exp, sig, sigExtra, roundingPrecision );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normRoundPackToExtF80.c ****/
|
|
|
+/**** start inlining ../../source/s_addMagsExtF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t
|
|
|
+ softfloat_addMagsExtF80(
|
|
|
+ uint_fast16_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast16_t uiB64,
|
|
|
+ uint_fast64_t uiB0,
|
|
|
+ bool signZ
|
|
|
+ )
|
|
|
+{
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ int_fast32_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ int_fast32_t expDiff;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0, sigZ, sigZExtra;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ sigB = uiB0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( (sigA | sigB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ uiZ64 = uiA64;
|
|
|
+ uiZ0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigZ = sigA + sigB;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! expA ) {
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigZ );
|
|
|
+ expZ = normExpSig.exp + 1;
|
|
|
+ sigZ = normExpSig.sig;
|
|
|
+ goto roundAndPack;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ goto shiftRight1;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
|
|
+ uiZ0 = uiB0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB;
|
|
|
+ if ( ! expA ) {
|
|
|
+ ++expDiff;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAligned;
|
|
|
+ }
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sigA, 0, -expDiff );
|
|
|
+ sigA = sig64Extra.v;
|
|
|
+ sigZExtra = sig64Extra.extra;
|
|
|
+ } else {
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ uiZ64 = uiA64;
|
|
|
+ uiZ0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ if ( ! expB ) {
|
|
|
+ --expDiff;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAligned;
|
|
|
+ }
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sigB, 0, expDiff );
|
|
|
+ sigB = sig64Extra.v;
|
|
|
+ sigZExtra = sig64Extra.extra;
|
|
|
+ }
|
|
|
+ newlyAligned:
|
|
|
+ sigZ = sigA + sigB;
|
|
|
+ if ( sigZ & UINT64_C( 0x8000000000000000 ) ) goto roundAndPack;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftRight1:
|
|
|
+ sig64Extra = softfloat_shortShiftRightJam64Extra( sigZ, sigZExtra, 1 );
|
|
|
+ sigZ = sig64Extra.v | UINT64_C( 0x8000000000000000 );
|
|
|
+ sigZExtra = sig64Extra.extra;
|
|
|
+ ++expZ;
|
|
|
+ roundAndPack:
|
|
|
+ return
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ signZ, expZ, sigZ, sigZExtra, extF80_roundingPrecision );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_addMagsExtF80.c ****/
|
|
|
+/**** start inlining ../../source/s_subMagsExtF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t
|
|
|
+ softfloat_subMagsExtF80(
|
|
|
+ uint_fast16_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast16_t uiB64,
|
|
|
+ uint_fast64_t uiB0,
|
|
|
+ bool signZ
|
|
|
+ )
|
|
|
+{
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ int_fast32_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ int_fast32_t expDiff;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint_fast64_t sigExtra;
|
|
|
+ struct uint128 sig128, uiZ;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ sigB = uiB0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( 0 < expDiff ) goto expABigger;
|
|
|
+ if ( expDiff < 0 ) goto expBBigger;
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( (sigA | sigB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ64 = defaultNaNExtF80UI64;
|
|
|
+ uiZ0 = defaultNaNExtF80UI0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA;
|
|
|
+ if ( ! expZ ) expZ = 1;
|
|
|
+ sigExtra = 0;
|
|
|
+ if ( sigB < sigA ) goto aBigger;
|
|
|
+ if ( sigA < sigB ) goto bBigger;
|
|
|
+ uiZ64 =
|
|
|
+ packToExtF80UI64( (softfloat_roundingMode == softfloat_round_min), 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expBBigger:
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ uiZ64 = packToExtF80UI64( signZ ^ 1, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ ++expDiff;
|
|
|
+ sigExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAlignedBBigger;
|
|
|
+ }
|
|
|
+ sig128 = softfloat_shiftRightJam128( sigA, 0, -expDiff );
|
|
|
+ sigA = sig128.v64;
|
|
|
+ sigExtra = sig128.v0;
|
|
|
+ newlyAlignedBBigger:
|
|
|
+ expZ = expB;
|
|
|
+ bBigger:
|
|
|
+ signZ = ! signZ;
|
|
|
+ sig128 = softfloat_sub128( sigB, 0, sigA, sigExtra );
|
|
|
+ goto normRoundPack;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expABigger:
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ uiZ64 = uiA64;
|
|
|
+ uiZ0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ --expDiff;
|
|
|
+ sigExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAlignedABigger;
|
|
|
+ }
|
|
|
+ sig128 = softfloat_shiftRightJam128( sigB, 0, expDiff );
|
|
|
+ sigB = sig128.v64;
|
|
|
+ sigExtra = sig128.v0;
|
|
|
+ newlyAlignedABigger:
|
|
|
+ expZ = expA;
|
|
|
+ aBigger:
|
|
|
+ sig128 = softfloat_sub128( sigA, 0, sigB, sigExtra );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ normRoundPack:
|
|
|
+ return
|
|
|
+ softfloat_normRoundPackToExtF80(
|
|
|
+ signZ, expZ, sig128.v64, sig128.v0, extF80_roundingPrecision );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_subMagsExtF80.c ****/
|
|
|
+/**** start inlining ../../source/s_normSubnormalF128Sig.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+struct exp32_sig128
|
|
|
+ softfloat_normSubnormalF128Sig( uint_fast64_t sig64, uint_fast64_t sig0 )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct exp32_sig128 z;
|
|
|
+
|
|
|
+ if ( ! sig64 ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig0 ) - 15;
|
|
|
+ z.exp = -63 - shiftDist;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ z.sig.v64 = sig0>>-shiftDist;
|
|
|
+ z.sig.v0 = sig0<<(shiftDist & 63);
|
|
|
+ } else {
|
|
|
+ z.sig.v64 = sig0<<shiftDist;
|
|
|
+ z.sig.v0 = 0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;
|
|
|
+ z.exp = 1 - shiftDist;
|
|
|
+ z.sig = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normSubnormalF128Sig.c ****/
|
|
|
+/**** start inlining ../../source/s_roundPackToF128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ softfloat_roundPackToF128(
|
|
|
+ bool sign,
|
|
|
+ int_fast32_t exp,
|
|
|
+ uint_fast64_t sig64,
|
|
|
+ uint_fast64_t sig0,
|
|
|
+ uint_fast64_t sigExtra
|
|
|
+ )
|
|
|
+{
|
|
|
+ uint_fast8_t roundingMode;
|
|
|
+ bool roundNearEven, doIncrement, isTiny;
|
|
|
+ struct uint128_extra sig128Extra;
|
|
|
+ uint_fast64_t uiZ64, uiZ0;
|
|
|
+ struct uint128 sig128;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ roundingMode = softfloat_roundingMode;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
|
|
|
+ if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) {
|
|
|
+ doIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ && sigExtra;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x7FFD <= (uint32_t) exp ) {
|
|
|
+ if ( exp < 0 ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ isTiny =
|
|
|
+ (softfloat_detectTininess
|
|
|
+ == softfloat_tininess_beforeRounding)
|
|
|
+ || (exp < -1)
|
|
|
+ || ! doIncrement
|
|
|
+ || softfloat_lt128(
|
|
|
+ sig64,
|
|
|
+ sig0,
|
|
|
+ UINT64_C( 0x0001FFFFFFFFFFFF ),
|
|
|
+ UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
|
|
+ );
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shiftRightJam128Extra( sig64, sig0, sigExtra, -exp );
|
|
|
+ sig64 = sig128Extra.v.v64;
|
|
|
+ sig0 = sig128Extra.v.v0;
|
|
|
+ sigExtra = sig128Extra.extra;
|
|
|
+ exp = 0;
|
|
|
+ if ( isTiny && sigExtra ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_underflow );
|
|
|
+ }
|
|
|
+ doIncrement = (UINT64_C( 0x8000000000000000 ) <= sigExtra);
|
|
|
+ if (
|
|
|
+ ! roundNearEven
|
|
|
+ && (roundingMode != softfloat_round_near_maxMag)
|
|
|
+ ) {
|
|
|
+ doIncrement =
|
|
|
+ (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ && sigExtra;
|
|
|
+ }
|
|
|
+ } else if (
|
|
|
+ (0x7FFD < exp)
|
|
|
+ || ((exp == 0x7FFD)
|
|
|
+ && softfloat_eq128(
|
|
|
+ sig64,
|
|
|
+ sig0,
|
|
|
+ UINT64_C( 0x0001FFFFFFFFFFFF ),
|
|
|
+ UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
|
|
+ )
|
|
|
+ && doIncrement)
|
|
|
+ ) {
|
|
|
+ /*----------------------------------------------------------------
|
|
|
+ *----------------------------------------------------------------*/
|
|
|
+ softfloat_raiseFlags(
|
|
|
+ softfloat_flag_overflow | softfloat_flag_inexact );
|
|
|
+ if (
|
|
|
+ roundNearEven
|
|
|
+ || (roundingMode == softfloat_round_near_maxMag)
|
|
|
+ || (roundingMode
|
|
|
+ == (sign ? softfloat_round_min : softfloat_round_max))
|
|
|
+ ) {
|
|
|
+ uiZ64 = packToF128UI64( sign, 0x7FFF, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ } else {
|
|
|
+ uiZ64 =
|
|
|
+ packToF128UI64(
|
|
|
+ sign, 0x7FFE, UINT64_C( 0x0000FFFFFFFFFFFF ) );
|
|
|
+ uiZ0 = UINT64_C( 0xFFFFFFFFFFFFFFFF );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( sigExtra ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ sig0 |= 1;
|
|
|
+ goto packReturn;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ if ( doIncrement ) {
|
|
|
+ sig128 = softfloat_add128( sig64, sig0, 0, 1 );
|
|
|
+ sig64 = sig128.v64;
|
|
|
+ sig0 =
|
|
|
+ sig128.v0
|
|
|
+ & ~(uint64_t)
|
|
|
+ (! (sigExtra & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ & roundNearEven);
|
|
|
+ } else {
|
|
|
+ if ( ! (sig64 | sig0) ) exp = 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ packReturn:
|
|
|
+ uiZ64 = packToF128UI64( sign, exp, sig64 );
|
|
|
+ uiZ0 = sig0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui.v64 = uiZ64;
|
|
|
+ uZ.ui.v0 = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_roundPackToF128.c ****/
|
|
|
+/**** start inlining ../../source/s_normRoundPackToF128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ softfloat_normRoundPackToF128(
|
|
|
+ bool sign, int_fast32_t exp, uint_fast64_t sig64, uint_fast64_t sig0 )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct uint128 sig128;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+ uint_fast64_t sigExtra;
|
|
|
+ struct uint128_extra sig128Extra;
|
|
|
+
|
|
|
+ if ( ! sig64 ) {
|
|
|
+ exp -= 64;
|
|
|
+ sig64 = sig0;
|
|
|
+ sig0 = 0;
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sig64 ) - 15;
|
|
|
+ exp -= shiftDist;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig128 = softfloat_shortShiftLeft128( sig64, sig0, shiftDist );
|
|
|
+ sig64 = sig128.v64;
|
|
|
+ sig0 = sig128.v0;
|
|
|
+ }
|
|
|
+ if ( (uint32_t) exp < 0x7FFD ) {
|
|
|
+ uZ.ui.v64 = packToF128UI64( sign, sig64 | sig0 ? exp : 0, sig64 );
|
|
|
+ uZ.ui.v0 = sig0;
|
|
|
+ return uZ.f;
|
|
|
+ }
|
|
|
+ sigExtra = 0;
|
|
|
+ } else {
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shortShiftRightJam128Extra( sig64, sig0, 0, -shiftDist );
|
|
|
+ sig64 = sig128Extra.v.v64;
|
|
|
+ sig0 = sig128Extra.v.v0;
|
|
|
+ sigExtra = sig128Extra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF128( sign, exp, sig64, sig0, sigExtra );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_normRoundPackToF128.c ****/
|
|
|
+/**** start inlining ../../source/s_addMagsF128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ softfloat_addMagsF128(
|
|
|
+ uint_fast64_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast64_t uiB64,
|
|
|
+ uint_fast64_t uiB0,
|
|
|
+ bool signZ
|
|
|
+ )
|
|
|
+{
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB;
|
|
|
+ int_fast32_t expDiff;
|
|
|
+ struct uint128 uiZ, sigZ;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ struct uint128_extra sig128Extra;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigZ = softfloat_add128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );
|
|
|
+ if ( ! expA ) {
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0, sigZ.v64 );
|
|
|
+ uiZ.v0 = sigZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ sigZ.v64 |= UINT64_C( 0x0002000000000000 );
|
|
|
+ sigZExtra = 0;
|
|
|
+ goto shiftRight1;
|
|
|
+ }
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expB;
|
|
|
+ if ( expA ) {
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ } else {
|
|
|
+ ++expDiff;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAligned;
|
|
|
+ }
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shiftRightJam128Extra( sigA.v64, sigA.v0, 0, -expDiff );
|
|
|
+ sigA = sig128Extra.v;
|
|
|
+ sigZExtra = sig128Extra.extra;
|
|
|
+ } else {
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ if ( expB ) {
|
|
|
+ sigB.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ } else {
|
|
|
+ --expDiff;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! expDiff ) goto newlyAligned;
|
|
|
+ }
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shiftRightJam128Extra( sigB.v64, sigB.v0, 0, expDiff );
|
|
|
+ sigB = sig128Extra.v;
|
|
|
+ sigZExtra = sig128Extra.extra;
|
|
|
+ }
|
|
|
+ newlyAligned:
|
|
|
+ sigZ =
|
|
|
+ softfloat_add128(
|
|
|
+ sigA.v64 | UINT64_C( 0x0001000000000000 ),
|
|
|
+ sigA.v0,
|
|
|
+ sigB.v64,
|
|
|
+ sigB.v0
|
|
|
+ );
|
|
|
+ --expZ;
|
|
|
+ if ( sigZ.v64 < UINT64_C( 0x0002000000000000 ) ) goto roundAndPack;
|
|
|
+ ++expZ;
|
|
|
+ shiftRight1:
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shortShiftRightJam128Extra(
|
|
|
+ sigZ.v64, sigZ.v0, sigZExtra, 1 );
|
|
|
+ sigZ = sig128Extra.v;
|
|
|
+ sigZExtra = sig128Extra.extra;
|
|
|
+ roundAndPack:
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_addMagsF128.c ****/
|
|
|
+/**** start inlining ../../source/s_subMagsF128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ softfloat_subMagsF128(
|
|
|
+ uint_fast64_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast64_t uiB64,
|
|
|
+ uint_fast64_t uiB0,
|
|
|
+ bool signZ
|
|
|
+ )
|
|
|
+{
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB, sigZ;
|
|
|
+ int_fast32_t expDiff, expZ;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ sigA = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 4 );
|
|
|
+ sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 4 );
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( 0 < expDiff ) goto expABigger;
|
|
|
+ if ( expDiff < 0 ) goto expBBigger;
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 | sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ expZ = expA;
|
|
|
+ if ( ! expZ ) expZ = 1;
|
|
|
+ if ( sigB.v64 < sigA.v64 ) goto aBigger;
|
|
|
+ if ( sigA.v64 < sigB.v64 ) goto bBigger;
|
|
|
+ if ( sigB.v0 < sigA.v0 ) goto aBigger;
|
|
|
+ if ( sigA.v0 < sigB.v0 ) goto bBigger;
|
|
|
+ uiZ.v64 =
|
|
|
+ packToF128UI64(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ expBBigger:
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ uiZ.v64 = packToF128UI64( signZ ^ 1, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expA ) {
|
|
|
+ sigA.v64 |= UINT64_C( 0x0010000000000000 );
|
|
|
+ } else {
|
|
|
+ ++expDiff;
|
|
|
+ if ( ! expDiff ) goto newlyAlignedBBigger;
|
|
|
+ }
|
|
|
+ sigA = softfloat_shiftRightJam128( sigA.v64, sigA.v0, -expDiff );
|
|
|
+ newlyAlignedBBigger:
|
|
|
+ expZ = expB;
|
|
|
+ sigB.v64 |= UINT64_C( 0x0010000000000000 );
|
|
|
+ bBigger:
|
|
|
+ signZ = ! signZ;
|
|
|
+ sigZ = softfloat_sub128( sigB.v64, sigB.v0, sigA.v64, sigA.v0 );
|
|
|
+ goto normRoundPack;
|
|
|
+ expABigger:
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiA0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( expB ) {
|
|
|
+ sigB.v64 |= UINT64_C( 0x0010000000000000 );
|
|
|
+ } else {
|
|
|
+ --expDiff;
|
|
|
+ if ( ! expDiff ) goto newlyAlignedABigger;
|
|
|
+ }
|
|
|
+ sigB = softfloat_shiftRightJam128( sigB.v64, sigB.v0, expDiff );
|
|
|
+ newlyAlignedABigger:
|
|
|
+ expZ = expA;
|
|
|
+ sigA.v64 |= UINT64_C( 0x0010000000000000 );
|
|
|
+ aBigger:
|
|
|
+ sigZ = softfloat_sub128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 );
|
|
|
+ normRoundPack:
|
|
|
+ return softfloat_normRoundPackToF128( signZ, expZ - 5, sigZ.v64, sigZ.v0 );
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_subMagsF128.c ****/
|
|
|
+/**** start inlining ../../source/s_mulAddF128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ softfloat_mulAddF128(
|
|
|
+ uint_fast64_t uiA64,
|
|
|
+ uint_fast64_t uiA0,
|
|
|
+ uint_fast64_t uiB64,
|
|
|
+ uint_fast64_t uiB0,
|
|
|
+ uint_fast64_t uiC64,
|
|
|
+ uint_fast64_t uiC0,
|
|
|
+ uint_fast8_t op
|
|
|
+ )
|
|
|
+{
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ bool signB;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB;
|
|
|
+ bool signC;
|
|
|
+ int_fast32_t expC;
|
|
|
+ struct uint128 sigC;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast64_t magBits;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint64_t sig256Z[4];
|
|
|
+ struct uint128 sigZ;
|
|
|
+ int_fast32_t shiftDist, expDiff;
|
|
|
+ struct uint128 x128;
|
|
|
+ uint64_t sig256C[4];
|
|
|
+ static uint64_t zero256[4] = INIT_UINTM4( 0, 0, 0, 0 );
|
|
|
+ uint_fast64_t sigZExtra, sig256Z0;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ signC = signF128UI64( uiC64 ) ^ (op == softfloat_mulAdd_subC);
|
|
|
+ expC = expF128UI64( uiC64 );
|
|
|
+ sigC.v64 = fracF128UI64( uiC64 );
|
|
|
+ sigC.v0 = uiC0;
|
|
|
+ signZ = signA ^ signB ^ (op == softfloat_mulAdd_subProd);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))
|
|
|
+ ) {
|
|
|
+ goto propagateNaN_ABC;
|
|
|
+ }
|
|
|
+ magBits = expB | sigB.v64 | sigB.v0;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN_ABC;
|
|
|
+ magBits = expA | sigA.v64 | sigA.v0;
|
|
|
+ goto infProdArg;
|
|
|
+ }
|
|
|
+ if ( expC == 0x7FFF ) {
|
|
|
+ if ( sigC.v64 | sigC.v0 ) {
|
|
|
+ uiZ.v64 = 0;
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ }
|
|
|
+ uiZ.v64 = uiC64;
|
|
|
+ uiZ.v0 = uiC0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! (sigA.v64 | sigA.v0) ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! (sigB.v64 | sigB.v0) ) goto zeroProd;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FFE;
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigB.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigA = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 8 );
|
|
|
+ sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 15 );
|
|
|
+ softfloat_mul128To256M( sigA.v64, sigA.v0, sigB.v64, sigB.v0, sig256Z );
|
|
|
+ sigZ.v64 = sig256Z[indexWord( 4, 3 )];
|
|
|
+ sigZ.v0 = sig256Z[indexWord( 4, 2 )];
|
|
|
+ shiftDist = 0;
|
|
|
+ if ( ! (sigZ.v64 & UINT64_C( 0x0100000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ shiftDist = -1;
|
|
|
+ }
|
|
|
+ if ( ! expC ) {
|
|
|
+ if ( ! (sigC.v64 | sigC.v0) ) {
|
|
|
+ shiftDist += 8;
|
|
|
+ goto sigZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigC.v64, sigC.v0 );
|
|
|
+ expC = normExpSig.exp;
|
|
|
+ sigC = normExpSig.sig;
|
|
|
+ }
|
|
|
+ sigC.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigC = softfloat_shortShiftLeft128( sigC.v64, sigC.v0, 8 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expZ - expC;
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ expZ = expC;
|
|
|
+ if ( (signZ == signC) || (expDiff < -1) ) {
|
|
|
+ shiftDist -= expDiff;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sigZ =
|
|
|
+ softfloat_shiftRightJam128( sigZ.v64, sigZ.v0, shiftDist );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( ! shiftDist ) {
|
|
|
+ x128 =
|
|
|
+ softfloat_shortShiftRight128(
|
|
|
+ sig256Z[indexWord( 4, 1 )], sig256Z[indexWord( 4, 0 )],
|
|
|
+ 1
|
|
|
+ );
|
|
|
+ sig256Z[indexWord( 4, 1 )] = (sigZ.v0<<63) | x128.v64;
|
|
|
+ sig256Z[indexWord( 4, 0 )] = x128.v0;
|
|
|
+ sigZ = softfloat_shortShiftRight128( sigZ.v64, sigZ.v0, 1 );
|
|
|
+ sig256Z[indexWord( 4, 3 )] = sigZ.v64;
|
|
|
+ sig256Z[indexWord( 4, 2 )] = sigZ.v0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( shiftDist ) softfloat_add256M( sig256Z, sig256Z, sig256Z );
|
|
|
+ if ( ! expDiff ) {
|
|
|
+ sigZ.v64 = sig256Z[indexWord( 4, 3 )];
|
|
|
+ sigZ.v0 = sig256Z[indexWord( 4, 2 )];
|
|
|
+ } else {
|
|
|
+ sig256C[indexWord( 4, 3 )] = sigC.v64;
|
|
|
+ sig256C[indexWord( 4, 2 )] = sigC.v0;
|
|
|
+ sig256C[indexWord( 4, 1 )] = 0;
|
|
|
+ sig256C[indexWord( 4, 0 )] = 0;
|
|
|
+ softfloat_shiftRightJam256M( sig256C, expDiff, sig256C );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 8;
|
|
|
+ if ( signZ == signC ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff <= 0 ) {
|
|
|
+ sigZ = softfloat_add128( sigC.v64, sigC.v0, sigZ.v64, sigZ.v0 );
|
|
|
+ } else {
|
|
|
+ softfloat_add256M( sig256Z, sig256C, sig256Z );
|
|
|
+ sigZ.v64 = sig256Z[indexWord( 4, 3 )];
|
|
|
+ sigZ.v0 = sig256Z[indexWord( 4, 2 )];
|
|
|
+ }
|
|
|
+ if ( sigZ.v64 & UINT64_C( 0x0200000000000000 ) ) {
|
|
|
+ ++expZ;
|
|
|
+ shiftDist = 9;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( expDiff < 0 ) {
|
|
|
+ signZ = signC;
|
|
|
+ if ( expDiff < -1 ) {
|
|
|
+ sigZ =
|
|
|
+ softfloat_sub128( sigC.v64, sigC.v0, sigZ.v64, sigZ.v0 );
|
|
|
+ sigZExtra =
|
|
|
+ sig256Z[indexWord( 4, 1 )] | sig256Z[indexWord( 4, 0 )];
|
|
|
+ if ( sigZExtra ) {
|
|
|
+ sigZ = softfloat_sub128( sigZ.v64, sigZ.v0, 0, 1 );
|
|
|
+ }
|
|
|
+ if ( ! (sigZ.v64 & UINT64_C( 0x0100000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ shiftDist = 7;
|
|
|
+ }
|
|
|
+ goto shiftRightRoundPack;
|
|
|
+ } else {
|
|
|
+ sig256C[indexWord( 4, 3 )] = sigC.v64;
|
|
|
+ sig256C[indexWord( 4, 2 )] = sigC.v0;
|
|
|
+ sig256C[indexWord( 4, 1 )] = 0;
|
|
|
+ sig256C[indexWord( 4, 0 )] = 0;
|
|
|
+ softfloat_sub256M( sig256C, sig256Z, sig256Z );
|
|
|
+ }
|
|
|
+ } else if ( ! expDiff ) {
|
|
|
+ sigZ = softfloat_sub128( sigZ.v64, sigZ.v0, sigC.v64, sigC.v0 );
|
|
|
+ if (
|
|
|
+ ! (sigZ.v64 | sigZ.v0) && ! sig256Z[indexWord( 4, 1 )]
|
|
|
+ && ! sig256Z[indexWord( 4, 0 )]
|
|
|
+ ) {
|
|
|
+ goto completeCancellation;
|
|
|
+ }
|
|
|
+ sig256Z[indexWord( 4, 3 )] = sigZ.v64;
|
|
|
+ sig256Z[indexWord( 4, 2 )] = sigZ.v0;
|
|
|
+ if ( sigZ.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signZ = ! signZ;
|
|
|
+ softfloat_sub256M( zero256, sig256Z, sig256Z );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ softfloat_sub256M( sig256Z, sig256C, sig256Z );
|
|
|
+ if ( 1 < expDiff ) {
|
|
|
+ sigZ.v64 = sig256Z[indexWord( 4, 3 )];
|
|
|
+ sigZ.v0 = sig256Z[indexWord( 4, 2 )];
|
|
|
+ if ( ! (sigZ.v64 & UINT64_C( 0x0100000000000000 )) ) {
|
|
|
+ --expZ;
|
|
|
+ shiftDist = 7;
|
|
|
+ }
|
|
|
+ goto sigZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigZ.v64 = sig256Z[indexWord( 4, 3 )];
|
|
|
+ sigZ.v0 = sig256Z[indexWord( 4, 2 )];
|
|
|
+ sigZExtra = sig256Z[indexWord( 4, 1 )];
|
|
|
+ sig256Z0 = sig256Z[indexWord( 4, 0 )];
|
|
|
+ if ( sigZ.v64 ) {
|
|
|
+ if ( sig256Z0 ) sigZExtra |= 1;
|
|
|
+ } else {
|
|
|
+ expZ -= 64;
|
|
|
+ sigZ.v64 = sigZ.v0;
|
|
|
+ sigZ.v0 = sigZExtra;
|
|
|
+ sigZExtra = sig256Z0;
|
|
|
+ if ( ! sigZ.v64 ) {
|
|
|
+ expZ -= 64;
|
|
|
+ sigZ.v64 = sigZ.v0;
|
|
|
+ sigZ.v0 = sigZExtra;
|
|
|
+ sigZExtra = 0;
|
|
|
+ if ( ! sigZ.v64 ) {
|
|
|
+ expZ -= 64;
|
|
|
+ sigZ.v64 = sigZ.v0;
|
|
|
+ sigZ.v0 = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( sigZ.v64 );
|
|
|
+ expZ += 7 - shiftDist;
|
|
|
+ shiftDist = 15 - shiftDist;
|
|
|
+ if ( 0 < shiftDist ) goto shiftRightRoundPack;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ shiftDist = -shiftDist;
|
|
|
+ sigZ = softfloat_shortShiftLeft128( sigZ.v64, sigZ.v0, shiftDist );
|
|
|
+ x128 = softfloat_shortShiftLeft128( 0, sigZExtra, shiftDist );
|
|
|
+ sigZ.v0 |= x128.v64;
|
|
|
+ sigZExtra = x128.v0;
|
|
|
+ }
|
|
|
+ goto roundPack;
|
|
|
+ }
|
|
|
+ sigZ:
|
|
|
+ sigZExtra = sig256Z[indexWord( 4, 1 )] | sig256Z[indexWord( 4, 0 )];
|
|
|
+ shiftRightRoundPack:
|
|
|
+ sigZExtra = (uint64_t) (sigZ.v0<<(64 - shiftDist)) | (sigZExtra != 0);
|
|
|
+ sigZ = softfloat_shortShiftRight128( sigZ.v64, sigZ.v0, shiftDist );
|
|
|
+ roundPack:
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF128(
|
|
|
+ signZ, expZ - 1, sigZ.v64, sigZ.v0, sigZExtra );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN_ABC:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ goto propagateNaN_ZC;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infProdArg:
|
|
|
+ if ( magBits ) {
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ if ( expC != 0x7FFF ) goto uiZ;
|
|
|
+ if ( sigC.v64 | sigC.v0 ) goto propagateNaN_ZC;
|
|
|
+ if ( signZ == signC ) goto uiZ;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ propagateNaN_ZC:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiZ.v64, uiZ.v0, uiC64, uiC0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zeroProd:
|
|
|
+ uiZ.v64 = uiC64;
|
|
|
+ uiZ.v0 = uiC0;
|
|
|
+ if ( ! (expC | sigC.v64 | sigC.v0) && (signZ != signC) ) {
|
|
|
+ completeCancellation:
|
|
|
+ uiZ.v64 =
|
|
|
+ packToF128UI64(
|
|
|
+ (softfloat_roundingMode == softfloat_round_min), 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/s_mulAddF128.c ****/
|
|
|
+/**** start inlining ../../source/softfloat_state.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifndef THREAD_LOCAL
|
|
|
+#define THREAD_LOCAL
|
|
|
+#endif
|
|
|
+
|
|
|
+THREAD_LOCAL uint_fast8_t softfloat_roundingMode = softfloat_round_near_even;
|
|
|
+THREAD_LOCAL uint_fast8_t softfloat_detectTininess = init_detectTininess;
|
|
|
+THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags = 0;
|
|
|
+
|
|
|
+THREAD_LOCAL uint_fast8_t extF80_roundingPrecision = 80;
|
|
|
+
|
|
|
+/**** ended inlining ../../source/softfloat_state.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t ui32_to_f16( uint32_t a )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 u;
|
|
|
+ uint_fast16_t sig;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a ) - 21;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF16UI(
|
|
|
+ 0, 0x18 - shiftDist, (uint_fast16_t) a<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 4;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0)
|
|
|
+ ? a>>(-shiftDist) | ((uint32_t) (a<<(shiftDist & 31)) != 0)
|
|
|
+ : (uint_fast16_t) a<<shiftDist;
|
|
|
+ return softfloat_roundPackToF16( 0, 0x1C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t ui32_to_f32( uint32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uZ.ui = 0;
|
|
|
+ return uZ.f;
|
|
|
+ }
|
|
|
+ if ( a & 0x80000000 ) {
|
|
|
+ return softfloat_roundPackToF32( 0, 0x9D, a>>1 | (a & 1) );
|
|
|
+ } else {
|
|
|
+ return softfloat_normRoundPackToF32( 0, 0x9C, a );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t ui32_to_f64( uint32_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uiZ = 0;
|
|
|
+ } else {
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a ) + 21;
|
|
|
+ uiZ =
|
|
|
+ packToF64UI( 0, 0x432 - shiftDist, (uint_fast64_t) a<<shiftDist );
|
|
|
+ }
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t ui32_to_extF80( uint32_t a )
|
|
|
+{
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a );
|
|
|
+ uiZ64 = 0x401E - shiftDist;
|
|
|
+ a <<= shiftDist;
|
|
|
+ }
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = (uint_fast64_t) a<<32;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void ui32_to_extF80M( uint32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = ui32_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void ui32_to_extF80M( uint32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t sigZ;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uiZ64 = 0;
|
|
|
+ sigZ = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a );
|
|
|
+ uiZ64 = packToExtF80UI64( 0, 0x401E - shiftDist );
|
|
|
+ sigZ = (uint64_t) (a<<shiftDist)<<32;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = sigZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t ui32_to_f128( uint32_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ64;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a ) + 17;
|
|
|
+ uiZ64 =
|
|
|
+ packToF128UI64(
|
|
|
+ 0, 0x402E - shiftDist, (uint_fast64_t) a<<shiftDist );
|
|
|
+ }
|
|
|
+ uZ.ui.v64 = uiZ64;
|
|
|
+ uZ.ui.v0 = 0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/ui32_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void ui32_to_f128M( uint32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = ui32_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void ui32_to_f128M( uint32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr, uiZ96, uiZ64;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ uint64_t normA;
|
|
|
+
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ uiZ96 = 0;
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( a ) + 17;
|
|
|
+ normA = (uint64_t) a<<shiftDist;
|
|
|
+ uiZ96 = packToF128UI96( 0, 0x402E - shiftDist, normA>>32 );
|
|
|
+ uiZ64 = normA;
|
|
|
+ }
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = uiZ64;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui32_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t ui64_to_f16( uint64_t a )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 u;
|
|
|
+ uint_fast16_t sig;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a ) - 53;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF16UI(
|
|
|
+ 0, 0x18 - shiftDist, (uint_fast16_t) a<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 4;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0) ? softfloat_shortShiftRightJam64( a, -shiftDist )
|
|
|
+ : (uint_fast16_t) a<<shiftDist;
|
|
|
+ return softfloat_roundPackToF16( 0, 0x1C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t ui64_to_f32( uint64_t a )
|
|
|
+{
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui32_f32 u;
|
|
|
+ uint_fast32_t sig;
|
|
|
+
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a ) - 40;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF32UI(
|
|
|
+ 0, 0x95 - shiftDist, (uint_fast32_t) a<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 7;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0) ? softfloat_shortShiftRightJam64( a, -shiftDist )
|
|
|
+ : (uint_fast32_t) a<<shiftDist;
|
|
|
+ return softfloat_roundPackToF32( 0, 0x9C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t ui64_to_f64( uint64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uZ.ui = 0;
|
|
|
+ return uZ.f;
|
|
|
+ }
|
|
|
+ if ( a & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF64(
|
|
|
+ 0, 0x43D, softfloat_shortShiftRightJam64( a, 1 ) );
|
|
|
+ } else {
|
|
|
+ return softfloat_normRoundPackToF64( 0, 0x43C, a );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t ui64_to_extF80( uint64_t a )
|
|
|
+{
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a );
|
|
|
+ uiZ64 = 0x403E - shiftDist;
|
|
|
+ a <<= shiftDist;
|
|
|
+ }
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = a;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void ui64_to_extF80M( uint64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = ui64_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void ui64_to_extF80M( uint64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t sigZ;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uiZ64 = 0;
|
|
|
+ sigZ = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a );
|
|
|
+ uiZ64 = packToExtF80UI64( 0, 0x403E - shiftDist );
|
|
|
+ sigZ = a<<shiftDist;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = sigZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t ui64_to_f128( uint64_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ64, uiZ0;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct uint128 zSig;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uiZ64 = 0;
|
|
|
+ uiZ0 = 0;
|
|
|
+ } else {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a ) + 49;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ zSig.v64 = a<<(shiftDist - 64);
|
|
|
+ zSig.v0 = 0;
|
|
|
+ } else {
|
|
|
+ zSig = softfloat_shortShiftLeft128( 0, a, shiftDist );
|
|
|
+ }
|
|
|
+ uiZ64 = packToF128UI64( 0, 0x406E - shiftDist, zSig.v64 );
|
|
|
+ uiZ0 = zSig.v0;
|
|
|
+ }
|
|
|
+ uZ.ui.v64 = uiZ64;
|
|
|
+ uZ.ui.v0 = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/ui64_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void ui64_to_f128M( uint64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = ui64_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void ui64_to_f128M( uint64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr, uiZ96, uiZ64;
|
|
|
+ uint_fast8_t shiftDist;
|
|
|
+ uint32_t *ptr;
|
|
|
+
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ uiZ96 = 0;
|
|
|
+ uiZ64 = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+ if ( a ) {
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( a ) + 17;
|
|
|
+ if ( shiftDist < 32 ) {
|
|
|
+ ptr = zWPtr + indexMultiwordHi( 4, 3 );
|
|
|
+ ptr[indexWord( 3, 2 )] = 0;
|
|
|
+ ptr[indexWord( 3, 1 )] = a>>32;
|
|
|
+ ptr[indexWord( 3, 0 )] = a;
|
|
|
+ softfloat_shortShiftLeft96M( ptr, shiftDist, ptr );
|
|
|
+ ptr[indexWordHi( 3 )] =
|
|
|
+ packToF128UI96( 0, 0x404E - shiftDist, ptr[indexWordHi( 3 )] );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ a <<= shiftDist - 32;
|
|
|
+ uiZ96 = packToF128UI96( 0, 0x404E - shiftDist, a>>32 );
|
|
|
+ uiZ64 = a;
|
|
|
+ }
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = uiZ64;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/ui64_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t i32_to_f16( int32_t a )
|
|
|
+{
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 u;
|
|
|
+ uint_fast16_t sig;
|
|
|
+
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA ) - 21;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF16UI(
|
|
|
+ sign, 0x18 - shiftDist, (uint_fast16_t) absA<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 4;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0)
|
|
|
+ ? absA>>(-shiftDist)
|
|
|
+ | ((uint32_t) (absA<<(shiftDist & 31)) != 0)
|
|
|
+ : (uint_fast16_t) absA<<shiftDist;
|
|
|
+ return softfloat_roundPackToF16( sign, 0x1C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t i32_to_f32( int32_t a )
|
|
|
+{
|
|
|
+ bool sign;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+ uint_fast32_t absA;
|
|
|
+
|
|
|
+ sign = (a < 0);
|
|
|
+ if ( ! (a & 0x7FFFFFFF) ) {
|
|
|
+ uZ.ui = sign ? packToF32UI( 1, 0x9E, 0 ) : 0;
|
|
|
+ return uZ.f;
|
|
|
+ }
|
|
|
+ absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;
|
|
|
+ return softfloat_normRoundPackToF32( sign, 0x9C, absA );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t i32_to_f64( int32_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uiZ = 0;
|
|
|
+ } else {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA ) + 21;
|
|
|
+ uiZ =
|
|
|
+ packToF64UI(
|
|
|
+ sign, 0x432 - shiftDist, (uint_fast64_t) absA<<shiftDist );
|
|
|
+ }
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t i32_to_extF80( int32_t a )
|
|
|
+{
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast32_t absA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ absA = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA );
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x401E - shiftDist );
|
|
|
+ absA <<= shiftDist;
|
|
|
+ }
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = (uint_fast64_t) absA<<32;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void i32_to_extF80M( int32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = i32_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void i32_to_extF80M( int32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t sigZ;
|
|
|
+ bool sign;
|
|
|
+ uint32_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uiZ64 = 0;
|
|
|
+ sigZ = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint32_t) a : (uint32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA );
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x401E - shiftDist );
|
|
|
+ sigZ = (uint64_t) (absA<<shiftDist)<<32;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = sigZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t i32_to_f128( int32_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ64;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast32_t) a : (uint_fast32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA ) + 17;
|
|
|
+ uiZ64 =
|
|
|
+ packToF128UI64(
|
|
|
+ sign, 0x402E - shiftDist, (uint_fast64_t) absA<<shiftDist );
|
|
|
+ }
|
|
|
+ uZ.ui.v64 = uiZ64;
|
|
|
+ uZ.ui.v0 = 0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/i32_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void i32_to_f128M( int32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = i32_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void i32_to_f128M( int32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint32_t uiZ96, uiZ64;
|
|
|
+ bool sign;
|
|
|
+ uint32_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ uint64_t normAbsA;
|
|
|
+
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ uiZ96 = 0;
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint32_t) a : (uint32_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros32( absA ) + 17;
|
|
|
+ normAbsA = (uint64_t) absA<<shiftDist;
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x402E - shiftDist, normAbsA>>32 );
|
|
|
+ uiZ64 = normAbsA;
|
|
|
+ }
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = uiZ64;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i32_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t i64_to_f16( int64_t a )
|
|
|
+{
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui16_f16 u;
|
|
|
+ uint_fast16_t sig;
|
|
|
+
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast64_t) a : (uint_fast64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA ) - 53;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF16UI(
|
|
|
+ sign, 0x18 - shiftDist, (uint_fast16_t) absA<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 4;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0)
|
|
|
+ ? softfloat_shortShiftRightJam64( absA, -shiftDist )
|
|
|
+ : (uint_fast16_t) absA<<shiftDist;
|
|
|
+ return softfloat_roundPackToF16( sign, 0x1C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t i64_to_f32( int64_t a )
|
|
|
+{
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union ui32_f32 u;
|
|
|
+ uint_fast32_t sig;
|
|
|
+
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast64_t) a : (uint_fast64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA ) - 40;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ u.ui =
|
|
|
+ a ? packToF32UI(
|
|
|
+ sign, 0x95 - shiftDist, (uint_fast32_t) absA<<shiftDist )
|
|
|
+ : 0;
|
|
|
+ return u.f;
|
|
|
+ } else {
|
|
|
+ shiftDist += 7;
|
|
|
+ sig =
|
|
|
+ (shiftDist < 0)
|
|
|
+ ? softfloat_shortShiftRightJam64( absA, -shiftDist )
|
|
|
+ : (uint_fast32_t) absA<<shiftDist;
|
|
|
+ return softfloat_roundPackToF32( sign, 0x9C - shiftDist, sig );
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t i64_to_f64( int64_t a )
|
|
|
+{
|
|
|
+ bool sign;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+ uint_fast64_t absA;
|
|
|
+
|
|
|
+ sign = (a < 0);
|
|
|
+ if ( ! (a & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) {
|
|
|
+ uZ.ui = sign ? packToF64UI( 1, 0x43E, 0 ) : 0;
|
|
|
+ return uZ.f;
|
|
|
+ }
|
|
|
+ absA = sign ? -(uint_fast64_t) a : (uint_fast64_t) a;
|
|
|
+ return softfloat_normRoundPackToF64( sign, 0x43C, absA );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t i64_to_extF80( int64_t a )
|
|
|
+{
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t absA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ uiZ64 = 0;
|
|
|
+ absA = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast64_t) a : (uint_fast64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA );
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x403E - shiftDist );
|
|
|
+ absA <<= shiftDist;
|
|
|
+ }
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = absA;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void i64_to_extF80M( int64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = i64_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void i64_to_extF80M( int64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t sigZ;
|
|
|
+ bool sign;
|
|
|
+ uint64_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uiZ64 = 0;
|
|
|
+ sigZ = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint64_t) a : (uint64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA );
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x403E - shiftDist );
|
|
|
+ sigZ = absA<<shiftDist;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = sigZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t i64_to_f128( int64_t a )
|
|
|
+{
|
|
|
+ uint_fast64_t uiZ64, uiZ0;
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t absA;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ struct uint128 zSig;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ if ( ! a ) {
|
|
|
+ uiZ64 = 0;
|
|
|
+ uiZ0 = 0;
|
|
|
+ } else {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint_fast64_t) a : (uint_fast64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA ) + 49;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ zSig.v64 = absA<<(shiftDist - 64);
|
|
|
+ zSig.v0 = 0;
|
|
|
+ } else {
|
|
|
+ zSig = softfloat_shortShiftLeft128( 0, absA, shiftDist );
|
|
|
+ }
|
|
|
+ uiZ64 = packToF128UI64( sign, 0x406E - shiftDist, zSig.v64 );
|
|
|
+ uiZ0 = zSig.v0;
|
|
|
+ }
|
|
|
+ uZ.ui.v64 = uiZ64;
|
|
|
+ uZ.ui.v0 = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/i64_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void i64_to_f128M( int64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = i64_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void i64_to_f128M( int64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint32_t uiZ96, uiZ64;
|
|
|
+ bool sign;
|
|
|
+ uint64_t absA;
|
|
|
+ uint_fast8_t shiftDist;
|
|
|
+ uint32_t *ptr;
|
|
|
+
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ uiZ96 = 0;
|
|
|
+ uiZ64 = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+ if ( a ) {
|
|
|
+ sign = (a < 0);
|
|
|
+ absA = sign ? -(uint64_t) a : (uint64_t) a;
|
|
|
+ shiftDist = softfloat_countLeadingZeros64( absA ) + 17;
|
|
|
+ if ( shiftDist < 32 ) {
|
|
|
+ ptr = zWPtr + indexMultiwordHi( 4, 3 );
|
|
|
+ ptr[indexWord( 3, 2 )] = 0;
|
|
|
+ ptr[indexWord( 3, 1 )] = absA>>32;
|
|
|
+ ptr[indexWord( 3, 0 )] = absA;
|
|
|
+ softfloat_shortShiftLeft96M( ptr, shiftDist, ptr );
|
|
|
+ ptr[indexWordHi( 3 )] =
|
|
|
+ packToF128UI96(
|
|
|
+ sign, 0x404E - shiftDist, ptr[indexWordHi( 3 )] );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ absA <<= shiftDist - 32;
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x404E - shiftDist, absA>>32 );
|
|
|
+ uiZ64 = absA;
|
|
|
+ }
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = uiZ64;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/i64_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f16_to_ui32( float16_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ uint_fast32_t sig32;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ frac ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = frac;
|
|
|
+ if ( exp ) {
|
|
|
+ sig32 |= 0x0400;
|
|
|
+ shiftDist = exp - 0x19;
|
|
|
+ if ( (0 <= shiftDist) && ! sign ) {
|
|
|
+ return sig32<<shiftDist;
|
|
|
+ }
|
|
|
+ shiftDist = exp - 0x0D;
|
|
|
+ if ( 0 < shiftDist ) sig32 <<= shiftDist;
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI32( sign, sig32, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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, 2018 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f16_to_ui64( float16_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ uint_fast32_t sig32;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+#ifndef SOFTFLOAT_FAST_INT64
|
|
|
+ uint32_t extSig[3];
|
|
|
+#endif
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ frac ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = frac;
|
|
|
+ if ( exp ) {
|
|
|
+ sig32 |= 0x0400;
|
|
|
+ shiftDist = exp - 0x19;
|
|
|
+ if ( (0 <= shiftDist) && ! sign ) {
|
|
|
+ return sig32<<shiftDist;
|
|
|
+ }
|
|
|
+ shiftDist = exp - 0x0D;
|
|
|
+ if ( 0 < shiftDist ) sig32 <<= shiftDist;
|
|
|
+ }
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ return
|
|
|
+ softfloat_roundToUI64(
|
|
|
+ sign, sig32>>12, (uint_fast64_t) sig32<<52, roundingMode, exact );
|
|
|
+#else
|
|
|
+ extSig[indexWord( 3, 2 )] = 0;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig32>>12;
|
|
|
+ extSig[indexWord( 3, 0 )] = sig32<<20;
|
|
|
+ return softfloat_roundMToUI64( sign, extSig, roundingMode, exact );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f16_to_i32( float16_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast32_t sig32;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ frac ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = frac;
|
|
|
+ if ( exp ) {
|
|
|
+ sig32 |= 0x0400;
|
|
|
+ shiftDist = exp - 0x19;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ sig32 <<= shiftDist;
|
|
|
+ return sign ? -sig32 : sig32;
|
|
|
+ }
|
|
|
+ shiftDist = exp - 0x0D;
|
|
|
+ if ( 0 < shiftDist ) sig32 <<= shiftDist;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundToI32(
|
|
|
+ sign, (uint_fast32_t) sig32, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f16_to_i64( float16_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast32_t sig32;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ frac ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = frac;
|
|
|
+ if ( exp ) {
|
|
|
+ sig32 |= 0x0400;
|
|
|
+ shiftDist = exp - 0x19;
|
|
|
+ if ( 0 <= shiftDist ) {
|
|
|
+ sig32 <<= shiftDist;
|
|
|
+ return sign ? -sig32 : sig32;
|
|
|
+ }
|
|
|
+ shiftDist = exp - 0x0D;
|
|
|
+ if ( 0 < shiftDist ) sig32 <<= shiftDist;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundToI32(
|
|
|
+ sign, (uint_fast32_t) sig32, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f16_to_ui32_r_minMag( float16_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t alignedSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = exp - 0x0F;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( exact && (exp | frac) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ if ( sign || (exp == 0x1F) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x1F) && frac ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ alignedSig = (uint_fast32_t) (frac | 0x0400)<<shiftDist;
|
|
|
+ if ( exact && (alignedSig & 0x3FF) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return alignedSig>>10;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f16_to_ui64_r_minMag( float16_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t alignedSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = exp - 0x0F;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( exact && (exp | frac) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ if ( sign || (exp == 0x1F) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x1F) && frac ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ alignedSig = (uint_fast32_t) (frac | 0x0400)<<shiftDist;
|
|
|
+ if ( exact && (alignedSig & 0x3FF) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return alignedSig>>10;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f16_to_i32_r_minMag( float16_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t alignedSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = exp - 0x0F;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( exact && (exp | frac) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x1F) && frac ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ alignedSig = (int_fast32_t) (frac | 0x0400)<<shiftDist;
|
|
|
+ if ( exact && (alignedSig & 0x3FF) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ alignedSig >>= 10;
|
|
|
+ return sign ? -alignedSig : alignedSig;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f16_to_i64_r_minMag( float16_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ int_fast8_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t alignedSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = exp - 0x0F;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( exact && (exp | frac) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x1F) && frac ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ alignedSig = (int_fast32_t) (frac | 0x0400)<<shiftDist;
|
|
|
+ if ( exact && (alignedSig & 0x3FF) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ alignedSig >>= 10;
|
|
|
+ return sign ? -alignedSig : alignedSig;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f16_to_f32( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = packToF32UI( sign, exp + 0x70, (uint_fast32_t) frac<<13 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f16_to_f64( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = packToF64UI( sign, exp + 0x3F0, (uint_fast64_t) frac<<42 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t f16_to_extF80( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ } else {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3FF0 );
|
|
|
+ uiZ0 = (uint_fast64_t) (frac | 0x0400)<<53;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f16_to_extF80M( float16_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f16_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f16_to_extF80M( float16_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint32_t uiZ32;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ32 = 0x80000000;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ32 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3FF0 );
|
|
|
+ uiZ32 = 0x80000000 | (uint32_t) frac<<21;
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = (uint64_t) uiZ32<<32;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f16_to_f128( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF128UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ.v64 = packToF128UI64( sign, exp + 0x3FF0, (uint_fast64_t) frac<<38 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/f16_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f16_to_f128M( float16_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f16_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f16_to_f128M( float16_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint16_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint16_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ96;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF16UI( uiA );
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ frac = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x1F ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f16UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToF128M( &commonNaN, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ96 = packToF128UI96( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ96 = packToF128UI96( sign, exp + 0x3FF0, (uint32_t) frac<<6 );
|
|
|
+ uiZ:
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/f16_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_roundToInt( float16_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ int_fast8_t exp;
|
|
|
+ uint_fast16_t uiZ, lastBitMask, roundBitsMask;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp <= 0xE ) {
|
|
|
+ if ( !(uint16_t) (uiA<<1) ) return a;
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ uiZ = uiA & packToF16UI( 1, 0, 0 );
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !fracF16UI( uiA ) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0xE ) uiZ |= packToF16UI( 0, 0xF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( uiZ ) uiZ = packToF16UI( 1, 0xF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !uiZ ) uiZ = packToF16UI( 0, 0xF, 0 );
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ uiZ |= packToF16UI( 0, 0xF, 0 );
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x19 <= exp ) {
|
|
|
+ if ( (exp == 0x1F) && fracF16UI( uiA ) ) {
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = uiA;
|
|
|
+ lastBitMask = (uint_fast16_t) 1<<(0x19 - exp);
|
|
|
+ roundBitsMask = lastBitMask - 1;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ if ( !(uiZ & roundBitsMask) ) uiZ &= ~lastBitMask;
|
|
|
+ } else if (
|
|
|
+ roundingMode
|
|
|
+ == (signF16UI( uiZ ) ? softfloat_round_min : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ uiZ += roundBitsMask;
|
|
|
+ }
|
|
|
+ uiZ &= ~roundBitsMask;
|
|
|
+ if ( uiZ != uiA ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) uiZ |= lastBitMask;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/f16_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_add( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1)
|
|
|
+ float16_t (*magsFuncPtr)( uint_fast16_t, uint_fast16_t );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
|
|
|
+ if ( signF16UI( uiA ^ uiB ) ) {
|
|
|
+ return softfloat_subMagsF16( uiA, uiB );
|
|
|
+ } else {
|
|
|
+ return softfloat_addMagsF16( uiA, uiB );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ signF16UI( uiA ^ uiB ) ? softfloat_subMagsF16 : softfloat_addMagsF16;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_add.c ****/
|
|
|
+/**** start inlining ../../source/f16_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_sub( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1)
|
|
|
+ float16_t (*magsFuncPtr)( uint_fast16_t, uint_fast16_t );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
|
|
|
+ if ( signF16UI( uiA ^ uiB ) ) {
|
|
|
+ return softfloat_addMagsF16( uiA, uiB );
|
|
|
+ } else {
|
|
|
+ return softfloat_subMagsF16( uiA, uiB );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ signF16UI( uiA ^ uiB ) ? softfloat_addMagsF16 : softfloat_subMagsF16;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_sub.c ****/
|
|
|
+/**** start inlining ../../source/f16_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_mul( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast16_t magBits;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ int_fast8_t expZ;
|
|
|
+ uint_fast32_t sig32Z;
|
|
|
+ uint_fast16_t sigZ, uiZ;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA || ((expB == 0x1F) && sigB) ) goto propagateNaN;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0xF;
|
|
|
+ sigA = (sigA | 0x0400)<<4;
|
|
|
+ sigB = (sigB | 0x0400)<<5;
|
|
|
+ sig32Z = (uint_fast32_t) sigA * sigB;
|
|
|
+ sigZ = sig32Z>>16;
|
|
|
+ if ( sig32Z & 0xFFFF ) sigZ |= 1;
|
|
|
+ if ( sigZ < 0x4000 ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infArg:
|
|
|
+ if ( ! magBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( signZ, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF16UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_mul.c ****/
|
|
|
+/**** start inlining ../../source/f16_mulAdd.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_mulAdd( float16_t a, float16_t b, float16_t c )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ union ui16_f16 uC;
|
|
|
+ uint_fast16_t uiC;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ uC.f = c;
|
|
|
+ uiC = uC.ui;
|
|
|
+ return softfloat_mulAddF16( uiA, uiB, uiC, 0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_mulAdd.c ****/
|
|
|
+/**** start inlining ../../source/f16_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecip_1k0s[];
|
|
|
+extern const uint16_t softfloat_approxRecip_1k1s[];
|
|
|
+
|
|
|
+float16_t f16_div( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ int_fast8_t expZ;
|
|
|
+#ifdef SOFTFLOAT_FAST_DIV32TO16
|
|
|
+ uint_fast32_t sig32A;
|
|
|
+ uint_fast16_t sigZ;
|
|
|
+#else
|
|
|
+ int index;
|
|
|
+ uint16_t r0;
|
|
|
+ uint_fast16_t sigZ, rem;
|
|
|
+#endif
|
|
|
+ uint_fast16_t uiZ;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) {
|
|
|
+ if ( ! (expA | sigA) ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0xE;
|
|
|
+ sigA |= 0x0400;
|
|
|
+ sigB |= 0x0400;
|
|
|
+#ifdef SOFTFLOAT_FAST_DIV32TO16
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ sig32A = (uint_fast32_t) sigA<<15;
|
|
|
+ } else {
|
|
|
+ sig32A = (uint_fast32_t) sigA<<14;
|
|
|
+ }
|
|
|
+ sigZ = sig32A / sigB;
|
|
|
+ if ( ! (sigZ & 7) ) sigZ |= ((uint_fast32_t) sigB * sigZ != sig32A);
|
|
|
+#else
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ sigA <<= 5;
|
|
|
+ } else {
|
|
|
+ sigA <<= 4;
|
|
|
+ }
|
|
|
+ index = sigB>>6 & 0xF;
|
|
|
+ r0 = softfloat_approxRecip_1k0s[index]
|
|
|
+ - (((uint_fast32_t) softfloat_approxRecip_1k1s[index]
|
|
|
+ * (sigB & 0x3F))
|
|
|
+ >>10);
|
|
|
+ sigZ = ((uint_fast32_t) sigA * r0)>>16;
|
|
|
+ rem = (sigA<<10) - sigZ * sigB;
|
|
|
+ sigZ += (rem * (uint_fast32_t) r0)>>26;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ ++sigZ;
|
|
|
+ if ( ! (sigZ & 7) ) {
|
|
|
+ sigZ &= ~1;
|
|
|
+ rem = (sigA<<10) - sigZ * sigB;
|
|
|
+ if ( rem & 0x8000 ) {
|
|
|
+ sigZ -= 2;
|
|
|
+ } else {
|
|
|
+ if ( rem ) sigZ |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ return softfloat_roundPackToF16( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ = packToF16UI( signZ, 0x1F, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF16UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_div.c ****/
|
|
|
+/**** start inlining ../../source/f16_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f16_rem( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ int_fast8_t expB;
|
|
|
+ uint_fast16_t sigB;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ uint16_t rem;
|
|
|
+ int_fast8_t expDiff;
|
|
|
+ uint_fast16_t q;
|
|
|
+ uint32_t recip32, q32;
|
|
|
+ uint16_t altRem, meanRem;
|
|
|
+ bool signRem;
|
|
|
+ uint_fast16_t uiZ;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ expB = expF16UI( uiB );
|
|
|
+ sigB = fracF16UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA || ((expB == 0x1F) && sigB) ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( expB == 0x1F ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto invalid;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ rem = sigA | 0x0400;
|
|
|
+ sigB |= 0x0400;
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff < -1 ) return a;
|
|
|
+ sigB <<= 3;
|
|
|
+ if ( expDiff ) {
|
|
|
+ rem <<= 2;
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ rem <<= 3;
|
|
|
+ q = (sigB <= rem);
|
|
|
+ if ( q ) rem -= sigB;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( (uint_fast32_t) sigB<<21 );
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Changing the shift of `rem' here requires also changing the initial
|
|
|
+ | subtraction from `expDiff'.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ rem <<= 4;
|
|
|
+ expDiff -= 31;
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | The scale of `sigB' affects how many bits are obtained during each
|
|
|
+ | cycle of the loop. Currently this is 29 bits per loop iteration,
|
|
|
+ | which is believed to be the maximum possible.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigB <<= 3;
|
|
|
+ for (;;) {
|
|
|
+ q32 = (rem * (uint_fast64_t) recip32)>>16;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ rem = -((uint_fast16_t) q32 * sigB);
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -30 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q32 >>= ~expDiff & 31;
|
|
|
+ q = q32;
|
|
|
+ rem = (rem<<(expDiff + 30)) - q * sigB;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ do {
|
|
|
+ altRem = rem;
|
|
|
+ ++q;
|
|
|
+ rem -= sigB;
|
|
|
+ } while ( ! (rem & 0x8000) );
|
|
|
+ meanRem = rem + altRem;
|
|
|
+ if ( (meanRem & 0x8000) || (! meanRem && (q & 1)) ) rem = altRem;
|
|
|
+ signRem = signA;
|
|
|
+ if ( 0x8000 <= rem ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ rem = -rem;
|
|
|
+ }
|
|
|
+ return softfloat_normRoundPackToF16( signRem, expB, rem );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_rem.c ****/
|
|
|
+/**** start inlining ../../source/f16_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k0s[];
|
|
|
+extern const uint16_t softfloat_approxRecipSqrt_1k1s[];
|
|
|
+
|
|
|
+float16_t f16_sqrt( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast8_t expA;
|
|
|
+ uint_fast16_t sigA, uiZ;
|
|
|
+ struct exp8_sig16 normExpSig;
|
|
|
+ int_fast8_t expZ;
|
|
|
+ int index;
|
|
|
+ uint_fast16_t r0;
|
|
|
+ uint_fast32_t ESqrR0;
|
|
|
+ uint16_t sigma0;
|
|
|
+ uint_fast16_t recipSqrt16, sigZ, shiftedSigZ;
|
|
|
+ uint16_t negRem;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ expA = expF16UI( uiA );
|
|
|
+ sigA = fracF16UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x1F ) {
|
|
|
+ if ( sigA ) {
|
|
|
+ uiZ = softfloat_propagateNaNF16UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! signA ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signA ) {
|
|
|
+ if ( ! (expA | sigA) ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF16Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0xF)>>1) + 0xE;
|
|
|
+ expA &= 1;
|
|
|
+ sigA |= 0x0400;
|
|
|
+ index = (sigA>>6 & 0xE) + expA;
|
|
|
+ r0 = softfloat_approxRecipSqrt_1k0s[index]
|
|
|
+ - (((uint_fast32_t) softfloat_approxRecipSqrt_1k1s[index]
|
|
|
+ * (sigA & 0x7F))
|
|
|
+ >>11);
|
|
|
+ ESqrR0 = ((uint_fast32_t) r0 * r0)>>1;
|
|
|
+ if ( expA ) ESqrR0 >>= 1;
|
|
|
+ sigma0 = ~(uint_fast16_t) ((ESqrR0 * sigA)>>16);
|
|
|
+ recipSqrt16 = r0 + (((uint_fast32_t) r0 * sigma0)>>25);
|
|
|
+ if ( ! (recipSqrt16 & 0x8000) ) recipSqrt16 = 0x8000;
|
|
|
+ sigZ = ((uint_fast32_t) (sigA<<5) * recipSqrt16)>>16;
|
|
|
+ if ( expA ) sigZ >>= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ ++sigZ;
|
|
|
+ if ( ! (sigZ & 7) ) {
|
|
|
+ shiftedSigZ = sigZ>>1;
|
|
|
+ negRem = shiftedSigZ * shiftedSigZ;
|
|
|
+ sigZ &= ~1;
|
|
|
+ if ( negRem & 0x8000 ) {
|
|
|
+ sigZ |= 1;
|
|
|
+ } else {
|
|
|
+ if ( negRem ) --sigZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( 0, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF16UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/f16_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_eq( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF16UI( uiA ) || softfloat_isSigNaNF16UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! (uint16_t) ((uiA | uiB)<<1);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_eq.c ****/
|
|
|
+/**** start inlining ../../source/f16_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_le( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA || ! (uint16_t) ((uiA | uiB)<<1)
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_le.c ****/
|
|
|
+/**** start inlining ../../source/f16_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_lt( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA && ((uint16_t) ((uiA | uiB)<<1) != 0)
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_lt.c ****/
|
|
|
+/**** start inlining ../../source/f16_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_eq_signaling( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! (uint16_t) ((uiA | uiB)<<1);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/f16_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_le_quiet( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF16UI( uiA ) || softfloat_isSigNaNF16UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA || ! (uint16_t) ((uiA | uiB)<<1)
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f16_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_lt_quiet( float16_t a, float16_t b )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+ uint_fast16_t uiA;
|
|
|
+ union ui16_f16 uB;
|
|
|
+ uint_fast16_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF16UI( uiA ) || isNaNF16UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF16UI( uiA ) || softfloat_isSigNaNF16UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF16UI( uiA );
|
|
|
+ signB = signF16UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA && ((uint16_t) ((uiA | uiB)<<1) != 0)
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f16_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f16_isSignalingNaN( float16_t a )
|
|
|
+{
|
|
|
+ union ui16_f16 uA;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ return softfloat_isSigNaNF16UI( uA.ui );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f16_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f32_to_ui32( float32_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)
|
|
|
+ if ( (exp == 0xFF) && sig ) {
|
|
|
+#if (ui32_fromNaN == ui32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (ui32_fromNaN == ui32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return ui32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= 0x00800000;
|
|
|
+ sig64 = (uint_fast64_t) sig<<32;
|
|
|
+ shiftDist = 0xAA - exp;
|
|
|
+ if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ return softfloat_roundToUI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f32_to_ui64( float32_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ uint_fast64_t sig64, extra;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+#else
|
|
|
+ uint32_t extSig[3];
|
|
|
+#endif
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0xBE - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= 0x00800000;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ sig64 = (uint_fast64_t) sig<<40;
|
|
|
+ extra = 0;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sig64, 0, shiftDist );
|
|
|
+ sig64 = sig64Extra.v;
|
|
|
+ extra = sig64Extra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI64( sign, sig64, extra, roundingMode, exact );
|
|
|
+#else
|
|
|
+ extSig[indexWord( 3, 2 )] = sig<<8;
|
|
|
+ extSig[indexWord( 3, 1 )] = 0;
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist ) softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ return softfloat_roundMToUI64( sign, extSig, roundingMode, exact );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f32_to_i32( float32_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)
|
|
|
+ if ( (exp == 0xFF) && sig ) {
|
|
|
+#if (i32_fromNaN == i32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (i32_fromNaN == i32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return i32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= 0x00800000;
|
|
|
+ sig64 = (uint_fast64_t) sig<<32;
|
|
|
+ shiftDist = 0xAA - exp;
|
|
|
+ if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ return softfloat_roundToI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f32_to_i64( float32_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ uint_fast64_t sig64, extra;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+#else
|
|
|
+ uint32_t extSig[3];
|
|
|
+#endif
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0xBE - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= 0x00800000;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ sig64 = (uint_fast64_t) sig<<40;
|
|
|
+ extra = 0;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sig64, 0, shiftDist );
|
|
|
+ sig64 = sig64Extra.v;
|
|
|
+ extra = sig64Extra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToI64( sign, sig64, extra, roundingMode, exact );
|
|
|
+#else
|
|
|
+ extSig[indexWord( 3, 2 )] = sig<<8;
|
|
|
+ extSig[indexWord( 3, 1 )] = 0;
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist ) softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ return softfloat_roundMToI64( sign, extSig, roundingMode, exact );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f32_to_ui32_r_minMag( float32_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x9E - exp;
|
|
|
+ if ( 32 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ if ( sign || (shiftDist < 0) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = (sig | 0x00800000)<<8;
|
|
|
+ z = sig>>shiftDist;
|
|
|
+ if ( exact && (z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f32_to_ui64_r_minMag( float32_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t sig64, z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0xBE - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ if ( sign || (shiftDist < 0) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig |= 0x00800000;
|
|
|
+ sig64 = (uint_fast64_t) sig<<40;
|
|
|
+ z = sig64>>shiftDist;
|
|
|
+ shiftDist = 40 - shiftDist;
|
|
|
+ if ( exact && (shiftDist < 0) && (uint32_t) (sig<<(shiftDist & 31)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f32_to_i32_r_minMag( float32_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x9E - exp;
|
|
|
+ if ( 32 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( uiA == packToF32UI( 1, 0x9E, 0 ) ) return -0x7FFFFFFF - 1;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = (sig | 0x00800000)<<8;
|
|
|
+ absZ = sig>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast32_t) absZ<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f32_to_i64_r_minMag( float32_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast64_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ sig = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0xBE - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( uiA == packToF32UI( 1, 0xBE, 0 ) ) {
|
|
|
+ return -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0xFF) && sig ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig |= 0x00800000;
|
|
|
+ sig64 = (uint_fast64_t) sig<<40;
|
|
|
+ absZ = sig64>>shiftDist;
|
|
|
+ shiftDist = 40 - shiftDist;
|
|
|
+ if ( exact && (shiftDist < 0) && (uint32_t) (sig<<(shiftDist & 31)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f32_to_f16( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ, frac16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac16 = frac>>9 | ((frac & 0x1FF) != 0);
|
|
|
+ if ( ! (exp | frac16) ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ return softfloat_roundPackToF16( sign, exp - 0x71, frac16 | 0x4000 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f32_to_f64( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = packToF64UI( sign, exp + 0x380, (uint_fast64_t) frac<<29 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t f32_to_extF80( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ } else {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3F80 );
|
|
|
+ uiZ0 = (uint_fast64_t) (frac | 0x00800000)<<40;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f32_to_extF80M( float32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f32_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f32_to_extF80M( float32_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint32_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint32_t uiZ32;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ32 = 0x80000000;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ32 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3F80 );
|
|
|
+ uiZ32 = 0x80000000 | (uint32_t) frac<<8;
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = (uint64_t) uiZ32<<32;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f32_to_f128( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF128UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ.v64 = packToF128UI64( sign, exp + 0x3F80, (uint_fast64_t) frac<<25 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/f32_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f32_to_f128M( float32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f32_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f32_to_f128M( float32_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint32_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint32_t frac, uiZ64;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ96;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ uint64_t frac64;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF32UI( uiA );
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ frac = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = 0;
|
|
|
+ if ( exp == 0xFF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f32UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToF128M( &commonNaN, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ96 = packToF128UI96( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac64 = (uint64_t) frac<<25;
|
|
|
+ uiZ96 = packToF128UI96( sign, exp + 0x3F80, frac64>>32 );
|
|
|
+ uiZ64 = frac64;
|
|
|
+ uiZ:
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = uiZ64;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/f32_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_roundToInt( float32_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast32_t uiZ, lastBitMask, roundBitsMask;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp <= 0x7E ) {
|
|
|
+ if ( !(uint32_t) (uiA<<1) ) return a;
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ uiZ = uiA & packToF32UI( 1, 0, 0 );
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !fracF32UI( uiA ) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x7E ) uiZ |= packToF32UI( 0, 0x7F, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( uiZ ) uiZ = packToF32UI( 1, 0x7F, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !uiZ ) uiZ = packToF32UI( 0, 0x7F, 0 );
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ uiZ |= packToF32UI( 0, 0x7F, 0 );
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x96 <= exp ) {
|
|
|
+ if ( (exp == 0xFF) && fracF32UI( uiA ) ) {
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = uiA;
|
|
|
+ lastBitMask = (uint_fast32_t) 1<<(0x96 - exp);
|
|
|
+ roundBitsMask = lastBitMask - 1;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ if ( !(uiZ & roundBitsMask) ) uiZ &= ~lastBitMask;
|
|
|
+ } else if (
|
|
|
+ roundingMode
|
|
|
+ == (signF32UI( uiZ ) ? softfloat_round_min : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ uiZ += roundBitsMask;
|
|
|
+ }
|
|
|
+ uiZ &= ~roundBitsMask;
|
|
|
+ if ( uiZ != uiA ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) uiZ |= lastBitMask;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/f32_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_add( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1)
|
|
|
+ float32_t (*magsFuncPtr)( uint_fast32_t, uint_fast32_t );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
|
|
|
+ if ( signF32UI( uiA ^ uiB ) ) {
|
|
|
+ return softfloat_subMagsF32( uiA, uiB );
|
|
|
+ } else {
|
|
|
+ return softfloat_addMagsF32( uiA, uiB );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ signF32UI( uiA ^ uiB ) ? softfloat_subMagsF32 : softfloat_addMagsF32;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_add.c ****/
|
|
|
+/**** start inlining ../../source/f32_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_sub( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1)
|
|
|
+ float32_t (*magsFuncPtr)( uint_fast32_t, uint_fast32_t );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL)
|
|
|
+ if ( signF32UI( uiA ^ uiB ) ) {
|
|
|
+ return softfloat_addMagsF32( uiA, uiB );
|
|
|
+ } else {
|
|
|
+ return softfloat_subMagsF32( uiA, uiB );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ signF32UI( uiA ^ uiB ) ? softfloat_addMagsF32 : softfloat_subMagsF32;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_sub.c ****/
|
|
|
+/**** start inlining ../../source/f32_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_mul( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast32_t magBits;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast32_t sigZ, uiZ;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x7F;
|
|
|
+ sigA = (sigA | 0x00800000)<<7;
|
|
|
+ sigB = (sigB | 0x00800000)<<8;
|
|
|
+ sigZ = softfloat_shortShiftRightJam64( (uint_fast64_t) sigA * sigB, 32 );
|
|
|
+ if ( sigZ < 0x40000000 ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infArg:
|
|
|
+ if ( ! magBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( signZ, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF32UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_mul.c ****/
|
|
|
+/**** start inlining ../../source/f32_mulAdd.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_mulAdd( float32_t a, float32_t b, float32_t c )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ union ui32_f32 uC;
|
|
|
+ uint_fast32_t uiC;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ uC.f = c;
|
|
|
+ uiC = uC.ui;
|
|
|
+ return softfloat_mulAddF32( uiA, uiB, uiC, 0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_mulAdd.c ****/
|
|
|
+/**** start inlining ../../source/f32_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_div( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+#ifdef SOFTFLOAT_FAST_DIV64TO32
|
|
|
+ uint_fast64_t sig64A;
|
|
|
+ uint_fast32_t sigZ;
|
|
|
+#else
|
|
|
+ uint_fast32_t sigZ;
|
|
|
+ uint_fast64_t rem;
|
|
|
+#endif
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) {
|
|
|
+ if ( ! (expA | sigA) ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x7E;
|
|
|
+ sigA |= 0x00800000;
|
|
|
+ sigB |= 0x00800000;
|
|
|
+#ifdef SOFTFLOAT_FAST_DIV64TO32
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ sig64A = (uint_fast64_t) sigA<<31;
|
|
|
+ } else {
|
|
|
+ sig64A = (uint_fast64_t) sigA<<30;
|
|
|
+ }
|
|
|
+ sigZ = sig64A / sigB;
|
|
|
+ if ( ! (sigZ & 0x3F) ) sigZ |= ((uint_fast64_t) sigB * sigZ != sig64A);
|
|
|
+#else
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ sigA <<= 8;
|
|
|
+ } else {
|
|
|
+ sigA <<= 7;
|
|
|
+ }
|
|
|
+ sigB <<= 8;
|
|
|
+ sigZ = ((uint_fast64_t) sigA * softfloat_approxRecip32_1( sigB ))>>32;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigZ += 2;
|
|
|
+ if ( (sigZ & 0x3F) < 2 ) {
|
|
|
+ sigZ &= ~3;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ rem = ((uint_fast64_t) sigA<<31) - (uint_fast64_t) sigZ * sigB;
|
|
|
+#else
|
|
|
+ rem = ((uint_fast64_t) sigA<<32) - (uint_fast64_t) (sigZ<<1) * sigB;
|
|
|
+#endif
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ sigZ -= 4;
|
|
|
+ } else {
|
|
|
+ if ( rem ) sigZ |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ = packToF32UI( signZ, 0xFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF32UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_div.c ****/
|
|
|
+/**** start inlining ../../source/f32_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_rem( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast32_t sigB;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ uint32_t rem;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint32_t q, recip32, altRem, meanRem;
|
|
|
+ bool signRem;
|
|
|
+ uint_fast32_t uiZ;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ expB = expF32UI( uiB );
|
|
|
+ sigB = fracF32UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA || ((expB == 0xFF) && sigB) ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( expB == 0xFF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto invalid;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ rem = sigA | 0x00800000;
|
|
|
+ sigB |= 0x00800000;
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff < -1 ) return a;
|
|
|
+ sigB <<= 6;
|
|
|
+ if ( expDiff ) {
|
|
|
+ rem <<= 5;
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ rem <<= 6;
|
|
|
+ q = (sigB <= rem);
|
|
|
+ if ( q ) rem -= sigB;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB<<8 );
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Changing the shift of `rem' here requires also changing the initial
|
|
|
+ | subtraction from `expDiff'.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ rem <<= 7;
|
|
|
+ expDiff -= 31;
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | The scale of `sigB' affects how many bits are obtained during each
|
|
|
+ | cycle of the loop. Currently this is 29 bits per loop iteration,
|
|
|
+ | which is believed to be the maximum possible.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigB <<= 6;
|
|
|
+ for (;;) {
|
|
|
+ q = (rem * (uint_fast64_t) recip32)>>32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ rem = -(q * (uint32_t) sigB);
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -30 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q >>= ~expDiff & 31;
|
|
|
+ rem = (rem<<(expDiff + 30)) - q * (uint32_t) sigB;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ do {
|
|
|
+ altRem = rem;
|
|
|
+ ++q;
|
|
|
+ rem -= sigB;
|
|
|
+ } while ( ! (rem & 0x80000000) );
|
|
|
+ meanRem = rem + altRem;
|
|
|
+ if ( (meanRem & 0x80000000) || (! meanRem && (q & 1)) ) rem = altRem;
|
|
|
+ signRem = signA;
|
|
|
+ if ( 0x80000000 <= rem ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ rem = -rem;
|
|
|
+ }
|
|
|
+ return softfloat_normRoundPackToF32( signRem, expB, rem );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_rem.c ****/
|
|
|
+/**** start inlining ../../source/f32_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f32_sqrt( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast32_t sigA, uiZ;
|
|
|
+ struct exp16_sig32 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint_fast32_t sigZ, shiftedSigZ;
|
|
|
+ uint32_t negRem;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ expA = expF32UI( uiA );
|
|
|
+ sigA = fracF32UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0xFF ) {
|
|
|
+ if ( sigA ) {
|
|
|
+ uiZ = softfloat_propagateNaNF32UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! signA ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signA ) {
|
|
|
+ if ( ! (expA | sigA) ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x7F)>>1) + 0x7E;
|
|
|
+ expA &= 1;
|
|
|
+ sigA = (sigA | 0x00800000)<<8;
|
|
|
+ sigZ =
|
|
|
+ ((uint_fast64_t) sigA * softfloat_approxRecipSqrt32_1( expA, sigA ))
|
|
|
+ >>32;
|
|
|
+ if ( expA ) sigZ >>= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigZ += 2;
|
|
|
+ if ( (sigZ & 0x3F) < 2 ) {
|
|
|
+ shiftedSigZ = sigZ>>2;
|
|
|
+ negRem = shiftedSigZ * shiftedSigZ;
|
|
|
+ sigZ &= ~3;
|
|
|
+ if ( negRem & 0x80000000 ) {
|
|
|
+ sigZ |= 1;
|
|
|
+ } else {
|
|
|
+ if ( negRem ) --sigZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( 0, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF32UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/f32_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_eq( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF32UI( uiA ) || softfloat_isSigNaNF32UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! (uint32_t) ((uiA | uiB)<<1);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_eq.c ****/
|
|
|
+/**** start inlining ../../source/f32_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_le( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA || ! (uint32_t) ((uiA | uiB)<<1)
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_le.c ****/
|
|
|
+/**** start inlining ../../source/f32_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_lt( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA && ((uint32_t) ((uiA | uiB)<<1) != 0)
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_lt.c ****/
|
|
|
+/**** start inlining ../../source/f32_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_eq_signaling( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! (uint32_t) ((uiA | uiB)<<1);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/f32_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_le_quiet( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF32UI( uiA ) || softfloat_isSigNaNF32UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA || ! (uint32_t) ((uiA | uiB)<<1)
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f32_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_lt_quiet( float32_t a, float32_t b )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+ uint_fast32_t uiA;
|
|
|
+ union ui32_f32 uB;
|
|
|
+ uint_fast32_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF32UI( uiA ) || isNaNF32UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF32UI( uiA ) || softfloat_isSigNaNF32UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF32UI( uiA );
|
|
|
+ signB = signF32UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB) ? signA && ((uint32_t) ((uiA | uiB)<<1) != 0)
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f32_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f32_isSignalingNaN( float32_t a )
|
|
|
+{
|
|
|
+ union ui32_f32 uA;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ return softfloat_isSigNaNF32UI( uA.ui );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f32_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f64_to_ui32( float64_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FF) && sig ) {
|
|
|
+#if (ui32_fromNaN == ui32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (ui32_fromNaN == ui32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return ui32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ shiftDist = 0x427 - exp;
|
|
|
+ if ( 0 < shiftDist ) sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ return softfloat_roundToUI32( sign, sig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f64_to_ui64( float64_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ struct uint64_extra sigExtra;
|
|
|
+#else
|
|
|
+ uint32_t extSig[3];
|
|
|
+#endif
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( shiftDist < -11 ) goto invalid;
|
|
|
+ sigExtra.v = sig<<-shiftDist;
|
|
|
+ sigExtra.extra = 0;
|
|
|
+ } else {
|
|
|
+ sigExtra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundToUI64(
|
|
|
+ sign, sigExtra.v, sigExtra.extra, roundingMode, exact );
|
|
|
+#else
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( shiftDist < -11 ) goto invalid;
|
|
|
+ sig <<= -shiftDist;
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ } else {
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ }
|
|
|
+ return softfloat_roundMToUI64( sign, extSig, roundingMode, exact );
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && fracF64UI( uiA ) ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f64_to_i32( float64_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FF) && sig ) {
|
|
|
+#if (i32_fromNaN == i32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (i32_fromNaN == i32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return i32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ shiftDist = 0x427 - exp;
|
|
|
+ if ( 0 < shiftDist ) sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ return softfloat_roundToI32( sign, sig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f64_to_i64( float64_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ struct uint64_extra sigExtra;
|
|
|
+#else
|
|
|
+ uint32_t extSig[3];
|
|
|
+#endif
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( shiftDist < -11 ) goto invalid;
|
|
|
+ sigExtra.v = sig<<-shiftDist;
|
|
|
+ sigExtra.extra = 0;
|
|
|
+ } else {
|
|
|
+ sigExtra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundToI64(
|
|
|
+ sign, sigExtra.v, sigExtra.extra, roundingMode, exact );
|
|
|
+#else
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( shiftDist < -11 ) goto invalid;
|
|
|
+ sig <<= -shiftDist;
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ } else {
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ }
|
|
|
+ return softfloat_roundMToI64( sign, extSig, roundingMode, exact );
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && fracF64UI( uiA ) ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f64_to_ui32_r_minMag( float64_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+ if ( 53 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ if ( sign || (shiftDist < 21) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && sig ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ z = sig>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast64_t) z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f64_to_ui64_r_minMag( float64_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+ if ( 53 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ if ( sign ) goto invalid;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( shiftDist < -11 ) goto invalid;
|
|
|
+ z = (sig | UINT64_C( 0x0010000000000000 ))<<-shiftDist;
|
|
|
+ } else {
|
|
|
+ sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ z = sig>>shiftDist;
|
|
|
+ if ( exact && (uint64_t) (sig<<(-shiftDist & 63)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && sig ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f64_to_i32_r_minMag( float64_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+ if ( 53 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ if ( shiftDist < 22 ) {
|
|
|
+ if (
|
|
|
+ sign && (exp == 0x41E) && (sig < UINT64_C( 0x0000000000200000 ))
|
|
|
+ ) {
|
|
|
+ if ( exact && sig ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return -0x7FFFFFFF - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && sig ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ absZ = sig>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast64_t) (uint_fast32_t) absZ<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f64_to_i64_r_minMag( float64_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast16_t shiftDist;
|
|
|
+ int_fast64_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ sig = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x433 - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( shiftDist < -10 ) {
|
|
|
+ if ( uiA == packToF64UI( 1, 0x43E, 0 ) ) {
|
|
|
+ return -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FF) && sig ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ absZ = sig<<-shiftDist;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( 53 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig |= UINT64_C( 0x0010000000000000 );
|
|
|
+ absZ = sig>>shiftDist;
|
|
|
+ if ( exact && (absZ<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f64_to_f16( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ, frac16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac16 = softfloat_shortShiftRightJam64( frac, 38 );
|
|
|
+ if ( ! (exp | frac16) ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ return softfloat_roundPackToF16( sign, exp - 0x3F1, frac16 | 0x4000 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f64_to_f32( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast32_t uiZ, frac32;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac32 = softfloat_shortShiftRightJam64( frac, 22 );
|
|
|
+ if ( ! (exp | frac32) ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ return softfloat_roundPackToF32( sign, exp - 0x381, frac32 | 0x40000000 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t f64_to_extF80( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ } else {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3C00 );
|
|
|
+ uiZ0 = (frac | UINT64_C( 0x0010000000000000 ))<<11;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f64_to_extF80M( float64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f64_to_extF80( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f64_to_extF80M( float64_t a, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t uiZ0;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( frac );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = packToExtF80UI64( sign, exp + 0x3C00 );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 ) | frac<<11;
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = uiZ0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f64_to_f128( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ struct uint128 frac128;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF128UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0x7FFF, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ.v64 = packToF128UI64( sign, 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac128 = softfloat_shortShiftLeft128( 0, frac, 60 );
|
|
|
+ uiZ.v64 = packToF128UI64( sign, exp + 0x3C00, frac128.v64 );
|
|
|
+ uiZ.v0 = frac128.v0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/f64_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f64_to_f128M( float64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f64_to_f128( a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f64_to_f128M( float64_t a, float128_t *zPtr )
|
|
|
+{
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint64_t uiA;
|
|
|
+ bool sign;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ96;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ sign = signF64UI( uiA );
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ frac = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+ if ( exp == 0x7FF ) {
|
|
|
+ if ( frac ) {
|
|
|
+ softfloat_f64UIToCommonNaN( uiA, &commonNaN );
|
|
|
+ softfloat_commonNaNToF128M( &commonNaN, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! frac ) {
|
|
|
+ uiZ96 = packToF128UI96( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( frac );
|
|
|
+ exp = normExpSig.exp - 1;
|
|
|
+ frac = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr[indexWord( 4, 1 )] = (uint32_t) frac<<28;
|
|
|
+ frac >>= 4;
|
|
|
+ zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp + 0x3C00, frac>>32 );
|
|
|
+ zWPtr[indexWord( 4, 2 )] = frac;
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/f64_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_roundToInt( float64_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ int_fast16_t exp;
|
|
|
+ uint_fast64_t uiZ, lastBitMask, roundBitsMask;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ exp = expF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp <= 0x3FE ) {
|
|
|
+ if ( !(uiA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) return a;
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ uiZ = uiA & packToF64UI( 1, 0, 0 );
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !fracF64UI( uiA ) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x3FE ) uiZ |= packToF64UI( 0, 0x3FF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( uiZ ) uiZ = packToF64UI( 1, 0x3FF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !uiZ ) uiZ = packToF64UI( 0, 0x3FF, 0 );
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ uiZ |= packToF64UI( 0, 0x3FF, 0 );
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x433 <= exp ) {
|
|
|
+ if ( (exp == 0x7FF) && fracF64UI( uiA ) ) {
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ = uiA;
|
|
|
+ lastBitMask = (uint_fast64_t) 1<<(0x433 - exp);
|
|
|
+ roundBitsMask = lastBitMask - 1;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ uiZ += lastBitMask>>1;
|
|
|
+ if ( !(uiZ & roundBitsMask) ) uiZ &= ~lastBitMask;
|
|
|
+ } else if (
|
|
|
+ roundingMode
|
|
|
+ == (signF64UI( uiZ ) ? softfloat_round_min : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ uiZ += roundBitsMask;
|
|
|
+ }
|
|
|
+ uiZ &= ~roundBitsMask;
|
|
|
+ if ( uiZ != uiA ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) uiZ |= lastBitMask;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/f64_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_add( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float64_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_addMagsF64( uiA, uiB, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_subMagsF64( uiA, uiB, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_addMagsF64 : softfloat_subMagsF64;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_add.c ****/
|
|
|
+/**** start inlining ../../source/f64_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_sub( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float64_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_subMagsF64( uiA, uiB, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_addMagsF64( uiA, uiB, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_subMagsF64 : softfloat_addMagsF64;
|
|
|
+ return (*magsFuncPtr)( uiA, uiB, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_sub.c ****/
|
|
|
+/**** start inlining ../../source/f64_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_mul( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast64_t magBits;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ struct uint128 sig128Z;
|
|
|
+#else
|
|
|
+ uint32_t sig128Z[4];
|
|
|
+#endif
|
|
|
+ uint_fast64_t sigZ, uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA || ((expB == 0x7FF) && sigB) ) goto propagateNaN;
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FF;
|
|
|
+ sigA = (sigA | UINT64_C( 0x0010000000000000 ))<<10;
|
|
|
+ sigB = (sigB | UINT64_C( 0x0010000000000000 ))<<11;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ sig128Z = softfloat_mul64To128( sigA, sigB );
|
|
|
+ sigZ = sig128Z.v64 | (sig128Z.v0 != 0);
|
|
|
+#else
|
|
|
+ softfloat_mul64To128M( sigA, sigB, sig128Z );
|
|
|
+ sigZ =
|
|
|
+ (uint64_t) sig128Z[indexWord( 4, 3 )]<<32 | sig128Z[indexWord( 4, 2 )];
|
|
|
+ if ( sig128Z[indexWord( 4, 1 )] || sig128Z[indexWord( 4, 0 )] ) sigZ |= 1;
|
|
|
+#endif
|
|
|
+ if ( sigZ < UINT64_C( 0x4000000000000000 ) ) {
|
|
|
+ --expZ;
|
|
|
+ sigZ <<= 1;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infArg:
|
|
|
+ if ( ! magBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF64UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_mul.c ****/
|
|
|
+/**** start inlining ../../source/f64_mulAdd.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_mulAdd( float64_t a, float64_t b, float64_t c )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ union ui64_f64 uC;
|
|
|
+ uint_fast64_t uiC;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ uC.f = c;
|
|
|
+ uiC = uC.ui;
|
|
|
+ return softfloat_mulAddF64( uiA, uiB, uiC, 0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_mulAdd.c ****/
|
|
|
+/**** start inlining ../../source/f64_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_div( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint32_t recip32, sig32Z, doubleTerm;
|
|
|
+ uint_fast64_t rem;
|
|
|
+ uint32_t q;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA ) goto propagateNaN;
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) {
|
|
|
+ if ( ! (expA | sigA) ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x3FE;
|
|
|
+ sigA |= UINT64_C( 0x0010000000000000 );
|
|
|
+ sigB |= UINT64_C( 0x0010000000000000 );
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ sigA <<= 11;
|
|
|
+ } else {
|
|
|
+ sigA <<= 10;
|
|
|
+ }
|
|
|
+ sigB <<= 11;
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB>>32 ) - 2;
|
|
|
+ sig32Z = ((uint32_t) (sigA>>32) * (uint_fast64_t) recip32)>>32;
|
|
|
+ doubleTerm = sig32Z<<1;
|
|
|
+ rem =
|
|
|
+ ((sigA - (uint_fast64_t) doubleTerm * (uint32_t) (sigB>>32))<<28)
|
|
|
+ - (uint_fast64_t) doubleTerm * ((uint32_t) sigB>>4);
|
|
|
+ q = (((uint32_t) (rem>>32) * (uint_fast64_t) recip32)>>32) + 4;
|
|
|
+ sigZ = ((uint_fast64_t) sig32Z<<32) + ((uint_fast64_t) q<<4);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (sigZ & 0x1FF) < 4<<4 ) {
|
|
|
+ q &= ~7;
|
|
|
+ sigZ &= ~(uint_fast64_t) 0x7F;
|
|
|
+ doubleTerm = q<<1;
|
|
|
+ rem =
|
|
|
+ ((rem - (uint_fast64_t) doubleTerm * (uint32_t) (sigB>>32))<<28)
|
|
|
+ - (uint_fast64_t) doubleTerm * ((uint32_t) sigB>>4);
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ sigZ -= 1<<7;
|
|
|
+ } else {
|
|
|
+ if ( rem ) sigZ |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( signZ, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ = packToF64UI( signZ, 0x7FF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ = packToF64UI( signZ, 0, 0 );
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_div.c ****/
|
|
|
+/**** start inlining ../../source/f64_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_rem( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ int_fast16_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ uint64_t rem;
|
|
|
+ int_fast16_t expDiff;
|
|
|
+ uint32_t q, recip32;
|
|
|
+ uint_fast64_t q64;
|
|
|
+ uint64_t altRem, meanRem;
|
|
|
+ bool signRem;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ expB = expF64UI( uiB );
|
|
|
+ sigB = fracF64UI( uiB );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA || ((expB == 0x7FF) && sigB) ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FF ) {
|
|
|
+ if ( sigB ) goto propagateNaN;
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA < expB - 1 ) return a;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! sigB ) goto invalid;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigB );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ rem = sigA | UINT64_C( 0x0010000000000000 );
|
|
|
+ sigB |= UINT64_C( 0x0010000000000000 );
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff < -1 ) return a;
|
|
|
+ sigB <<= 9;
|
|
|
+ if ( expDiff ) {
|
|
|
+ rem <<= 8;
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ rem <<= 9;
|
|
|
+ q = (sigB <= rem);
|
|
|
+ if ( q ) rem -= sigB;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB>>21 );
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Changing the shift of `rem' here requires also changing the initial
|
|
|
+ | subtraction from `expDiff'.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ rem <<= 9;
|
|
|
+ expDiff -= 30;
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | The scale of `sigB' affects how many bits are obtained during each
|
|
|
+ | cycle of the loop. Currently this is 29 bits per loop iteration,
|
|
|
+ | the maximum possible.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigB <<= 9;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint32_t) (rem>>32) * (uint_fast64_t) recip32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+ rem <<= 29;
|
|
|
+#else
|
|
|
+ rem = (uint_fast64_t) (uint32_t) (rem>>3)<<32;
|
|
|
+#endif
|
|
|
+ rem -= q * (uint64_t) sigB;
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) rem += sigB;
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -29 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
|
|
+ rem = (rem<<(expDiff + 30)) - q * (uint64_t) sigB;
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ altRem = rem + sigB;
|
|
|
+ goto selectRem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ do {
|
|
|
+ altRem = rem;
|
|
|
+ ++q;
|
|
|
+ rem -= sigB;
|
|
|
+ } while ( ! (rem & UINT64_C( 0x8000000000000000 )) );
|
|
|
+ selectRem:
|
|
|
+ meanRem = rem + altRem;
|
|
|
+ if (
|
|
|
+ (meanRem & UINT64_C( 0x8000000000000000 )) || (! meanRem && (q & 1))
|
|
|
+ ) {
|
|
|
+ rem = altRem;
|
|
|
+ }
|
|
|
+ signRem = signA;
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ rem = -rem;
|
|
|
+ }
|
|
|
+ return softfloat_normRoundPackToF64( signRem, expB, rem );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, uiB );
|
|
|
+ goto uiZ;
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_rem.c ****/
|
|
|
+/**** start inlining ../../source/f64_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f64_sqrt( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ bool signA;
|
|
|
+ int_fast16_t expA;
|
|
|
+ uint_fast64_t sigA, uiZ;
|
|
|
+ struct exp16_sig64 normExpSig;
|
|
|
+ int_fast16_t expZ;
|
|
|
+ uint32_t sig32A, recipSqrt32, sig32Z;
|
|
|
+ uint_fast64_t rem;
|
|
|
+ uint32_t q;
|
|
|
+ uint_fast64_t sigZ, shiftedSigZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ expA = expF64UI( uiA );
|
|
|
+ sigA = fracF64UI( uiA );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FF ) {
|
|
|
+ if ( sigA ) {
|
|
|
+ uiZ = softfloat_propagateNaNF64UI( uiA, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! signA ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signA ) {
|
|
|
+ if ( ! (expA | sigA) ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! sigA ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF64Sig( sigA );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (`sig32Z' is guaranteed to be a lower bound on the square root of
|
|
|
+ | `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
|
|
+ | `sigA'.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x3FF)>>1) + 0x3FE;
|
|
|
+ expA &= 1;
|
|
|
+ sigA |= UINT64_C( 0x0010000000000000 );
|
|
|
+ sig32A = sigA>>21;
|
|
|
+ recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
|
|
+ sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;
|
|
|
+ if ( expA ) {
|
|
|
+ sigA <<= 8;
|
|
|
+ sig32Z >>= 1;
|
|
|
+ } else {
|
|
|
+ sigA <<= 9;
|
|
|
+ }
|
|
|
+ rem = sigA - (uint_fast64_t) sig32Z * sig32Z;
|
|
|
+ q = ((uint32_t) (rem>>2) * (uint_fast64_t) recipSqrt32)>>32;
|
|
|
+ sigZ = ((uint_fast64_t) sig32Z<<32 | 1<<5) + ((uint_fast64_t) q<<3);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (sigZ & 0x1FF) < 0x22 ) {
|
|
|
+ sigZ &= ~(uint_fast64_t) 0x3F;
|
|
|
+ shiftedSigZ = sigZ>>6;
|
|
|
+ rem = (sigA<<52) - shiftedSigZ * shiftedSigZ;
|
|
|
+ if ( rem & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --sigZ;
|
|
|
+ } else {
|
|
|
+ if ( rem ) sigZ |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( 0, expZ, sigZ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ = defaultNaNF64UI;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/f64_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_eq( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF64UI( uiA ) || softfloat_isSigNaNF64UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_eq.c ****/
|
|
|
+/**** start inlining ../../source/f64_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_le( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA || ! ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_le.c ****/
|
|
|
+/**** start inlining ../../source/f64_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_lt( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA && ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_lt.c ****/
|
|
|
+/**** start inlining ../../source/f64_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_eq_signaling( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return (uiA == uiB) || ! ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/f64_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_le_quiet( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF64UI( uiA ) || softfloat_isSigNaNF64UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA || ! ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ : (uiA == uiB) || (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f64_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_lt_quiet( float64_t a, float64_t b )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+ uint_fast64_t uiA;
|
|
|
+ union ui64_f64 uB;
|
|
|
+ uint_fast64_t uiB;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA = uA.ui;
|
|
|
+ uB.f = b;
|
|
|
+ uiB = uB.ui;
|
|
|
+ if ( isNaNF64UI( uiA ) || isNaNF64UI( uiB ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF64UI( uiA ) || softfloat_isSigNaNF64UI( uiB )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF64UI( uiA );
|
|
|
+ signB = signF64UI( uiB );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA && ((uiA | uiB) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ : (uiA != uiB) && (signA ^ (uiA < uiB));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f64_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f64_isSignalingNaN( float64_t a )
|
|
|
+{
|
|
|
+ union ui64_f64 uA;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ return softfloat_isSigNaNF64UI( uA.ui );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f64_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ extF80_to_ui32( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) {
|
|
|
+#if (ui32_fromNaN == ui32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (ui32_fromNaN == ui32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return ui32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x4032 - exp;
|
|
|
+ if ( shiftDist <= 0 ) shiftDist = 1;
|
|
|
+ sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ return softfloat_roundToUI32( sign, sig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ extF80_to_ui64( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ uint_fast64_t sigExtra;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigExtra = 0;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );
|
|
|
+ sig = sig64Extra.v;
|
|
|
+ sigExtra = sig64Extra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI64( sign, sig, sigExtra, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ extF80_to_i32( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) {
|
|
|
+#if (i32_fromNaN == i32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (i32_fromNaN == i32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return i32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x4032 - exp;
|
|
|
+ if ( shiftDist <= 0 ) shiftDist = 1;
|
|
|
+ sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ return softfloat_roundToI32( sign, sig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ extF80_to_i64( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ uint_fast64_t sigExtra;
|
|
|
+ struct uint64_extra sig64Extra;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( shiftDist ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sigExtra = 0;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64Extra = softfloat_shiftRightJam64Extra( sig, 0, shiftDist );
|
|
|
+ sig = sig64Extra.v;
|
|
|
+ sigExtra = sig64Extra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToI64( sign, sig, sigExtra, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t extF80_to_ui32_r_minMag( extFloat80_t a, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( sign || (shiftDist < 32) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ z = sig>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast64_t) z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t extF80_to_ui64_r_minMag( extFloat80_t a, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( sign || (shiftDist < 0) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ z = sig>>shiftDist;
|
|
|
+ if ( exact && (z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t extF80_to_i32_r_minMag( extFloat80_t a, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( shiftDist < 33 ) {
|
|
|
+ if (
|
|
|
+ (uiA64 == packToExtF80UI64( 1, 0x401E ))
|
|
|
+ && (sig < UINT64_C( 0x8000000100000000 ))
|
|
|
+ ) {
|
|
|
+ if ( exact && (sig & UINT64_C( 0x00000000FFFFFFFF )) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return -0x7FFFFFFF - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ absZ = sig>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast64_t) (uint_fast32_t) absZ<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t extF80_to_i64_r_minMag( extFloat80_t a, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast64_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if (
|
|
|
+ (uiA64 == packToExtF80UI64( 1, 0x403E ))
|
|
|
+ && (sig == UINT64_C( 0x8000000000000000 ))
|
|
|
+ ) {
|
|
|
+ return -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ absZ = sig>>shiftDist;
|
|
|
+ if ( exact && (uint64_t) (sig<<(-shiftDist & 63)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t extF80_to_f16( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ, sig16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig16 = softfloat_shortShiftRightJam64( sig, 49 );
|
|
|
+ if ( ! (exp | sig16) ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3FF1;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x40 ) exp = -0x40;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( sign, exp, sig16 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t extF80_to_f32( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast32_t uiZ, sig32;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = softfloat_shortShiftRightJam64( sig, 33 );
|
|
|
+ if ( ! (exp | sig32) ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3F81;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( sign, exp, sig32 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t extF80_to_f64( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! (exp | sig) ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = softfloat_shortShiftRightJam64( sig, 1 );
|
|
|
+ exp -= 0x3C01;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( sign, exp, sig );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/extF80_to_f128.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t extF80_to_f128( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ uint_fast16_t exp;
|
|
|
+ uint_fast64_t frac;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ bool sign;
|
|
|
+ struct uint128 frac128;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ frac = uiA0 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
|
|
|
+ if ( (exp == 0x7FFF) && frac ) {
|
|
|
+ softfloat_extF80UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF128UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ frac128 = softfloat_shortShiftLeft128( 0, frac, 49 );
|
|
|
+ uiZ.v64 = packToF128UI64( sign, exp, frac128.v64 );
|
|
|
+ uiZ.v0 = frac128.v0;
|
|
|
+ }
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_to_f128.c ****/
|
|
|
+/**** start inlining ../../source/extF80_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t
|
|
|
+ extF80_roundToInt( extFloat80_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64, signUI64;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast64_t lastBitMask, roundBitsMask;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uA.s.signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( !(sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
|
|
|
+ if ( !sigA ) {
|
|
|
+ uiZ64 = signUI64;
|
|
|
+ sigZ = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
|
|
+ exp += normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x403E <= exp ) {
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, sigA, 0, 0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ sigZ = uiZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ } else {
|
|
|
+ sigZ = sigA;
|
|
|
+ }
|
|
|
+ uiZ64 = signUI64 | exp;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( exp <= 0x3FFE ) {
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x3FFE ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( signUI64 ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !signUI64 ) goto mag1;
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ goto mag1;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ uiZ64 = signUI64;
|
|
|
+ sigZ = 0;
|
|
|
+ goto uiZ;
|
|
|
+ mag1:
|
|
|
+ uiZ64 = signUI64 | 0x3FFF;
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = signUI64 | exp;
|
|
|
+ lastBitMask = (uint_fast64_t) 1<<(0x403E - exp);
|
|
|
+ roundBitsMask = lastBitMask - 1;
|
|
|
+ sigZ = sigA;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ sigZ += lastBitMask>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ sigZ += lastBitMask>>1;
|
|
|
+ if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
|
|
|
+ } else if (
|
|
|
+ roundingMode == (signUI64 ? softfloat_round_min : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ sigZ += roundBitsMask;
|
|
|
+ }
|
|
|
+ sigZ &= ~roundBitsMask;
|
|
|
+ if ( !sigZ ) {
|
|
|
+ ++uiZ64;
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ if ( sigZ != sigA ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) sigZ |= lastBitMask;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = sigZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/extF80_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_add( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ extFloat80_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;
|
|
|
+ return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_add.c ****/
|
|
|
+/**** start inlining ../../source/extF80_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_sub( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ extFloat80_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80;
|
|
|
+ return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_sub.c ****/
|
|
|
+/**** start inlining ../../source/extF80_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_mul( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+ int_fast32_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast64_t magBits;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ struct uint128 sig128Z, uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ sigB = uiB0;
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ || ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
|
|
+ ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ magBits = expB | sigB;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ magBits = expA | sigA;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
|
|
+ expA += normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigB ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
|
|
+ expB += normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FFE;
|
|
|
+ sig128Z = softfloat_mul64To128( sigA, sigB );
|
|
|
+ if ( sig128Z.v64 < UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --expZ;
|
|
|
+ sig128Z =
|
|
|
+ softfloat_add128(
|
|
|
+ sig128Z.v64, sig128Z.v0, sig128Z.v64, sig128Z.v0 );
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ signZ, expZ, sig128Z.v64, sig128Z.v0, extF80_roundingPrecision );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infArg:
|
|
|
+ if ( ! magBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ64 = defaultNaNExtF80UI64;
|
|
|
+ uiZ0 = defaultNaNExtF80UI0;
|
|
|
+ } else {
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_mul.c ****/
|
|
|
+/**** start inlining ../../source/extF80_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_div( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+ int_fast32_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ bool signZ;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ struct uint128 rem;
|
|
|
+ uint_fast32_t recip32;
|
|
|
+ uint_fast64_t sigZ;
|
|
|
+ int ix;
|
|
|
+ uint_fast64_t q64;
|
|
|
+ uint_fast32_t q;
|
|
|
+ struct uint128 term;
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ sigB = uiB0;
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigB ) {
|
|
|
+ if ( ! sigA ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
|
|
+ expB += normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
|
|
+ expA += normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x3FFF;
|
|
|
+ if ( sigA < sigB ) {
|
|
|
+ --expZ;
|
|
|
+ rem = softfloat_shortShiftLeft128( 0, sigA, 32 );
|
|
|
+ } else {
|
|
|
+ rem = softfloat_shortShiftLeft128( 0, sigA, 31 );
|
|
|
+ }
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB>>32 );
|
|
|
+ sigZ = 0;
|
|
|
+ ix = 2;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ --ix;
|
|
|
+ if ( ix < 0 ) break;
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul64ByShifted32To128( sigB, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --q;
|
|
|
+ rem = softfloat_add128( rem.v64, rem.v0, sigB>>32, sigB<<32 );
|
|
|
+ }
|
|
|
+ sigZ = (sigZ<<29) + q;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ((q + 1) & 0x3FFFFF) < 2 ) {
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul64ByShifted32To128( sigB, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ term = softfloat_shortShiftLeft128( 0, sigB, 32 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --q;
|
|
|
+ rem = softfloat_add128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ } else if ( softfloat_le128( term.v64, term.v0, rem.v64, rem.v0 ) ) {
|
|
|
+ ++q;
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ }
|
|
|
+ if ( rem.v64 | rem.v0 ) q |= 1;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigZ = (sigZ<<6) + (q>>23);
|
|
|
+ sigZExtra = (uint64_t) ((uint_fast64_t) q<<41);
|
|
|
+ return
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ signZ, expZ, sigZ, sigZExtra, extF80_roundingPrecision );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ64 = defaultNaNExtF80UI64;
|
|
|
+ uiZ0 = defaultNaNExtF80UI0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_div.c ****/
|
|
|
+/**** start inlining ../../source/extF80_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_rem( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ int_fast32_t expB;
|
|
|
+ uint_fast64_t sigB;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ int_fast32_t expDiff;
|
|
|
+ struct uint128 rem, shiftedSigB;
|
|
|
+ uint_fast32_t q, recip32;
|
|
|
+ uint_fast64_t q64;
|
|
|
+ struct uint128 term, altRem, meanRem;
|
|
|
+ bool signRem;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ sigB = uiB0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ || ((expB == 0x7FFF) && (sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
|
|
+ ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) goto propagateNaN;
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Argument b is an infinity. Doubling `expB' is an easy way to ensure
|
|
|
+ | that `expDiff' later is less than -1, which will result in returning
|
|
|
+ | a canonicalized version of argument a.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ expB += expB;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigB ) goto invalid;
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigB );
|
|
|
+ expB += normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) {
|
|
|
+ expA = 0;
|
|
|
+ goto copyA;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
|
|
+ expA += normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < -1 ) goto copyA;
|
|
|
+ rem = softfloat_shortShiftLeft128( 0, sigA, 32 );
|
|
|
+ shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 32 );
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff ) {
|
|
|
+ --expB;
|
|
|
+ shiftedSigB = softfloat_shortShiftLeft128( 0, sigB, 33 );
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ q = (sigB <= sigA);
|
|
|
+ if ( q ) {
|
|
|
+ rem =
|
|
|
+ softfloat_sub128(
|
|
|
+ rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB>>32 );
|
|
|
+ expDiff -= 30;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint_fast64_t) (uint32_t) (rem.v64>>2) * recip32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul64ByShifted32To128( sigB, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ rem =
|
|
|
+ softfloat_add128(
|
|
|
+ rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
|
|
+ }
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -29 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );
|
|
|
+ term = softfloat_mul64ByShifted32To128( sigB, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ altRem =
|
|
|
+ softfloat_add128(
|
|
|
+ rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
|
|
+ goto selectRem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ do {
|
|
|
+ altRem = rem;
|
|
|
+ ++q;
|
|
|
+ rem =
|
|
|
+ softfloat_sub128(
|
|
|
+ rem.v64, rem.v0, shiftedSigB.v64, shiftedSigB.v0 );
|
|
|
+ } while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );
|
|
|
+ selectRem:
|
|
|
+ meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );
|
|
|
+ if (
|
|
|
+ (meanRem.v64 & UINT64_C( 0x8000000000000000 ))
|
|
|
+ || (! (meanRem.v64 | meanRem.v0) && (q & 1))
|
|
|
+ ) {
|
|
|
+ rem = altRem;
|
|
|
+ }
|
|
|
+ signRem = signA;
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_normRoundPackToExtF80(
|
|
|
+ signRem, rem.v64 | rem.v0 ? expB + 32 : 0, rem.v64, rem.v0, 80 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ64 = defaultNaNExtF80UI64;
|
|
|
+ uiZ0 = defaultNaNExtF80UI0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ copyA:
|
|
|
+ if ( expA < 1 ) {
|
|
|
+ sigA >>= 1 - expA;
|
|
|
+ expA = 0;
|
|
|
+ }
|
|
|
+ uiZ64 = packToExtF80UI64( signA, expA );
|
|
|
+ uiZ0 = sigA;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_rem.c ****/
|
|
|
+/**** start inlining ../../source/extF80_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t extF80_sqrt( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ uint_fast64_t sigA;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ struct exp32_sig64 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint_fast32_t sig32A, recipSqrt32, sig32Z;
|
|
|
+ struct uint128 rem;
|
|
|
+ uint_fast64_t q, x64, sigZ;
|
|
|
+ struct uint128 y, term;
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ sigA = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ uiZ = softfloat_propagateNaNExtF80UI( uiA64, uiA0, 0, 0 );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! signA ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signA ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalExtF80Sig( sigA );
|
|
|
+ expA += normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (`sig32Z' is guaranteed to be a lower bound on the square root of
|
|
|
+ | `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
|
|
+ | `sigA'.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;
|
|
|
+ expA &= 1;
|
|
|
+ sig32A = sigA>>32;
|
|
|
+ recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
|
|
+ sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;
|
|
|
+ if ( expA ) {
|
|
|
+ sig32Z >>= 1;
|
|
|
+ rem = softfloat_shortShiftLeft128( 0, sigA, 61 );
|
|
|
+ } else {
|
|
|
+ rem = softfloat_shortShiftLeft128( 0, sigA, 62 );
|
|
|
+ }
|
|
|
+ rem.v64 -= (uint_fast64_t) sig32Z * sig32Z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((uint32_t) (rem.v64>>2) * (uint_fast64_t) recipSqrt32)>>32;
|
|
|
+ x64 = (uint_fast64_t) sig32Z<<32;
|
|
|
+ sigZ = x64 + (q<<3);
|
|
|
+ y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ term = softfloat_mul64ByShifted32To128( x64 + sigZ, q );
|
|
|
+ rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );
|
|
|
+ if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;
|
|
|
+ --q;
|
|
|
+ sigZ -= 1<<3;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = (((rem.v64>>2) * recipSqrt32)>>32) + 2;
|
|
|
+ x64 = sigZ;
|
|
|
+ sigZ = (sigZ<<1) + (q>>25);
|
|
|
+ sigZExtra = (uint64_t) (q<<39);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (q & 0xFFFFFF) <= 2 ) {
|
|
|
+ q &= ~(uint_fast64_t) 0xFFFF;
|
|
|
+ sigZExtra = (uint64_t) (q<<39);
|
|
|
+ term = softfloat_mul64ByShifted32To128( x64 + (q>>27), q );
|
|
|
+ x64 = (uint32_t) (q<<5) * (uint_fast64_t) (uint32_t) q;
|
|
|
+ term = softfloat_add128( term.v64, term.v0, 0, x64 );
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 28 );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ if ( ! sigZExtra ) --sigZ;
|
|
|
+ --sigZExtra;
|
|
|
+ } else {
|
|
|
+ if ( rem.v64 | rem.v0 ) sigZExtra |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToExtF80(
|
|
|
+ 0, expZ, sigZ, sigZExtra, extF80_roundingPrecision );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ64 = defaultNaNExtF80UI64;
|
|
|
+ uiZ0 = defaultNaNExtF80UI0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ64 = packToExtF80UI64( signA, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/extF80_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_eq( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ (uiA0 == uiB0)
|
|
|
+ && ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF)));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_eq.c ****/
|
|
|
+/**** start inlining ../../source/extF80_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_le( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA || ! (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
|
|
+ : ((uiA64 == uiB64) && (uiA0 == uiB0))
|
|
|
+ || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_le.c ****/
|
|
|
+/**** start inlining ../../source/extF80_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_lt( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
|
|
+ : ((uiA64 != uiB64) || (uiA0 != uiB0))
|
|
|
+ && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_lt.c ****/
|
|
|
+/**** start inlining ../../source/extF80_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_eq_signaling( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ (uiA0 == uiB0)
|
|
|
+ && ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF)));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/extF80_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_le_quiet( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA || ! (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
|
|
+ : ((uiA64 == uiB64) && (uiA0 == uiB0))
|
|
|
+ || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/extF80_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_lt_quiet( extFloat80_t a, extFloat80_t b )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uB;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.s.signExp;
|
|
|
+ uiA0 = uA.s.signif;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.s.signExp;
|
|
|
+ uiB0 = uB.s.signif;
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0)
|
|
|
+ : ((uiA64 != uiB64) || (uiA0 != uiB0))
|
|
|
+ && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/extF80_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool extF80_isSignalingNaN( extFloat80_t a )
|
|
|
+{
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uA;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ return softfloat_isSigNaNExtF80UI( uA.s.signExp, uA.s.signif );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ extF80M_to_ui32(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_ui32( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ extF80M_to_ui32(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x4032 - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( sig>>32 ) goto invalid;
|
|
|
+ if ( -32 < shiftDist ) {
|
|
|
+ sig <<= -shiftDist;
|
|
|
+ } else {
|
|
|
+ if ( (uint32_t) sig ) goto invalid;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI32( sign, sig, roundingMode, exact );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ extF80M_to_ui64(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_ui64( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ extF80M_to_ui64(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t extSig[3];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist ) softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ return softfloat_roundMToUI64( sign, extSig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ extF80M_to_i32(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_i32( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ extF80M_to_i32(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x4032 - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ if ( sig>>32 ) goto invalid;
|
|
|
+ if ( -32 < shiftDist ) {
|
|
|
+ sig <<= -shiftDist;
|
|
|
+ } else {
|
|
|
+ if ( (uint32_t) sig ) goto invalid;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sig = softfloat_shiftRightJam64( sig, shiftDist );
|
|
|
+ }
|
|
|
+ return softfloat_roundToI32( sign, sig, roundingMode, exact );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ extF80M_to_i64(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_i64( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ extF80M_to_i64(
|
|
|
+ const extFloat80_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t extSig[3];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ extSig[indexWord( 3, 2 )] = sig>>32;
|
|
|
+ extSig[indexWord( 3, 1 )] = sig;
|
|
|
+ extSig[indexWord( 3, 0 )] = 0;
|
|
|
+ if ( shiftDist ) softfloat_shiftRightJam96M( extSig, shiftDist, extSig );
|
|
|
+ return softfloat_roundMToI64( sign, extSig, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_ui32_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast32_t extF80M_to_ui32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint64_t shiftedSig;
|
|
|
+ uint32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! sig && (exp != 0x7FFF) ) return 0;
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( sign || sig>>32 || (shiftDist <= -31) ) goto invalid;
|
|
|
+ shiftedSig = (uint64_t) (uint32_t) sig<<-shiftDist;
|
|
|
+ if ( shiftedSig>>32 ) goto invalid;
|
|
|
+ z = shiftedSig;
|
|
|
+ } else {
|
|
|
+ shiftedSig = sig;
|
|
|
+ if ( shiftDist ) shiftedSig >>= shiftDist;
|
|
|
+ if ( shiftedSig>>32 ) goto invalid;
|
|
|
+ z = shiftedSig;
|
|
|
+ if ( sign && z ) goto invalid;
|
|
|
+ if ( exact && shiftDist && ((uint64_t) z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_ui64_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast64_t extF80M_to_ui64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! sig && (exp != 0x7FFF) ) return 0;
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( sign || (shiftDist <= -63) ) goto invalid;
|
|
|
+ shiftDist = -shiftDist;
|
|
|
+ z = sig<<shiftDist;
|
|
|
+ if ( z>>shiftDist != sig ) goto invalid;
|
|
|
+ } else {
|
|
|
+ z = sig;
|
|
|
+ if ( shiftDist ) z >>= shiftDist;
|
|
|
+ if ( sign && z ) goto invalid;
|
|
|
+ if ( exact && shiftDist && (z<<shiftDist != sig) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_i32_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast32_t extF80M_to_i32_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ bool sign, raiseInexact;
|
|
|
+ int32_t z;
|
|
|
+ uint64_t shiftedSig;
|
|
|
+ uint32_t absZ;
|
|
|
+ union { uint32_t ui; int32_t i; } u;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! sig && (exp != 0x7FFF) ) return 0;
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ raiseInexact = exact;
|
|
|
+ z = 0;
|
|
|
+ } else {
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ raiseInexact = false;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( sig>>32 || (shiftDist <= -31) ) goto invalid;
|
|
|
+ shiftedSig = (uint64_t) (uint32_t) sig<<-shiftDist;
|
|
|
+ if ( shiftedSig>>32 ) goto invalid;
|
|
|
+ absZ = shiftedSig;
|
|
|
+ } else {
|
|
|
+ shiftedSig = sig;
|
|
|
+ if ( shiftDist ) shiftedSig >>= shiftDist;
|
|
|
+ if ( shiftedSig>>32 ) goto invalid;
|
|
|
+ absZ = shiftedSig;
|
|
|
+ if ( exact && shiftDist ) {
|
|
|
+ raiseInexact = ((uint64_t) absZ<<shiftDist != sig);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( sign ) {
|
|
|
+ if ( 0x80000000 < absZ ) goto invalid;
|
|
|
+ u.ui = -absZ;
|
|
|
+ z = u.i;
|
|
|
+ } else {
|
|
|
+ if ( 0x80000000 <= absZ ) goto invalid;
|
|
|
+ z = absZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( raiseInexact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_i64_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast64_t extF80M_to_i64_r_minMag( const extFloat80_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ int32_t shiftDist;
|
|
|
+ bool sign, raiseInexact;
|
|
|
+ int64_t z;
|
|
|
+ uint64_t absZ;
|
|
|
+ union { uint64_t ui; int64_t i; } u;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! sig && (exp != 0x7FFF) ) return 0;
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( 64 <= shiftDist ) {
|
|
|
+ raiseInexact = exact;
|
|
|
+ z = 0;
|
|
|
+ } else {
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ raiseInexact = false;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ if ( shiftDist <= -63 ) goto invalid;
|
|
|
+ shiftDist = -shiftDist;
|
|
|
+ absZ = sig<<shiftDist;
|
|
|
+ if ( absZ>>shiftDist != sig ) goto invalid;
|
|
|
+ } else {
|
|
|
+ absZ = sig;
|
|
|
+ if ( shiftDist ) absZ >>= shiftDist;
|
|
|
+ if ( exact && shiftDist ) raiseInexact = (absZ<<shiftDist != sig);
|
|
|
+ }
|
|
|
+ if ( sign ) {
|
|
|
+ if ( UINT64_C( 0x8000000000000000 ) < absZ ) goto invalid;
|
|
|
+ u.ui = -absZ;
|
|
|
+ z = u.i;
|
|
|
+ } else {
|
|
|
+ if ( UINT64_C( 0x8000000000000000 ) <= absZ ) goto invalid;
|
|
|
+ z = absZ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( raiseInexact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float16_t extF80M_to_f16( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_f16( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float16_t extF80M_to_f16( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint16_t uiZ, sig16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sig ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ exp += softfloat_normExtF80SigM( &sig );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig16 = softfloat_shortShiftRightJam64( sig, 49 );
|
|
|
+ exp -= 0x3FF1;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x40 ) exp = -0x40;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( sign, exp, sig16 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float32_t extF80M_to_f32( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_f32( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float32_t extF80M_to_f32( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ, sig32;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sig ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ exp += softfloat_normExtF80SigM( &sig );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig32 = softfloat_shortShiftRightJam64( sig, 33 );
|
|
|
+ exp -= 0x3F81;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( sign, exp, sig32 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float64_t extF80M_to_f64( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_to_f64( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float64_t extF80M_to_f64( const extFloat80_t *aPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint64_t uiZ;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sig ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ exp += softfloat_normExtF80SigM( &sig );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig = softfloat_shortShiftRightJam64( sig, 1 );
|
|
|
+ exp -= 0x3C01;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF64( sign, exp, sig );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_to_f128M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void extF80M_to_f128M( const extFloat80_t *aPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_to_f128( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void extF80M_to_f128M( const extFloat80_t *aPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ96;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ sign = signExtF80UI64( uiA64 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sig = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sig & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_extF80MToCommonNaN( aSPtr, &commonNaN );
|
|
|
+ softfloat_commonNaNToF128M( &commonNaN, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ96 = packToF128UI96( sign, 0x7FFF, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) --exp;
|
|
|
+ if ( ! (sig & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sig ) {
|
|
|
+ uiZ96 = packToF128UI96( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ exp += softfloat_normExtF80SigM( &sig );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zWPtr[indexWord( 4, 1 )] = (uint32_t) sig<<17;
|
|
|
+ sig >>= 15;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = sig;
|
|
|
+ if ( exp < 0 ) {
|
|
|
+ zWPtr[indexWordHi( 4 )] = sig>>32;
|
|
|
+ softfloat_shiftRight96M(
|
|
|
+ &zWPtr[indexMultiwordHi( 4, 3 )],
|
|
|
+ -exp,
|
|
|
+ &zWPtr[indexMultiwordHi( 4, 3 )]
|
|
|
+ );
|
|
|
+ exp = 0;
|
|
|
+ sig = (uint64_t) zWPtr[indexWordHi( 4 )]<<32;
|
|
|
+ }
|
|
|
+ zWPtr[indexWordHi( 4 )] = packToF128UI96( sign, exp, sig>>32 );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ zWPtr[indexWord( 4, 3 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_to_f128M.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_roundToInt(
|
|
|
+ const extFloat80_t *aPtr,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact,
|
|
|
+ extFloat80_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_roundToInt( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_roundToInt(
|
|
|
+ const extFloat80_t *aPtr,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact,
|
|
|
+ extFloat80_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiA64, signUI64;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sigA;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t sigZ, lastBitMask, roundBitsMask;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
|
|
+ exp = expExtF80UI64( uiA64 );
|
|
|
+ sigA = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( !(sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) {
|
|
|
+ if ( !sigA ) {
|
|
|
+ uiZ64 = signUI64;
|
|
|
+ sigZ = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ exp += softfloat_normExtF80SigM( &sigA );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp <= 0x3FFE ) {
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x3FFE ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( signUI64 ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !signUI64 ) goto mag1;
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ goto mag1;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ uiZ64 = signUI64;
|
|
|
+ sigZ = 0;
|
|
|
+ goto uiZ;
|
|
|
+ mag1:
|
|
|
+ uiZ64 = signUI64 | 0x3FFF;
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x403E <= exp ) {
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_propagateNaNExtF80M( aSPtr, 0, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ } else {
|
|
|
+ sigZ = sigA;
|
|
|
+ }
|
|
|
+ uiZ64 = signUI64 | exp;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ64 = signUI64 | exp;
|
|
|
+ lastBitMask = (uint64_t) 1<<(0x403E - exp);
|
|
|
+ roundBitsMask = lastBitMask - 1;
|
|
|
+ sigZ = sigA;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ sigZ += lastBitMask>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ sigZ += lastBitMask>>1;
|
|
|
+ if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask;
|
|
|
+ } else if (
|
|
|
+ roundingMode == (signUI64 ? softfloat_round_min : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ sigZ += roundBitsMask;
|
|
|
+ }
|
|
|
+ sigZ &= ~roundBitsMask;
|
|
|
+ if ( !sigZ ) {
|
|
|
+ ++uiZ64;
|
|
|
+ sigZ = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ if ( sigZ != sigA ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) sigZ |= lastBitMask;
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = sigZ;
|
|
|
+ return;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_add(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ extFloat80_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80;
|
|
|
+ *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_add(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_addExtF80M(
|
|
|
+ (const struct extFloat80M *) aPtr,
|
|
|
+ (const struct extFloat80M *) bPtr,
|
|
|
+ (struct extFloat80M *) zPtr,
|
|
|
+ false
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_add.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_sub(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint_fast64_t uiA0;
|
|
|
+ bool signA;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint_fast64_t uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ extFloat80_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ signB = signExtF80UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80;
|
|
|
+ *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_sub(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_addExtF80M(
|
|
|
+ (const struct extFloat80M *) aPtr,
|
|
|
+ (const struct extFloat80M *) bPtr,
|
|
|
+ (struct extFloat80M *) zPtr,
|
|
|
+ true
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_sub.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_mul(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_mul( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_mul(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t expA;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ int32_t expB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast16_t exp, uiZ64;
|
|
|
+ uint64_t uiZ0, sigA, sigB;
|
|
|
+ int32_t expZ;
|
|
|
+ uint32_t sigProd[4], *extSigZPtr;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ signZ = signExtF80UI64( uiA64 ) ^ signExtF80UI64( uiB64 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
|
|
+ if (
|
|
|
+ (! aSPtr->signif && (expA != 0x7FFF))
|
|
|
+ || (! bSPtr->signif && (expB != 0x7FFF))
|
|
|
+ ) {
|
|
|
+ softfloat_invalidExtF80M( zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ sigA = aSPtr->signif;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ expA += softfloat_normExtF80SigM( &sigA );
|
|
|
+ }
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ sigB = bSPtr->signif;
|
|
|
+ if ( ! (sigB & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigB ) goto zero;
|
|
|
+ expB += softfloat_normExtF80SigM( &sigB );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x3FFE;
|
|
|
+ softfloat_mul64To128M( sigA, sigB, sigProd );
|
|
|
+ if ( sigProd[indexWordLo( 4 )] ) sigProd[indexWord( 4, 1 )] |= 1;
|
|
|
+ extSigZPtr = &sigProd[indexMultiwordHi( 4, 3 )];
|
|
|
+ if ( sigProd[indexWordHi( 4 )] < 0x80000000 ) {
|
|
|
+ --expZ;
|
|
|
+ softfloat_add96M( extSigZPtr, extSigZPtr, extSigZPtr );
|
|
|
+ }
|
|
|
+ softfloat_roundPackMToExtF80M(
|
|
|
+ signZ, expZ, extSigZPtr, extF80_roundingPrecision, zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = uiZ0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_mul.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_div(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_div( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_div(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t expA;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ int32_t expB;
|
|
|
+ bool signZ;
|
|
|
+ uint64_t sigA, x64;
|
|
|
+ int32_t expZ;
|
|
|
+ int shiftDist;
|
|
|
+ uint32_t y[3], recip32, sigB[3];
|
|
|
+ int ix;
|
|
|
+ uint32_t q, qs[2];
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint64_t uiZ0;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ expB = expExtF80UI64( uiB64 );
|
|
|
+ signZ = signExtF80UI64( uiA64 ) ^ signExtF80UI64( uiB64 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( expB == 0x7FFF ) goto invalid;
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigA = aSPtr->signif;
|
|
|
+ x64 = bSPtr->signif;
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ if ( ! (x64 & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! x64 ) {
|
|
|
+ if ( ! sigA ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ expB += softfloat_normExtF80SigM( &x64 );
|
|
|
+ }
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) goto zero;
|
|
|
+ expA += softfloat_normExtF80SigM( &sigA );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x3FFF;
|
|
|
+ shiftDist = 29;
|
|
|
+ if ( sigA < x64 ) {
|
|
|
+ --expZ;
|
|
|
+ shiftDist = 30;
|
|
|
+ }
|
|
|
+ softfloat_shortShiftLeft64To96M( sigA, shiftDist, y );
|
|
|
+ recip32 = softfloat_approxRecip32_1( x64>>32 );
|
|
|
+ sigB[indexWord( 3, 0 )] = (uint32_t) x64<<30;
|
|
|
+ x64 >>= 2;
|
|
|
+ sigB[indexWord( 3, 2 )] = x64>>32;
|
|
|
+ sigB[indexWord( 3, 1 )] = x64;
|
|
|
+ ix = 2;
|
|
|
+ for (;;) {
|
|
|
+ x64 = (uint64_t) y[indexWordHi( 3 )] * recip32;
|
|
|
+ q = (x64 + 0x80000000)>>32;
|
|
|
+ --ix;
|
|
|
+ if ( ix < 0 ) break;
|
|
|
+ softfloat_remStep96MBy32( y, 29, sigB, q, y );
|
|
|
+ if ( y[indexWordHi( 3 )] & 0x80000000 ) {
|
|
|
+ --q;
|
|
|
+ softfloat_add96M( y, sigB, y );
|
|
|
+ }
|
|
|
+ qs[ix] = q;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ((q + 1) & 0x3FFFFF) < 2 ) {
|
|
|
+ softfloat_remStep96MBy32( y, 29, sigB, q, y );
|
|
|
+ if ( y[indexWordHi( 3 )] & 0x80000000 ) {
|
|
|
+ --q;
|
|
|
+ softfloat_add96M( y, sigB, y );
|
|
|
+ } else if ( softfloat_compare96M( sigB, y ) <= 0 ) {
|
|
|
+ ++q;
|
|
|
+ softfloat_sub96M( y, sigB, y );
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ y[indexWordLo( 3 )] || y[indexWord( 3, 1 )] || y[indexWord( 3, 2 )]
|
|
|
+ ) {
|
|
|
+ q |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ x64 = (uint64_t) q<<9;
|
|
|
+ y[indexWord( 3, 0 )] = x64;
|
|
|
+ x64 = ((uint64_t) qs[0]<<6) + (x64>>32);
|
|
|
+ y[indexWord( 3, 1 )] = x64;
|
|
|
+ y[indexWord( 3, 2 )] = (qs[1]<<3) + (x64>>32);
|
|
|
+ softfloat_roundPackMToExtF80M(
|
|
|
+ signZ, expZ, y, extF80_roundingPrecision, zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidExtF80M( zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ64 = packToExtF80UI64( signZ, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ uiZ:
|
|
|
+ zSPtr->signExp = uiZ64;
|
|
|
+ zSPtr->signif = uiZ0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_div.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_rem(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_rem( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ extF80M_rem(
|
|
|
+ const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ int32_t expA, expB;
|
|
|
+ uint64_t x64;
|
|
|
+ bool signRem;
|
|
|
+ uint64_t sigA;
|
|
|
+ int32_t expDiff;
|
|
|
+ uint32_t rem[3], x[3], sig32B, q, recip32, rem2[3], *remPtr, *altRemPtr;
|
|
|
+ uint32_t *newRemPtr, wordMeanRem;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ expB = expExtF80UI64( bSPtr->signExp );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNExtF80M( aSPtr, bSPtr, zSPtr ) ) return;
|
|
|
+ if ( expA == 0x7FFF ) goto invalid;
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | If we get here, then argument b is an infinity and `expB' is 0x7FFF;
|
|
|
+ | Doubling `expB' is an easy way to ensure that `expDiff' later is
|
|
|
+ | less than -1, which will result in returning a canonicalized version
|
|
|
+ | of argument a.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ expB += expB;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) expB = 1;
|
|
|
+ x64 = bSPtr->signif;
|
|
|
+ if ( ! (x64 & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! x64 ) goto invalid;
|
|
|
+ expB += softfloat_normExtF80SigM( &x64 );
|
|
|
+ }
|
|
|
+ signRem = signExtF80UI64( uiA64 );
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ sigA = aSPtr->signif;
|
|
|
+ if ( ! (sigA & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! sigA ) {
|
|
|
+ expA = 0;
|
|
|
+ goto copyA;
|
|
|
+ }
|
|
|
+ expA += softfloat_normExtF80SigM( &sigA );
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < -1 ) goto copyA;
|
|
|
+ rem[indexWord( 3, 2 )] = sigA>>34;
|
|
|
+ rem[indexWord( 3, 1 )] = sigA>>2;
|
|
|
+ rem[indexWord( 3, 0 )] = (uint32_t) sigA<<30;
|
|
|
+ x[indexWord( 3, 0 )] = (uint32_t) x64<<30;
|
|
|
+ sig32B = x64>>32;
|
|
|
+ x64 >>= 2;
|
|
|
+ x[indexWord( 3, 2 )] = x64>>32;
|
|
|
+ x[indexWord( 3, 1 )] = x64;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff ) {
|
|
|
+ --expB;
|
|
|
+ softfloat_add96M( x, x, x );
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ q = (softfloat_compare96M( x, rem ) <= 0);
|
|
|
+ if ( q ) softfloat_sub96M( rem, x, rem );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( sig32B );
|
|
|
+ expDiff -= 30;
|
|
|
+ for (;;) {
|
|
|
+ x64 = (uint64_t) rem[indexWordHi( 3 )] * recip32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ q = (x64 + 0x80000000)>>32;
|
|
|
+ softfloat_remStep96MBy32( rem, 29, x, q, rem );
|
|
|
+ if ( rem[indexWordHi( 3 )] & 0x80000000 ) {
|
|
|
+ softfloat_add96M( rem, x, rem );
|
|
|
+ }
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -29 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q = (uint32_t) (x64>>32)>>(~expDiff & 31);
|
|
|
+ softfloat_remStep96MBy32( rem, expDiff + 30, x, q, rem );
|
|
|
+ if ( rem[indexWordHi( 3 )] & 0x80000000 ) {
|
|
|
+ remPtr = rem;
|
|
|
+ altRemPtr = rem2;
|
|
|
+ softfloat_add96M( remPtr, x, altRemPtr );
|
|
|
+ goto selectRem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ remPtr = rem;
|
|
|
+ altRemPtr = rem2;
|
|
|
+ do {
|
|
|
+ ++q;
|
|
|
+ newRemPtr = altRemPtr;
|
|
|
+ softfloat_sub96M( remPtr, x, newRemPtr );
|
|
|
+ altRemPtr = remPtr;
|
|
|
+ remPtr = newRemPtr;
|
|
|
+ } while ( ! (remPtr[indexWordHi( 3 )] & 0x80000000) );
|
|
|
+ selectRem:
|
|
|
+ softfloat_add96M( remPtr, altRemPtr, x );
|
|
|
+ wordMeanRem = x[indexWordHi( 3 )];
|
|
|
+ if (
|
|
|
+ (wordMeanRem & 0x80000000)
|
|
|
+ || (! wordMeanRem && (q & 1) && ! x[indexWord( 3, 0 )]
|
|
|
+ && ! x[indexWord( 3, 1 )])
|
|
|
+ ) {
|
|
|
+ remPtr = altRemPtr;
|
|
|
+ }
|
|
|
+ if ( remPtr[indexWordHi( 3 )] & 0x80000000 ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ softfloat_negX96M( remPtr );
|
|
|
+ }
|
|
|
+ softfloat_normRoundPackMToExtF80M( signRem, expB + 2, remPtr, 80, zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidExtF80M( zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ copyA:
|
|
|
+ if ( expA < 1 ) {
|
|
|
+ sigA >>= 1 - expA;
|
|
|
+ expA = 0;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = packToExtF80UI64( signRem, expA );
|
|
|
+ zSPtr->signif = sigA;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_rem.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void extF80M_sqrt( const extFloat80_t *aPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = extF80_sqrt( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void extF80M_sqrt( const extFloat80_t *aPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint_fast16_t uiA64, signUI64;
|
|
|
+ int32_t expA;
|
|
|
+ uint64_t rem64;
|
|
|
+ int32_t expZ;
|
|
|
+ uint32_t rem96[3], sig32A, recipSqrt32, sig32Z, q;
|
|
|
+ uint64_t sig64Z, x64;
|
|
|
+ uint32_t rem32, term[4], rem[4], extSigZ[3];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ signUI64 = uiA64 & packToExtF80UI64( 1, 0 );
|
|
|
+ expA = expExtF80UI64( uiA64 );
|
|
|
+ rem64 = aSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( rem64 & UINT64_C( 0x7FFFFFFFFFFFFFFF ) ) {
|
|
|
+ softfloat_propagateNaNExtF80M( aSPtr, 0, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ( signUI64 ) goto invalid;
|
|
|
+ rem64 = UINT64_C( 0x8000000000000000 );
|
|
|
+ goto copyA;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) expA = 1;
|
|
|
+ if ( ! (rem64 & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ if ( ! rem64 ) {
|
|
|
+ uiA64 = signUI64;
|
|
|
+ goto copyA;
|
|
|
+ }
|
|
|
+ expA += softfloat_normExtF80SigM( &rem64 );
|
|
|
+ }
|
|
|
+ if ( signUI64 ) goto invalid;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x3FFF)>>1) + 0x3FFF;
|
|
|
+ expA &= 1;
|
|
|
+ softfloat_shortShiftLeft64To96M( rem64, 30 - expA, rem96 );
|
|
|
+ sig32A = rem64>>32;
|
|
|
+ recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
|
|
+ sig32Z = ((uint64_t) sig32A * recipSqrt32)>>32;
|
|
|
+ if ( expA ) sig32Z >>= 1;
|
|
|
+ rem64 =
|
|
|
+ ((uint64_t) rem96[indexWord( 3, 2 )]<<32 | rem96[indexWord( 3, 1 )])
|
|
|
+ - (uint64_t) sig32Z * sig32Z;
|
|
|
+ rem96[indexWord( 3, 2 )] = rem64>>32;
|
|
|
+ rem96[indexWord( 3, 1 )] = rem64;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
|
|
+ sig64Z = ((uint64_t) sig32Z<<32) + ((uint64_t) q<<3);
|
|
|
+ term[indexWord( 3, 2 )] = 0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ x64 = ((uint64_t) sig32Z<<32) + sig64Z;
|
|
|
+ term[indexWord( 3, 1 )] = x64>>32;
|
|
|
+ term[indexWord( 3, 0 )] = x64;
|
|
|
+ softfloat_remStep96MBy32(
|
|
|
+ rem96, 29, term, q, &rem[indexMultiwordHi( 4, 3 )] );
|
|
|
+ rem32 = rem[indexWord( 4, 3 )];
|
|
|
+ if ( ! (rem32 & 0x80000000) ) break;
|
|
|
+ --q;
|
|
|
+ sig64Z -= 1<<3;
|
|
|
+ }
|
|
|
+ rem64 = (uint64_t) rem32<<32 | rem[indexWord( 4, 2 )];
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = (((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32) + 2;
|
|
|
+ if ( rem64>>34 ) q += recipSqrt32;
|
|
|
+ x64 = (uint64_t) q<<7;
|
|
|
+ extSigZ[indexWord( 3, 0 )] = x64;
|
|
|
+ x64 = (sig64Z<<1) + (x64>>32);
|
|
|
+ extSigZ[indexWord( 3, 2 )] = x64>>32;
|
|
|
+ extSigZ[indexWord( 3, 1 )] = x64;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (q & 0xFFFFFF) <= 2 ) {
|
|
|
+ q &= ~(uint32_t) 0xFFFF;
|
|
|
+ extSigZ[indexWordLo( 3 )] = q<<7;
|
|
|
+ x64 = sig64Z + (q>>27);
|
|
|
+ term[indexWord( 4, 3 )] = 0;
|
|
|
+ term[indexWord( 4, 2 )] = x64>>32;
|
|
|
+ term[indexWord( 4, 1 )] = x64;
|
|
|
+ term[indexWord( 4, 0 )] = q<<5;
|
|
|
+ rem[indexWord( 4, 0 )] = 0;
|
|
|
+ softfloat_remStep128MBy32( rem, 28, term, q, rem );
|
|
|
+ q = rem[indexWordHi( 4 )];
|
|
|
+ if ( q & 0x80000000 ) {
|
|
|
+ softfloat_sub1X96M( extSigZ );
|
|
|
+ } else {
|
|
|
+ if ( q || rem[indexWord( 4, 1 )] || rem[indexWord( 4, 2 )] ) {
|
|
|
+ extSigZ[indexWordLo( 3 )] |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ softfloat_roundPackMToExtF80M(
|
|
|
+ 0, expZ, extSigZ, extF80_roundingPrecision, zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidExtF80M( zSPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ copyA:
|
|
|
+ zSPtr->signExp = uiA64;
|
|
|
+ zSPtr->signif = rem64;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_eq( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_eq( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_eq( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( uiA0 == uiB0 ) {
|
|
|
+ return (uiA64 == uiB64) || ! uiA0;
|
|
|
+ } else {
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return ! softfloat_compareNonnormExtF80M( aSPtr, bSPtr );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_eq.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_le( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_le( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_le( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+ bool signA, ltMags;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are different.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ return signA || ! (uiA0 | uiB0);
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are the same.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) <= 0);
|
|
|
+ }
|
|
|
+ if ( uiA64 == uiB64 ) {
|
|
|
+ if ( uiA0 == uiB0 ) return true;
|
|
|
+ ltMags = (uiA0 < uiB0);
|
|
|
+ } else {
|
|
|
+ ltMags = (uiA64 < uiB64);
|
|
|
+ }
|
|
|
+ return signA ^ ltMags;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_le.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_lt( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_lt( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_lt( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+ bool signA, ltMags;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are different.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ return signA && ((uiA0 | uiB0) != 0);
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are the same.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) < 0);
|
|
|
+ }
|
|
|
+ if ( uiA64 == uiB64 ) {
|
|
|
+ if ( uiA0 == uiB0 ) return false;
|
|
|
+ ltMags = (uiA0 < uiB0);
|
|
|
+ } else {
|
|
|
+ ltMags = (uiA64 < uiB64);
|
|
|
+ }
|
|
|
+ return signA ^ ltMags;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_lt.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_eq_signaling( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_eq_signaling( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_eq_signaling( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( uiA0 == uiB0 ) {
|
|
|
+ return (uiA64 == uiB64) || ! uiA0;
|
|
|
+ } else {
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return ! softfloat_compareNonnormExtF80M( aSPtr, bSPtr );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_le_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_le_quiet( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_le_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+ bool signA, ltMags;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are different.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ return signA || ! (uiA0 | uiB0);
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are the same.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) <= 0);
|
|
|
+ }
|
|
|
+ if ( uiA64 == uiB64 ) {
|
|
|
+ if ( uiA0 == uiB0 ) return true;
|
|
|
+ ltMags = (uiA0 < uiB0);
|
|
|
+ } else {
|
|
|
+ ltMags = (uiA64 < uiB64);
|
|
|
+ }
|
|
|
+ return signA ^ ltMags;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/extF80M_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool extF80M_lt_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return extF80_lt_quiet( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool extF80M_lt_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr )
|
|
|
+{
|
|
|
+ const struct extFloat80M *aSPtr, *bSPtr;
|
|
|
+ uint_fast16_t uiA64;
|
|
|
+ uint64_t uiA0;
|
|
|
+ uint_fast16_t uiB64;
|
|
|
+ uint64_t uiB0;
|
|
|
+ bool signA, ltMags;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aSPtr = (const struct extFloat80M *) aPtr;
|
|
|
+ bSPtr = (const struct extFloat80M *) bPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA64 = aSPtr->signExp;
|
|
|
+ uiA0 = aSPtr->signif;
|
|
|
+ uiB64 = bSPtr->signExp;
|
|
|
+ uiB0 = bSPtr->signif;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNExtF80UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNExtF80UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ signA = signExtF80UI64( uiA64 );
|
|
|
+ if ( (uiA64 ^ uiB64) & 0x8000 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are different.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ return signA && ((uiA0 | uiB0) != 0);
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | Signs are the same.
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) {
|
|
|
+ return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) < 0);
|
|
|
+ }
|
|
|
+ if ( uiA64 == uiB64 ) {
|
|
|
+ if ( uiA0 == uiB0 ) return false;
|
|
|
+ ltMags = (uiA0 < uiB0);
|
|
|
+ } else {
|
|
|
+ ltMags = (uiA64 < uiB64);
|
|
|
+ }
|
|
|
+ return signA ^ ltMags;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/extF80M_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ f128_to_ui32( float128_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 ) | (uiA0 != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && sig64 ) {
|
|
|
+#if (ui32_fromNaN == ui32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (ui32_fromNaN == ui32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return ui32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ shiftDist = 0x4023 - exp;
|
|
|
+ if ( 0 < shiftDist ) {
|
|
|
+ sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ f128_to_ui64( float128_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64, sig0;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ struct uint128 sig128;
|
|
|
+ struct uint64_extra sigExtra;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 );
|
|
|
+ sig0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( shiftDist < -15 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig64 | sig0) ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig128 = softfloat_shortShiftLeft128( sig64, sig0, -shiftDist );
|
|
|
+ sig64 = sig128.v64;
|
|
|
+ sig0 = sig128.v0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigExtra = softfloat_shiftRightJam64Extra( sig64, sig0, shiftDist );
|
|
|
+ sig64 = sigExtra.v;
|
|
|
+ sig0 = sigExtra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToUI64( sign, sig64, sig0, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f128_to_i32( float128_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64, sig0;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 );
|
|
|
+ sig0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && (sig64 | sig0) ) {
|
|
|
+#if (i32_fromNaN == i32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (i32_fromNaN == i32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return i32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sig64 |= (sig0 != 0);
|
|
|
+ shiftDist = 0x4023 - exp;
|
|
|
+ if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ return softfloat_roundToI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f128_to_i64( float128_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64, sig0;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ struct uint128 sig128;
|
|
|
+ struct uint64_extra sigExtra;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 );
|
|
|
+ sig0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( shiftDist <= 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( shiftDist < -15 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig64 | sig0) ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ if ( shiftDist ) {
|
|
|
+ sig128 = softfloat_shortShiftLeft128( sig64, sig0, -shiftDist );
|
|
|
+ sig64 = sig128.v64;
|
|
|
+ sig0 = sig128.v0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigExtra = softfloat_shiftRightJam64Extra( sig64, sig0, shiftDist );
|
|
|
+ sig64 = sigExtra.v;
|
|
|
+ sig0 = sigExtra.extra;
|
|
|
+ }
|
|
|
+ return softfloat_roundToI64( sign, sig64, sig0, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast32_t f128_to_ui32_r_minMag( float128_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint_fast32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 ) | (uiA0 != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( 49 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ if ( sign || (shiftDist < 17) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && sig64 ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ z = sig64>>shiftDist;
|
|
|
+ if ( exact && ((uint_fast64_t) z<<shiftDist != sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+uint_fast64_t f128_to_ui64_r_minMag( float128_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64, sig0;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ int_fast8_t negShiftDist;
|
|
|
+ uint_fast64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 );
|
|
|
+ sig0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( sign || (shiftDist < -15) ) goto invalid;
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ negShiftDist = -shiftDist;
|
|
|
+ z = sig64<<negShiftDist | sig0>>(shiftDist & 63);
|
|
|
+ if ( exact && (uint64_t) (sig0<<negShiftDist) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( 49 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig64 | sig0) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( sign ) goto invalid;
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ z = sig64>>shiftDist;
|
|
|
+ if ( exact && (sig0 || (z<<shiftDist != sig64)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig64 | sig0) ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast32_t f128_to_i32_r_minMag( float128_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 ) | (uiA0 != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( 49 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ if ( shiftDist < 18 ) {
|
|
|
+ if (
|
|
|
+ sign && (shiftDist == 17)
|
|
|
+ && (sig64 < UINT64_C( 0x0000000000020000 ))
|
|
|
+ ) {
|
|
|
+ if ( exact && sig64 ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return -0x7FFFFFFF - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && sig64 ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ absZ = sig64>>shiftDist;
|
|
|
+ if (
|
|
|
+ exact && ((uint_fast64_t) (uint_fast32_t) absZ<<shiftDist != sig64)
|
|
|
+ ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+int_fast64_t f128_to_i64_r_minMag( float128_t a, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t sig64, sig0;
|
|
|
+ int_fast32_t shiftDist;
|
|
|
+ int_fast8_t negShiftDist;
|
|
|
+ int_fast64_t absZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ sig64 = fracF128UI64( uiA64 );
|
|
|
+ sig0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( shiftDist < 0 ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( shiftDist < -14 ) {
|
|
|
+ if (
|
|
|
+ (uiA64 == UINT64_C( 0xC03E000000000000 ))
|
|
|
+ && (sig0 < UINT64_C( 0x0002000000000000 ))
|
|
|
+ ) {
|
|
|
+ if ( exact && sig0 ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return -INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1;
|
|
|
+ }
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && (sig64 | sig0) ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ negShiftDist = -shiftDist;
|
|
|
+ absZ = sig64<<negShiftDist | sig0>>(shiftDist & 63);
|
|
|
+ if ( exact && (uint64_t) (sig0<<negShiftDist) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( 49 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig64 | sig0) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ absZ = sig64>>shiftDist;
|
|
|
+ if ( exact && (sig0 || (absZ<<shiftDist != sig64)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sign ? -absZ : absZ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float16_t f128_to_f16( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t frac64;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast16_t uiZ, frac16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ frac64 = fracF128UI64( uiA64 ) | (uiA0 != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 ) {
|
|
|
+ softfloat_f128UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac16 = softfloat_shortShiftRightJam64( frac64, 34 );
|
|
|
+ if ( ! (exp | frac16) ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3FF1;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x40 ) exp = -0x40;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( sign, exp, frac16 | 0x4000 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float32_t f128_to_f32( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t frac64;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast32_t uiZ, frac32;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ frac64 = fracF128UI64( uiA64 ) | (uiA0 != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 ) {
|
|
|
+ softfloat_f128UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac32 = softfloat_shortShiftRightJam64( frac64, 18 );
|
|
|
+ if ( ! (exp | frac32) ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3F81;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( sign, exp, frac32 | 0x40000000 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_extF80.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+extFloat80_t f128_to_extF80( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t frac64, frac0;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast16_t uiZ64;
|
|
|
+ uint_fast64_t uiZ0;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ struct uint128 sig128;
|
|
|
+ union { struct extFloat80M s; extFloat80_t f; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ frac64 = fracF128UI64( uiA64 );
|
|
|
+ frac0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 | frac0 ) {
|
|
|
+ softfloat_f128UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToExtF80UI( &commonNaN );
|
|
|
+ uiZ64 = uiZ.v64;
|
|
|
+ uiZ0 = uiZ.v0;
|
|
|
+ } else {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ uiZ0 = UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! exp ) {
|
|
|
+ if ( ! (frac64 | frac0) ) {
|
|
|
+ uiZ64 = packToExtF80UI64( sign, 0 );
|
|
|
+ uiZ0 = 0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( frac64, frac0 );
|
|
|
+ exp = normExpSig.exp;
|
|
|
+ frac64 = normExpSig.sig.v64;
|
|
|
+ frac0 = normExpSig.sig.v0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig128 =
|
|
|
+ softfloat_shortShiftLeft128(
|
|
|
+ frac64 | UINT64_C( 0x0001000000000000 ), frac0, 15 );
|
|
|
+ return softfloat_roundPackToExtF80( sign, exp, sig128.v64, sig128.v0, 80 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.s.signExp = uiZ64;
|
|
|
+ uZ.s.signif = uiZ0;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_extF80.c ****/
|
|
|
+/**** start inlining ../../source/f128_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float64_t f128_to_f64( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool sign;
|
|
|
+ int_fast32_t exp;
|
|
|
+ uint_fast64_t frac64, frac0;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint_fast64_t uiZ;
|
|
|
+ struct uint128 frac128;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ sign = signF128UI64( uiA64 );
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ frac64 = fracF128UI64( uiA64 );
|
|
|
+ frac0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 | frac0 ) {
|
|
|
+ softfloat_f128UIToCommonNaN( uiA64, uiA0, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac128 = softfloat_shortShiftLeft128( frac64, frac0, 14 );
|
|
|
+ frac64 = frac128.v64 | (frac128.v0 != 0);
|
|
|
+ if ( ! (exp | frac64) ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3C01;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int_fast32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF64(
|
|
|
+ sign, exp, frac64 | UINT64_C( 0x4000000000000000 ) );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/f128_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t
|
|
|
+ f128_roundToInt( float128_t a, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ int_fast32_t exp;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ uint_fast64_t lastBitMask0, roundBitsMask;
|
|
|
+ bool roundNearEven;
|
|
|
+ uint_fast64_t lastBitMask64;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ exp = expF128UI64( uiA64 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x402F <= exp ) {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( 0x406F <= exp ) {
|
|
|
+ if ( (exp == 0x7FFF) && (fracF128UI64( uiA64 ) | uiA0) ) {
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ lastBitMask0 = (uint_fast64_t) 2<<(0x406E - exp);
|
|
|
+ roundBitsMask = lastBitMask0 - 1;
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = uiA0;
|
|
|
+ roundNearEven = (roundingMode == softfloat_round_near_even);
|
|
|
+ if ( roundNearEven || (roundingMode == softfloat_round_near_maxMag) ) {
|
|
|
+ if ( exp == 0x402F ) {
|
|
|
+ if ( UINT64_C( 0x8000000000000000 ) <= uiZ.v0 ) {
|
|
|
+ ++uiZ.v64;
|
|
|
+ if (
|
|
|
+ roundNearEven
|
|
|
+ && (uiZ.v0 == UINT64_C( 0x8000000000000000 ))
|
|
|
+ ) {
|
|
|
+ uiZ.v64 &= ~1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ uiZ = softfloat_add128( uiZ.v64, uiZ.v0, 0, lastBitMask0>>1 );
|
|
|
+ if ( roundNearEven && !(uiZ.v0 & roundBitsMask) ) {
|
|
|
+ uiZ.v0 &= ~lastBitMask0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (
|
|
|
+ roundingMode
|
|
|
+ == (signF128UI64( uiZ.v64 ) ? softfloat_round_min
|
|
|
+ : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ uiZ = softfloat_add128( uiZ.v64, uiZ.v0, 0, roundBitsMask );
|
|
|
+ }
|
|
|
+ uiZ.v0 &= ~roundBitsMask;
|
|
|
+ lastBitMask64 = !lastBitMask0;
|
|
|
+ } else {
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( exp < 0x3FFF ) {
|
|
|
+ if ( !((uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF )) | uiA0) ) return a;
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ uiZ.v64 = uiA64 & packToF128UI64( 1, 0, 0 );
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !(fracF128UI64( uiA64 ) | uiA0) ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x3FFE ) uiZ.v64 |= packToF128UI64( 0, 0x3FFF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( uiZ.v64 ) uiZ.v64 = packToF128UI64( 1, 0x3FFF, 0 );
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !uiZ.v64 ) uiZ.v64 = packToF128UI64( 0, 0x3FFF, 0 );
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ uiZ.v64 |= packToF128UI64( 0, 0x3FFF, 0 );
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ uiZ.v64 = uiA64;
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ lastBitMask64 = (uint_fast64_t) 1<<(0x402F - exp);
|
|
|
+ roundBitsMask = lastBitMask64 - 1;
|
|
|
+ if ( roundingMode == softfloat_round_near_maxMag ) {
|
|
|
+ uiZ.v64 += lastBitMask64>>1;
|
|
|
+ } else if ( roundingMode == softfloat_round_near_even ) {
|
|
|
+ uiZ.v64 += lastBitMask64>>1;
|
|
|
+ if ( !((uiZ.v64 & roundBitsMask) | uiA0) ) {
|
|
|
+ uiZ.v64 &= ~lastBitMask64;
|
|
|
+ }
|
|
|
+ } else if (
|
|
|
+ roundingMode
|
|
|
+ == (signF128UI64( uiZ.v64 ) ? softfloat_round_min
|
|
|
+ : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ uiZ.v64 = (uiZ.v64 | (uiA0 != 0)) + roundBitsMask;
|
|
|
+ }
|
|
|
+ uiZ.v64 &= ~roundBitsMask;
|
|
|
+ lastBitMask0 = 0;
|
|
|
+ }
|
|
|
+ if ( (uiZ.v64 != uiA64) || (uiZ.v0 != uiA0) ) {
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ uiZ.v64 |= lastBitMask64;
|
|
|
+ uiZ.v0 |= lastBitMask0;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/f128_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_add( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float128_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128;
|
|
|
+ return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_add.c ****/
|
|
|
+/**** start inlining ../../source/f128_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_sub( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float128_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128;
|
|
|
+ return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_sub.c ****/
|
|
|
+/**** start inlining ../../source/f128_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_mul( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB;
|
|
|
+ bool signZ;
|
|
|
+ uint_fast64_t magBits;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint64_t sig256Z[4];
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ struct uint128 sigZ;
|
|
|
+ struct uint128_extra sig128Extra;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))
|
|
|
+ ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ magBits = expB | sigB.v64 | sigB.v0;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ magBits = expA | sigA.v64 | sigA.v0;
|
|
|
+ goto infArg;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! (sigA.v64 | sigA.v0) ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! (sigB.v64 | sigB.v0) ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x4000;
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigB = softfloat_shortShiftLeft128( sigB.v64, sigB.v0, 16 );
|
|
|
+ softfloat_mul128To256M( sigA.v64, sigA.v0, sigB.v64, sigB.v0, sig256Z );
|
|
|
+ sigZExtra = sig256Z[indexWord( 4, 1 )] | (sig256Z[indexWord( 4, 0 )] != 0);
|
|
|
+ sigZ =
|
|
|
+ softfloat_add128(
|
|
|
+ sig256Z[indexWord( 4, 3 )], sig256Z[indexWord( 4, 2 )],
|
|
|
+ sigA.v64, sigA.v0
|
|
|
+ );
|
|
|
+ if ( UINT64_C( 0x0002000000000000 ) <= sigZ.v64 ) {
|
|
|
+ ++expZ;
|
|
|
+ sig128Extra =
|
|
|
+ softfloat_shortShiftRightJam128Extra(
|
|
|
+ sigZ.v64, sigZ.v0, sigZExtra, 1 );
|
|
|
+ sigZ = sig128Extra.v;
|
|
|
+ sigZExtra = sig128Extra.extra;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infArg:
|
|
|
+ if ( ! magBits ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
|
|
|
+ goto uiZ0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0, 0 );
|
|
|
+ uiZ0:
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_mul.c ****/
|
|
|
+/**** start inlining ../../source/f128_mulAdd.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_mulAdd( float128_t a, float128_t b, float128_t c )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ union ui128_f128 uC;
|
|
|
+ uint_fast64_t uiC64, uiC0;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ uC.f = c;
|
|
|
+ uiC64 = uC.ui.v64;
|
|
|
+ uiC0 = uC.ui.v0;
|
|
|
+ return softfloat_mulAddF128( uiA64, uiA0, uiB64, uiB0, uiC64, uiC0, 0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_mulAdd.c ****/
|
|
|
+/**** start inlining ../../source/f128_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_div( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB;
|
|
|
+ bool signZ;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ struct uint128 rem;
|
|
|
+ uint_fast32_t recip32;
|
|
|
+ int ix;
|
|
|
+ uint_fast64_t q64;
|
|
|
+ uint_fast32_t q;
|
|
|
+ struct uint128 term;
|
|
|
+ uint_fast32_t qs[3];
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ struct uint128 sigZ, uiZ;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 ) goto propagateNaN;
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! (sigB.v64 | sigB.v0) ) {
|
|
|
+ if ( ! (expA | sigA.v64 | sigA.v0) ) goto invalid;
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! (sigA.v64 | sigA.v0) ) goto zero;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x3FFE;
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigB.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ rem = sigA;
|
|
|
+ if ( softfloat_lt128( sigA.v64, sigA.v0, sigB.v64, sigB.v0 ) ) {
|
|
|
+ --expZ;
|
|
|
+ rem = softfloat_add128( sigA.v64, sigA.v0, sigA.v64, sigA.v0 );
|
|
|
+ }
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );
|
|
|
+ ix = 3;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ --ix;
|
|
|
+ if ( ix < 0 ) break;
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --q;
|
|
|
+ rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ }
|
|
|
+ qs[ix] = q;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ((q + 1) & 7) < 2 ) {
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ --q;
|
|
|
+ rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ } else if ( softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 ) ) {
|
|
|
+ ++q;
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ }
|
|
|
+ if ( rem.v64 | rem.v0 ) q |= 1;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigZExtra = (uint64_t) ((uint_fast64_t) q<<60);
|
|
|
+ term = softfloat_shortShiftLeft128( 0, qs[1], 54 );
|
|
|
+ sigZ =
|
|
|
+ softfloat_add128(
|
|
|
+ (uint_fast64_t) qs[2]<<19, ((uint_fast64_t) qs[0]<<25) + (q>>4),
|
|
|
+ term.v64, term.v0
|
|
|
+ );
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF128( signZ, expZ, sigZ.v64, sigZ.v0, sigZExtra );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0x7FFF, 0 );
|
|
|
+ goto uiZ0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ.v64 = packToF128UI64( signZ, 0, 0 );
|
|
|
+ uiZ0:
|
|
|
+ uiZ.v0 = 0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_div.c ****/
|
|
|
+/**** start inlining ../../source/f128_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_rem( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ int_fast32_t expB;
|
|
|
+ struct uint128 sigB;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ struct uint128 rem;
|
|
|
+ int_fast32_t expDiff;
|
|
|
+ uint_fast32_t q, recip32;
|
|
|
+ uint_fast64_t q64;
|
|
|
+ struct uint128 term, altRem, meanRem;
|
|
|
+ bool signRem;
|
|
|
+ struct uint128 uiZ;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ expB = expF128UI64( uiB64 );
|
|
|
+ sigB.v64 = fracF128UI64( uiB64 );
|
|
|
+ sigB.v0 = uiB0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ (sigA.v64 | sigA.v0) || ((expB == 0x7FFF) && (sigB.v64 | sigB.v0))
|
|
|
+ ) {
|
|
|
+ goto propagateNaN;
|
|
|
+ }
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( expB == 0x7FFF ) {
|
|
|
+ if ( sigB.v64 | sigB.v0 ) goto propagateNaN;
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expB ) {
|
|
|
+ if ( ! (sigB.v64 | sigB.v0) ) goto invalid;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigB.v64, sigB.v0 );
|
|
|
+ expB = normExpSig.exp;
|
|
|
+ sigB = normExpSig.sig;
|
|
|
+ }
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! (sigA.v64 | sigA.v0) ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sigB.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ rem = sigA;
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff < -1 ) return a;
|
|
|
+ if ( expDiff ) {
|
|
|
+ --expB;
|
|
|
+ sigB = softfloat_add128( sigB.v64, sigB.v0, sigB.v64, sigB.v0 );
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ q = softfloat_le128( sigB.v64, sigB.v0, rem.v64, rem.v0 );
|
|
|
+ if ( q ) {
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 = softfloat_approxRecip32_1( sigB.v64>>17 );
|
|
|
+ expDiff -= 30;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint_fast64_t) (uint32_t) (rem.v64>>19) * recip32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ rem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ }
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -29 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, expDiff + 30 );
|
|
|
+ term = softfloat_mul128By32( sigB.v64, sigB.v0, q );
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, term.v64, term.v0 );
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ altRem = softfloat_add128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ goto selectRem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ do {
|
|
|
+ altRem = rem;
|
|
|
+ ++q;
|
|
|
+ rem = softfloat_sub128( rem.v64, rem.v0, sigB.v64, sigB.v0 );
|
|
|
+ } while ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) );
|
|
|
+ selectRem:
|
|
|
+ meanRem = softfloat_add128( rem.v64, rem.v0, altRem.v64, altRem.v0 );
|
|
|
+ if (
|
|
|
+ (meanRem.v64 & UINT64_C( 0x8000000000000000 ))
|
|
|
+ || (! (meanRem.v64 | meanRem.v0) && (q & 1))
|
|
|
+ ) {
|
|
|
+ rem = altRem;
|
|
|
+ }
|
|
|
+ signRem = signA;
|
|
|
+ if ( rem.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ rem = softfloat_sub128( 0, 0, rem.v64, rem.v0 );
|
|
|
+ }
|
|
|
+ return softfloat_normRoundPackToF128( signRem, expB - 1, rem.v64, rem.v0 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ propagateNaN:
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, uiB64, uiB0 );
|
|
|
+ goto uiZ;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_rem.c ****/
|
|
|
+/**** start inlining ../../source/f128_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+float128_t f128_sqrt( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ int_fast32_t expA;
|
|
|
+ struct uint128 sigA, uiZ;
|
|
|
+ struct exp32_sig128 normExpSig;
|
|
|
+ int_fast32_t expZ;
|
|
|
+ uint_fast32_t sig32A, recipSqrt32, sig32Z;
|
|
|
+ struct uint128 rem;
|
|
|
+ uint32_t qs[3];
|
|
|
+ uint_fast32_t q;
|
|
|
+ uint_fast64_t x64, sig64Z;
|
|
|
+ struct uint128 y, term;
|
|
|
+ uint_fast64_t sigZExtra;
|
|
|
+ struct uint128 sigZ;
|
|
|
+ union ui128_f128 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ expA = expF128UI64( uiA64 );
|
|
|
+ sigA.v64 = fracF128UI64( uiA64 );
|
|
|
+ sigA.v0 = uiA0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( sigA.v64 | sigA.v0 ) {
|
|
|
+ uiZ = softfloat_propagateNaNF128UI( uiA64, uiA0, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ if ( ! signA ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( signA ) {
|
|
|
+ if ( ! (expA | sigA.v64 | sigA.v0) ) return a;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ! expA ) {
|
|
|
+ if ( ! (sigA.v64 | sigA.v0) ) return a;
|
|
|
+ normExpSig = softfloat_normSubnormalF128Sig( sigA.v64, sigA.v0 );
|
|
|
+ expA = normExpSig.exp;
|
|
|
+ sigA = normExpSig.sig;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (`sig32Z' is guaranteed to be a lower bound on the square root of
|
|
|
+ | `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
|
|
+ | `sigA'.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x3FFF)>>1) + 0x3FFE;
|
|
|
+ expA &= 1;
|
|
|
+ sigA.v64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ sig32A = sigA.v64>>17;
|
|
|
+ recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
|
|
+ sig32Z = ((uint_fast64_t) sig32A * recipSqrt32)>>32;
|
|
|
+ if ( expA ) {
|
|
|
+ sig32Z >>= 1;
|
|
|
+ rem = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 12 );
|
|
|
+ } else {
|
|
|
+ rem = softfloat_shortShiftLeft128( sigA.v64, sigA.v0, 13 );
|
|
|
+ }
|
|
|
+ qs[2] = sig32Z;
|
|
|
+ rem.v64 -= (uint_fast64_t) sig32Z * sig32Z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((uint32_t) (rem.v64>>2) * (uint_fast64_t) recipSqrt32)>>32;
|
|
|
+ x64 = (uint_fast64_t) sig32Z<<32;
|
|
|
+ sig64Z = x64 + ((uint_fast64_t) q<<3);
|
|
|
+ y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ term = softfloat_mul64ByShifted32To128( x64 + sig64Z, q );
|
|
|
+ rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );
|
|
|
+ if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;
|
|
|
+ --q;
|
|
|
+ sig64Z -= 1<<3;
|
|
|
+ }
|
|
|
+ qs[1] = q;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((rem.v64>>2) * recipSqrt32)>>32;
|
|
|
+ y = softfloat_shortShiftLeft128( rem.v64, rem.v0, 29 );
|
|
|
+ sig64Z <<= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ term = softfloat_shortShiftLeft128( 0, sig64Z, 32 );
|
|
|
+ term = softfloat_add128( term.v64, term.v0, 0, (uint_fast64_t) q<<6 );
|
|
|
+ term = softfloat_mul128By32( term.v64, term.v0, q );
|
|
|
+ rem = softfloat_sub128( y.v64, y.v0, term.v64, term.v0 );
|
|
|
+ if ( ! (rem.v64 & UINT64_C( 0x8000000000000000 )) ) break;
|
|
|
+ --q;
|
|
|
+ }
|
|
|
+ qs[0] = q;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = (((rem.v64>>2) * recipSqrt32)>>32) + 2;
|
|
|
+ sigZExtra = (uint64_t) ((uint_fast64_t) q<<59);
|
|
|
+ term = softfloat_shortShiftLeft128( 0, qs[1], 53 );
|
|
|
+ sigZ =
|
|
|
+ softfloat_add128(
|
|
|
+ (uint_fast64_t) qs[2]<<18, ((uint_fast64_t) qs[0]<<24) + (q>>5),
|
|
|
+ term.v64, term.v0
|
|
|
+ );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (q & 0xF) <= 2 ) {
|
|
|
+ q &= ~3;
|
|
|
+ sigZExtra = (uint64_t) ((uint_fast64_t) q<<59);
|
|
|
+ y = softfloat_shortShiftLeft128( sigZ.v64, sigZ.v0, 6 );
|
|
|
+ y.v0 |= sigZExtra>>58;
|
|
|
+ term = softfloat_sub128( y.v64, y.v0, 0, q );
|
|
|
+ y = softfloat_mul64ByShifted32To128( term.v0, q );
|
|
|
+ term = softfloat_mul64ByShifted32To128( term.v64, q );
|
|
|
+ term = softfloat_add128( term.v64, term.v0, 0, y.v64 );
|
|
|
+ rem = softfloat_shortShiftLeft128( rem.v64, rem.v0, 20 );
|
|
|
+ term = softfloat_sub128( term.v64, term.v0, rem.v64, rem.v0 );
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | The concatenation of `term' and `y.v0' is now the negative remainder
|
|
|
+ | (3 words altogether).
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ if ( term.v64 & UINT64_C( 0x8000000000000000 ) ) {
|
|
|
+ sigZExtra |= 1;
|
|
|
+ } else {
|
|
|
+ if ( term.v64 | term.v0 | y.v0 ) {
|
|
|
+ if ( sigZExtra ) {
|
|
|
+ --sigZExtra;
|
|
|
+ } else {
|
|
|
+ sigZ = softfloat_sub128( sigZ.v64, sigZ.v0, 0, 1 );
|
|
|
+ sigZExtra = ~0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF128( 0, expZ, sigZ.v64, sigZ.v0, sigZExtra );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ uiZ.v64 = defaultNaNF128UI64;
|
|
|
+ uiZ.v0 = defaultNaNF128UI0;
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/f128_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_eq( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF128UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNF128UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ (uiA0 == uiB0)
|
|
|
+ && ( (uiA64 == uiB64)
|
|
|
+ || (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_eq.c ****/
|
|
|
+/**** start inlining ../../source/f128_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_le( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA
|
|
|
+ || ! (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ | uiA0 | uiB0)
|
|
|
+ : ((uiA64 == uiB64) && (uiA0 == uiB0))
|
|
|
+ || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_le.c ****/
|
|
|
+/**** start inlining ../../source/f128_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_lt( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA
|
|
|
+ && (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ | uiA0 | uiB0)
|
|
|
+ : ((uiA64 != uiB64) || (uiA0 != uiB0))
|
|
|
+ && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_lt.c ****/
|
|
|
+/**** start inlining ../../source/f128_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_eq_signaling( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ (uiA0 == uiB0)
|
|
|
+ && ( (uiA64 == uiB64)
|
|
|
+ || (! uiA0 && ! ((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF )))
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/f128_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_le_quiet( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF128UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNF128UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA
|
|
|
+ || ! (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ | uiA0 | uiB0)
|
|
|
+ : ((uiA64 == uiB64) && (uiA0 == uiB0))
|
|
|
+ || (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f128_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_lt_quiet( float128_t a, float128_t b )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ union ui128_f128 uB;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signA, signB;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ uiA64 = uA.ui.v64;
|
|
|
+ uiA0 = uA.ui.v0;
|
|
|
+ uB.f = b;
|
|
|
+ uiB64 = uB.ui.v64;
|
|
|
+ uiB0 = uB.ui.v0;
|
|
|
+ if ( isNaNF128UI( uiA64, uiA0 ) || isNaNF128UI( uiB64, uiB0 ) ) {
|
|
|
+ if (
|
|
|
+ softfloat_isSigNaNF128UI( uiA64, uiA0 )
|
|
|
+ || softfloat_isSigNaNF128UI( uiB64, uiB0 )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+ return
|
|
|
+ (signA != signB)
|
|
|
+ ? signA
|
|
|
+ && (((uiA64 | uiB64) & UINT64_C( 0x7FFFFFFFFFFFFFFF ))
|
|
|
+ | uiA0 | uiB0)
|
|
|
+ : ((uiA64 != uiB64) || (uiA0 != uiB0))
|
|
|
+ && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 ));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_lt_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f128_isSignalingNaN.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+bool f128_isSignalingNaN( float128_t a )
|
|
|
+{
|
|
|
+ union ui128_f128 uA;
|
|
|
+
|
|
|
+ uA.f = a;
|
|
|
+ return softfloat_isSigNaNF128UI( uA.ui.v64, uA.ui.v0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128_isSignalingNaN.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_ui32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ f128M_to_ui32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_ui32( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast32_t
|
|
|
+ f128M_to_ui32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig64;
|
|
|
+ int32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (ui32_fromNaN != ui32_fromPosOverflow) || (ui32_fromNaN != ui32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && sig64 ) {
|
|
|
+#if (ui32_fromNaN == ui32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (ui32_fromNaN == ui32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return ui32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ shiftDist = 0x4023 - exp;
|
|
|
+ if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ return softfloat_roundToUI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_ui32.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_ui64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ f128M_to_ui64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_ui64( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast64_t
|
|
|
+ f128M_to_ui64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t sig96;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t sig[4];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig96 = fracF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x404F - exp;
|
|
|
+ if ( shiftDist < 17 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF)
|
|
|
+ && (sig96
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )]))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig96 |= 0x00010000;
|
|
|
+ sig[indexWord( 4, 3 )] = sig96;
|
|
|
+ sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ softfloat_shiftRightJam128M( sig, shiftDist, sig );
|
|
|
+ return
|
|
|
+ softfloat_roundMToUI64(
|
|
|
+ sign, sig + indexMultiwordLo( 4, 3 ), roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_ui64.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_i32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ f128M_to_i32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_i32( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast32_t
|
|
|
+ f128M_to_i32( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig64;
|
|
|
+ int32_t shiftDist;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+#if (i32_fromNaN != i32_fromPosOverflow) || (i32_fromNaN != i32_fromNegOverflow)
|
|
|
+ if ( (exp == 0x7FFF) && sig64 ) {
|
|
|
+#if (i32_fromNaN == i32_fromPosOverflow)
|
|
|
+ sign = 0;
|
|
|
+#elif (i32_fromNaN == i32_fromNegOverflow)
|
|
|
+ sign = 1;
|
|
|
+#else
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return i32_fromNaN;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ shiftDist = 0x4023 - exp;
|
|
|
+ if ( 0 < shiftDist ) sig64 = softfloat_shiftRightJam64( sig64, shiftDist );
|
|
|
+ return softfloat_roundToI32( sign, sig64, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_i32.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_i64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ f128M_to_i64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_i64( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast64_t
|
|
|
+ f128M_to_i64( const float128_t *aPtr, uint_fast8_t roundingMode, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t sig96;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t sig[4];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig96 = fracF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x404F - exp;
|
|
|
+ if ( shiftDist < 17 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF)
|
|
|
+ && (sig96
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )]))
|
|
|
+ ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp ) sig96 |= 0x00010000;
|
|
|
+ sig[indexWord( 4, 3 )] = sig96;
|
|
|
+ sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ softfloat_shiftRightJam128M( sig, shiftDist, sig );
|
|
|
+ return
|
|
|
+ softfloat_roundMToI64(
|
|
|
+ sign, sig + indexMultiwordLo( 4, 3 ), roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_i64.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_ui32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast32_t f128M_to_ui32_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_ui32_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast32_t f128M_to_ui32_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig64;
|
|
|
+ int32_t shiftDist;
|
|
|
+ bool sign;
|
|
|
+ uint32_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ if ( 49 <= shiftDist ) {
|
|
|
+ if ( exact && (exp | sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ if ( sign || (shiftDist < 17) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && sig64 ? ui32_fromNaN
|
|
|
+ : sign ? ui32_fromNegOverflow : ui32_fromPosOverflow;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ z = sig64>>shiftDist;
|
|
|
+ if ( exact && ((uint64_t) z<<shiftDist != sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_ui32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_ui64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+uint_fast64_t f128M_to_ui64_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_ui64_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+uint_fast64_t f128M_to_ui64_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t sig96;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t sig[4];
|
|
|
+ uint64_t z;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig96 = fracF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist < 0 ) goto invalid;
|
|
|
+ if ( exact ) {
|
|
|
+ if ( exp ) sig96 |= 0x00010000;
|
|
|
+ sig[indexWord( 4, 3 )] = sig96;
|
|
|
+ sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ softfloat_shiftRightJam128M( sig, shiftDist + 17, sig );
|
|
|
+ z = (uint64_t) sig[indexWord( 4, 2 )]<<32 | sig[indexWord( 4, 1 )];
|
|
|
+ if ( sign && z ) goto invalid;
|
|
|
+ if ( sig[indexWordLo( 4 )] ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( 64 <= shiftDist ) return 0;
|
|
|
+ if ( sign ) goto invalid;
|
|
|
+ z = UINT64_C( 0x8000000000000000 )
|
|
|
+ | (uint64_t) sig96<<47
|
|
|
+ | (uint64_t) aWPtr[indexWord( 4, 2 )]<<15
|
|
|
+ | aWPtr[indexWord( 4, 1 )]>>17;
|
|
|
+ z >>= shiftDist;
|
|
|
+ }
|
|
|
+ return z;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF)
|
|
|
+ && (sig96
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )]))
|
|
|
+ ? ui64_fromNaN
|
|
|
+ : sign ? ui64_fromNegOverflow : ui64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_ui64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_i32_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast32_t f128M_to_i32_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_i32_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast32_t f128M_to_i32_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t sig64;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t absZ, uiZ;
|
|
|
+ union { uint32_t ui; int32_t i; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) sig64 |= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp < 0x3FFF ) {
|
|
|
+ if ( exact && (exp | sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x401F <= exp ) goto invalid;
|
|
|
+ shiftDist = 0x402F - exp;
|
|
|
+ sig64 |= UINT64_C( 0x0001000000000000 );
|
|
|
+ absZ = sig64>>shiftDist;
|
|
|
+ uiZ = sign ? -absZ : absZ;
|
|
|
+ if ( uiZ>>31 != sign ) goto invalid;
|
|
|
+ if ( exact && ((uint64_t) absZ<<shiftDist != sig64) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.i;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF) && sig64 ? i32_fromNaN
|
|
|
+ : sign ? i32_fromNegOverflow : i32_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_i32_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_i64_r_minMag.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+int_fast64_t f128M_to_i64_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_i64_r_minMag( *aPtr, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+int_fast64_t f128M_to_i64_r_minMag( const float128_t *aPtr, bool exact )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t sig96;
|
|
|
+ int32_t shiftDist;
|
|
|
+ uint32_t sig[4];
|
|
|
+ uint64_t uiZ;
|
|
|
+ union { uint64_t ui; int64_t i; } uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ sig96 = fracF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ shiftDist = 0x403E - exp;
|
|
|
+ if ( shiftDist < 0 ) goto invalid;
|
|
|
+ if ( exact ) {
|
|
|
+ if ( exp ) sig96 |= 0x00010000;
|
|
|
+ sig[indexWord( 4, 3 )] = sig96;
|
|
|
+ sig[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ sig[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ sig[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ softfloat_shiftRightJam128M( sig, shiftDist + 17, sig );
|
|
|
+ uiZ = (uint64_t) sig[indexWord( 4, 2 )]<<32 | sig[indexWord( 4, 1 )];
|
|
|
+ if ( uiZ>>63 && (! sign || (uiZ != UINT64_C( 0x8000000000000000 ))) ) {
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ if ( sig[indexWordLo( 4 )] ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if ( 64 <= shiftDist ) return 0;
|
|
|
+ uiZ =
|
|
|
+ (uint64_t) sig96<<47
|
|
|
+ | (uint64_t) aWPtr[indexWord( 4, 2 )]<<15
|
|
|
+ | aWPtr[indexWord( 4, 1 )]>>17;
|
|
|
+ if ( shiftDist ) {
|
|
|
+ uiZ |= UINT64_C( 0x8000000000000000 );
|
|
|
+ uiZ >>= shiftDist;
|
|
|
+ } else {
|
|
|
+ if ( uiZ || ! sign ) goto invalid;
|
|
|
+ uiZ |= UINT64_C( 0x8000000000000000 );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( sign ) uiZ = -uiZ;
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.i;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return
|
|
|
+ (exp == 0x7FFF)
|
|
|
+ && (sig96
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )]))
|
|
|
+ ? i64_fromNaN
|
|
|
+ : sign ? i64_fromNegOverflow : i64_fromPosOverflow;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_i64_r_minMag.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_f16.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float16_t f128M_to_f16( const float128_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_f16( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float16_t f128M_to_f16( const float128_t *aPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t frac32;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint16_t uiZ, frac16;
|
|
|
+ union ui16_f16 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ frac32 =
|
|
|
+ fracF128UI96( uiA96 )
|
|
|
+ | ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )])
|
|
|
+ != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac32 ) {
|
|
|
+ softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF16UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF16UI( sign, 0x1F, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac16 = frac32>>2 | (frac32 & 3);
|
|
|
+ if ( ! (exp | frac16) ) {
|
|
|
+ uiZ = packToF16UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3FF1;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x40 ) exp = -0x40;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF16( sign, exp, frac16 | 0x4000 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_f16.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_f32.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float32_t f128M_to_f32( const float128_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_f32( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float32_t f128M_to_f32( const float128_t *aPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t frac64;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t uiZ, frac32;
|
|
|
+ union ui32_f32 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ frac64 =
|
|
|
+ (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )]
|
|
|
+ | ((aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )]) != 0);
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 ) {
|
|
|
+ softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF32UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF32UI( sign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac32 = softfloat_shortShiftRightJam64( frac64, 18 );
|
|
|
+ if ( ! (exp | frac32) ) {
|
|
|
+ uiZ = packToF32UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3F81;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return softfloat_roundPackToF32( sign, exp, frac32 | 0x40000000 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_f32.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_extF80M.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f128M_to_extF80M( const float128_t *aPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_to_extF80( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f128M_to_extF80M( const float128_t *aPtr, extFloat80_t *zPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ struct extFloat80M *zSPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint32_t sig[4];
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ zSPtr = (struct extFloat80M *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) ) {
|
|
|
+ softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
|
|
+ softfloat_commonNaNToExtF80M( &commonNaN, zSPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ zSPtr->signExp = packToExtF80UI64( sign, 0x7FFF );
|
|
|
+ zSPtr->signif = UINT64_C( 0x8000000000000000 );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp = softfloat_shiftNormSigF128M( aWPtr, 15, sig );
|
|
|
+ if ( exp == -128 ) {
|
|
|
+ zSPtr->signExp = packToExtF80UI64( sign, 0 );
|
|
|
+ zSPtr->signif = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ( sig[indexWord( 4, 0 )] ) sig[indexWord( 4, 1 )] |= 1;
|
|
|
+ softfloat_roundPackMToExtF80M(
|
|
|
+ sign, exp, &sig[indexMultiwordHi( 4, 3 )], 80, zSPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_extF80M.c ****/
|
|
|
+/**** start inlining ../../source/f128M_to_f64.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+float64_t f128M_to_f64( const float128_t *aPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_to_f64( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+float64_t f128M_to_f64( const float128_t *aPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool sign;
|
|
|
+ int32_t exp;
|
|
|
+ uint64_t frac64;
|
|
|
+ struct commonNaN commonNaN;
|
|
|
+ uint64_t uiZ;
|
|
|
+ uint32_t frac32;
|
|
|
+ union ui64_f64 uZ;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ sign = signF128UI96( uiA96 );
|
|
|
+ exp = expF128UI96( uiA96 );
|
|
|
+ frac64 = (uint64_t) fracF128UI96( uiA96 )<<32 | aWPtr[indexWord( 4, 2 )];
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp == 0x7FFF ) {
|
|
|
+ if ( frac64 || aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )] ) {
|
|
|
+ softfloat_f128MToCommonNaN( aWPtr, &commonNaN );
|
|
|
+ uiZ = softfloat_commonNaNToF64UI( &commonNaN );
|
|
|
+ } else {
|
|
|
+ uiZ = packToF64UI( sign, 0x7FF, 0 );
|
|
|
+ }
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ frac32 = aWPtr[indexWord( 4, 1 )];
|
|
|
+ frac64 = frac64<<14 | frac32>>18;
|
|
|
+ if ( (frac32 & 0x0003FFFF) || aWPtr[indexWord( 4, 0 )] ) frac64 |= 1;
|
|
|
+ if ( ! (exp | frac64) ) {
|
|
|
+ uiZ = packToF64UI( sign, 0, 0 );
|
|
|
+ goto uiZ;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ exp -= 0x3C01;
|
|
|
+ if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
|
|
|
+ if ( exp < -0x1000 ) exp = -0x1000;
|
|
|
+ }
|
|
|
+ return
|
|
|
+ softfloat_roundPackToF64(
|
|
|
+ sign, exp, frac64 | UINT64_C( 0x4000000000000000 ) );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiZ:
|
|
|
+ uZ.ui = uiZ;
|
|
|
+ return uZ.f;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_to_f64.c ****/
|
|
|
+/**** start inlining ../../source/f128M_roundToInt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_roundToInt(
|
|
|
+ const float128_t *aPtr,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact,
|
|
|
+ float128_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_roundToInt( *aPtr, roundingMode, exact );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_roundToInt(
|
|
|
+ const float128_t *aPtr,
|
|
|
+ uint_fast8_t roundingMode,
|
|
|
+ bool exact,
|
|
|
+ float128_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint32_t ui96;
|
|
|
+ int32_t exp;
|
|
|
+ uint32_t sigExtra;
|
|
|
+ bool sign;
|
|
|
+ uint_fast8_t bitPos;
|
|
|
+ bool roundNear;
|
|
|
+ unsigned int index, lastIndex;
|
|
|
+ bool extra;
|
|
|
+ uint32_t wordA, bit, wordZ;
|
|
|
+ uint_fast8_t carry;
|
|
|
+ uint32_t extrasMask;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ ui96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ exp = expF128UI96( ui96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( exp < 0x3FFF ) {
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+ sigExtra = aWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( !sigExtra ) {
|
|
|
+ sigExtra = aWPtr[indexWord( 4, 1 )] | aWPtr[indexWord( 4, 0 )];
|
|
|
+ }
|
|
|
+ if ( !sigExtra && !(ui96 & 0x7FFFFFFF) ) goto ui96;
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ sign = signF128UI96( ui96 );
|
|
|
+ switch ( roundingMode ) {
|
|
|
+ case softfloat_round_near_even:
|
|
|
+ if ( !fracF128UI96( ui96 ) && !sigExtra ) break;
|
|
|
+ case softfloat_round_near_maxMag:
|
|
|
+ if ( exp == 0x3FFE ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_min:
|
|
|
+ if ( sign ) goto mag1;
|
|
|
+ break;
|
|
|
+ case softfloat_round_max:
|
|
|
+ if ( !sign ) goto mag1;
|
|
|
+ break;
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ case softfloat_round_odd:
|
|
|
+ goto mag1;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ ui96 = packToF128UI96( sign, 0, 0 );
|
|
|
+ goto ui96;
|
|
|
+ mag1:
|
|
|
+ ui96 = packToF128UI96( sign, 0x3FFF, 0 );
|
|
|
+ goto ui96;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( 0x406F <= exp ) {
|
|
|
+ if (
|
|
|
+ (exp == 0x7FFF)
|
|
|
+ && (fracF128UI96( ui96 )
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )]))
|
|
|
+ ) {
|
|
|
+ softfloat_propagateNaNF128M( aWPtr, 0, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ goto ui96;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ bitPos = 0x406F - exp;
|
|
|
+ roundNear =
|
|
|
+ (roundingMode == softfloat_round_near_maxMag)
|
|
|
+ || (roundingMode == softfloat_round_near_even);
|
|
|
+ bitPos -= roundNear;
|
|
|
+ index = indexWordLo( 4 );
|
|
|
+ lastIndex = indexWordHi( 4 );
|
|
|
+ extra = 0;
|
|
|
+ for (;;) {
|
|
|
+ wordA = aWPtr[index];
|
|
|
+ if ( bitPos < 32 ) break;
|
|
|
+ if ( wordA ) extra = 1;
|
|
|
+ zWPtr[index] = 0;
|
|
|
+ index += wordIncr;
|
|
|
+ bitPos -= 32;
|
|
|
+ }
|
|
|
+ bit = (uint32_t) 1<<bitPos;
|
|
|
+ if ( roundNear ) {
|
|
|
+ wordZ = wordA + bit;
|
|
|
+ carry = (wordZ < wordA);
|
|
|
+ bit <<= 1;
|
|
|
+ extrasMask = bit - 1;
|
|
|
+ if ( exact && (extra || (wordA & extrasMask)) ) {
|
|
|
+ softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ (roundingMode == softfloat_round_near_even)
|
|
|
+ && !extra && !(wordZ & extrasMask)
|
|
|
+ ) {
|
|
|
+ if ( !bit ) {
|
|
|
+ zWPtr[index] = wordZ;
|
|
|
+ index += wordIncr;
|
|
|
+ wordZ = aWPtr[index] + carry;
|
|
|
+ carry &= !wordZ;
|
|
|
+ zWPtr[index] = wordZ & ~1;
|
|
|
+ goto propagateCarry;
|
|
|
+ }
|
|
|
+ wordZ &= ~bit;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ wordZ = wordA;
|
|
|
+ carry = 0;
|
|
|
+ extrasMask = bit - 1;
|
|
|
+ if ( extra || (wordA & extrasMask) ) {
|
|
|
+ if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact;
|
|
|
+ if (
|
|
|
+ roundingMode
|
|
|
+ == (signF128UI96( ui96 ) ? softfloat_round_min
|
|
|
+ : softfloat_round_max)
|
|
|
+ ) {
|
|
|
+ wordZ += bit;
|
|
|
+ carry = (wordZ < wordA);
|
|
|
+#ifdef SOFTFLOAT_ROUND_ODD
|
|
|
+ } else if ( roundingMode == softfloat_round_odd ) {
|
|
|
+ wordZ |= bit;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wordZ &= ~extrasMask;
|
|
|
+ zWPtr[index] = wordZ;
|
|
|
+ propagateCarry:
|
|
|
+ while ( index != lastIndex ) {
|
|
|
+ index += wordIncr;
|
|
|
+ wordZ = aWPtr[index] + carry;
|
|
|
+ zWPtr[index] = wordZ;
|
|
|
+ carry &= !wordZ;
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ ui96:
|
|
|
+ zWPtr[indexWordHi( 4 )] = ui96;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_roundToInt.c ****/
|
|
|
+/**** start inlining ../../source/f128M_add.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_add( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint64_t *aWPtr, *bWPtr;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float128_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ aWPtr = (const uint64_t *) aPtr;
|
|
|
+ bWPtr = (const uint64_t *) bPtr;
|
|
|
+ uiA64 = aWPtr[indexWord( 2, 1 )];
|
|
|
+ uiA0 = aWPtr[indexWord( 2, 0 )];
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ uiB64 = bWPtr[indexWord( 2, 1 )];
|
|
|
+ uiB0 = bWPtr[indexWord( 2, 0 )];
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128;
|
|
|
+ *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_add( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_addF128M(
|
|
|
+ (const uint32_t *) aPtr,
|
|
|
+ (const uint32_t *) bPtr,
|
|
|
+ (uint32_t *) zPtr,
|
|
|
+ false
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_add.c ****/
|
|
|
+/**** start inlining ../../source/f128M_sub.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint64_t *aWPtr, *bWPtr;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ bool signA;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ bool signB;
|
|
|
+#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2)
|
|
|
+ float128_t
|
|
|
+ (*magsFuncPtr)(
|
|
|
+ uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool );
|
|
|
+#endif
|
|
|
+
|
|
|
+ aWPtr = (const uint64_t *) aPtr;
|
|
|
+ bWPtr = (const uint64_t *) bPtr;
|
|
|
+ uiA64 = aWPtr[indexWord( 2, 1 )];
|
|
|
+ uiA0 = aWPtr[indexWord( 2, 0 )];
|
|
|
+ signA = signF128UI64( uiA64 );
|
|
|
+ uiB64 = bWPtr[indexWord( 2, 1 )];
|
|
|
+ uiB0 = bWPtr[indexWord( 2, 0 )];
|
|
|
+ signB = signF128UI64( uiB64 );
|
|
|
+#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL)
|
|
|
+ if ( signA == signB ) {
|
|
|
+ *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ } else {
|
|
|
+ *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+ }
|
|
|
+#else
|
|
|
+ magsFuncPtr =
|
|
|
+ (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128;
|
|
|
+ *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA );
|
|
|
+#endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_addF128M(
|
|
|
+ (const uint32_t *) aPtr,
|
|
|
+ (const uint32_t *) bPtr,
|
|
|
+ (uint32_t *) zPtr,
|
|
|
+ true
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_sub.c ****/
|
|
|
+/**** start inlining ../../source/f128M_mul.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_mul( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_mul( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_mul( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ int32_t expA;
|
|
|
+ uint32_t uiB96;
|
|
|
+ int32_t expB;
|
|
|
+ bool signZ;
|
|
|
+ const uint32_t *ptr;
|
|
|
+ uint32_t uiZ96, sigA[4];
|
|
|
+ uint_fast8_t shiftDist;
|
|
|
+ uint32_t sigB[4];
|
|
|
+ int32_t expZ;
|
|
|
+ uint32_t sigProd[8], *extSigZPtr;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ expA = expF128UI96( uiA96 );
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ expB = expF128UI96( uiB96 );
|
|
|
+ signZ = signF128UI96( uiA96 ) ^ signF128UI96( uiB96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
|
|
+ ptr = aWPtr;
|
|
|
+ if ( ! expA ) goto possiblyInvalid;
|
|
|
+ if ( ! expB ) {
|
|
|
+ ptr = bWPtr;
|
|
|
+ possiblyInvalid:
|
|
|
+ if (
|
|
|
+ ! fracF128UI96( ptr[indexWordHi( 4 )] )
|
|
|
+ && ! (ptr[indexWord( 4, 2 )] | ptr[indexWord( 4, 1 )]
|
|
|
+ | ptr[indexWord( 4, 0 )])
|
|
|
+ ) {
|
|
|
+ softfloat_invalidF128M( zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
|
|
|
+ goto uiZ96;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA ) {
|
|
|
+ sigA[indexWordHi( 4 )] = fracF128UI96( uiA96 ) | 0x00010000;
|
|
|
+ sigA[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ sigA[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ sigA[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+ } else {
|
|
|
+ expA = softfloat_shiftNormSigF128M( aWPtr, 0, sigA );
|
|
|
+ if ( expA == -128 ) goto zero;
|
|
|
+ }
|
|
|
+ if ( expB ) {
|
|
|
+ sigB[indexWordHi( 4 )] = fracF128UI96( uiB96 ) | 0x00010000;
|
|
|
+ sigB[indexWord( 4, 2 )] = bWPtr[indexWord( 4, 2 )];
|
|
|
+ sigB[indexWord( 4, 1 )] = bWPtr[indexWord( 4, 1 )];
|
|
|
+ sigB[indexWord( 4, 0 )] = bWPtr[indexWord( 4, 0 )];
|
|
|
+ } else {
|
|
|
+ expB = softfloat_shiftNormSigF128M( bWPtr, 0, sigB );
|
|
|
+ if ( expB == -128 ) goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA + expB - 0x4000;
|
|
|
+ softfloat_mul128MTo256M( sigA, sigB, sigProd );
|
|
|
+ if (
|
|
|
+ sigProd[indexWord( 8, 2 )]
|
|
|
+ || (sigProd[indexWord( 8, 1 )] | sigProd[indexWord( 8, 0 )])
|
|
|
+ ) {
|
|
|
+ sigProd[indexWord( 8, 3 )] |= 1;
|
|
|
+ }
|
|
|
+ extSigZPtr = &sigProd[indexMultiwordHi( 8, 5 )];
|
|
|
+ shiftDist = 16;
|
|
|
+ if ( extSigZPtr[indexWordHi( 5 )] & 2 ) {
|
|
|
+ ++expZ;
|
|
|
+ shiftDist = 15;
|
|
|
+ }
|
|
|
+ softfloat_shortShiftLeft160M( extSigZPtr, shiftDist, extSigZPtr );
|
|
|
+ softfloat_roundPackMToF128M( signZ, expZ, extSigZPtr, zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ zero:
|
|
|
+ uiZ96 = packToF128UI96( signZ, 0, 0 );
|
|
|
+ uiZ96:
|
|
|
+ zWPtr[indexWordHi( 4 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_mul.c ****/
|
|
|
+/**** start inlining ../../source/f128M_mulAdd.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_mulAdd(
|
|
|
+ const float128_t *aPtr,
|
|
|
+ const float128_t *bPtr,
|
|
|
+ const float128_t *cPtr,
|
|
|
+ float128_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+ const uint64_t *aWPtr, *bWPtr, *cWPtr;
|
|
|
+ uint_fast64_t uiA64, uiA0;
|
|
|
+ uint_fast64_t uiB64, uiB0;
|
|
|
+ uint_fast64_t uiC64, uiC0;
|
|
|
+
|
|
|
+ aWPtr = (const uint64_t *) aPtr;
|
|
|
+ bWPtr = (const uint64_t *) bPtr;
|
|
|
+ cWPtr = (const uint64_t *) cPtr;
|
|
|
+ uiA64 = aWPtr[indexWord( 2, 1 )];
|
|
|
+ uiA0 = aWPtr[indexWord( 2, 0 )];
|
|
|
+ uiB64 = bWPtr[indexWord( 2, 1 )];
|
|
|
+ uiB0 = bWPtr[indexWord( 2, 0 )];
|
|
|
+ uiC64 = cWPtr[indexWord( 2, 1 )];
|
|
|
+ uiC0 = cWPtr[indexWord( 2, 0 )];
|
|
|
+ *zPtr = softfloat_mulAddF128( uiA64, uiA0, uiB64, uiB0, uiC64, uiC0, 0 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_mulAdd(
|
|
|
+ const float128_t *aPtr,
|
|
|
+ const float128_t *bPtr,
|
|
|
+ const float128_t *cPtr,
|
|
|
+ float128_t *zPtr
|
|
|
+ )
|
|
|
+{
|
|
|
+
|
|
|
+ softfloat_mulAddF128M(
|
|
|
+ (const uint32_t *) aPtr,
|
|
|
+ (const uint32_t *) bPtr,
|
|
|
+ (const uint32_t *) cPtr,
|
|
|
+ (uint32_t *) zPtr,
|
|
|
+ 0
|
|
|
+ );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_mulAdd.c ****/
|
|
|
+/**** start inlining ../../source/f128M_div.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_div( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_div( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_div( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t *zWPtr, uiA96;
|
|
|
+ bool signA;
|
|
|
+ int32_t expA;
|
|
|
+ uint32_t uiB96;
|
|
|
+ bool signB;
|
|
|
+ int32_t expB;
|
|
|
+ bool signZ;
|
|
|
+ uint32_t y[5], sigB[4];
|
|
|
+ int32_t expZ;
|
|
|
+ uint32_t recip32;
|
|
|
+ int ix;
|
|
|
+ uint64_t q64;
|
|
|
+ uint32_t q, qs[3], uiZ96;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ expA = expF128UI96( uiA96 );
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ signB = signF128UI96( uiB96 );
|
|
|
+ expB = expF128UI96( uiB96 );
|
|
|
+ signZ = signA ^ signB;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
|
|
+ if ( expA == 0x7FFF ) {
|
|
|
+ if ( expB == 0x7FFF ) goto invalid;
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = softfloat_shiftNormSigF128M( aWPtr, 13, y );
|
|
|
+ expB = softfloat_shiftNormSigF128M( bWPtr, 13, sigB );
|
|
|
+ if ( expA == -128 ) {
|
|
|
+ if ( expB == -128 ) goto invalid;
|
|
|
+ goto zero;
|
|
|
+ }
|
|
|
+ if ( expB == -128 ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_infinite );
|
|
|
+ goto infinity;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = expA - expB + 0x3FFE;
|
|
|
+ if ( softfloat_compare128M( y, sigB ) < 0 ) {
|
|
|
+ --expZ;
|
|
|
+ softfloat_add128M( y, y, y );
|
|
|
+ }
|
|
|
+ recip32 =
|
|
|
+ softfloat_approxRecip32_1(
|
|
|
+ ((uint64_t) sigB[indexWord( 4, 3 )]<<32 | sigB[indexWord( 4, 2 )])
|
|
|
+ >>30
|
|
|
+ );
|
|
|
+ ix = 3;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint64_t) y[indexWordHi( 4 )] * recip32;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ --ix;
|
|
|
+ if ( ix < 0 ) break;
|
|
|
+ softfloat_remStep128MBy32( y, 29, sigB, q, y );
|
|
|
+ if ( y[indexWordHi( 4 )] & 0x80000000 ) {
|
|
|
+ --q;
|
|
|
+ softfloat_add128M( y, sigB, y );
|
|
|
+ }
|
|
|
+ qs[ix] = q;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( ((q + 1) & 7) < 2 ) {
|
|
|
+ softfloat_remStep128MBy32( y, 29, sigB, q, y );
|
|
|
+ if ( y[indexWordHi( 4 )] & 0x80000000 ) {
|
|
|
+ --q;
|
|
|
+ softfloat_add128M( y, sigB, y );
|
|
|
+ } else if ( softfloat_compare128M( sigB, y ) <= 0 ) {
|
|
|
+ ++q;
|
|
|
+ softfloat_sub128M( y, sigB, y );
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ y[indexWordLo( 4 )] || y[indexWord( 4, 1 )]
|
|
|
+ || (y[indexWord( 4, 2 )] | y[indexWord( 4, 3 )])
|
|
|
+ ) {
|
|
|
+ q |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q64 = (uint64_t) q<<28;
|
|
|
+ y[indexWord( 5, 0 )] = q64;
|
|
|
+ q64 = ((uint64_t) qs[0]<<25) + (q64>>32);
|
|
|
+ y[indexWord( 5, 1 )] = q64;
|
|
|
+ q64 = ((uint64_t) qs[1]<<22) + (q64>>32);
|
|
|
+ y[indexWord( 5, 2 )] = q64;
|
|
|
+ q64 = ((uint64_t) qs[2]<<19) + (q64>>32);
|
|
|
+ y[indexWord( 5, 3 )] = q64;
|
|
|
+ y[indexWord( 5, 4 )] = q64>>32;
|
|
|
+ softfloat_roundPackMToF128M( signZ, expZ, y, zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidF128M( zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ infinity:
|
|
|
+ uiZ96 = packToF128UI96( signZ, 0x7FFF, 0 );
|
|
|
+ goto uiZ96;
|
|
|
+ zero:
|
|
|
+ uiZ96 = packToF128UI96( signZ, 0, 0 );
|
|
|
+ uiZ96:
|
|
|
+ zWPtr[indexWordHi( 4 )] = uiZ96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 1 )] = 0;
|
|
|
+ zWPtr[indexWord( 4, 0 )] = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_div.c ****/
|
|
|
+/**** start inlining ../../source/f128M_rem.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_rem( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_rem( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void
|
|
|
+ f128M_rem( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t *zWPtr, uiA96;
|
|
|
+ int32_t expA, expB;
|
|
|
+ uint32_t x[4], rem1[5], *remPtr;
|
|
|
+ bool signRem;
|
|
|
+ int32_t expDiff;
|
|
|
+ uint32_t q, recip32;
|
|
|
+ uint64_t q64;
|
|
|
+ uint32_t rem2[5], *altRemPtr, *newRemPtr, wordMeanRem;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ expA = expF128UI96( uiA96 );
|
|
|
+ expB = expF128UI96( bWPtr[indexWordHi( 4 )] );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
|
|
|
+ if ( softfloat_tryPropagateNaNF128M( aWPtr, bWPtr, zWPtr ) ) return;
|
|
|
+ if ( expA == 0x7FFF ) goto invalid;
|
|
|
+ goto copyA;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( expA < expB - 1 ) goto copyA;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expB = softfloat_shiftNormSigF128M( bWPtr, 13, x );
|
|
|
+ if ( expB == -128 ) goto invalid;
|
|
|
+ remPtr = &rem1[indexMultiwordLo( 5, 4 )];
|
|
|
+ expA = softfloat_shiftNormSigF128M( aWPtr, 13, remPtr );
|
|
|
+ if ( expA == -128 ) goto copyA;
|
|
|
+ signRem = signF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expDiff = expA - expB;
|
|
|
+ if ( expDiff < 1 ) {
|
|
|
+ if ( expDiff < -1 ) goto copyA;
|
|
|
+ if ( expDiff ) {
|
|
|
+ --expB;
|
|
|
+ softfloat_add128M( x, x, x );
|
|
|
+ q = 0;
|
|
|
+ } else {
|
|
|
+ q = (softfloat_compare128M( x, remPtr ) <= 0);
|
|
|
+ if ( q ) softfloat_sub128M( remPtr, x, remPtr );
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ recip32 =
|
|
|
+ softfloat_approxRecip32_1(
|
|
|
+ ((uint64_t) x[indexWord( 4, 3 )]<<32 | x[indexWord( 4, 2 )])
|
|
|
+ >>30
|
|
|
+ );
|
|
|
+ expDiff -= 30;
|
|
|
+ for (;;) {
|
|
|
+ q64 = (uint64_t) remPtr[indexWordHi( 4 )] * recip32;
|
|
|
+ if ( expDiff < 0 ) break;
|
|
|
+ q = (q64 + 0x80000000)>>32;
|
|
|
+ softfloat_remStep128MBy32( remPtr, 29, x, q, remPtr );
|
|
|
+ if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
|
|
+ softfloat_add128M( remPtr, x, remPtr );
|
|
|
+ }
|
|
|
+ expDiff -= 29;
|
|
|
+ }
|
|
|
+ /*--------------------------------------------------------------------
|
|
|
+ | (`expDiff' cannot be less than -29 here.)
|
|
|
+ *--------------------------------------------------------------------*/
|
|
|
+ q = (uint32_t) (q64>>32)>>(~expDiff & 31);
|
|
|
+ softfloat_remStep128MBy32( remPtr, expDiff + 30, x, q, remPtr );
|
|
|
+ if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
|
|
+ altRemPtr = &rem2[indexMultiwordLo( 5, 4 )];
|
|
|
+ softfloat_add128M( remPtr, x, altRemPtr );
|
|
|
+ goto selectRem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ altRemPtr = &rem2[indexMultiwordLo( 5, 4 )];
|
|
|
+ do {
|
|
|
+ ++q;
|
|
|
+ newRemPtr = altRemPtr;
|
|
|
+ softfloat_sub128M( remPtr, x, newRemPtr );
|
|
|
+ altRemPtr = remPtr;
|
|
|
+ remPtr = newRemPtr;
|
|
|
+ } while ( ! (remPtr[indexWordHi( 4 )] & 0x80000000) );
|
|
|
+ selectRem:
|
|
|
+ softfloat_add128M( remPtr, altRemPtr, x );
|
|
|
+ wordMeanRem = x[indexWordHi( 4 )];
|
|
|
+ if (
|
|
|
+ (wordMeanRem & 0x80000000)
|
|
|
+ || (! wordMeanRem && (q & 1) && ! x[indexWord( 4, 0 )]
|
|
|
+ && ! (x[indexWord( 4, 2 )] | x[indexWord( 4, 1 )]))
|
|
|
+ ) {
|
|
|
+ remPtr = altRemPtr;
|
|
|
+ }
|
|
|
+ if ( remPtr[indexWordHi( 4 )] & 0x80000000 ) {
|
|
|
+ signRem = ! signRem;
|
|
|
+ softfloat_negX128M( remPtr );
|
|
|
+ }
|
|
|
+ remPtr -= indexMultiwordLo( 5, 4 );
|
|
|
+ remPtr[indexWordHi( 5 )] = 0;
|
|
|
+ softfloat_normRoundPackMToF128M( signRem, expB + 18, remPtr, zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidF128M( zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ copyA:
|
|
|
+ zWPtr[indexWordHi( 4 )] = uiA96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_rem.c ****/
|
|
|
+/**** start inlining ../../source/f128M_sqrt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
|
|
+Package, Release 3e, by John R. Hauser.
|
|
|
+
|
|
|
+Copyright 2011, 2012, 2013, 2014, 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+void f128M_sqrt( const float128_t *aPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ *zPtr = f128_sqrt( *aPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void f128M_sqrt( const float128_t *aPtr, float128_t *zPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr;
|
|
|
+ uint32_t *zWPtr;
|
|
|
+ uint32_t uiA96;
|
|
|
+ bool signA;
|
|
|
+ int32_t rawExpA;
|
|
|
+ uint32_t rem[6];
|
|
|
+ int32_t expA, expZ;
|
|
|
+ uint64_t rem64;
|
|
|
+ uint32_t sig32A, recipSqrt32, sig32Z, qs[3], q;
|
|
|
+ uint64_t sig64Z;
|
|
|
+ uint32_t term[5];
|
|
|
+ uint64_t x64;
|
|
|
+ uint32_t y[5], rem32;
|
|
|
+
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ zWPtr = (uint32_t *) zPtr;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ rawExpA = expF128UI96( uiA96 );
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( rawExpA == 0x7FFF ) {
|
|
|
+ if (
|
|
|
+ fracF128UI96( uiA96 )
|
|
|
+ || (aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
|
|
+ | aWPtr[indexWord( 4, 0 )])
|
|
|
+ ) {
|
|
|
+ softfloat_propagateNaNF128M( aWPtr, 0, zWPtr );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ( ! signA ) goto copyA;
|
|
|
+ goto invalid;
|
|
|
+ }
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expA = softfloat_shiftNormSigF128M( aWPtr, 13 - (rawExpA & 1), rem );
|
|
|
+ if ( expA == -128 ) goto copyA;
|
|
|
+ if ( signA ) goto invalid;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (`sig32Z' is guaranteed to be a lower bound on the square root of
|
|
|
+ | `sig32A', which makes `sig32Z' also a lower bound on the square root of
|
|
|
+ | `sigA'.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ expZ = ((expA - 0x3FFF)>>1) + 0x3FFE;
|
|
|
+ expA &= 1;
|
|
|
+ rem64 = (uint64_t) rem[indexWord( 4, 3 )]<<32 | rem[indexWord( 4, 2 )];
|
|
|
+ if ( expA ) {
|
|
|
+ if ( ! rawExpA ) {
|
|
|
+ softfloat_shortShiftRight128M( rem, 1, rem );
|
|
|
+ rem64 >>= 1;
|
|
|
+ }
|
|
|
+ sig32A = rem64>>29;
|
|
|
+ } else {
|
|
|
+ sig32A = rem64>>30;
|
|
|
+ }
|
|
|
+ recipSqrt32 = softfloat_approxRecipSqrt32_1( expA, sig32A );
|
|
|
+ sig32Z = ((uint64_t) sig32A * recipSqrt32)>>32;
|
|
|
+ if ( expA ) sig32Z >>= 1;
|
|
|
+ qs[2] = sig32Z;
|
|
|
+ rem64 -= (uint64_t) sig32Z * sig32Z;
|
|
|
+ rem[indexWord( 4, 3 )] = rem64>>32;
|
|
|
+ rem[indexWord( 4, 2 )] = rem64;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
|
|
+ sig64Z = ((uint64_t) sig32Z<<32) + ((uint64_t) q<<3);
|
|
|
+ term[indexWord( 4, 3 )] = 0;
|
|
|
+ term[indexWord( 4, 0 )] = 0;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ x64 = ((uint64_t) sig32Z<<32) + sig64Z;
|
|
|
+ term[indexWord( 4, 2 )] = x64>>32;
|
|
|
+ term[indexWord( 4, 1 )] = x64;
|
|
|
+ softfloat_remStep128MBy32( rem, 29, term, q, y );
|
|
|
+ rem32 = y[indexWord( 4, 3 )];
|
|
|
+ if ( ! (rem32 & 0x80000000) ) break;
|
|
|
+ --q;
|
|
|
+ sig64Z -= 1<<3;
|
|
|
+ }
|
|
|
+ qs[1] = q;
|
|
|
+ rem64 = (uint64_t) rem32<<32 | y[indexWord( 4, 2 )];
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = ((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32;
|
|
|
+ if ( rem64>>34 ) q += recipSqrt32;
|
|
|
+ sig64Z <<= 1;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ | (Repeating this loop is a rare occurrence.)
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ for (;;) {
|
|
|
+ x64 = sig64Z + (q>>26);
|
|
|
+ term[indexWord( 4, 2 )] = x64>>32;
|
|
|
+ term[indexWord( 4, 1 )] = x64;
|
|
|
+ term[indexWord( 4, 0 )] = q<<6;
|
|
|
+ softfloat_remStep128MBy32(
|
|
|
+ y, 29, term, q, &rem[indexMultiwordHi( 6, 4 )] );
|
|
|
+ rem32 = rem[indexWordHi( 6 )];
|
|
|
+ if ( ! (rem32 & 0x80000000) ) break;
|
|
|
+ --q;
|
|
|
+ }
|
|
|
+ qs[0] = q;
|
|
|
+ rem64 = (uint64_t) rem32<<32 | rem[indexWord( 6, 4 )];
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ q = (((uint32_t) (rem64>>2) * (uint64_t) recipSqrt32)>>32) + 2;
|
|
|
+ if ( rem64>>34 ) q += recipSqrt32;
|
|
|
+ x64 = (uint64_t) q<<27;
|
|
|
+ y[indexWord( 5, 0 )] = x64;
|
|
|
+ x64 = ((uint64_t) qs[0]<<24) + (x64>>32);
|
|
|
+ y[indexWord( 5, 1 )] = x64;
|
|
|
+ x64 = ((uint64_t) qs[1]<<21) + (x64>>32);
|
|
|
+ y[indexWord( 5, 2 )] = x64;
|
|
|
+ x64 = ((uint64_t) qs[2]<<18) + (x64>>32);
|
|
|
+ y[indexWord( 5, 3 )] = x64;
|
|
|
+ y[indexWord( 5, 4 )] = x64>>32;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ if ( (q & 0xF) <= 2 ) {
|
|
|
+ q &= ~3;
|
|
|
+ y[indexWordLo( 5 )] = q<<27;
|
|
|
+ term[indexWord( 5, 4 )] = 0;
|
|
|
+ term[indexWord( 5, 3 )] = 0;
|
|
|
+ term[indexWord( 5, 2 )] = 0;
|
|
|
+ term[indexWord( 5, 1 )] = q>>6;
|
|
|
+ term[indexWord( 5, 0 )] = q<<26;
|
|
|
+ softfloat_sub160M( y, term, term );
|
|
|
+ rem[indexWord( 6, 1 )] = 0;
|
|
|
+ rem[indexWord( 6, 0 )] = 0;
|
|
|
+ softfloat_remStep160MBy32(
|
|
|
+ &rem[indexMultiwordLo( 6, 5 )],
|
|
|
+ 14,
|
|
|
+ term,
|
|
|
+ q,
|
|
|
+ &rem[indexMultiwordLo( 6, 5 )]
|
|
|
+ );
|
|
|
+ rem32 = rem[indexWord( 6, 4 )];
|
|
|
+ if ( rem32 & 0x80000000 ) {
|
|
|
+ softfloat_sub1X160M( y );
|
|
|
+ } else {
|
|
|
+ if (
|
|
|
+ rem32 || rem[indexWord( 6, 0 )] || rem[indexWord( 6, 1 )]
|
|
|
+ || (rem[indexWord( 6, 3 )] | rem[indexWord( 6, 2 )])
|
|
|
+ ) {
|
|
|
+ y[indexWordLo( 5 )] |= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ softfloat_roundPackMToF128M( 0, expZ, y, zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ invalid:
|
|
|
+ softfloat_invalidF128M( zWPtr );
|
|
|
+ return;
|
|
|
+ /*------------------------------------------------------------------------
|
|
|
+ *------------------------------------------------------------------------*/
|
|
|
+ copyA:
|
|
|
+ zWPtr[indexWordHi( 4 )] = uiA96;
|
|
|
+ zWPtr[indexWord( 4, 2 )] = aWPtr[indexWord( 4, 2 )];
|
|
|
+ zWPtr[indexWord( 4, 1 )] = aWPtr[indexWord( 4, 1 )];
|
|
|
+ zWPtr[indexWord( 4, 0 )] = aWPtr[indexWord( 4, 0 )];
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_sqrt.c ****/
|
|
|
+/**** start inlining ../../source/f128M_eq.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_eq( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_eq( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_eq( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t wordA, wordB, uiA96, uiB96;
|
|
|
+ bool possibleOppositeZeros;
|
|
|
+ uint32_t mashWord;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA != wordB ) goto false_checkSigNaNs;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ possibleOppositeZeros = false;
|
|
|
+ if ( uiA96 != uiB96 ) {
|
|
|
+ possibleOppositeZeros = (((uiA96 | uiB96) & 0x7FFFFFFF) == 0);
|
|
|
+ if ( ! possibleOppositeZeros ) goto false_checkSigNaNs;
|
|
|
+ }
|
|
|
+ mashWord = wordA | wordB;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA != wordB ) goto false_checkSigNaNs;
|
|
|
+ mashWord |= wordA | wordB;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ if ( wordA != wordB ) goto false_checkSigNaNs;
|
|
|
+ if ( possibleOppositeZeros && ((mashWord | wordA | wordB) != 0) ) {
|
|
|
+ goto false_checkSigNaNs;
|
|
|
+ }
|
|
|
+ if ( ! softfloat_isNaNF128M( aWPtr ) && ! softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ false_checkSigNaNs:
|
|
|
+ if (
|
|
|
+ f128M_isSignalingNaN( (const float128_t *) aWPtr )
|
|
|
+ || f128M_isSignalingNaN( (const float128_t *) bWPtr )
|
|
|
+ ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_eq.c ****/
|
|
|
+/**** start inlining ../../source/f128M_le.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_le( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_le( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_le( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t uiA96, uiB96;
|
|
|
+ bool signA, signB;
|
|
|
+ uint32_t wordA, wordB;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ signB = signF128UI96( uiB96 );
|
|
|
+ if ( signA != signB ) {
|
|
|
+ if ( signA ) return true;
|
|
|
+ if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA | wordB ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA | wordB ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ return ((wordA | wordB) == 0);
|
|
|
+ }
|
|
|
+ if ( signA ) {
|
|
|
+ aWPtr = (const uint32_t *) bPtr;
|
|
|
+ bWPtr = (const uint32_t *) aPtr;
|
|
|
+ }
|
|
|
+ return (softfloat_compare128M( aWPtr, bWPtr ) <= 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_le.c ****/
|
|
|
+/**** start inlining ../../source/f128M_lt.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_lt( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_lt( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_lt( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t uiA96, uiB96;
|
|
|
+ bool signA, signB;
|
|
|
+ uint32_t wordA, wordB;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ signB = signF128UI96( uiB96 );
|
|
|
+ if ( signA != signB ) {
|
|
|
+ if ( signB ) return false;
|
|
|
+ if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA | wordB ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA | wordB ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ return ((wordA | wordB) != 0);
|
|
|
+ }
|
|
|
+ if ( signA ) {
|
|
|
+ aWPtr = (const uint32_t *) bPtr;
|
|
|
+ bWPtr = (const uint32_t *) aPtr;
|
|
|
+ }
|
|
|
+ return (softfloat_compare128M( aWPtr, bWPtr ) < 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_lt.c ****/
|
|
|
+/**** start inlining ../../source/f128M_eq_signaling.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_eq_signaling( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_eq_signaling( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_eq_signaling( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t wordA, wordB, uiA96, uiB96;
|
|
|
+ bool possibleOppositeZeros;
|
|
|
+ uint32_t mashWord;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA != wordB ) return false;
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ possibleOppositeZeros = false;
|
|
|
+ if ( uiA96 != uiB96 ) {
|
|
|
+ possibleOppositeZeros = (((uiA96 | uiB96) & 0x7FFFFFFF) == 0);
|
|
|
+ if ( ! possibleOppositeZeros ) return false;
|
|
|
+ }
|
|
|
+ mashWord = wordA | wordB;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA != wordB ) return false;
|
|
|
+ mashWord |= wordA | wordB;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ return
|
|
|
+ (wordA == wordB)
|
|
|
+ && (! possibleOppositeZeros || ((mashWord | wordA | wordB) == 0));
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_eq_signaling.c ****/
|
|
|
+/**** start inlining ../../source/f128M_le_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_le_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_le_quiet( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_le_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t uiA96, uiB96;
|
|
|
+ bool signA, signB;
|
|
|
+ uint32_t wordA, wordB;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ if ( f128M_isSignalingNaN( aPtr ) || f128M_isSignalingNaN( bPtr ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ signB = signF128UI96( uiB96 );
|
|
|
+ if ( signA != signB ) {
|
|
|
+ if ( signA ) return true;
|
|
|
+ if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA | wordB ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA | wordB ) return false;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ return ((wordA | wordB) == 0);
|
|
|
+ }
|
|
|
+ if ( signA ) {
|
|
|
+ aWPtr = (const uint32_t *) bPtr;
|
|
|
+ bWPtr = (const uint32_t *) aPtr;
|
|
|
+ }
|
|
|
+ return (softfloat_compare128M( aWPtr, bWPtr ) <= 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_le_quiet.c ****/
|
|
|
+/**** start inlining ../../source/f128M_lt_quiet.c ****/
|
|
|
+
|
|
|
+/*============================================================================
|
|
|
+
|
|
|
+This C source 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.
|
|
|
+
|
|
|
+=============================================================================*/
|
|
|
+
|
|
|
+#include <stdbool.h>
|
|
|
+#include <stdint.h>
|
|
|
+/**** skipping file: platform.h ****/
|
|
|
+/**** skipping file: internals.h ****/
|
|
|
+/**** skipping file: specialize.h ****/
|
|
|
+/**** skipping file: softfloat.h ****/
|
|
|
+
|
|
|
+#ifdef SOFTFLOAT_FAST_INT64
|
|
|
+
|
|
|
+bool f128M_lt_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+
|
|
|
+ return f128_lt_quiet( *aPtr, *bPtr );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+bool f128M_lt_quiet( const float128_t *aPtr, const float128_t *bPtr )
|
|
|
+{
|
|
|
+ const uint32_t *aWPtr, *bWPtr;
|
|
|
+ uint32_t uiA96, uiB96;
|
|
|
+ bool signA, signB;
|
|
|
+ uint32_t wordA, wordB;
|
|
|
+
|
|
|
+ aWPtr = (const uint32_t *) aPtr;
|
|
|
+ bWPtr = (const uint32_t *) bPtr;
|
|
|
+ if ( softfloat_isNaNF128M( aWPtr ) || softfloat_isNaNF128M( bWPtr ) ) {
|
|
|
+ if ( f128M_isSignalingNaN( aPtr ) || f128M_isSignalingNaN( bPtr ) ) {
|
|
|
+ softfloat_raiseFlags( softfloat_flag_invalid );
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ uiA96 = aWPtr[indexWordHi( 4 )];
|
|
|
+ uiB96 = bWPtr[indexWordHi( 4 )];
|
|
|
+ signA = signF128UI96( uiA96 );
|
|
|
+ signB = signF128UI96( uiB96 );
|
|
|
+ if ( signA != signB ) {
|
|
|
+ if ( signB ) return false;
|
|
|
+ if ( (uiA96 | uiB96) & 0x7FFFFFFF ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 2 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 2 )];
|
|
|
+ if ( wordA | wordB ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 1 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 1 )];
|
|
|
+ if ( wordA | wordB ) return true;
|
|
|
+ wordA = aWPtr[indexWord( 4, 0 )];
|
|
|
+ wordB = bWPtr[indexWord( 4, 0 )];
|
|
|
+ return ((wordA | wordB) != 0);
|
|
|
+ }
|
|
|
+ if ( signA ) {
|
|
|
+ aWPtr = (const uint32_t *) bPtr;
|
|
|
+ bWPtr = (const uint32_t *) aPtr;
|
|
|
+ }
|
|
|
+ return (softfloat_compare128M( aWPtr, bWPtr ) < 0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/**** ended inlining ../../source/f128M_lt_quiet.c ****/
|