Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
f128M_to_f16.c File Reference
#include <stdbool.h>
#include <stdint.h>
#include "platform.h"
#include "internals.h"
#include "specialize.h"
#include "softfloat.h"
Include dependency graph for f128M_to_f16.c:

Go to the source code of this file.

Functions

float16_t f128M_to_f16 (const float128_t *aPtr)
 

Function Documentation

◆ f128M_to_f16()

float16_t f128M_to_f16 ( const float128_t * aPtr)

Definition at line 55 of file f128M_to_f16.c.

56{
57 const uint32_t *aWPtr;
58 uint32_t uiA96;
59 bool sign;
60 int32_t exp;
61 uint32_t frac32;
62 struct commonNaN commonNaN;
63 uint16_t uiZ, frac16;
64 union ui16_f16 uZ;
65
66 /*------------------------------------------------------------------------
67 *------------------------------------------------------------------------*/
68 aWPtr = (const uint32_t *) aPtr;
69 /*------------------------------------------------------------------------
70 *------------------------------------------------------------------------*/
71 uiA96 = aWPtr[indexWordHi( 4 )];
72 sign = signF128UI96( uiA96 );
73 exp = expF128UI96( uiA96 );
74 frac32 =
75 fracF128UI96( uiA96 )
76 | ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
77 | aWPtr[indexWord( 4, 0 )])
78 != 0);
79 /*------------------------------------------------------------------------
80 *------------------------------------------------------------------------*/
81 if ( exp == 0x7FFF ) {
82 if ( frac32 ) {
85 } else {
86 uiZ = packToF16UI( sign, 0x1F, 0 );
87 }
88 goto uiZ;
89 }
90 /*------------------------------------------------------------------------
91 *------------------------------------------------------------------------*/
92 frac16 = frac32>>2 | (frac32 & 3);
93 if ( ! (exp | frac16) ) {
94 uiZ = packToF16UI( sign, 0, 0 );
95 goto uiZ;
96 }
97 /*------------------------------------------------------------------------
98 *------------------------------------------------------------------------*/
99 exp -= 0x3FF1;
100 if ( sizeof (int_fast16_t) < sizeof (int32_t) ) {
101 if ( exp < -0x40 ) exp = -0x40;
102 }
103 return softfloat_roundPackToF16( sign, exp, frac16 | 0x4000 );
104 /*------------------------------------------------------------------------
105 *------------------------------------------------------------------------*/
106 uiZ:
107 uZ.ui = uiZ;
108 return uZ.f;
109
110}
#define softfloat_commonNaNToF16UI(aPtr)
Definition specialize.h:102
#define softfloat_f128MToCommonNaN(aWPtr, zPtr)
Definition specialize.h:369
#define fracF128UI96(a96)
Definition internals.h:249
float16_t softfloat_roundPackToF16(bool, int_fast16_t, uint_fast16_t)
#define signF128UI96(a96)
Definition internals.h:247
#define packToF16UI(sign, exp, sig)
Definition internals.h:86
#define expF128UI96(a96)
Definition internals.h:248
#define indexWord(total, n)
#define indexWordHi(total)
unsigned short uint16_t
Definition stdint.h:125
unsigned int uint32_t
Definition stdint.h:126
int16_t int_fast16_t
Definition stdint.h:151
signed int int32_t
Definition stdint.h:123
Here is the call graph for this function: