[PATCH 04/11] softfloat: Introduce float_flag_result_denormal

Richard Henderson posted 11 patches 4 years, 8 months ago
Maintainers: Aurelien Jarno <aurelien@aurel32.net>, "Philippe Mathieu-Daudé" <f4bug@amsat.org>, "Alex Bennée" <alex.bennee@linaro.org>, Peter Maydell <peter.maydell@linaro.org>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Eduardo Habkost <ehabkost@redhat.com>, Aleksandar Rikalo <aleksandar.rikalo@syrmia.com>, Yoshinori Sato <ysato@users.sourceforge.jp>, Bastian Koppelmann <kbastian@mail.uni-paderborn.de>, Paolo Bonzini <pbonzini@redhat.com>, Richard Henderson <richard.henderson@linaro.org>
[PATCH 04/11] softfloat: Introduce float_flag_result_denormal
Posted by Richard Henderson 4 years, 8 months ago
Create a new exception flag for reporting output denormals
that are not flushed to zero.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 include/fpu/softfloat-types.h | 3 ++-
 fpu/softfloat-parts.c.inc     | 8 ++++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h
index 174100e50e..83632aa09f 100644
--- a/include/fpu/softfloat-types.h
+++ b/include/fpu/softfloat-types.h
@@ -151,6 +151,7 @@ enum {
     float_flag_inorm_denormal  = 0x0020,  /* denormal input, normalized */
     float_flag_iflush_denormal = 0x0040,  /* denormal input, flushed to zero */
     float_flag_oflush_denormal = 0x0080,  /* denormal result, flushed to zero */
+    float_flag_result_denormal = 0x0100,  /* denormal result, not flushed */
 };
 
 /*
@@ -170,8 +171,8 @@ typedef enum __attribute__((__packed__)) {
  */
 
 typedef struct float_status {
+    uint16_t float_exception_flags;
     FloatRoundMode float_rounding_mode;
-    uint8_t     float_exception_flags;
     FloatX80RoundPrec floatx80_rounding_precision;
     bool tininess_before_rounding;
     /* should denormalised results go to zero and set the inexact flag? */
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index 16d4425419..a21fcec3e5 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -276,8 +276,12 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
         if (is_tiny && (flags & float_flag_inexact)) {
             flags |= float_flag_underflow;
         }
-        if (exp == 0 && frac_eqz(p)) {
-            p->cls = float_class_zero;
+        if (exp == 0) {
+            if (frac_eqz(p)) {
+                p->cls = float_class_zero;
+            } else {
+                flags |= float_flag_result_denormal;
+            }
         }
     }
     p->exp = exp;
-- 
2.25.1


Re: [PATCH 04/11] softfloat: Introduce float_flag_result_denormal
Posted by Alex Bennée 4 years, 8 months ago
Richard Henderson <richard.henderson@linaro.org> writes:

> Create a new exception flag for reporting output denormals
> that are not flushed to zero.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

-- 
Alex Bennée

Re: [PATCH 04/11] softfloat: Introduce float_flag_result_denormal
Posted by Philippe Mathieu-Daudé 4 years, 7 months ago
On 5/27/21 6:13 AM, Richard Henderson wrote:
> Create a new exception flag for reporting output denormals
> that are not flushed to zero.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  include/fpu/softfloat-types.h | 3 ++-
>  fpu/softfloat-parts.c.inc     | 8 ++++++--
>  2 files changed, 8 insertions(+), 3 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>