[PATCH 2/8] fpu/softfloat: Add LoongArch specialization for pickNaNMulAdd

Song Gao posted 8 patches 3 years, 6 months ago
Maintainers: Aurelien Jarno <aurelien@aurel32.net>, Peter Maydell <peter.maydell@linaro.org>, "Alex Bennée" <alex.bennee@linaro.org>, Song Gao <gaosong@loongson.cn>, Xiaojuan Yang <yangxiaojuan@loongson.cn>
[PATCH 2/8] fpu/softfloat: Add LoongArch specialization for pickNaNMulAdd
Posted by Song Gao 3 years, 6 months ago
LoongArch system follows IEEE754-2008 specificationa. The (inf,zero,nan)
case sets InvalidOp and returns the input value 'c', and Prefer sNaN
over qNaN, in the c, a, b order.

Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 fpu/softfloat-specialize.c.inc | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc
index 943e3301d2..948e1c1b24 100644
--- a/fpu/softfloat-specialize.c.inc
+++ b/fpu/softfloat-specialize.c.inc
@@ -574,6 +574,29 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
             return 1;
         }
     }
+#elif defined(TARGET_LOONGARCH64)
+    /*
+     * For LoongArch systems that conform to IEEE754-2008, the (inf,zero,nan)
+     * case sets InvalidOp and returns the input value 'c'
+     */
+    if (infzero) {
+        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
+        return 2;
+    }
+    /* Prefer sNaN over qNaN, in the c, a, b order. */
+    if (is_snan(c_cls)) {
+        return 2;
+    } else if (is_snan(a_cls)) {
+        return 0;
+    } else if (is_snan(b_cls)) {
+        return 1;
+    } else if (is_qnan(c_cls)) {
+        return 2;
+    } else if (is_qnan(a_cls)) {
+        return 0;
+    } else {
+        return 1;
+    }
 #elif defined(TARGET_PPC)
     /* For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer
      * to return an input NaN if we have one (ie c) rather than generating
-- 
2.31.1
Re: [PATCH 2/8] fpu/softfloat: Add LoongArch specialization for pickNaNMulAdd
Posted by Richard Henderson 3 years, 6 months ago
On 7/16/22 14:24, Song Gao wrote:
> LoongArch system follows IEEE754-2008 specificationa. The (inf,zero,nan)
> case sets InvalidOp and returns the input value 'c', and Prefer sNaN
> over qNaN, in the c, a, b order.
> 
> Signed-off-by: Song Gao <gaosong@loongson.cn>

Yep, matches paragraph 3 of 3.1.1.3. Non-numerical Result of Instructions.

You need another patch for pickNaN, just above here.  You can add TARGET_LOONGARCH64 to 
the first #if block, with ARM, MIPS and HPPA.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~