updates softfloat to #b51ef8f of softfloat3
https://github.com/ucb-bar/berkeley-softfloat-3/
This commit is contained in:
@@ -1,241 +1,291 @@
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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 "primitives.h"
|
||||
#include "softfloat_types.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.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
|
||||
|
||||
/*============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3e, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
|
||||
University of California. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the University nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#ifndef internals_h
|
||||
#define internals_h 1
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "primitives.h"
|
||||
#include "softfloat_types.h"
|
||||
|
||||
union ui16_f16 { uint16_t ui; float16_t f; };
|
||||
union ui16_bf16 { uint16_t ui; bfloat16_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 signBF16UI( a ) ((bool) ((uint16_t) (a)>>15))
|
||||
#define expBF16UI( a ) ((int_fast16_t) ((a)>>7) & 0xFF)
|
||||
#define fracBF16UI( a ) ((a) & 0x07F)
|
||||
#define packToBF16UI( sign, exp, sig ) (((uint16_t) (sign)<<15) + ((uint16_t) (exp)<<7) + (sig))
|
||||
|
||||
#define isNaNBF16UI( a ) (((~(a) & 0x7FC0) == 0) && ((a) & 0x07F))
|
||||
|
||||
bfloat16_t softfloat_roundPackToBF16( bool, int_fast16_t, uint_fast16_t );
|
||||
struct exp8_sig16 softfloat_normSubnormalBF16Sig( uint_fast16_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
|
||||
|
||||
|
@@ -1,113 +1,113 @@
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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 "primitiveTypes.h"
|
||||
#include <stdint.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
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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 "primitiveTypes.h"
|
||||
#include <stdint.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
|
||||
|
@@ -1,100 +1,85 @@
|
||||
|
||||
/*============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3e, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the University nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#ifndef primitiveTypes_h
|
||||
#define primitiveTypes_h 1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef SOFTFLOAT_FAST_INT64
|
||||
|
||||
#ifdef LITTLEENDIAN
|
||||
struct uint128 {
|
||||
uint64_t v0, v64;
|
||||
};
|
||||
struct uint64_extra {
|
||||
uint64_t extra, v;
|
||||
};
|
||||
struct uint128_extra {
|
||||
uint64_t extra;
|
||||
struct uint128 v;
|
||||
};
|
||||
#else
|
||||
struct uint128 {
|
||||
uint64_t v64, v0;
|
||||
};
|
||||
struct uint64_extra {
|
||||
uint64_t v, extra;
|
||||
};
|
||||
struct uint128_extra {
|
||||
struct uint128 v;
|
||||
uint64_t extra;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| These macros are used to isolate the differences in word order between big-
|
||||
| endian and little-endian platforms.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#ifdef LITTLEENDIAN
|
||||
#define wordIncr 1
|
||||
#define indexWord(total, n) (n)
|
||||
#define indexWordHi(total) ((total)-1)
|
||||
#define indexWordLo(total) 0
|
||||
#define indexMultiword(total, m, n) (n)
|
||||
#define indexMultiwordHi(total, n) ((total) - (n))
|
||||
#define indexMultiwordLo(total, n) 0
|
||||
#define indexMultiwordHiBut(total, n) (n)
|
||||
#define indexMultiwordLoBut(total, n) 0
|
||||
#define INIT_UINTM4(v3, v2, v1, v0) \
|
||||
{ v0, v1, v2, v3 }
|
||||
#else
|
||||
#define wordIncr -1
|
||||
#define indexWord(total, n) ((total)-1 - (n))
|
||||
#define indexWordHi(total) 0
|
||||
#define indexWordLo(total) ((total)-1)
|
||||
#define indexMultiword(total, m, n) ((total)-1 - (m))
|
||||
#define indexMultiwordHi(total, n) 0
|
||||
#define indexMultiwordLo(total, n) ((total) - (n))
|
||||
#define indexMultiwordHiBut(total, n) 0
|
||||
#define indexMultiwordLoBut(total, n) (n)
|
||||
#define INIT_UINTM4(v3, v2, v1, v0) \
|
||||
{ v3, v2, v1, v0 }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,361 +1,379 @@
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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 "softfloat_types.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.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
|
||||
|
||||
/*============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||
Package, Release 3e, by John R. Hauser.
|
||||
|
||||
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
|
||||
University of California. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions, and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions, and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the University nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
|
||||
/*============================================================================
|
||||
| Note: If SoftFloat is made available as a general library for programs to
|
||||
| use, it is strongly recommended that a platform-specific version of this
|
||||
| header, "softfloat.h", be created that folds in "softfloat_types.h" and that
|
||||
| eliminates all dependencies on compile-time macros.
|
||||
*============================================================================*/
|
||||
|
||||
|
||||
#ifndef softfloat_h
|
||||
#define softfloat_h 1
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "softfloat_types.h"
|
||||
|
||||
#ifndef THREAD_LOCAL
|
||||
#define THREAD_LOCAL
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Software floating-point underflow tininess-detection mode.
|
||||
*----------------------------------------------------------------------------*/
|
||||
extern THREAD_LOCAL uint_fast8_t softfloat_detectTininess;
|
||||
enum {
|
||||
softfloat_tininess_beforeRounding = 0,
|
||||
softfloat_tininess_afterRounding = 1
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Software floating-point rounding mode. (Mode "odd" is supported only if
|
||||
| SoftFloat is compiled with macro 'SOFTFLOAT_ROUND_ODD' defined.)
|
||||
*----------------------------------------------------------------------------*/
|
||||
extern THREAD_LOCAL uint_fast8_t softfloat_roundingMode;
|
||||
enum {
|
||||
softfloat_round_near_even = 0,
|
||||
softfloat_round_minMag = 1,
|
||||
softfloat_round_min = 2,
|
||||
softfloat_round_max = 3,
|
||||
softfloat_round_near_maxMag = 4,
|
||||
softfloat_round_odd = 6
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Software floating-point exception flags.
|
||||
*----------------------------------------------------------------------------*/
|
||||
extern THREAD_LOCAL uint_fast8_t softfloat_exceptionFlags;
|
||||
typedef enum {
|
||||
softfloat_flag_inexact = 1,
|
||||
softfloat_flag_underflow = 2,
|
||||
softfloat_flag_overflow = 4,
|
||||
softfloat_flag_infinite = 8,
|
||||
softfloat_flag_invalid = 16
|
||||
} exceptionFlag_t;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| 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 );
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| 16-bit (brain float 16) floating-point operations.
|
||||
*----------------------------------------------------------------------------*/
|
||||
float32_t bf16_to_f32( bfloat16_t );
|
||||
bfloat16_t f32_to_bf16( float32_t );
|
||||
bool bf16_isSignalingNaN( bfloat16_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
|
||||
|
||||
|
@@ -1,94 +1,82 @@
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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
|
||||
|
||||
/*============================================================================
|
||||
|
||||
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 { uint16_t v; } bfloat16_t;
|
||||
typedef struct { uint32_t v; } float32_t;
|
||||
typedef struct { uint64_t v; } float64_t;
|
||||
typedef struct { uint64_t v[2]; } float128_t;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The format of an 80-bit extended floating-point number in memory. This
|
||||
| structure must contain a 16-bit field named 'signExp' and a 64-bit field
|
||||
| named 'signif'.
|
||||
*----------------------------------------------------------------------------*/
|
||||
#ifdef LITTLEENDIAN
|
||||
struct extFloat80M { uint64_t signif; uint16_t signExp; };
|
||||
#else
|
||||
struct extFloat80M { uint16_t signExp; uint64_t signif; };
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| The type used to pass 80-bit extended floating-point arguments and
|
||||
| results to/from functions. This type must have size identical to
|
||||
| 'struct extFloat80M'. Type 'extFloat80_t' can be defined as an alias for
|
||||
| 'struct extFloat80M'. Alternatively, if a platform has "native" support
|
||||
| for IEEE-Standard 80-bit extended floating-point, it may be possible,
|
||||
| if desired, to define 'extFloat80_t' as an alias for the native type
|
||||
| (presumably either 'long double' or a nonstandard compiler-intrinsic type).
|
||||
| In that case, the 'signif' and 'signExp' fields of 'struct extFloat80M'
|
||||
| must align exactly with the locations in memory of the sign, exponent, and
|
||||
| significand of the native type.
|
||||
*----------------------------------------------------------------------------*/
|
||||
typedef struct extFloat80M extFloat80_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user