/*-------------------------------------------------------------------------
 * drawElements Base Portability Library
 * -------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief 16-bit floating-point math.
 *//*--------------------------------------------------------------------*/

#include "deFloat16.h"

DE_BEGIN_EXTERN_C

deFloat16 deFloat32To16 (float val32)
{
	deUint32	sign;
	int			expotent;
	deUint32	mantissa;
	union
	{
		float		f;
		deUint32	u;
	} x;

	x.f			= val32;
	sign		= (x.u >> 16u) & 0x00008000u;
	expotent	= (int)((x.u >> 23u) & 0x000000ffu) - (127 - 15);
	mantissa	= x.u & 0x007fffffu;

	if (expotent <= 0)
	{
		if (expotent < -10)
		{
			/* Rounds to zero. */
			return (deFloat16) sign;
		}

		/* Converted to denormalized half, add leading 1 to significand. */
		mantissa = mantissa | 0x00800000u;

		/* Round mantissa to nearest (10+e) */
		{
			deUint32 t = 14u - expotent;
			deUint32 a = (1u << (t - 1u)) - 1u;
			deUint32 b = (mantissa >> t) & 1u;

			mantissa = (mantissa + a + b) >> t;
		}

		return (deFloat16) (sign | mantissa);
	}
	else if (expotent == 0xff - (127 - 15))
	{
		if (mantissa == 0u)
		{
			/* InF */
			return (deFloat16) (sign | 0x7c00u);
		}
		else
		{
			/* NaN */
			mantissa >>= 13u;
			return (deFloat16) (sign | 0x7c00u | mantissa | (mantissa == 0u));
		}
	}
	else
	{
		/* Normalized float. */
		mantissa = mantissa + 0x00000fffu + ((mantissa >> 13u) & 1u);

		if (mantissa & 0x00800000u)
		{
			/* Overflow in mantissa. */
			mantissa  = 0u;
			expotent += 1;
		}

		if (expotent > 30)
		{
			/* \todo [pyry] Cause hw fp overflow */
			return (deFloat16) (sign | 0x7c00u);
		}

		return (deFloat16) (sign | ((deUint32)expotent << 10u) | (mantissa >> 13u));
	}
}

deFloat16 deFloat64To16 (double val64)
{
	deUint64	sign;
	long		expotent;
	deUint64	mantissa;
	union
	{
		double		f;
		deUint64	u;
	} x;

	x.f			= val64;
	sign		= (x.u >> 48u) & 0x00008000u;
	expotent	= (long int)((x.u >> 52u) & 0x000007ffu) - (1023 - 15);
	mantissa	= x.u & 0x00fffffffffffffu;

	if (expotent <= 0)
	{
		if (expotent < -10)
		{
			/* Rounds to zero. */
			return (deFloat16) sign;
		}

		/* Converted to denormalized half, add leading 1 to significand. */
		mantissa = mantissa | 0x0010000000000000u;

		/* Round mantissa to nearest (10+e) */
		{
			deUint64 t = 43u - expotent;
			deUint64 a = (1u << (t - 1u)) - 1u;
			deUint64 b = (mantissa >> t) & 1u;

			mantissa = (mantissa + a + b) >> t;
		}

		return (deFloat16) (sign | mantissa);
	}
	else if (expotent == 0x7ff - (1023 - 15))
	{
		if (mantissa == 0u)
		{
			/* InF */
			return (deFloat16) (sign | 0x7c00u);
		}
		else
		{
			/* NaN */
			mantissa >>= 42u;
			return (deFloat16) (sign | 0x7c00u | mantissa | (mantissa == 0u));
		}
	}
	else
	{
		/* Normalized float. */
		mantissa = mantissa + 0x000001ffffffffffu + ((mantissa >> 42u) & 1u);

		if (mantissa & 0x010000000000000u)
		{
			/* Overflow in mantissa. */
			mantissa  = 0u;
			expotent += 1;
		}

		if (expotent > 30)
		{
			return (deFloat16) (sign | 0x7c00u);
		}

		return (deFloat16) (sign | ((deUint32)expotent << 10u) | (mantissa >> 13u));
	}
}

/*--------------------------------------------------------------------*//*!
 * \brief Round the given number `val` to nearest even by discarding
 *        the last `numBitsToDiscard` bits.
 * \param val value to round
 * \param numBitsToDiscard number of (least significant) bits to discard
 * \return The rounded value with the last `numBitsToDiscard` removed
 *//*--------------------------------------------------------------------*/
