static float32 addFloat32Sigs()

in kernel/cpu/sh4/softfloat.c [516:571]


static float32 addFloat32Sigs(float32 a, float32 b, flag zSign)
{
	int16 aExp, bExp, zExp;
	bits32 aSig, bSig, zSig;
	int16 expDiff;

	aSig = extractFloat32Frac(a);
	aExp = extractFloat32Exp(a);
	bSig = extractFloat32Frac(b);
	bExp = extractFloat32Exp(b);
	expDiff = aExp - bExp;
	aSig <<= 6;
	bSig <<= 6;
	if (0 < expDiff) {
		if (aExp == 0xFF) {
			return a;
		}
		if (bExp == 0) {
			--expDiff;
		} else {
			bSig |= 0x20000000;
		}
		shift32RightJamming(bSig, expDiff, &bSig);
		zExp = aExp;
	} else if (expDiff < 0) {
		if (bExp == 0xFF) {
			return packFloat32(zSign, 0xFF, 0);
		}
		if (aExp == 0) {
			++expDiff;
		} else {
			aSig |= 0x20000000;
		}
		shift32RightJamming(aSig, -expDiff, &aSig);
		zExp = bExp;
	} else {
		if (aExp == 0xFF) {
			return a;
		}
		if (aExp == 0)
			return packFloat32(zSign, 0, (aSig + bSig) >> 6);
		zSig = 0x40000000 + aSig + bSig;
		zExp = aExp;
		goto roundAndPack;
	}
	aSig |= 0x20000000;
	zSig = (aSig + bSig) << 1;
	--zExp;
	if ((sbits32) zSig < 0) {
		zSig = aSig + bSig;
		++zExp;
	}
      roundAndPack:
	return roundAndPackFloat32(zSign, zExp, zSig);

}