Skip to content

Commit 422234b

Browse files
committed
Implement f8_to_f16 and f16_to_f8 conversion functions
1 parent 18f4d0f commit 422234b

File tree

5 files changed

+194
-0
lines changed

5 files changed

+194
-0
lines changed

softfloat/f16_to_f8.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
2+
/*============================================================================
3+
4+
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
5+
Package, Release 3d, by John R. Hauser.
6+
7+
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
8+
California. All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
13+
1. Redistributions of source code must retain the above copyright notice,
14+
this list of conditions, and the following disclaimer.
15+
16+
2. Redistributions in binary form must reproduce the above copyright notice,
17+
this list of conditions, and the following disclaimer in the documentation
18+
and/or other materials provided with the distribution.
19+
20+
3. Neither the name of the University nor the names of its contributors may
21+
be used to endorse or promote products derived from this software without
22+
specific prior written permission.
23+
24+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
25+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
27+
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
28+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34+
35+
=============================================================================*/
36+
37+
#include <stdbool.h>
38+
#include <stdint.h>
39+
#include "platform.h"
40+
#include "internals.h"
41+
#include "specialize.h"
42+
#include "softfloat.h"
43+
44+
float8_t f16_to_f8( float16_t a )
45+
{
46+
union ui16_f16 uA;
47+
uint_fast16_t uiA;
48+
bool sign;
49+
int_fast8_t exp;
50+
uint_fast16_t frac;
51+
struct commonNaN commonNaN;
52+
uint_fast8_t uiZ;
53+
uint_fast16_t frac8;
54+
union ui8_f8 uZ;
55+
56+
/*------------------------------------------------------------------------
57+
*------------------------------------------------------------------------*/
58+
uA.f = a;
59+
uiA = uA.ui;
60+
sign = signF16UI( uiA );
61+
exp = expF16UI( uiA );
62+
frac = fracF16UI( uiA );
63+
/*------------------------------------------------------------------------
64+
*------------------------------------------------------------------------*/
65+
if ( exp == 0xFF ) {
66+
if ( frac ) {
67+
softfloat_f16UIToCommonNaN( uiA, &commonNaN );
68+
uiZ = softfloat_commonNaNToF8UI( &commonNaN );
69+
} else {
70+
uiZ = signInfF8UI( sign );
71+
}
72+
goto uiZ;
73+
}
74+
/*------------------------------------------------------------------------
75+
*------------------------------------------------------------------------*/
76+
frac8 = frac>>2 | ((frac & 0x3) != 0); // Round and preserve sticky bit
77+
if ( ! (exp | frac8) ) {
78+
uiZ = packToF8UI( 0, 0, 0 ); // zero
79+
goto uiZ;
80+
}
81+
/*------------------------------------------------------------------------
82+
*------------------------------------------------------------------------*/
83+
return softfloat_roundPackToF8( sign, exp - 0xC, frac8 | 0x100 );
84+
uiZ:
85+
uZ.ui = uiZ;
86+
return uZ.f;
87+
88+
}
89+

