diff options
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | disasm/isa_parser.cc | 40 | ||||
-rw-r--r-- | riscv/debug_module.h | 32 | ||||
-rw-r--r-- | riscv/triggers.cc | 2 | ||||
-rw-r--r-- | softfloat/bf16_add.c | 50 | ||||
-rw-r--r-- | softfloat/bf16_div.c | 50 | ||||
-rw-r--r-- | softfloat/bf16_mul.c | 50 | ||||
-rw-r--r-- | softfloat/bf16_mulAdd.c | 67 | ||||
-rw-r--r-- | softfloat/bf16_sqrt.c | 49 | ||||
-rw-r--r-- | softfloat/bf16_sub.c | 50 | ||||
-rw-r--r-- | softfloat/bf16_to_f64.c | 49 | ||||
-rw-r--r-- | softfloat/f64_to_bf16.c | 54 | ||||
-rw-r--r-- | softfloat/softfloat.h | 16 | ||||
-rw-r--r-- | softfloat/softfloat.mk.in | 12 |
14 files changed, 481 insertions, 42 deletions
@@ -86,7 +86,7 @@ Build Steps We assume that the RISCV environment variable is set to the RISC-V tools install path. - $ apt-get install device-tree-compiler libboost-regex-dev + $ apt-get install device-tree-compiler libboost-regex-dev libboost-system-dev $ mkdir build $ cd build $ ../configure --prefix=$RISCV diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc index 7d3d002..7c607d7 100644 --- a/disasm/isa_parser.cc +++ b/disasm/isa_parser.cc @@ -330,26 +330,6 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) bad_isa_string(str, ("can't parse: " + std::string(p)).c_str()); } - if (extension_table[EXT_ZCMLSD] && extension_table[EXT_ZCF]) { - bad_isa_string(str, "'Zcmlsd' extension conflicts with 'Zcf' extensions"); - } - - if (extension_table[EXT_ZCMLSD] && (!extension_table[EXT_ZCA] || !extension_table[EXT_ZILSD])) { - bad_isa_string(str, "'Zcmlsd' extension requires 'Zca' and 'Zilsd' extensions"); - } - - if (extension_table[EXT_ZFBFMIN] && !extension_table['F']) { - bad_isa_string(str, "'Zfbfmin' extension requires 'F' extension"); - } - - if ((extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZVFBFWMA]) && !extension_table['V']) { - bad_isa_string(str, "'Zvfbfmin/Zvfbfwma' extension requires 'V' extension"); - } - - if (extension_table[EXT_ZFBFMIN] || extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZFHMIN]) { - extension_table[EXT_INTERNAL_ZFH_MOVE] = true; - } - if (extension_table['A']) { extension_table[EXT_ZAAMO] = true; extension_table[EXT_ZALRSC] = true; @@ -373,6 +353,26 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv) extension_table[EXT_ZCD] = true; } + if (extension_table[EXT_ZCMLSD] && extension_table[EXT_ZCF]) { + bad_isa_string(str, "'Zcmlsd' extension conflicts with 'Zcf' extensions"); + } + + if (extension_table[EXT_ZCMLSD] && (!extension_table[EXT_ZCA] || !extension_table[EXT_ZILSD])) { + bad_isa_string(str, "'Zcmlsd' extension requires 'Zca' and 'Zilsd' extensions"); + } + + if (extension_table[EXT_ZFBFMIN] && !extension_table['F']) { + bad_isa_string(str, "'Zfbfmin' extension requires 'F' extension"); + } + + if ((extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZVFBFWMA]) && !extension_table['V']) { + bad_isa_string(str, "'Zvfbfmin/Zvfbfwma' extension requires 'V' extension"); + } + + if (extension_table[EXT_ZFBFMIN] || extension_table[EXT_ZVFBFMIN] || extension_table[EXT_ZFHMIN]) { + extension_table[EXT_INTERNAL_ZFH_MOVE] = true; + } + if (extension_table[EXT_ZFINX] && extension_table['F']) { bad_isa_string(str, ("Zfinx/Zdinx/Zhinx{min} extensions conflict with 'F/D/Q/Zfh{min}' extensions")); } diff --git a/riscv/debug_module.h b/riscv/debug_module.h index bca29b2..3771489 100644 --- a/riscv/debug_module.h +++ b/riscv/debug_module.h @@ -11,7 +11,7 @@ class simif_t; class bus_t; class processor_t; -typedef struct { +struct debug_module_config_t { // Size of program_buffer in 32-bit words, as exposed to the rest of the // world. unsigned progbufsize = 2; @@ -23,9 +23,9 @@ typedef struct { bool support_abstract_fpr_access = true; bool support_haltgroups = true; bool support_impebreak = true; -} debug_module_config_t; +}; -typedef struct { +struct dmcontrol_t { bool haltreq; bool resumereq; bool hasel; @@ -33,9 +33,9 @@ typedef struct { bool hartreset; bool dmactive; bool ndmreset; -} dmcontrol_t; +}; -typedef struct { +struct dmstatus_t { bool impebreak; bool allhavereset; bool anyhavereset; @@ -53,30 +53,30 @@ typedef struct { bool authbusy; bool cfgstrvalid; unsigned version; -} dmstatus_t; +}; -typedef enum cmderr { +enum cmderr_t { CMDERR_NONE = 0, CMDERR_BUSY = 1, CMDERR_NOTSUP = 2, CMDERR_EXCEPTION = 3, CMDERR_HALTRESUME = 4, CMDERR_OTHER = 7 -} cmderr_t; +}; -typedef struct { +struct abstractcs_t { bool busy; unsigned datacount; unsigned progbufsize; cmderr_t cmderr; -} abstractcs_t; +}; -typedef struct { +struct abstractauto_t { unsigned autoexecprogbuf; unsigned autoexecdata; -} abstractauto_t; +}; -typedef struct { +struct sbcs_t { unsigned version; bool readonaddr; unsigned sbaccess; @@ -90,14 +90,14 @@ typedef struct { bool access16; bool access8; bool sbbusyerror; -} sbcs_t; +}; -typedef struct { +struct hart_debug_state_t { bool halted; bool resumeack; bool havereset; uint8_t haltgroup; -} hart_debug_state_t; +}; class debug_module_t : public abstract_device_t { diff --git a/riscv/triggers.cc b/riscv/triggers.cc index aa258bd..de3da40 100644 --- a/riscv/triggers.cc +++ b/riscv/triggers.cc @@ -83,7 +83,7 @@ bool trigger_t::textra_match(processor_t * const proc) const noexcept if (sselect == SSELECT_SCONTEXT) { reg_t mask = (reg_t(1) << ((xlen == 32) ? CSR_TEXTRA32_SVALUE_LENGTH : CSR_TEXTRA64_SVALUE_LENGTH)) - 1; assert(CSR_TEXTRA32_SBYTEMASK_LENGTH < CSR_TEXTRA64_SBYTEMASK_LENGTH); - for (int i = 0; i < CSR_TEXTRA64_SBYTEMASK_LENGTH; i++) + for (unsigned i = 0; i < CSR_TEXTRA64_SBYTEMASK_LENGTH; i++) if (sbytemask & (1 << i)) mask &= ~(reg_t(0xff) << (i * 8)); if ((state->scontext->read() & mask) != (svalue & mask)) 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 <stdbool.h> +#include <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 <stdbool.h> +#include <stdint.h> +#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 8f533c8..81d63f3 100644 --- a/softfloat/softfloat.h +++ b/softfloat/softfloat.h @@ -156,7 +156,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 ); @@ -186,6 +185,18 @@ float16_t f16_rsqrte7( float16_t ); 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. *----------------------------------------------------------------------------*/ uint_fast16_t f32_to_ui16( float32_t, uint_fast8_t, bool ); @@ -198,8 +209,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 ); @@ -239,6 +250,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 9c780ac..626b611 100644 --- a/softfloat/softfloat.mk.in +++ b/softfloat/softfloat.mk.in @@ -1,6 +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 \ @@ -45,7 +53,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 +83,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 \ @@ -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 \ |