static deUint32 roundToNearestEven (deUint32 val, const deUint32 numBitsToDiscard)
{
	const deUint32	lastBits	= val & ((1 << numBitsToDiscard) - 1);
	const deUint32	headBit		= val & (1 << (numBitsToDiscard - 1));

	DE_ASSERT(numBitsToDiscard > 0 && numBitsToDiscard < 32);	/* Make sure no overflow. */
	val >>= numBitsToDiscard;

	if (headBit == 0)
	{
		return val;
	}
	else if (headBit == lastBits)
	{
		if ((val & 0x1) == 0x1)
		{
			return val + 1;
		}
		else
		{
			return val;
		}
	}
	else
	{
		return val + 1;
	}
}

deFloat16 deFloat32To16Round (float val32, deRoundingMode mode)
{
	union
	{
		float		f;		/* Interpret as 32-bit float */
		deUint32	u;		/* Interpret as 32-bit unsigned integer */
	} x;
	deUint32	sign;		/* sign : 0000 0000 0000 0000 X000 0000 0000 0000 */
	deUint32	exp32;		/* exp32: biased exponent for 32-bit floats */
	int			exp16;		/* exp16: biased exponent for 16-bit floats */
	deUint32	mantissa;

	/* We only support these two rounding modes for now */
	DE_ASSERT(mode == DE_ROUNDINGMODE_TO_ZERO || mode == DE_ROUNDINGMODE_TO_NEAREST_EVEN);

	x.f			= val32;
	sign		= (x.u >> 16u) & 0x00008000u;
	exp32		= (x.u >> 23u) & 0x000000ffu;
	exp16		= (int) (exp32) - 127 + 15;	/* 15/127: exponent bias for 16-bit/32-bit floats */
	mantissa	= x.u & 0x007fffffu;

	/* Case: zero and denormalized floats */
	if (exp32 == 0)
	{
		/* Denormalized floats are < 2^(1-127), not representable in 16-bit floats, rounding to zero. */
		return (deFloat16) sign;
	}
	/* Case: Inf and NaN */
	else if (exp32 == 0x000000ffu)
	{
		if (mantissa == 0u)
		{
			/* Inf */
			return (deFloat16) (sign | 0x7c00u);
		}
		else
		{
			/* NaN */
			mantissa >>= 13u;	/* 16-bit floats has 10-bit for mantissa, 13-bit less than 32-bit floats. */
			/* Make sure we don't turn NaN into zero by | (mantissa == 0). */
			return (deFloat16) (sign | 0x7c00u | mantissa | (mantissa == 0u));
		}
	}
	/* The following are cases for normalized floats.
	 *
	 * * If exp16 is less than 0, we are experiencing underflow for the exponent. To encode this underflowed exponent,
	 *   we can only shift the mantissa further right.
	 *   The real exponent is exp16 - 15. A denormalized 16-bit float can represent -14 via its exponent.
	 *   Note that the most significant bit in the mantissa of a denormalized float is already -1 as for exponent.
	 *   So, we just need to right shift the mantissa -exp16 bits.
	 * * If exp16 is 0, mantissa shifting requirement is similar to the above.
	 * * If exp16 is greater than 30 (0b11110), we are experiencing overflow for the exponent of 16-bit normalized floats.
	 */
	/* Case: normalized floats -> zero */
	else if (exp16 < -10)
	{
		/* 16-bit floats have only 10 bits for mantissa. Minimal 16-bit denormalized float is (2^-10) * (2^-14). */
		/* Expecting a number < (2^-10) * (2^-14) here, not representable, round to zero. */
		return (deFloat16) sign;
	}
	/* Case: normalized floats -> zero and denormalized halfs */
	else if (exp16 <= 0)
	{
		/* Add the implicit leading 1 in mormalized float to mantissa. */
		mantissa |= 0x00800000u;
		/* We have a (23 + 1)-bit mantissa, but 16-bit floats only expect 10-bit mantissa.
		 * Need to discard the last 14-bits considering rounding mode.
		 * We also need to shift right -exp16 bits to encode the underflowed exponent.
		 */
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			mantissa >>= (14 - exp16);
		}
		else
		{
			/* mantissa in the above may exceed 10-bits, in which case overflow happens.
			 * The overflowed bit is automatically carried to exponent then.
			 */
			mantissa = roundToNearestEven(mantissa, 14 - exp16);
		}
		return (deFloat16) (sign | mantissa);
	}
	/* Case: normalized floats -> normalized floats */
	else if (exp16 <= 30)
	{
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			return (deFloat16) (sign | ((deUint32)exp16 << 10u) | (mantissa >> 13u));
		}
		else
		{
			mantissa	= roundToNearestEven(mantissa, 13);
			/* Handle overflow. exp16 may overflow (and become Inf) itself, but that's correct. */
			exp16		= (exp16 << 10u) + (mantissa & (1 << 10));
			mantissa	&= (1u << 10) - 1;
			return (deFloat16) (sign | ((deUint32) exp16) | mantissa);
		}
	}
	/* Case: normalized floats (too large to be representable as 16-bit floats) */
	else
	{
		/* According to IEEE Std 754-2008 Section 7.4,
		 * * roundTiesToEven and roundTiesToAway carry all overflows to Inf with the sign
		 *   of the intermediate  result.
		 * * roundTowardZero carries all overflows to the format’s largest finite number
		 *   with the sign of the intermediate result.
		 */
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			return (deFloat16) (sign | 0x7bffu); /* 111 1011 1111 1111 */
		}
		else
		{
			return (deFloat16) (sign | (0x1f << 10));
		}
	}

	/* Make compiler happy */
	return (deFloat16) 0;
}

