From 4a884e684cd925d484bdb357942594a9442f32a0 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Fri, 14 Jun 2024 18:25:47 -0700 Subject: Consistently order BF16 routines in Makefile and softfloat.h --- softfloat/softfloat.h | 8 ++++++-- softfloat/softfloat.mk.in | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/softfloat/softfloat.h b/softfloat/softfloat.h index 72daccb..ce6c38a 100644 --- a/softfloat/softfloat.h +++ b/softfloat/softfloat.h @@ -157,7 +157,6 @@ 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 ); -float32_t bf16_to_f32( bfloat16_t ); float64_t f16_to_f64( float16_t ); #ifdef SOFTFLOAT_FAST_INT64 extFloat80_t f16_to_extF80( float16_t ); @@ -187,6 +186,11 @@ float16_t f16_rsqrte7( float16_t ); float16_t f16_recip7( float16_t ); /*---------------------------------------------------------------------------- +| BFloat16 operations. +*----------------------------------------------------------------------------*/ +float32_t bf16_to_f32( bfloat16_t ); + +/*---------------------------------------------------------------------------- | 32-bit (single-precision) floating-point operations. *----------------------------------------------------------------------------*/ uint_fast16_t f32_to_ui16( float32_t, uint_fast8_t, bool ); @@ -199,8 +203,8 @@ 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 ); bfloat16_t f32_to_bf16( float32_t ); +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 ); diff --git a/softfloat/softfloat.mk.in b/softfloat/softfloat.mk.in index 9c780ac..1e8611a 100644 --- a/softfloat/softfloat.mk.in +++ b/softfloat/softfloat.mk.in @@ -1,6 +1,7 @@ softfloat_subproject_deps = softfloat_c_srcs = \ + bf16_to_f32.c \ f128_add.c \ f128_classify.c \ f128_div.c \ @@ -45,7 +46,6 @@ softfloat_c_srcs = \ f16_sqrt.c \ f16_sub.c \ f16_to_f128.c \ - bf16_to_f32.c \ f16_to_f32.c \ f16_to_f64.c \ f16_to_i8.c \ @@ -76,8 +76,8 @@ softfloat_c_srcs = \ f32_roundToInt.c \ f32_sqrt.c \ f32_sub.c \ - f32_to_f128.c \ f32_to_bf16.c \ + f32_to_f128.c \ f32_to_f16.c \ f32_to_f64.c \ f32_to_i16.c \ -- cgit v1.1 From fe47d091e1bd833ec0e1250df1414ace63c19cac Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 18 Jun 2024 17:24:24 -0700 Subject: Add several BF16 ops to SoftFloat --- softfloat/bf16_add.c | 50 +++++++++++++++++++++++++++++++++++ softfloat/bf16_div.c | 50 +++++++++++++++++++++++++++++++++++ softfloat/bf16_mul.c | 50 +++++++++++++++++++++++++++++++++++ softfloat/bf16_mulAdd.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ softfloat/bf16_sqrt.c | 49 ++++++++++++++++++++++++++++++++++ softfloat/bf16_sub.c | 50 +++++++++++++++++++++++++++++++++++ softfloat/bf16_to_f64.c | 49 ++++++++++++++++++++++++++++++++++ softfloat/f64_to_bf16.c | 54 ++++++++++++++++++++++++++++++++++++++ softfloat/softfloat.h | 8 ++++++ softfloat/softfloat.mk.in | 8 ++++++ 10 files changed, 435 insertions(+) create mode 100644 softfloat/bf16_add.c create mode 100644 softfloat/bf16_div.c create mode 100644 softfloat/bf16_mul.c create mode 100644 softfloat/bf16_mulAdd.c create mode 100644 softfloat/bf16_sqrt.c create mode 100644 softfloat/bf16_sub.c create mode 100644 softfloat/bf16_to_f64.c create mode 100644 softfloat/f64_to_bf16.c diff --git a/softfloat/bf16_add.c b/softfloat/bf16_add.c new file mode 100644 index 0000000..9314fa8 --- /dev/null +++ b/softfloat/bf16_add.c @@ -0,0 +1,50 @@ + +/*============================================================================ + +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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_add( bfloat16_t a, bfloat16_t b ) +{ + float32_t f32A = { (uint_fast32_t)a.v << 16 }; + float32_t f32B = { (uint_fast32_t)b.v << 16 }; + + return f32_to_bf16 ( f32_add ( f32A, f32B ) ); +} + diff --git a/softfloat/bf16_div.c b/softfloat/bf16_div.c new file mode 100644 index 0000000..93501b0 --- /dev/null +++ b/softfloat/bf16_div.c @@ -0,0 +1,50 @@ + +/*============================================================================ + +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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_div( bfloat16_t a, bfloat16_t b ) +{ + float32_t f32A = { (uint_fast32_t)a.v << 16 }; + float32_t f32B = { (uint_fast32_t)b.v << 16 }; + + return f32_to_bf16 ( f32_div ( f32A, f32B ) ); +} + diff --git a/softfloat/bf16_mul.c b/softfloat/bf16_mul.c new file mode 100644 index 0000000..5703044 --- /dev/null +++ b/softfloat/bf16_mul.c @@ -0,0 +1,50 @@ + +/*============================================================================ + +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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_mul( bfloat16_t a, bfloat16_t b ) +{ + float32_t f32A = { (uint_fast32_t)a.v << 16 }; + float32_t f32B = { (uint_fast32_t)b.v << 16 }; + + return f32_to_bf16 ( f32_mul ( f32A, f32B ) ); +} + diff --git a/softfloat/bf16_mulAdd.c b/softfloat/bf16_mulAdd.c new file mode 100644 index 0000000..5e67396 --- /dev/null +++ b/softfloat/bf16_mulAdd.c @@ -0,0 +1,67 @@ + +/*============================================================================ + +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 The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_mulAdd( bfloat16_t a, bfloat16_t b, bfloat16_t c ) +{ + uint_fast8_t roundingMode = softfloat_roundingMode; + + float64_t f64A = bf16_to_f64( a ); + float64_t f64B = bf16_to_f64( b ); + float64_t f64C = bf16_to_f64( c ); + + float64_t prod = f64_mul( f64A, f64B ); + + softfloat_roundingMode = softfloat_round_odd; + + float64_t sum = f64_add( prod, f64C ); + + softfloat_roundingMode = roundingMode; + + /* When rounding down, return -0 instead of +0 when product's sign + * differs from C's sign. */ + if ( softfloat_roundingMode == softfloat_round_min + && sum.v == 0 + && ( ( prod.v ^ f64C.v ) & 0x8000000000000000U ) != 0 ) + return (bfloat16_t) { 0x8000 }; + + return f64_to_bf16( sum ); +} + diff --git a/softfloat/bf16_sqrt.c b/softfloat/bf16_sqrt.c new file mode 100644 index 0000000..9d4f2eb --- /dev/null +++ b/softfloat/bf16_sqrt.c @@ -0,0 +1,49 @@ + +/*============================================================================ + +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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_sqrt( bfloat16_t a ) +{ + float32_t f32A = { (uint_fast32_t)a.v << 16 }; + + return f32_to_bf16 ( f32_sqrt ( f32A ) ); +} + diff --git a/softfloat/bf16_sub.c b/softfloat/bf16_sub.c new file mode 100644 index 0000000..762d854 --- /dev/null +++ b/softfloat/bf16_sub.c @@ -0,0 +1,50 @@ + +/*============================================================================ + +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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "softfloat.h" + +bfloat16_t bf16_sub( bfloat16_t a, bfloat16_t b ) +{ + float32_t f32A = { (uint_fast32_t)a.v << 16 }; + float32_t f32B = { (uint_fast32_t)b.v << 16 }; + + return f32_to_bf16 ( f32_sub ( f32A, f32B ) ); +} + diff --git a/softfloat/bf16_to_f64.c b/softfloat/bf16_to_f64.c new file mode 100644 index 0000000..9b46781 --- /dev/null +++ b/softfloat/bf16_to_f64.c @@ -0,0 +1,49 @@ + +/*============================================================================ + +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 +#include "platform.h" +#include "internals.h" +#include "specialize.h" +#include "softfloat.h" + +float64_t bf16_to_f64( bfloat16_t a ) +{ + float32_t f32A = (float32_t) { (uint_fast32_t)a.v << 16 }; + + return f32_to_f64( f32A ); +} diff --git a/softfloat/f64_to_bf16.c b/softfloat/f64_to_bf16.c new file mode 100644 index 0000000..a320979 --- /dev/null +++ b/softfloat/f64_to_bf16.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 The Regents of the University of +California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING 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 +#include "platform.h" +#include "internals.h" +#include "specialize.h" +#include "softfloat.h" + +bfloat16_t f64_to_bf16( float64_t a ) +{ + uint_fast8_t roundingMode = softfloat_roundingMode; + softfloat_roundingMode = softfloat_round_odd; + + float32_t f32A = f64_to_f32( a ); + + softfloat_roundingMode = roundingMode; + + return f32_to_bf16( f32A ); +} diff --git a/softfloat/softfloat.h b/softfloat/softfloat.h index ce6c38a..09d7235 100644 --- a/softfloat/softfloat.h +++ b/softfloat/softfloat.h @@ -189,6 +189,13 @@ float16_t f16_recip7( float16_t ); | BFloat16 operations. *----------------------------------------------------------------------------*/ float32_t bf16_to_f32( bfloat16_t ); +float64_t bf16_to_f64( bfloat16_t ); +bfloat16_t bf16_add( bfloat16_t, bfloat16_t ); +bfloat16_t bf16_sub( bfloat16_t, bfloat16_t ); +bfloat16_t bf16_mul( bfloat16_t, bfloat16_t ); +bfloat16_t bf16_mulAdd( bfloat16_t, bfloat16_t, bfloat16_t ); +bfloat16_t bf16_div( bfloat16_t, bfloat16_t ); +bfloat16_t bf16_sqrt( bfloat16_t ); /*---------------------------------------------------------------------------- | 32-bit (single-precision) floating-point operations. @@ -244,6 +251,7 @@ 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 ); +bfloat16_t f64_to_bf16( float64_t ); float16_t f64_to_f16( float64_t ); float32_t f64_to_f32( float64_t ); #ifdef SOFTFLOAT_FAST_INT64 diff --git a/softfloat/softfloat.mk.in b/softfloat/softfloat.mk.in index 1e8611a..626b611 100644 --- a/softfloat/softfloat.mk.in +++ b/softfloat/softfloat.mk.in @@ -1,7 +1,14 @@ softfloat_subproject_deps = softfloat_c_srcs = \ + bf16_add.c \ + bf16_div.c \ + bf16_mul.c \ + bf16_mulAdd.c \ + bf16_sqrt.c \ + bf16_sub.c \ bf16_to_f32.c \ + bf16_to_f64.c \ f128_add.c \ f128_classify.c \ f128_div.c \ @@ -106,6 +113,7 @@ softfloat_c_srcs = \ f64_roundToInt.c \ f64_sqrt.c \ f64_sub.c \ + f64_to_bf16.c \ f64_to_f128.c \ f64_to_f16.c \ f64_to_f32.c \ -- cgit v1.1