41#include "specialize.h"
60 bool signProd, prodIsInfinite;
68 (*addCarryMRoutinePtr)(
96 prodIsInfinite =
false;
97 if ( (expA == 0x7FFF) || (expB == 0x7FFF) ) {
102 if ( ! (
uint32_t) (uiA96<<1) )
goto possibleInvalidProd;
113 prodIsInfinite =
true;
115 if ( expC == 0x7FFF ) {
122 goto propagateNaN_ZC;
124 if ( prodIsInfinite && (signProd != signC) )
goto invalid;
127 if ( prodIsInfinite ) {
140 if ( expA == -128 )
goto zeroProd;
149 if ( expB == -128 )
goto zeroProd;
153 expProd = expA + expB - 0x3FF0;
160 wordSig |= 0x00010000;
168 doSub = (signProd != signC);
169 addCarryMRoutinePtr =
171 expDiff = expProd - expC;
172 if ( expDiff <= 0 ) {
193 (*addCarryMRoutinePtr)(
202 if ( wordSig & 0x80000000 ) {
207 goto checkCancellation;
209 if ( wordSig < 0x00010000 ) {
214 goto extSigReady_noCancellation;
222 if ( 0 <= expDiff ) {
233 (*addCarryMRoutinePtr)(
245 shiftDist = expDiff & 31;
254 (*addCarryMRoutinePtr)( 5, extSigPtr, sigX, doSub, extSigPtr );
255 if ( expDiff == -4 ) {
259 if ( wordSig & 0x80000000 ) {
266 if ( wordSig )
goto expProdBigger_noWordShift;
268 if ( 0x00040000 <= wordSig )
goto expProdBigger_noWordShift;
272 if ( wordSig )
break;
274 if ( 0x00040000 <= wordSig )
break;
278 goto checkCancellation;
298 if ( carry != doSub ) {
304 }
while ( ! wordSig );
310 }
while ( ! wordSig );
315 expProdBigger_noWordShift:
327 if ( wordSig < 0x00010000 )
goto doRoundPack;
328 extSigReady_noCancellation:
329 if ( 0x00020000 <= wordSig ) {
336 (*roundPackRoutinePtr)( signZ, expZ, extSigPtr, zWPtr );
349 ! (
uint32_t) (uiC96<<1) && (signProd != signC)
353 goto completeCancellation;
371 completeCancellation:
void softfloat_propagateNaNF128M(const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr)
void softfloat_invalidF128M(uint32_t *)
void softfloat_normRoundPackMToF128M(bool, int32_t, uint32_t *, uint32_t *)
#define fracF128UI96(a96)
void softfloat_roundPackMToF128M(bool, int32_t, uint32_t *, uint32_t *)
#define packToF128UI96(sign, exp, sig96)
int softfloat_shiftNormSigF128M(const uint32_t *, uint_fast8_t, uint32_t *)
bool softfloat_tryPropagateNaNF128M(const uint32_t *, const uint32_t *, uint32_t *)
@ softfloat_mulAdd_subProd
#define signF128UI96(a96)
#define indexMultiwordHi(total, n)
#define indexMultiwordLo(total, n)
#define indexWordLo(total)
#define indexWord(total, n)
#define indexWordHi(total)
#define softfloat_negX160M(zPtr)
#define softfloat_shortShiftRight160M(aPtr, dist, zPtr)
#define softfloat_shiftRightJam160M(aPtr, dist, zPtr)
#define softfloat_add160M(aPtr, bPtr, zPtr)
#define softfloat_negX256M(zPtr)
uint_fast8_t softfloat_addCarryM(uint_fast8_t size_words, const uint32_t *aPtr, const uint32_t *bPtr, uint_fast8_t carry, uint32_t *zPtr)
uint_fast8_t softfloat_addComplCarryM(uint_fast8_t size_words, const uint32_t *aPtr, const uint32_t *bPtr, uint_fast8_t carry, uint32_t *zPtr)
void softfloat_mul128MTo256M(const uint32_t *aPtr, const uint32_t *bPtr, uint32_t *zPtr)
#define softfloat_shortShiftRightJam160M(aPtr, dist, zPtr)
THREAD_LOCAL uint_fast8_t softfloat_roundingMode
void softfloat_mulAddF128M(const uint32_t *aWPtr, const uint32_t *bWPtr, const uint32_t *cWPtr, uint32_t *zWPtr, uint_fast8_t op)