/*--------------------------------------------------------------------*//*!
 * \brief Round the given number `val` to nearest even by discarding
 *        the last `numBitsToDiscard` bits.
 * \param val value to round
 * \param numBitsToDiscard number of (least significant) bits to discard
 * \return The rounded value with the last `numBitsToDiscard` removed
 *//*--------------------------------------------------------------------*/
static deUint64 roundToNearestEven64 (deUint64 val, const deUint64 numBitsToDiscard)
{
	const deUint64	lastBits	= val & (((deUint64)1 << numBitsToDiscard) - 1);
	const deUint64	headBit		= val & ((deUint64)1 << (numBitsToDiscard - 1));

	DE_ASSERT(numBitsToDiscard > 0 && numBitsToDiscard < 64);	/* Make sure no overflow. */
	val >>= numBitsToDiscard;

	if (headBit == 0)
	{
		return val;
	}
	else if (headBit == lastBits)
	{
		if ((val & 0x1) == 0x1)
		{
			return val + 1;
		}
		else
		{
			return val;
		}
	}
	else
	{
		return val + 1;
	}
}

deFloat16 deFloat64To16Round (double val64, deRoundingMode mode)
{
	union
	{
		double		f;		/* Interpret as 64-bit float */
		deUint64	u;		/* Interpret as 64-bit unsigned integer */
	} x;
	deUint64	sign;		/* sign : 0000 0000 0000 0000 X000 0000 0000 0000 */
	deUint64	exp64;		/* exp32: biased exponent for 64-bit floats */
	int			exp16;		/* exp16: biased exponent for 16-bit floats */
	deUint64	mantissa;

	/* We only support these two rounding modes for now */
	DE_ASSERT(mode == DE_ROUNDINGMODE_TO_ZERO || mode == DE_ROUNDINGMODE_TO_NEAREST_EVEN);

	x.f			= val64;
	sign		= (x.u >> 48u) & 0x00008000u;
	exp64		= (x.u >> 52u) & 0x000007ffu;
	exp16		= (int) (exp64) - 1023 + 15;	/* 15/127: exponent bias for 16-bit/32-bit floats */
	mantissa	= x.u & 0x00fffffffffffffu;

	/* Case: zero and denormalized floats */
	if (exp64 == 0)
	{
		/* Denormalized floats are < 2^(1-1023), not representable in 16-bit floats, rounding to zero. */
		return (deFloat16) sign;
	}
	/* Case: Inf and NaN */
	else if (exp64 == 0x000007ffu)
	{
		if (mantissa == 0u)
		{
			/* Inf */
			return (deFloat16) (sign | 0x7c00u);
		}
		else
		{
			/* NaN */
			mantissa >>= 42u;	/* 16-bit floats has 10-bit for mantissa, 42-bit less than 64-bit floats. */
			/* Make sure we don't turn NaN into zero by | (mantissa == 0). */
			return (deFloat16) (sign | 0x7c00u | mantissa | (mantissa == 0u));
		}
	}
	/* The following are cases for normalized floats.
	 *
	 * * If exp16 is less than 0, we are experiencing underflow for the exponent. To encode this underflowed exponent,
	 *   we can only shift the mantissa further right.
	 *   The real exponent is exp16 - 15. A denormalized 16-bit float can represent -14 via its exponent.
	 *   Note that the most significant bit in the mantissa of a denormalized float is already -1 as for exponent.
	 *   So, we just need to right shift the mantissa -exp16 bits.
	 * * If exp16 is 0, mantissa shifting requirement is similar to the above.
	 * * If exp16 is greater than 30 (0b11110), we are experiencing overflow for the exponent of 16-bit normalized floats.
	 */
	/* Case: normalized floats -> zero */
	else if (exp16 < -10)
	{
		/* 16-bit floats have only 10 bits for mantissa. Minimal 16-bit denormalized float is (2^-10) * (2^-14). */
		/* Expecting a number < (2^-10) * (2^-14) here, not representable, round to zero. */
		return (deFloat16) sign;
	}
	/* Case: normalized floats -> zero and denormalized halfs */
	else if (exp16 <= 0)
	{
		/* Add the implicit leading 1 in mormalized float to mantissa. */
		mantissa |= 0x0010000000000000u;
		/* We have a (23 + 1)-bit mantissa, but 16-bit floats only expect 10-bit mantissa.
		 * Need to discard the last 14-bits considering rounding mode.
		 * We also need to shift right -exp16 bits to encode the underflowed exponent.
		 */
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			mantissa >>= (43 - exp16);
		}
		else
		{
			/* mantissa in the above may exceed 10-bits, in which case overflow happens.
			 * The overflowed bit is automatically carried to exponent then.
			 */
			mantissa = roundToNearestEven64(mantissa, 43 - exp16);
		}
		return (deFloat16) (sign | mantissa);
	}
	/* Case: normalized floats -> normalized floats */
	else if (exp16 <= 30)
	{
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			return (deFloat16) (sign | ((deUint32)exp16 << 10u) | (mantissa >> 42u));
		}
		else
		{
			mantissa	= roundToNearestEven64(mantissa, 42);
			/* Handle overflow. exp16 may overflow (and become Inf) itself, but that's correct. */
			exp16		= (exp16 << 10u) + (deFloat16)(mantissa & (1 << 10));
			mantissa	&= (1u << 10) - 1;
			return (deFloat16) (sign | ((deUint32) exp16) | mantissa);
		}
	}
	/* Case: normalized floats (too large to be representable as 16-bit floats) */
	else
	{
		/* According to IEEE Std 754-2008 Section 7.4,
		 * * roundTiesToEven and roundTiesToAway carry all overflows to Inf with the sign
		 *   of the intermediate  result.
		 * * roundTowardZero carries all overflows to the format’s largest finite number
		 *   with the sign of the intermediate result.
		 */
		if (mode == DE_ROUNDINGMODE_TO_ZERO)
		{
			return (deFloat16) (sign | 0x7bffu); /* 111 1011 1111 1111 */
		}
		else
		{
			return (deFloat16) (sign | (0x1f << 10));
		}
	}

	/* Make compiler happy */
	return (deFloat16) 0;
}

