committed by
GitHub
26 changed files with 515 additions and 9 deletions
@ -0,0 +1,5 @@ |
|||||
|
require_extension(EXT_ZFBFMIN); |
||||
|
require_fp; |
||||
|
softfloat_roundingMode = RM; |
||||
|
WRITE_FRD_BF(f32_to_bf16(FRS1_F)); |
||||
|
set_fp_exceptions; |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_extension(EXT_ZFBFMIN); |
||||
|
require_fp; |
||||
|
softfloat_roundingMode = RM; |
||||
|
WRITE_FRD_F(bf16_to_f32(FRS1_BF)); |
||||
|
set_fp_exceptions; |
||||
@ -1,3 +1,3 @@ |
|||||
require_extension(EXT_ZFHMIN); |
require_extension(EXT_INTERNAL_ZFH_MOVE); |
||||
require_fp; |
require_fp; |
||||
WRITE_FRD(f16(MMU.load<uint16_t>(RS1 + insn.i_imm()))); |
WRITE_FRD(f16(MMU.load<uint16_t>(RS1 + insn.i_imm()))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension(EXT_ZFHMIN); |
require_extension(EXT_INTERNAL_ZFH_MOVE); |
||||
require_fp; |
require_fp; |
||||
WRITE_FRD(f16(RS1)); |
WRITE_FRD(f16(RS1)); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension(EXT_ZFHMIN); |
require_extension(EXT_INTERNAL_ZFH_MOVE); |
||||
require_fp; |
require_fp; |
||||
WRITE_RD(sext32((int16_t)(FRS1.v[0]))); |
WRITE_RD(sext32((int16_t)(FRS1.v[0]))); |
||||
|
|||||
@ -1,3 +1,3 @@ |
|||||
require_extension(EXT_ZFHMIN); |
require_extension(EXT_INTERNAL_ZFH_MOVE); |
||||
require_fp; |
require_fp; |
||||
MMU.store<uint16_t>(RS1 + insn.s_imm(), FRS2.v[0]); |
MMU.store<uint16_t>(RS1 + insn.s_imm(), FRS2.v[0]); |
||||
|
|||||
@ -0,0 +1,5 @@ |
|||||
|
// vfncvtbf16.f.f.w vd, vs2, vm
|
||||
|
VI_VFP_NCVT_BF16_TO_FP( |
||||
|
{ vd = f32_to_bf16(vs2); }, // BODY16
|
||||
|
{ require_extension(EXT_ZVFBFMIN); } // CHECK16
|
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
// vfwcvtbf16.f.f.v vd, vs2, vm
|
||||
|
VI_VFP_WCVT_FP_TO_BF16( |
||||
|
{ vd = bf16_to_f32(vs2); }, // BODY16
|
||||
|
{ require_extension(EXT_ZVFBFMIN); } // CHECK16
|
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
// vfwmaccbf16.vf vd, vs2, rs1
|
||||
|
VI_VFP_BF16_VF_LOOP_WIDE |
||||
|
({ |
||||
|
vd = f32_mulAdd(rs1, vs2, vd); |
||||
|
}) |
||||
@ -0,0 +1,5 @@ |
|||||
|
// vfwmaccbf16.vv vd, vs2, vs1
|
||||
|
VI_VFP_BF16_VV_LOOP_WIDE |
||||
|
({ |
||||
|
vd = f32_mulAdd(vs1, vs2, vd); |
||||
|
}) |
||||
@ -0,0 +1,80 @@ |
|||||
|
|
||||
|
/*============================================================================
|
||||
|
|
||||
|
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" |
||||
|
|
||||
|
float32_t bf16_to_f32( bfloat16_t a ) |
||||
|
{ |
||||
|
union ui16_f16 uA; |
||||
|
uint_fast16_t uiA; |
||||
|
bool sign; |
||||
|
int_fast16_t exp; |
||||
|
uint_fast16_t frac; |
||||
|
struct commonNaN commonNaN; |
||||
|
uint_fast32_t uiZ; |
||||
|
union ui32_f32 uZ; |
||||
|
|
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
uA.f = a; |
||||
|
uiA = uA.ui; |
||||
|
sign = signBF16UI( uiA ); |
||||
|
exp = expBF16UI( uiA ); |
||||
|
frac = fracBF16UI( uiA ); |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
if ( exp == 0xFF ) { |
||||
|
if ( frac ) { |
||||
|
softfloat_bf16UIToCommonNaN( uiA, &commonNaN ); |
||||
|
uiZ = softfloat_commonNaNToF32UI( &commonNaN ); |
||||
|
} else { |
||||
|
uiZ = packToF32UI( sign, 0xFF, 0 ); |
||||
|
} |
||||
|
goto uiZ; |
||||
|
} |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
uiZ = packToF32UI( sign, exp, (uint_fast32_t) frac<<16 ); |
||||
|
uiZ: |
||||
|
uZ.ui = uiZ; |
||||
|
return uZ.f; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,92 @@ |
|||||
|
|
||||
|
/*============================================================================
|
||||
|
|
||||
|
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 f32_to_bf16( float32_t a ) |
||||
|
{ |
||||
|
union ui32_f32 uA; |
||||
|
uint_fast32_t uiA; |
||||
|
bool sign; |
||||
|
int_fast16_t exp; |
||||
|
uint_fast32_t frac; |
||||
|
struct commonNaN commonNaN; |
||||
|
struct exp16_sig32 normExpSig; |
||||
|
uint_fast16_t uiZ, frac16; |
||||
|
union ui16_f16 uZ; |
||||
|
|
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
uA.f = a; |
||||
|
uiA = uA.ui; |
||||
|
sign = signF32UI( uiA ); |
||||
|
exp = expF32UI( uiA ); |
||||
|
frac = fracF32UI( uiA ); |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
if ( exp == 0xFF ) { |
||||
|
if ( frac ) { |
||||
|
softfloat_f32UIToCommonNaN( uiA, &commonNaN ); |
||||
|
uiZ = softfloat_commonNaNToBF16UI( &commonNaN ); |
||||
|
} else { |
||||
|
uiZ = packToBF16UI( sign, 0xFF, 0 ); |
||||
|
} |
||||
|
goto uiZ; |
||||
|
} |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
if ( ! (exp | frac) ) { |
||||
|
uiZ = packToBF16UI( sign, 0, 0 ); |
||||
|
goto uiZ; |
||||
|
} else if ( !exp ) { |
||||
|
normExpSig = softfloat_normSubnormalF32Sig( frac ); |
||||
|
exp = normExpSig.exp; |
||||
|
frac = normExpSig.sig; |
||||
|
} |
||||
|
frac16 = frac>>9 | ((frac & 0x1FF) != 0); |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
return softfloat_roundPackToBF16( sign, exp - 1, frac16 | 0x4000 ); |
||||
|
uiZ: |
||||
|
uZ.ui = uiZ; |
||||
|
return uZ.f; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,113 @@ |
|||||
|
|
||||
|
/*============================================================================
|
||||
|
|
||||
|
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, 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 "softfloat.h" |
||||
|
|
||||
|
bfloat16_t |
||||
|
softfloat_roundPackToBF16( bool sign, int_fast16_t exp, uint_fast16_t sig ) |
||||
|
{ |
||||
|
uint_fast8_t roundingMode; |
||||
|
bool roundNearEven; |
||||
|
uint_fast8_t roundIncrement, roundBits; |
||||
|
bool isTiny; |
||||
|
uint_fast16_t uiZ; |
||||
|
union ui16_f16 uZ; |
||||
|
|
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
roundingMode = softfloat_roundingMode; |
||||
|
roundNearEven = (roundingMode == softfloat_round_near_even); |
||||
|
roundIncrement = 0x40; |
||||
|
if ( ! roundNearEven && (roundingMode != softfloat_round_near_maxMag) ) { |
||||
|
roundIncrement = |
||||
|
(roundingMode |
||||
|
== (sign ? softfloat_round_min : softfloat_round_max)) |
||||
|
? 0x7F |
||||
|
: 0; |
||||
|
} |
||||
|
roundBits = sig & 0x7F; |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
if ( 0xFD <= (unsigned int) exp ) { |
||||
|
if ( exp < 0 ) { |
||||
|
/*----------------------------------------------------------------
|
||||
|
*----------------------------------------------------------------*/ |
||||
|
isTiny = |
||||
|
(softfloat_detectTininess == softfloat_tininess_beforeRounding) |
||||
|
|| (exp < -1) || (sig + roundIncrement < 0x8000); |
||||
|
sig = softfloat_shiftRightJam32( sig, -exp ); |
||||
|
exp = 0; |
||||
|
roundBits = sig & 0x7F; |
||||
|
if ( isTiny && roundBits ) { |
||||
|
softfloat_raiseFlags( softfloat_flag_underflow ); |
||||
|
} |
||||
|
} else if ( (0xFD < exp) || (0x8000 <= sig + roundIncrement) ) { |
||||
|
/*----------------------------------------------------------------
|
||||
|
*----------------------------------------------------------------*/ |
||||
|
softfloat_raiseFlags( |
||||
|
softfloat_flag_overflow | softfloat_flag_inexact ); |
||||
|
uiZ = packToBF16UI( sign, 0xFF, 0 ) - ! roundIncrement; |
||||
|
goto uiZ; |
||||
|
} |
||||
|
} |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
sig = (sig + roundIncrement)>>7; |
||||
|
if ( roundBits ) { |
||||
|
softfloat_exceptionFlags |= softfloat_flag_inexact; |
||||
|
#ifdef SOFTFLOAT_ROUND_ODD |
||||
|
if ( roundingMode == softfloat_round_odd ) { |
||||
|
sig |= 1; |
||||
|
goto packReturn; |
||||
|
} |
||||
|
#endif |
||||
|
} |
||||
|
sig &= ~(uint_fast16_t) (! (roundBits ^ 0x40) & roundNearEven); |
||||
|
if ( ! sig ) exp = 0; |
||||
|
/*------------------------------------------------------------------------
|
||||
|
*------------------------------------------------------------------------*/ |
||||
|
packReturn: |
||||
|
uiZ = packToBF16UI( sign, exp, sig ); |
||||
|
uiZ: |
||||
|
uZ.ui = uiZ; |
||||
|
return uZ.f; |
||||
|
|
||||
|
} |
||||
|
|
||||
Loading…
Reference in new issue