[(set_attr "type" "unknown")
(set_attr "mode" "<MODE>")])
-(define_int_iterator FCLASS_MASK [68 136 952])
+(define_int_iterator FCLASS_MASK [68 136 952 3])
(define_int_attr fclass_optab
[(68 "isinf")
(136 "isnormal")
- (952 "isfinite")])
+ (952 "isfinite")
+ (3 "isnan")])
(define_expand "<FCLASS_MASK:fclass_optab><ANYF:mode>2"
[(match_operand:SI 0 "register_operand" "=r")
(match_operand:ANYF 1 "register_operand" " f")
(const_int FCLASS_MASK)]
- "TARGET_HARD_FLOAT"
+ "TARGET_HARD_FLOAT && (<FCLASS_MASK> != 3 || flag_signaling_nans)"
{
rtx ft0 = gen_reg_rtx (SImode);
rtx t0 = gen_reg_rtx (word_mode);
/* { dg-do compile } */
-/* { dg-options "-O2 -march=loongarch64 -mfpu=64 -mabi=lp64d" } */
+/* { dg-options "-O2 -fsignaling-nans -march=loongarch64 -mfpu=64 -mabi=lp64d" } */
/* { dg-final { scan-assembler-times "fclass\\.s" 1 } } */
/* { dg-final { scan-assembler-times "fclass\\.d" 1 } } */
+/* { dg-final { scan-assembler-not "fcmp" } } */
__attribute__ ((noipa)) int
test_fclass_f (float f)
{
return __builtin_isinf (f)
| __builtin_isnormal (f) << 1
- | __builtin_isfinite (f) << 2;
+ | __builtin_isfinite (f) << 2
+ | __builtin_isnan (f) << 3;
}
__attribute__ ((noipa)) int
{
return __builtin_isinf (d)
| __builtin_isnormal (d) << 1
- | __builtin_isfinite (d) << 2;
+ | __builtin_isfinite (d) << 2
+ | __builtin_isnan (d) << 3;
}
ASSERT_EQ (test_fclass_f (-f_normal), 0b110);
ASSERT_EQ (test_fclass_f (f_subnormal), 0b100);
ASSERT_EQ (test_fclass_f (-f_subnormal), 0b100);
- ASSERT_EQ (test_fclass_f (f_qnan), 0);
- ASSERT_EQ (test_fclass_f (f_snan), 0);
+ ASSERT_EQ (test_fclass_f (f_qnan), 0b1000);
+ ASSERT_EQ (test_fclass_f (f_snan), 0b1000);
ASSERT_EQ (test_fclass_d (d_inf), 0b001);
ASSERT_EQ (test_fclass_d (-d_inf), 0b001);
ASSERT_EQ (test_fclass_d (-d_normal), 0b110);
ASSERT_EQ (test_fclass_d (d_subnormal), 0b100);
ASSERT_EQ (test_fclass_d (-d_subnormal), 0b100);
- ASSERT_EQ (test_fclass_d (d_qnan), 0);
- ASSERT_EQ (test_fclass_d (d_snan), 0);
+ ASSERT_EQ (test_fclass_d (d_qnan), 0b1000);
+ ASSERT_EQ (test_fclass_d (d_snan), 0b1000);
}