[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/22] softfloat: Add float16 <=> float64 conversion
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH 13/22] softfloat: Add float16 <=> float64 conversion functions |
Date: |
Tue, 31 Dec 2013 13:35:49 +0000 |
Add the conversion functions float16_to_float64() and
float64_to_float16(), which will be needed for the ARM
A64 instruction set.
Signed-off-by: Peter Maydell <address@hidden>
---
fpu/softfloat.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++
include/fpu/softfloat.h | 2 ++
2 files changed, 77 insertions(+)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 925db05..623a4b9 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -3279,6 +3279,81 @@ float16 float32_to_float16(float32 a, flag ieee
STATUS_PARAM)
return roundAndPackFloat16(aSign, aExp, aSig, ieee STATUS_VAR);
}
+float64 float16_to_float64(float16 a, flag ieee STATUS_PARAM)
+{
+ flag aSign;
+ int_fast16_t aExp;
+ uint32_t aSig;
+
+ aSign = extractFloat16Sign(a);
+ aExp = extractFloat16Exp(a);
+ aSig = extractFloat16Frac(a);
+
+ if (aExp == 0x1f && ieee) {
+ if (aSig) {
+ return commonNaNToFloat64(
+ float16ToCommonNaN(a STATUS_VAR) STATUS_VAR);
+ }
+ return packFloat64(aSign, 0x7ff, 0);
+ }
+ if (aExp == 0) {
+ if (aSig == 0) {
+ return packFloat64(aSign, 0, 0);
+ }
+
+ normalizeFloat16Subnormal(aSig, &aExp, &aSig);
+ aExp--;
+ }
+ return packFloat64(aSign, aExp + 0x3f0, ((uint64_t)aSig) << 42);
+}
+
+float16 float64_to_float16(float64 a, flag ieee STATUS_PARAM)
+{
+ flag aSign;
+ int_fast16_t aExp;
+ uint64_t aSig;
+ uint32_t zSig;
+
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac(a);
+ aExp = extractFloat64Exp(a);
+ aSign = extractFloat64Sign(a);
+ if (aExp == 0x7FF) {
+ if (aSig) {
+ /* Input is a NaN */
+ if (!ieee) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ return packFloat16(aSign, 0, 0);
+ }
+ return commonNaNToFloat16(
+ float64ToCommonNaN(a STATUS_VAR) STATUS_VAR);
+ }
+ /* Infinity */
+ if (!ieee) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ return packFloat16(aSign, 0x1f, 0x3ff);
+ }
+ return packFloat16(aSign, 0x1f, 0);
+ }
+ shift64RightJamming(aSig, 29, &aSig);
+ zSig = aSig;
+ if (aExp == 0 && zSig == 0) {
+ return packFloat16(aSign, 0, 0);
+ }
+ /* Decimal point between bits 22 and 23. Note that we add the 1 bit
+ * even if the input is denormal; however this is harmless because
+ * the largest possible single-precision denormal is still smaller
+ * than the smallest representable half-precision denormal, and so we
+ * will end up ignoring aSig and returning via the "always return zero"
+ * codepath.
+ */
+ zSig |= 0x00800000;
+ aExp -= 0x3F1;
+
+ return roundAndPackFloat16(aSign, aExp, zSig, ieee STATUS_VAR);
+}
+
/*----------------------------------------------------------------------------
| Returns the result of converting the double-precision floating-point value
| `a' to the extended double-precision floating-point format. The conversion
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
index b8d2b30..08c7559 100644
--- a/include/fpu/softfloat.h
+++ b/include/fpu/softfloat.h
@@ -294,6 +294,8 @@ INLINE float64 uint16_to_float64(uint_fast16_t v
STATUS_PARAM)
*----------------------------------------------------------------------------*/
float16 float32_to_float16( float32, flag STATUS_PARAM );
float32 float16_to_float32( float16, flag STATUS_PARAM );
+float16 float64_to_float16(float64 a, flag ieee STATUS_PARAM);
+float64 float16_to_float64(float16 a, flag ieee STATUS_PARAM);
/*----------------------------------------------------------------------------
| Software half-precision operations.
--
1.8.5
- [Qemu-devel] [PATCH 18/22] target-arm: A64: Add extra VFP fixed point conversion helpers, (continued)
- [Qemu-devel] [PATCH 18/22] target-arm: A64: Add extra VFP fixed point conversion helpers, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 06/22] softfloat: Fix factor 2 error for scalbn on denormal inputs, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 05/22] softfloat: Only raise Invalid when conversions to int are out of range, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 09/22] softfloat: Fix float64_to_uint32, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 17/22] target-arm: Ignore most exceptions from scalbn when doing fixpoint conversion, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 21/22] target-arm: A64: Add 1-source 32-to-32 and 64-to-64 FP instructions, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 04/22] softfloat: Fix float64_to_uint64, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 13/22] softfloat: Add float16 <=> float64 conversion functions,
Peter Maydell <=
- [Qemu-devel] [PATCH 14/22] softfloat: Add support for ties-away rounding, Peter Maydell, 2013/12/31
- [Qemu-devel] [PATCH 12/22] softfloat: Factor out RoundAndPackFloat16 and NormalizeFloat16Subnormal, Peter Maydell, 2013/12/31