[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 11/28] fpu/softfloat: Partial support for ARM Alterna
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PULL 11/28] fpu/softfloat: Partial support for ARM Alternative half-precision |
Date: |
Wed, 16 May 2018 08:52:26 -0700 |
From: Alex Bennée <address@hidden>
For float16 ARM supports an alternative half-precision format which
sacrifices the ability to represent NaN/Inf in return for a higher
dynamic range. The new FloatFmt flag, arm_althp, is then used to
modify the behaviour of canonicalize and round_canonical with respect
to representation and exception raising.
Usage of this new flag waits until we re-factor float-to-float conversions.
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Alex Bennée <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
---
fpu/softfloat.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 41253c6749..64e1ad4f98 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -220,8 +220,10 @@ typedef struct {
* frac_shift: shift to normalise the fraction with DECOMPOSED_BINARY_POINT
* The following are computed based the size of fraction
* frac_lsb: least significant bit of fraction
- * fram_lsbm1: the bit bellow the least significant bit (for rounding)
+ * frac_lsbm1: the bit below the least significant bit (for rounding)
* round_mask/roundeven_mask: masks used for rounding
+ * The following optional modifiers are available:
+ * arm_althp: handle ARM Alternative Half Precision
*/
typedef struct {
int exp_size;
@@ -233,6 +235,7 @@ typedef struct {
uint64_t frac_lsbm1;
uint64_t round_mask;
uint64_t roundeven_mask;
+ bool arm_althp;
} FloatFmt;
/* Expand fields based on the size of exponent and fraction */
@@ -324,7 +327,7 @@ static inline float64 float64_pack_raw(FloatParts p)
static FloatParts canonicalize(FloatParts part, const FloatFmt *parm,
float_status *status)
{
- if (part.exp == parm->exp_max) {
+ if (part.exp == parm->exp_max && !parm->arm_althp) {
if (part.frac == 0) {
part.cls = float_class_inf;
} else {
@@ -413,7 +416,15 @@ static FloatParts round_canonical(FloatParts p,
float_status *s,
}
frac >>= frac_shift;
- if (unlikely(exp >= exp_max)) {
+ if (parm->arm_althp) {
+ /* ARM Alt HP eschews Inf and NaN for a wider exponent. */
+ if (unlikely(exp > exp_max)) {
+ /* Overflow. Return the maximum normal. */
+ flags = float_flag_invalid;
+ exp = exp_max;
+ frac = -1;
+ }
+ } else if (unlikely(exp >= exp_max)) {
flags |= float_flag_overflow | float_flag_inexact;
if (overflow_norm) {
exp = exp_max - 1;
@@ -464,12 +475,14 @@ static FloatParts round_canonical(FloatParts p,
float_status *s,
case float_class_inf:
do_inf:
+ assert(!parm->arm_althp);
exp = exp_max;
frac = 0;
break;
case float_class_qnan:
case float_class_snan:
+ assert(!parm->arm_althp);
exp = exp_max;
frac >>= parm->frac_shift;
break;
--
2.17.0
- [Qemu-devel] [PULL 00/28] softfloat patch roundup, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 01/28] fpu/softfloat: Fix conversion from uint64 to float128, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 02/28] fpu/softfloat: Merge NO_SIGNALING_NANS definitions, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 03/28] fpu/softfloat: Split floatXX_silence_nan from floatXX_maybe_silence_nan, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 05/28] fpu/softfloat: Canonicalize NaN fraction, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 04/28] fpu/softfloat: Move softfloat-specialize.h below FloatParts definition, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 08/28] fpu/softfloat: Replace float_class_msnan with parts_silence_nan, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 07/28] fpu/softfloat: Replace float_class_dnan with parts_default_nan, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 06/28] fpu/softfloat: Introduce parts_is_snan_frac, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 11/28] fpu/softfloat: Partial support for ARM Alternative half-precision,
Richard Henderson <=
- [Qemu-devel] [PULL 09/28] target/arm: convert conversion helpers to fpst/ahp_flag, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 14/28] target/arm: Remove floatX_maybe_silence_nan from conversions, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 12/28] fpu/softfloat: re-factor float to float conversions, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 10/28] target/arm: squash FZ16 behaviour for conversions, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 13/28] target/arm: Use floatX_silence_nan when we have already checked for SNaN, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 15/28] target/hppa: Remove floatX_maybe_silence_nan from conversions, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 16/28] target/m68k: Use floatX_silence_nan when we have already checked for SNaN, Richard Henderson, 2018/05/16
- [Qemu-devel] [PULL 17/28] target/mips: Remove floatX_maybe_silence_nan from conversions, Richard Henderson, 2018/05/16