diff --git a/softfloat/f16_to_i16.c b/softfloat/f16_to_i16.c index 0ec7ce14..b0fbb7cc 100644 --- a/softfloat/f16_to_i16.c +++ b/softfloat/f16_to_i16.c @@ -40,13 +40,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. int_fast16_t f16_to_i16( float16_t a, uint_fast8_t roundingMode, bool exact ) { + uint_fast8_t old_flags = softfloat_exceptionFlags; + int_fast32_t sig32 = f16_to_i32(a, roundingMode, exact); if (sig32 > INT16_MAX) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return i16_fromPosOverflow; } else if (sig32 < INT16_MIN) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return i16_fromNegOverflow; } else { return sig32; diff --git a/softfloat/f16_to_i8.c b/softfloat/f16_to_i8.c new file mode 100644 index 00000000..23638cc1 --- /dev/null +++ b/softfloat/f16_to_i8.c @@ -0,0 +1,57 @@ + +/*============================================================================ + +This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic +Package, Release 3d, 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 +#include "specialize.h" +#include "softfloat.h" + +int_fast8_t f16_to_i8( float16_t a, uint_fast8_t roundingMode, bool exact ) +{ + uint_fast8_t old_flags = softfloat_exceptionFlags; + + int_fast32_t sig32 = f16_to_i32(a, roundingMode, exact); + + if (sig32 > INT8_MAX) { + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; + return i8_fromPosOverflow; + } else if (sig32 < INT8_MIN) { + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; + return i8_fromNegOverflow; + } else { + return sig32; + } +} + diff --git a/softfloat/f16_to_ui16.c b/softfloat/f16_to_ui16.c index 818328a1..81c4f8d9 100644 --- a/softfloat/f16_to_ui16.c +++ b/softfloat/f16_to_ui16.c @@ -40,10 +40,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uint_fast16_t f16_to_ui16( float16_t a, uint_fast8_t roundingMode, bool exact ) { + uint_fast8_t old_flags = softfloat_exceptionFlags; + uint_fast32_t sig32 = f16_to_ui32(a, roundingMode, exact); if (sig32 > UINT16_MAX) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return ui16_fromPosOverflow; } else { return sig32; diff --git a/softfloat/f16_to_ui8.c b/softfloat/f16_to_ui8.c new file mode 100644 index 00000000..96124e12 --- /dev/null +++ b/softfloat/f16_to_ui8.c @@ -0,0 +1,54 @@ + +/*============================================================================ + +This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic +Package, Release 3d, 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 +#include "specialize.h" +#include "softfloat.h" + +uint_fast8_t f16_to_ui8( float16_t a, uint_fast8_t roundingMode, bool exact ) +{ + uint_fast8_t old_flags = softfloat_exceptionFlags; + + uint_fast32_t sig32 = f16_to_ui32(a, roundingMode, exact); + + if (sig32 > UINT8_MAX) { + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; + return ui8_fromPosOverflow; + } else { + return sig32; + } +} + diff --git a/softfloat/f32_to_i16.c b/softfloat/f32_to_i16.c index 14ebc6b4..bde4c76c 100644 --- a/softfloat/f32_to_i16.c +++ b/softfloat/f32_to_i16.c @@ -40,13 +40,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. int_fast16_t f32_to_i16( float32_t a, uint_fast8_t roundingMode, bool exact ) { + uint_fast8_t old_flags = softfloat_exceptionFlags; + int_fast32_t sig32 = f32_to_i32(a, roundingMode, exact); if (sig32 > INT16_MAX) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return i16_fromPosOverflow; } else if (sig32 < INT16_MIN) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return i16_fromNegOverflow; } else { return sig32; diff --git a/softfloat/f32_to_ui16.c b/softfloat/f32_to_ui16.c index a8f458da..073492bf 100644 --- a/softfloat/f32_to_ui16.c +++ b/softfloat/f32_to_ui16.c @@ -40,10 +40,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uint_fast16_t f32_to_ui16( float32_t a, uint_fast8_t roundingMode, bool exact ) { + uint_fast8_t old_flags = softfloat_exceptionFlags; + uint_fast32_t sig32 = f32_to_ui32(a, roundingMode, exact); if (sig32 > UINT16_MAX) { - softfloat_exceptionFlags |= softfloat_flag_invalid; + softfloat_exceptionFlags = old_flags | softfloat_flag_invalid; return ui16_fromPosOverflow; } else { return sig32; diff --git a/softfloat/softfloat.h b/softfloat/softfloat.h index 5579c68a..f63b6fc0 100644 --- a/softfloat/softfloat.h +++ b/softfloat/softfloat.h @@ -141,9 +141,11 @@ void i64_to_f128M( int64_t, float128_t * ); /*---------------------------------------------------------------------------- | 16-bit (half-precision) floating-point operations. *----------------------------------------------------------------------------*/ +uint_fast8_t f16_to_ui8( float16_t, uint_fast8_t, bool ); uint_fast16_t f16_to_ui16( float16_t, uint_fast8_t, bool ); 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_fast8_t f16_to_i8( float16_t, uint_fast8_t, bool ); int_fast16_t f16_to_i16( 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 ); diff --git a/softfloat/softfloat.mk.in b/softfloat/softfloat.mk.in index 56fc5602..900771ec 100644 --- a/softfloat/softfloat.mk.in +++ b/softfloat/softfloat.mk.in @@ -56,11 +56,13 @@ softfloat_c_srcs = \ f16_to_f128.c \ f16_to_f32.c \ f16_to_f64.c \ + f16_to_i8.c \ f16_to_i16.c \ f16_to_i32.c \ f16_to_i32_r_minMag.c \ f16_to_i64.c \ f16_to_i64_r_minMag.c \ + f16_to_ui8.c \ f16_to_ui16.c \ f16_to_ui32.c \ f16_to_ui32_r_minMag.c \ diff --git a/softfloat/specialize.h b/softfloat/specialize.h index 8bd98570..556476c1 100644 --- a/softfloat/specialize.h +++ b/softfloat/specialize.h @@ -55,6 +55,13 @@ extern "C" { | The values to return on conversions to 32-bit integer formats that raise an | invalid exception. *----------------------------------------------------------------------------*/ +#define ui8_fromPosOverflow 0xFF +#define ui8_fromNegOverflow 0 +#define ui8_fromNaN 0xFF +#define i8_fromPosOverflow 0x7F +#define i8_fromNegOverflow (-0x7F - 1) +#define i8_fromNaN 0x7F + #define ui16_fromPosOverflow 0xFFFF #define ui16_fromNegOverflow 0 #define ui16_fromNaN 0xFFFF