[PATCH 03/21] softfloat: add xtensa specialization for pickNaNMulAdd

Max Filippov posted 21 patches 5 years, 5 months ago
Maintainers: Max Filippov <jcmvbkbc@gmail.com>
There is a newer version of this series
[PATCH 03/21] softfloat: add xtensa specialization for pickNaNMulAdd
Posted by Max Filippov 5 years, 5 months ago
pickNaNMulAdd logic on Xtensa is the same as pickNaN when applied to
the expression (a * b) + c. So with two pickNaN variants there must be
two pickNaNMulAdd variants.

Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: "Alex Bennée" <alex.bennee@linaro.org>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 fpu/softfloat-specialize.inc.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/fpu/softfloat-specialize.inc.c b/fpu/softfloat-specialize.inc.c
index e17327b405c5..6b07d50efad3 100644
--- a/fpu/softfloat-specialize.inc.c
+++ b/fpu/softfloat-specialize.inc.c
@@ -574,6 +574,24 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
     } else {
         return 1;
     }
+#elif defined(TARGET_XTENSA)
+    if (status->use_first_nan) {
+        if (is_nan(a_cls)) {
+            return 0;
+        } else if (is_nan(b_cls)) {
+            return 1;
+        } else {
+            return 2;
+        }
+    } else {
+        if (is_nan(c_cls)) {
+            return 2;
+        } else if (is_nan(b_cls)) {
+            return 1;
+        } else {
+            return 0;
+        }
+    }
 #else
     /* A default implementation: prefer a to b to c.
      * This is unlikely to actually match any real implementation.
-- 
2.20.1


Re: [PATCH 03/21] softfloat: add xtensa specialization for pickNaNMulAdd
Posted by Richard Henderson 5 years, 5 months ago
On 7/6/20 4:47 PM, Max Filippov wrote:
> pickNaNMulAdd logic on Xtensa is the same as pickNaN when applied to
> the expression (a * b) + c. So with two pickNaN variants there must be
> two pickNaNMulAdd variants.

"Is the same as"?

I question the non-use of the infzero parameter.

When infzero, (a * b) = (Inf * 0), which will produce a default QNaN.  Your
sentence above would suggest that pickNaN is applied twice, so that if
use_first_nan, the default nan is chosen above any nan within c.

In addition, is the invalid flag raised for (Inf * 0) + NaN?  Does that happen
regardless of the use_first_nan setting, or does the whole operation short-circuit?


r~

Re: [PATCH 03/21] softfloat: add xtensa specialization for pickNaNMulAdd
Posted by Max Filippov 5 years, 5 months ago
On Wed, Jul 8, 2020 at 9:07 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 7/6/20 4:47 PM, Max Filippov wrote:
> > pickNaNMulAdd logic on Xtensa is the same as pickNaN when applied to
> > the expression (a * b) + c. So with two pickNaN variants there must be
> > two pickNaNMulAdd variants.
>
> "Is the same as"?
>
> I question the non-use of the infzero parameter.
>
> When infzero, (a * b) = (Inf * 0), which will produce a default QNaN.  Your
> sentence above would suggest that pickNaN is applied twice, so that if
> use_first_nan, the default nan is chosen above any nan within c.

Apparently the description it's wrong: only NaNs in arguments are
considered, default NaN produced as a result of (a * b) is never
chosen when c is NaN.

> In addition, is the invalid flag raised for (Inf * 0) + NaN?  Does that happen
> regardless of the use_first_nan setting, or does the whole operation short-circuit?

Flag setting happens regardless of which NaN is chosen.
I'll post v3 with a fix for this and additional tests.

-- 
Thanks.
-- Max

Re: [PATCH 03/21] softfloat: add xtensa specialization for pickNaNMulAdd
Posted by Alex Bennée 5 years, 5 months ago
Max Filippov <jcmvbkbc@gmail.com> writes:

> pickNaNMulAdd logic on Xtensa is the same as pickNaN when applied to
> the expression (a * b) + c. So with two pickNaN variants there must be
> two pickNaNMulAdd variants.
>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> Cc: "Alex Bennée" <alex.bennee@linaro.org>
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>

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

-- 
Alex Bennée