{"id":2234617,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2234617/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260507221717.486023-5-richard.henderson@linaro.org/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.2/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260507221717.486023-5-richard.henderson@linaro.org>","list_archive_url":null,"date":"2026-05-07T22:17:03","name":"[04/18] fpu: Introduce FloatSNaNRule","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"fad32cc778912aacf5944d4776be951ad18dad85","submitter":{"id":72104,"url":"http://patchwork.ozlabs.org/api/1.2/people/72104/?format=json","name":"Richard Henderson","email":"richard.henderson@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260507221717.486023-5-richard.henderson@linaro.org/mbox/","series":[{"id":503289,"url":"http://patchwork.ozlabs.org/api/1.2/series/503289/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=503289","date":"2026-05-07T22:16:59","name":"fpu: Compress float_status","version":1,"mbox":"http://patchwork.ozlabs.org/series/503289/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2234617/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2234617/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=RbDqyvQz;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gBRVZ69xDz1yKm\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 08 May 2026 08:19:02 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wL72A-0000p4-E5; Thu, 07 May 2026 18:17:30 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1wL728-0000oh-9l\n for qemu-devel@nongnu.org; Thu, 07 May 2026 18:17:28 -0400","from mail-oa1-x34.google.com ([2001:4860:4864:20::34])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1wL725-00039r-QF\n for qemu-devel@nongnu.org; Thu, 07 May 2026 18:17:27 -0400","by mail-oa1-x34.google.com with SMTP id\n 586e51a60fabf-42321c8b8f5so1093365fac.1\n for <qemu-devel@nongnu.org>; Thu, 07 May 2026 15:17:25 -0700 (PDT)","from stoup.attlocal.net ([2600:381:c938:6375:9641:bbb2:a93a:bb4c])\n by smtp.gmail.com with ESMTPSA id\n 586e51a60fabf-435573e7254sm45037fac.14.2026.05.07.15.17.23\n for <qemu-devel@nongnu.org>\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 07 May 2026 15:17:23 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1778192244; x=1778797044; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:from:to:cc:subject:date:message-id\n :reply-to; bh=1HnxtWH4yGYngMg/1E/CURv4bewMQRvEBgxk9Rn0Sro=;\n b=RbDqyvQzZFj8uNJVMTUpcPFAwExzEI6ce8wIPAXHg6dcLJFzqjRhG79vdruyvBhMh2\n TjbtkhIg5N1GozVdbLRZZSUgCAWZlvDmsYx9xrC1lNZV9hbbgAA9vk0J2BkWrdpyi/PC\n Z/hMj55PiSma7YKEw0YvSfYjwBHYh49RQbtQJQFW53PLd5UrKVWROzMFws+mUuif0Qoq\n bmtSfxUMoAb7giZdyF4qoyCwcKA1+F2bRi0CndKvW//kLKY0i8BEhHMdymv1qd1tRFDR\n TTSaXeHXUDFh0RCPXu0Q7pSLy9m8VlwgJr5sHGHh0xHSHwzBHqSJLTYCKledaEk5wdja\n KM+g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1778192244; x=1778797044;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=1HnxtWH4yGYngMg/1E/CURv4bewMQRvEBgxk9Rn0Sro=;\n b=YbXKhxHLBLRAU/cK7WF/CQo42U6VSeYIVhi9N7VteNrWs0QhjDunEl8kLHIZ0YAJPR\n /XvoGKpQBuySmrcnaWnyPDTnIt1hVvV8SI5xAg+aZyxsnmi1NFsCuIadMnyZ5TzJgGii\n eaA0fhlc2TZi1PaafQtcFcqhfXhPzSkHT+K5pa2Se3SdveGjIH08QiXXUVNf718jMei3\n eSMAc3OqncAceieS6EPvaDmdy+FqE0o19zim98VaGiKfXTY26LUdDfV0dT3eliaTXA1Q\n myQFxXk4si5vYnR68CBHgg1htfoEZIu/9n71T9Rj222Dpe67rGCaTg7Nd6FxwYloUv56\n MJoQ==","X-Gm-Message-State":"AOJu0YyHFfCGCMr4k4Q2ZHOE95pA6b75s/Ma/hsuS26hFInfRRjrPRli\n TEv9+zNWJ4dI48ThhM3KqedW/LBgDFY54Z2Nc7/QOUhMz6GfqTd1JOCp28d94nTAG4lRPKC9KuW\n FnAPQ","X-Gm-Gg":"Acq92OEc7tn1XuJjOfTPksKFrD/rn/1ciRexFvye/mDHpgwnOG4Qqxifn3xAziDmbo7\n /+jHc7ghIC7EF/5KIMukKTGEuChW/fTxbMZvXsmedreQpbBSWKg0ptJMCbEU93n/hcaE0qhT4zL\n uME/Mr/OeshlwnqFiQC6JHbgNuL/qRCsp/P4ftfXnIOTe+9HgqNy2R4nZg68+lAlitF/bGIffh7\n t4FYcx0862JvFAOHMsasXgN6+Q3yIzVvCidFsXNhiHuowgowFXsH61J6KbjujxI2XWnyEJD4dYn\n eOAFb2jEebM8JdJm0ELAtk2VpLVykq8fpdUHY8RNb7fRDcb6qbQIXLU8QzIJPEFar2A0VaWE1Sk\n G+8o8g7MDgJ8DabgU5tludQgOHzPTueuJD9ej4l3l60XJkP0a3rnNOKqiO9TO+Gdi+Aegx9EHBN\n ezlj9e3I1sqqIKCG7Hz+3ca4WIdE7e9UrA/7vxaS38vjWhLw==","X-Received":"by 2002:a05:6870:d215:b0:42f:f390:d9 with SMTP id\n 586e51a60fabf-435269c4445mr2740642fac.15.1778192243851;\n Thu, 07 May 2026 15:17:23 -0700 (PDT)","From":"Richard Henderson <richard.henderson@linaro.org>","To":"qemu-devel@nongnu.org","Subject":"[PATCH 04/18] fpu: Introduce FloatSNaNRule","Date":"Thu,  7 May 2026 17:17:03 -0500","Message-ID":"<20260507221717.486023-5-richard.henderson@linaro.org>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260507221717.486023-1-richard.henderson@linaro.org>","References":"<20260507221717.486023-1-richard.henderson@linaro.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2001:4860:4864:20::34;\n envelope-from=richard.henderson@linaro.org; helo=mail-oa1-x34.google.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Merge snan_bit_is_one and no_signaling_nans into one control.\n\nSigned-off-by: Richard Henderson <richard.henderson@linaro.org>\n---\n include/fpu/softfloat-helpers.h | 14 ++---\n include/fpu/softfloat-types.h   | 25 ++++++---\n target/mips/fpu_helper.h        |  3 +-\n target/hppa/fpu_helper.c        |  2 +-\n target/mips/msa.c               |  4 +-\n target/sh4/cpu.c                |  2 +-\n target/xtensa/cpu.c             |  3 +-\n fpu/softfloat-specialize.c.inc  | 95 ++++++++++++---------------------\n 8 files changed, 66 insertions(+), 82 deletions(-)","diff":"diff --git a/include/fpu/softfloat-helpers.h b/include/fpu/softfloat-helpers.h\nindex 745a49f07a..95edd22842 100644\n--- a/include/fpu/softfloat-helpers.h\n+++ b/include/fpu/softfloat-helpers.h\n@@ -127,14 +127,9 @@ static inline void set_default_nan_mode(bool val, float_status *status)\n     status->default_nan_mode = val;\n }\n \n-static inline void set_snan_bit_is_one(bool val, float_status *status)\n+static inline void set_snan_rule(FloatSNaNRule val, float_status *status)\n {\n-    status->snan_bit_is_one = val;\n-}\n-\n-static inline void set_no_signaling_nans(bool val, float_status *status)\n-{\n-    status->no_signaling_nans = val;\n+    status->float_snan_rule = val;\n }\n \n static inline bool get_float_detect_tininess(const float_status *status)\n@@ -203,6 +198,11 @@ static inline bool get_default_nan_mode(const float_status *status)\n     return status->default_nan_mode;\n }\n \n+static inline FloatSNaNRule get_snan_rule(float_status *status)\n+{\n+    return status->float_snan_rule;\n+}\n+\n static inline FloatFTZDetection get_float_ftz_detection(const float_status *status)\n {\n     return status->ftz_detection;\ndiff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h\nindex 5048faa76f..b8ce8ff78e 100644\n--- a/include/fpu/softfloat-types.h\n+++ b/include/fpu/softfloat-types.h\n@@ -192,6 +192,23 @@ typedef enum __attribute__((__packed__)) {\n     floatx80_precision_s,\n } FloatX80RoundPrec;\n \n+/*\n+ * Define how the architecture discriminates signaling NaNs.\n+ * This done with the most significant bit of the fraction.\n+ *\n+ * In IEEE 754-1985 this was implementation defined, but in IEEE 754-2008\n+ * the msb must be 0.  But setting the msb to 1 got baked into HPPA, SH4,\n+ * and pre-2008 MIPS.\n+ *\n+ * Further, some architectures (or modes of architectures) do not detect\n+ * signaling NaNs at all.\n+ */\n+typedef enum __attribute__((__packed__)) {\n+    float_snan_bit_is_zero = 0,\n+    float_snan_bit_is_one = 1,\n+    float_snan_never,\n+} FloatSNaNRule;\n+\n /*\n  * 2-input NaN propagation rule. Individual architectures have\n  * different rules for which input NaN is propagated to the output\n@@ -394,6 +411,7 @@ typedef struct float_status {\n     Float2NaNPropRule float_2nan_prop_rule;\n     Float3NaNPropRule float_3nan_prop_rule;\n     FloatInfZeroNaNRule float_infzeronan_rule;\n+    FloatSNaNRule float_snan_rule;\n     bool tininess_before_rounding;\n     /* should denormalised results go to zero and set output_denormal_flushed? */\n     bool flush_to_zero;\n@@ -412,13 +430,6 @@ typedef struct float_status {\n      * create a default NaN.\n      */\n     uint8_t default_nan_pattern;\n-    /*\n-     * The flags below are not used on all specializations and may\n-     * constant fold away (see snan_bit_is_one()/no_signalling_nans() in\n-     * softfloat-specialize.inc.c)\n-     */\n-    bool snan_bit_is_one;\n-    bool no_signaling_nans;\n     /* should overflowed results subtract re_bias to its exponent? */\n     bool rebias_overflow;\n     /* should underflowed results add re_bias to its exponent? */\ndiff --git a/target/mips/fpu_helper.h b/target/mips/fpu_helper.h\nindex 08fb409390..cf667c6637 100644\n--- a/target/mips/fpu_helper.h\n+++ b/target/mips/fpu_helper.h\n@@ -35,7 +35,8 @@ static inline void restore_snan_bit_mode(CPUMIPSState *env)\n      * With nan2008, SNaNs are silenced in the usual way.\n      * Before that, SNaNs are not silenced; default nans are produced.\n      */\n-    set_snan_bit_is_one(!nan2008, &env->active_fpu.fp_status);\n+    set_snan_rule(nan2008 ? float_snan_bit_is_zero : float_snan_bit_is_one,\n+                  &env->active_fpu.fp_status);\n     set_default_nan_mode(!nan2008, &env->active_fpu.fp_status);\n     /*\n      * For MIPS systems that conform to IEEE754-1985, the (inf,zero,nan)\ndiff --git a/target/hppa/fpu_helper.c b/target/hppa/fpu_helper.c\nindex 2d272730f6..cdbebcfeb3 100644\n--- a/target/hppa/fpu_helper.c\n+++ b/target/hppa/fpu_helper.c\n@@ -66,7 +66,7 @@ void HELPER(loaded_fr0)(CPUHPPAState *env)\n     set_float_infzeronan_rule(float_infzeronan_dnan_never, &env->fp_status);\n     /* Default NaN: sign bit clear, msb-1 frac bit set */\n     set_float_default_nan_pattern(0b00100000, &env->fp_status);\n-    set_snan_bit_is_one(true, &env->fp_status);\n+    set_snan_rule(float_snan_bit_is_one, &env->fp_status);\n     /*\n      * \"PA-RISC 2.0 Architecture\" says it is IMPDEF whether the flushing\n      * enabled by FPSR.D happens before or after rounding. We pick \"before\"\ndiff --git a/target/mips/msa.c b/target/mips/msa.c\nindex 32c6acbcc5..53fbce10d3 100644\n--- a/target/mips/msa.c\n+++ b/target/mips/msa.c\n@@ -84,8 +84,8 @@ void msa_reset(CPUMIPSState *env)\n     /* clear float_status nan mode */\n     set_default_nan_mode(0, &env->active_tc.msa_fp_status);\n \n-    /* set proper signanling bit meaning (\"1\" means \"quiet\") */\n-    set_snan_bit_is_one(0, &env->active_tc.msa_fp_status);\n+    /* set proper signanling bit meaning */\n+    set_snan_rule(float_snan_bit_is_zero, &env->active_tc.msa_fp_status);\n \n     /* Inf * 0 + NaN returns the input NaN */\n     set_float_infzeronan_rule(float_infzeronan_dnan_never,\ndiff --git a/target/sh4/cpu.c b/target/sh4/cpu.c\nindex e2bde45761..0f40acea00 100644\n--- a/target/sh4/cpu.c\n+++ b/target/sh4/cpu.c\n@@ -151,7 +151,7 @@ static void superh_cpu_reset_hold(Object *obj, ResetType type)\n     set_flush_to_zero(1, &env->fp_status);\n #endif\n     set_default_nan_mode(1, &env->fp_status);\n-    set_snan_bit_is_one(true, &env->fp_status);\n+    set_snan_rule(float_snan_bit_is_one, &env->fp_status);\n     /* sign bit clear, set all frac bits other than msb */\n     set_float_default_nan_pattern(0b00111111, &env->fp_status);\n     /*\ndiff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c\nindex 31429ec2f8..e6cd0e160d 100644\n--- a/target/xtensa/cpu.c\n+++ b/target/xtensa/cpu.c\n@@ -209,7 +209,8 @@ static void xtensa_cpu_reset_hold(Object *obj, ResetType type)\n #endif\n     /* For inf * 0 + NaN, return the input NaN */\n     set_float_infzeronan_rule(float_infzeronan_dnan_never, &env->fp_status);\n-    set_no_signaling_nans(!dfpu, &env->fp_status);\n+    set_snan_rule(dfpu ? float_snan_bit_is_zero : float_snan_never,\n+                  &env->fp_status);\n     /* Default NaN value: sign bit clear, set frac msb */\n     set_float_default_nan_pattern(0b01000000, &env->fp_status);\n     xtensa_use_first_nan(env, !dfpu);\ndiff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc\nindex 485f082cf8..29a2fdeb9b 100644\n--- a/fpu/softfloat-specialize.c.inc\n+++ b/fpu/softfloat-specialize.c.inc\n@@ -79,39 +79,29 @@ this code that are retained.\n  * version 2 or later. See the COPYING file in the top-level directory.\n  */\n \n-/*\n- * Define whether architecture deviates from IEEE in not supporting\n- * signaling NaNs (so all NaNs are treated as quiet).\n- */\n-static inline bool no_signaling_nans(float_status *status)\n-{\n-    return status->no_signaling_nans;\n-}\n-\n-/* Define how the architecture discriminates signaling NaNs.\n- * This done with the most significant bit of the fraction.\n- * In IEEE 754-1985 this was implementation defined, but in IEEE 754-2008\n- * the msb must be zero.  MIPS is (so far) unique in supporting both the\n- * 2008 revision and backward compatibility with their original choice.\n- */\n-static inline bool snan_bit_is_one(float_status *status)\n-{\n-    return status->snan_bit_is_one;\n-}\n-\n /*----------------------------------------------------------------------------\n | For the deconstructed floating-point with fraction FRAC, return true\n | if the fraction represents a signalling NaN; otherwise false.\n *----------------------------------------------------------------------------*/\n \n+static bool frac_msb_is_snan(bool msb, float_status *status)\n+{\n+    FloatSNaNRule rule = get_snan_rule(status);\n+\n+    switch (rule) {\n+    case float_snan_never:\n+        return false;\n+    case float_snan_bit_is_one:\n+    case float_snan_bit_is_zero:\n+        return msb == rule;\n+    }\n+    g_assert_not_reached();\n+}\n+\n static bool parts_is_snan_frac(uint64_t frac, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    } else {\n-        bool msb = extract64(frac, DECOMPOSED_BINARY_POINT - 1, 1);\n-        return msb == snan_bit_is_one(status);\n-    }\n+    bool msb = extract64(frac, DECOMPOSED_BINARY_POINT - 1, 1);\n+    return frac_msb_is_snan(msb, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -167,14 +157,19 @@ FloatParts128 parts128_default_nan(float_status *status)\n \n static uint64_t parts_silence_nan_frac(uint64_t frac, float_status *status)\n {\n-    g_assert(!no_signaling_nans(status));\n+    FloatSNaNRule rule = get_snan_rule(status);\n \n-    /* The only snan_bit_is_one target without default_nan_mode is HPPA. */\n-    if (snan_bit_is_one(status)) {\n+    switch (rule) {\n+    case float_snan_bit_is_zero:\n+        frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 1);\n+        break;\n+    case float_snan_bit_is_one:\n+        /* The only snan_bit_is_one target without default_nan_mode is HPPA. */\n         frac &= ~(1ULL << (DECOMPOSED_BINARY_POINT - 1));\n         frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 2);\n-    } else {\n-        frac |= 1ULL << (DECOMPOSED_BINARY_POINT - 1);\n+        break;\n+    default:\n+        g_assert_not_reached();\n     }\n     return frac;\n }\n@@ -238,11 +233,7 @@ floatx80 floatx80_default_inf(bool zSign, float_status *status)\n \n static bool float16_nan_is_snan(float16 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a >> 9) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a >> 9) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -271,11 +262,7 @@ bool float16_is_signaling_nan(float16 a_, float_status *status)\n \n static bool bfloat16_nan_is_snan(bfloat16 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a >> 6) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a >> 6) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -302,11 +289,7 @@ bool bfloat16_is_signaling_nan(bfloat16 a_, float_status *status)\n \n static bool float32_nan_is_snan(float32 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a >> 22) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a >> 22) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -335,11 +318,7 @@ bool float32_is_signaling_nan(float32 a_, float_status *status)\n \n static bool float64_nan_is_snan(float64 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a >> 51) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a >> 51) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -370,11 +349,7 @@ bool float64_is_signaling_nan(float64 a_, float_status *status)\n \n static bool floatx80_nan_is_snan(floatx80 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a.low >> 62) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a.low >> 62) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n@@ -405,7 +380,7 @@ bool floatx80_is_signaling_nan(floatx80 a, float_status *status)\n floatx80 floatx80_silence_nan(floatx80 a, float_status *status)\n {\n     /* None of the targets that have snan_bit_is_one use floatx80.  */\n-    assert(!snan_bit_is_one(status));\n+    assert(get_snan_rule(status) == float_snan_bit_is_zero);\n     a.low |= UINT64_C(0xC000000000000000);\n     return a;\n }\n@@ -416,11 +391,7 @@ floatx80 floatx80_silence_nan(floatx80 a, float_status *status)\n \n static bool float128_nan_is_snan(float128 a, float_status *status)\n {\n-    if (no_signaling_nans(status)) {\n-        return false;\n-    }\n-    bool frac_msb_is_one = (a.high >> 47) & 1;\n-    return frac_msb_is_one == snan_bit_is_one(status);\n+    return frac_msb_is_snan((a.high >> 47) & 1, status);\n }\n \n /*----------------------------------------------------------------------------\n","prefixes":["04/18"]}