softfloat/f8_to_f16.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
2+
/*============================================================================
3+
4+
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
5+
Package, Release 3d, by John R. Hauser.
6+
7+
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
8+
California. All rights reserved.
9+
10+
Redistribution and use in source and binary forms, with or without
11+
modification, are permitted provided that the following conditions are met:
12+
13+
1. Redistributions of source code must retain the above copyright notice,
14+
this list of conditions, and the following disclaimer.
15+
16+
2. Redistributions in binary form must reproduce the above copyright notice,
17+
this list of conditions, and the following disclaimer in the documentation
18+
and/or other materials provided with the distribution.
19+
20+
3. Neither the name of the University nor the names of its contributors may
21+
be used to endorse or promote products derived from this software without
22+
specific prior written permission.
23+
24+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
25+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
27+
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
28+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34+
35+
=============================================================================*/
36+
37+
#include <stdbool.h>
38+
#include <stdint.h>
39+
#include "platform.h"
40+
#include "internals.h"
41+
#include "specialize.h"
42+
#include "softfloat.h"
43+
44+
float16_t f8_to_f16( float8_t a )
45+
{
46+
union ui8_f8 uA;
47+
uint_fast8_t uiA;
48+
bool sign;
49+
int_fast8_t exp;
50+
uint_fast8_t frac;
51+
uint_fast16_t uiZ;
52+
struct exp8_sig8 normExpSig;
53+
union ui16_f16 uZ;
54+
55+
/*------------------------------------------------------------------------
56+
*------------------------------------------------------------------------*/
57+
uA.f = a;
58+
uiA = uA.ui;
59+
sign = signF8UI( uiA );
60+
exp = expF8UI( uiA );
61+
frac = fracF8UI( uiA );
62+
/*------------------------------------------------------------------------
63+
*------------------------------------------------------------------------*/
64+
if ( isNaNF8UI(uiA) ) {
65+
uiZ = defaultNaNF16UI;
66+
goto uiZ;
67+
}
68+
if ( isInfF8UI(uiA) ) {
69+
uiZ = packToF16UI( sign, 0x1F, 0 );
70+
goto uiZ;
71+
}
72+
/*------------------------------------------------------------------------
73+
*------------------------------------------------------------------------*/
74+
if ( ! exp ) {
75+
if ( ! frac ) {
76+
uiZ = packToF16UI( 0, 0, 0 );
77+
goto uiZ;
78+
}
79+
normExpSig = softfloat_normSubnormalF8Sig( frac );
80+
exp = normExpSig.exp - 1;
81+
frac = normExpSig.sig;
82+
}
83+
/*------------------------------------------------------------------------
84+
*------------------------------------------------------------------------*/
85+
uiZ = packToF16UI( sign, exp + 0xB, (uint_fast16_t) frac<<6 );
86+
uiZ:
87+
uZ.ui = uiZ;
88+
return uZ.f;
89+
90+
}
91+

softfloat/softfloat.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ float128_t i64_to_f128( int64_t );
140140
void i64_to_extF80M( int64_t, extFloat80_t * );
141141
void i64_to_f128M( int64_t, float128_t * );
142142

143+
/*----------------------------------------------------------------------------
144+
| 8-bit (half-precision) floating-point operations.
145+
*----------------------------------------------------------------------------*/
146+
float16_t f8_to_f16( float8_t );
147+
143148
/*----------------------------------------------------------------------------
144149
| 16-bit (half-precision) floating-point operations.
145150
*----------------------------------------------------------------------------*/
@@ -155,6 +160,7 @@ uint_fast32_t f16_to_ui32_r_minMag( float16_t, bool );
155160
uint_fast64_t f16_to_ui64_r_minMag( float16_t, bool );
156161
int_fast32_t f16_to_i32_r_minMag( float16_t, bool );
157162
int_fast64_t f16_to_i64_r_minMag( float16_t, bool );
163+
float8_t f16_to_f8( float16_t );
158164
float32_t f16_to_f32( float16_t );
159165
float64_t f16_to_f64( float16_t );
160166
#ifdef SOFTFLOAT_FAST_INT64

softfloat/softfloat.mk.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ softfloat_c_srcs = \
5252
f16_roundToInt.c \
5353
f16_sqrt.c \
5454
f16_sub.c \
55+
f16_to_f8.c \
5556
f16_to_f128.c \
57+
f8_to_f16.c \
5658
f16_to_f32.c \
5759
f16_to_f64.c \
5860
f16_to_i8.c \

softfloat/specialize.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ struct commonNaN { char _unused; };
103103
*----------------------------------------------------------------------------*/
104104
#define defaultNaNBF16UI 0x7FC0
105105

106+
/*----------------------------------------------------------------------------
107+
| Converts the common NaN pointed to by `aPtr' into a 8-bit floating-point
108+
| NaN, and returns the bit pattern of this value as an unsigned integer.
109+
*----------------------------------------------------------------------------*/
110+
#define softfloat_commonNaNToF8UI( aPtr ) ((uint_fast8_t) defaultNaNF8UI)
111+
106112
/*----------------------------------------------------------------------------
107113
| Returns true when 16-bit unsigned integer `uiA' has the bit pattern of a
108114
| 16-bit floating-point signaling NaN.

0 commit comments

Comments
 (0)