float deFloat16To32 (deFloat16 val16)
{
	deUint32 sign;
	deUint32 expotent;
	deUint32 mantissa;
	union
	{
		float		f;
		deUint32	u;
	} x;

	x.u			= 0u;

	sign		= ((deUint32)val16 >> 15u) & 0x00000001u;
	expotent	= ((deUint32)val16 >> 10u) & 0x0000001fu;
	mantissa	= (deUint32)val16 & 0x000003ffu;

	if (expotent == 0u)
	{
		if (mantissa == 0u)
		{
			/* +/- 0 */
			x.u = sign << 31u;
			return x.f;
		}
		else
		{
			/* Denormalized, normalize it. */

			while (!(mantissa & 0x00000400u))
			{
				mantissa <<= 1u;
				expotent -=  1u;
			}

			expotent += 1u;
			mantissa &= ~0x00000400u;
		}
	}
	else if (expotent == 31u)
	{
		if (mantissa == 0u)
		{
			/* +/- InF */
			x.u = (sign << 31u) | 0x7f800000u;
			return x.f;
		}
		else
		{
			/* +/- NaN */
			x.u = (sign << 31u) | 0x7f800000u | (mantissa << 13u);
			return x.f;
		}
	}

	expotent = expotent + (127u - 15u);
	mantissa = mantissa << 13u;

	x.u = (sign << 31u) | (expotent << 23u) | mantissa;
	return x.f;
}

double deFloat16To64 (deFloat16 val16)
{
	deUint64 sign;
	deUint64 expotent;
	deUint64 mantissa;
	union
	{
		double		f;
		deUint64	u;
	} x;

	x.u			= 0u;

	sign		= ((deUint32)val16 >> 15u) & 0x00000001u;
	expotent	= ((deUint32)val16 >> 10u) & 0x0000001fu;
	mantissa	= (deUint32)val16 & 0x000003ffu;

	if (expotent == 0u)
	{
		if (mantissa == 0u)
		{
			/* +/- 0 */
			x.u = sign << 63u;
			return x.f;
		}
		else
		{
			/* Denormalized, normalize it. */

			while (!(mantissa & 0x00000400u))
			{
				mantissa <<= 1u;
				expotent -=  1u;
			}

			expotent += 1u;
			mantissa &= ~0x00000400u;
		}
	}
	else if (expotent == 31u)
	{
		if (mantissa == 0u)
		{
			/* +/- InF */
			x.u = (sign << 63u) | 0x7ff0000000000000u;
			return x.f;
		}
		else
		{
			/* +/- NaN */
			x.u = (sign << 63u) | 0x7ff0000000000000u | (mantissa << 42u);
			return x.f;
		}
	}

	expotent = expotent + (1023u - 15u);
	mantissa = mantissa << 42u;

	x.u = (sign << 63u) | (expotent << 52u) | mantissa;
	return x.f;
}

DE_END_EXTERN_C
