From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id 3AFA23858400; Wed, 31 Aug 2022 14:22:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3AFA23858400 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x62f.google.com with SMTP id h5so17130011ejb.3; Wed, 31 Aug 2022 07:22:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc; bh=Upw/eR4AKARoP8oRXw2HQJC1END23hM62BmfRHmlSfo=; b=j94giBLJcO/scmOa8fL4N9FJ+ettsWzKoJlWqBEDv9vMZc8YaJA93GzZ0r9KuyeoKT 9/3MUxcVMnE5/D7/hZYEh+dEFfS+/b+XFQtHr9k8w3HY43GvQw86JrnnCS6vOdDTVVxS EN3zkYUvCmlHLtFJk6li2uDsGs/NRszAt0Rh/Ie0Q/Je9BmGle1BPkYjSaUDAddFio11 oXEIfhZtZKwcql2yiB4bor3Hj6PoXWfQrFqR+bMR7/c5s5XjIpocVY/4xuYfOjGeG2CS qK6UlN8TpqC8DzsA4DcbbS8wTHrt0juEHBW0gDv9/LZa4mTsYzpShi88msURLs5B1FZF pwUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc; bh=Upw/eR4AKARoP8oRXw2HQJC1END23hM62BmfRHmlSfo=; b=A8xdo/0OI2awTr3aNwBLmYyAODPgWY9J/1EYinc5XN6sn/oLXWUB9pnn/ICq4pRbXH vnGwXTrGmP1TyF28PFezY59Vt6n2GudWkBuMgEb5dUE0NDBcZpUp7q6FfiE9Rz24xr8Z zv9Uu16OkmC3I+18pXt/vHYxDVHgszd6N1aKiUu1uOJvMFVbvBF9kKiWy52Q97/gck2l yrtD2bwkrc55jhqULBAcl/1Y6Dp47siOoYWt+vm59k+sQr7th0Rznr283pqUUS0rvBsk M5BYy2v6tbKn18vMRQS151Mo1sq5qfbKclty8dxR5p6t21TSJsTv/fiNt11GmVnVuiNr eYqg== X-Gm-Message-State: ACgBeo3E+wF7G55I1sjheroUQUM+cqOcxz4QYwG8LBMYONxH2wndKnGb Qt0Q1LBrUtiYDTgvVss2LmLsZmdqSJyFyg== X-Google-Smtp-Source: AA6agR7XaPY81qlmZ2A0xiZruq3me7/S3s5BXr7JwAcptE6FCW4xFP34kUNufQ4ufNFLJEXndIqCqg== X-Received: by 2002:a17:907:1c87:b0:741:8199:a59d with SMTP id nb7-20020a1709071c8700b007418199a59dmr10928482ejc.736.1661955724800; Wed, 31 Aug 2022 07:22:04 -0700 (PDT) Received: from smtpclient.apple (chp127.enscp.fr. [193.51.253.127]) by smtp.gmail.com with ESMTPSA id j19-20020a508a93000000b0043ba7df7a42sm9208130edj.26.2022.08.31.07.22.02 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Aug 2022 07:22:03 -0700 (PDT) From: FX Message-Id: <7A9A82FB-3144-406C-A4E5-87F8EAC72044@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_7A81D948-8EA6-4BCB-927A-87D80EF33D1C" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.120.41.1.1\)) Subject: Re: [PATCH] Fortran: Add IEEE_SIGNBIT and IEEE_FMA functions Date: Wed, 31 Aug 2022 16:22:02 +0200 In-Reply-To: Cc: gcc-patches@gcc.gnu.org To: fortran@gcc.gnu.org References: X-Mailer: Apple Mail (2.3696.120.41.1.1) X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --Apple-Mail=_7A81D948-8EA6-4BCB-927A-87D80EF33D1C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hum, slightly amended patch, after checking 32-bit results on another = linux machine. The test for FMA has been made a bit less strict, because otherwise we = have surprised on 387 arithmetic due to excess precision. Final patch is attached. Regression-tested on x86_64-pc-linux-gnu, both = 32- and 64-bit. OK to commit? FX --Apple-Mail=_7A81D948-8EA6-4BCB-927A-87D80EF33D1C Content-Disposition: attachment; filename=0001-fortran-Add-IEEE_SIGNBIT-and-IEEE_FMA-functions.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-fortran-Add-IEEE_SIGNBIT-and-IEEE_FMA-functions.patch" Content-Transfer-Encoding: quoted-printable =46rom=20315046830a1b52ac1ed89b1469558c992febcc0c=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Francois-Xavier=20Coudert=20= =0ADate:=20Wed,=2031=20Aug=202022=2015:22:50=20= +0200=0ASubject:=20[PATCH]=20fortran:=20Add=20IEEE_SIGNBIT=20and=20= IEEE_FMA=20functions=0A=0AThe=20functions=20are=20added=20to=20the=20= IEEE_ARITHMETIC=20module,=20but=0Aare=20entirely=20expanded=20in=20the=20= front-end,=20using=20GCC=20built-ins.=0A=0A2022-08-31=20=20= Francois-Xavier=20Coudert=20=0A=0A=09PR=20= fortran/95644=0A=0Agcc/fortran/=0A=09*=20f95-lang.cc=20= (gfc_init_builtin_functions):=20Declare=20FMA=0A=09built-ins.=0A=09*=20= mathbuiltins.def:=20Declare=20FMA=20built-ins.=0A=09*=20= trans-intrinsic.cc=20(conv_intrinsic_ieee_fma):=20New=20function.=0A=09= (conv_intrinsic_ieee_signbit):=20New=20function.=0A=09= (gfc_build_intrinsic_lib_fndecls):=20Add=20cases=20for=20FMA=20and=0A=09= SIGNBIT.=0A=0Agcc/testsuite/=0A=09*=20gfortran.dg/ieee/fma_1.f90:=20New=20= test.=0A=09*=20gfortran.dg/ieee/signbit_1.f90:=20New=20test.=0A=0A= libgfortran/=0A=09*=20ieee/ieee_arithmetic.F90:=20Add=20IEEE_SIGNBIT=20= and=20IEEE_FMA.=0A---=0A=20gcc/fortran/f95-lang.cc=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2016=20++=0A=20= gcc/fortran/mathbuiltins.def=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20|=20=20=201=20+=0A=20gcc/fortran/trans-intrinsic.cc=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20|=20=2051=20+++++-=0A=20= gcc/testsuite/gfortran.dg/ieee/fma_1.f90=20=20=20=20=20|=20100=20= +++++++++++=0A=20gcc/testsuite/gfortran.dg/ieee/signbit_1.f90=20|=20166=20= +++++++++++++++++++=0A=20libgfortran/ieee/ieee_arithmetic.F90=20=20=20=20= =20=20=20=20=20|=20=2066=20++++++++=0A=206=20files=20changed,=20398=20= insertions(+),=202=20deletions(-)=0A=20create=20mode=20100644=20= gcc/testsuite/gfortran.dg/ieee/fma_1.f90=0A=20create=20mode=20100644=20= gcc/testsuite/gfortran.dg/ieee/signbit_1.f90=0A=0Adiff=20--git=20= a/gcc/fortran/f95-lang.cc=20b/gcc/fortran/f95-lang.cc=0Aindex=20= 10ac8a95b87..ff4bf800e49=20100644=0A---=20a/gcc/fortran/f95-lang.cc=0A= +++=20b/gcc/fortran/f95-lang.cc=0A@@=20-1281,6=20+1281,22=20@@=20= gfc_init_builtin_functions=20(void)=0A=20=09=09=20=20=20=20=20=20= "__builtin_assume_aligned",=0A=20=09=09=20=20=20=20=20=20= ATTR_CONST_NOTHROW_LEAF_LIST);=0A=20=0A+=20=20ftype=20=3D=20= build_function_type_list=20(long_double_type_node,=20= long_double_type_node,=0A+=09=09=09=09=20=20=20=20long_double_type_node,=20= long_double_type_node,=0A+=09=09=09=09=20=20=20=20NULL_TREE);=0A+=20=20= gfc_define_builtin=20("__builtin_fmal",=20ftype,=20BUILT_IN_FMAL,=0A+=09=09= =20=20=20=20=20=20"fmal",=20ATTR_CONST_NOTHROW_LEAF_LIST);=0A+=20=20= ftype=20=3D=20build_function_type_list=20(double_type_node,=20= double_type_node,=0A+=09=09=09=09=20=20=20=20double_type_node,=20= double_type_node,=0A+=09=09=09=09=20=20=20=20NULL_TREE);=0A+=20=20= gfc_define_builtin=20("__builtin_fma",=20ftype,=20BUILT_IN_FMA,=0A+=09=09= =20=20=20=20=20=20"fma",=20ATTR_CONST_NOTHROW_LEAF_LIST);=0A+=20=20ftype=20= =3D=20build_function_type_list=20(float_type_node,=20float_type_node,=0A= +=09=09=09=09=20=20=20=20float_type_node,=20float_type_node,=0A+=09=09=09= =09=20=20=20=20NULL_TREE);=0A+=20=20gfc_define_builtin=20= ("__builtin_fmaf",=20ftype,=20BUILT_IN_FMAF,=0A+=09=09=20=20=20=20=20=20= "fmaf",=20ATTR_CONST_NOTHROW_LEAF_LIST);=0A+=0A=20=20=20= gfc_define_builtin=20("__emutls_get_address",=0A=20=09=09=20=20=20=20=20=20= builtin_types[BT_FN_PTR_PTR],=0A=20=09=09=20=20=20=20=20=20= BUILT_IN_EMUTLS_GET_ADDRESS,=0Adiff=20--git=20= a/gcc/fortran/mathbuiltins.def=20b/gcc/fortran/mathbuiltins.def=0Aindex=20= 615214ebcd6..9d55c34cda8=20100644=0A---=20a/gcc/fortran/mathbuiltins.def=0A= +++=20b/gcc/fortran/mathbuiltins.def=0A@@=20-60,6=20+60,7=20@@=20= OTHER_BUILTIN=20(CABS,=20=20=20=20=20=20"cabs",=20=20=20=20=20=20cabs,=20= =20=20=20true)=0A=20OTHER_BUILTIN=20(COPYSIGN,=20=20"copysign",=20=202,=20= =20=20=20=20=20=20true)=0A=20OTHER_BUILTIN=20(CPOW,=20=20=20=20=20=20= "cpow",=20=20=20=20=20=20cpow,=20=20=20=20true)=0A=20OTHER_BUILTIN=20= (FABS,=20=20=20=20=20=20"fabs",=20=20=20=20=20=201,=20=20=20=20=20=20=20= true)=0A+OTHER_BUILTIN=20(FMA,=20=20=20=20=20=20=20"fma",=20=20=20=20=20=20= =203,=20=20=20=20=20=20=20true)=0A=20OTHER_BUILTIN=20(FMOD,=20=20=20=20=20= =20"fmod",=20=20=20=20=20=202,=20=20=20=20=20=20=20true)=0A=20= OTHER_BUILTIN=20(FREXP,=20=20=20=20=20"frexp",=20=20=20=20=20frexp,=20=20= =20false)=0A=20OTHER_BUILTIN=20(LOGB,=20=20=20=20=20=20"logb",=20=20=20=20= =20=201,=20=20=20=20=20=20=20true)=0Adiff=20--git=20= a/gcc/fortran/trans-intrinsic.cc=20b/gcc/fortran/trans-intrinsic.cc=0A= index=20ec116fff26e..bb938026828=20100644=0A---=20= a/gcc/fortran/trans-intrinsic.cc=0A+++=20= b/gcc/fortran/trans-intrinsic.cc=0A@@=20-695,7=20+695,7=20@@=20= gfc_build_intrinsic_lib_fndecls=20(void)=0A=20=20=20=20=20=20=20=20= C99-like=20library=20functions.=20=20For=20now,=20we=20only=20handle=20= _Float128=0A=20=20=20=20=20=20=20=20q-suffixed=20or=20IEC=2060559=20= f128-suffixed=20functions.=20=20*/=0A=20=0A-=20=20=20=20tree=20type,=20= complex_type,=20func_1,=20func_2,=20func_cabs,=20func_frexp;=0A+=20=20=20= =20tree=20type,=20complex_type,=20func_1,=20func_2,=20func_3,=20= func_cabs,=20func_frexp;=0A=20=20=20=20=20tree=20func_iround,=20= func_lround,=20func_llround,=20func_scalbn,=20func_cpow;=0A=20=0A=20=20=20= =20=20memset=20(quad_decls,=200,=20sizeof(tree)=20*=20(END_BUILTINS=20+=20= 1));=0A@@=20-715,6=20+715,8=20@@=20gfc_build_intrinsic_lib_fndecls=20= (void)=0A=20=09=09=09=09=09=20=20=20=20=20type,=20NULL_TREE);=0A=20=20=20= =20=20/*=20type=20(*)=20(type,=20type)=20*/=0A=20=20=20=20=20func_2=20=3D=20= build_function_type_list=20(type,=20type,=20type,=20NULL_TREE);=0A+=20=20= =20=20/*=20type=20(*)=20(type,=20type,=20type)=20*/=0A+=20=20=20=20= func_3=20=3D=20build_function_type_list=20(type,=20type,=20type,=20type,=20= NULL_TREE);=0A=20=20=20=20=20/*=20type=20(*)=20(type,=20&int)=20*/=0A=20=20= =20=20=20func_frexp=0A=20=20=20=20=20=20=20=3D=20= build_function_type_list=20(type,=0A@@=20-9781,7=20+9783,7=20@@=20= conv_ieee_function_args=20(gfc_se=20*se,=20gfc_expr=20*expr,=20tree=20= *argarray,=0A=20}=0A=20=0A=20=0A-/*=20Generate=20code=20for=20intrinsics=20= IEEE_IS_NAN,=20IEEE_IS_FINITE,=0A+/*=20Generate=20code=20for=20= intrinsics=20IEEE_IS_NAN,=20IEEE_IS_FINITE=0A=20=20=20=20and=20= IEEE_UNORDERED,=20which=20translate=20directly=20to=20GCC=20type-generic=0A= =20=20=20=20built-ins.=20=20*/=0A=20=0A@@=20-9801,6=20+9803,23=20@@=20= conv_intrinsic_ieee_builtin=20(gfc_se=20*=20se,=20gfc_expr=20*=20expr,=0A= =20}=0A=20=0A=20=0A+/*=20Generate=20code=20for=20intrinsics=20= IEEE_SIGNBIT.=20=20*/=0A+=0A+static=20void=0A= +conv_intrinsic_ieee_signbit=20(gfc_se=20*=20se,=20gfc_expr=20*=20expr)=0A= +{=0A+=20=20tree=20arg,=20signbit;=0A+=0A+=20=20conv_ieee_function_args=20= (se,=20expr,=20&arg,=201);=0A+=20=20signbit=20=3D=20build_call_expr_loc=20= (input_location,=0A+=09=09=09=09=20builtin_decl_explicit=20= (BUILT_IN_SIGNBIT),=0A+=09=09=09=09=201,=20arg);=0A+=20=20signbit=20=3D=20= fold_build2_loc=20(input_location,=20NE_EXPR,=20logical_type_node,=0A+=09= =09=09=20=20=20=20=20signbit,=20integer_zero_node);=0A+=20=20se->expr=20= =3D=20fold_convert=20(gfc_typenode_for_spec=20(&expr->ts),=20signbit);=0A= +}=0A+=0A+=0A=20/*=20Generate=20code=20for=20IEEE_IS_NORMAL=20intrinsic:=0A= =20=20=20=20=20=20IEEE_IS_NORMAL(x)=20-->=20(__builtin_isnormal(x)=20||=20= x=20=3D=3D=200)=20=20*/=0A=20=0A@@=20-10207,6=20+10226,30=20@@=20= conv_intrinsic_ieee_value=20(gfc_se=20*se,=20gfc_expr=20*expr)=0A=20}=0A=20= =0A=20=0A+/*=20Generate=20code=20for=20IEEE_FMA.=20=20*/=0A+=0A+static=20= void=0A+conv_intrinsic_ieee_fma=20(gfc_se=20*=20se,=20gfc_expr=20*=20= expr)=0A+{=0A+=20=20tree=20args[3],=20decl,=20call;=0A+=20=20int=20= argprec;=0A+=0A+=20=20conv_ieee_function_args=20(se,=20expr,=20args,=20= 3);=0A+=0A+=20=20/*=20All=20three=20arguments=20should=20have=20the=20= same=20type.=20=20*/=0A+=20=20gcc_assert=20(TYPE_PRECISION=20(TREE_TYPE=20= (args[0]))=20=3D=3D=20TYPE_PRECISION=20(TREE_TYPE=20(args[1])));=0A+=20=20= gcc_assert=20(TYPE_PRECISION=20(TREE_TYPE=20(args[0]))=20=3D=3D=20= TYPE_PRECISION=20(TREE_TYPE=20(args[2])));=0A+=0A+=20=20/*=20Call=20the=20= type-generic=20FMA=20built-in.=20=20*/=0A+=20=20argprec=20=3D=20= TYPE_PRECISION=20(TREE_TYPE=20(args[0]));=0A+=20=20decl=20=3D=20= builtin_decl_for_precision=20(BUILT_IN_FMA,=20argprec);=0A+=20=20call=20= =3D=20build_call_expr_loc_array=20(input_location,=20decl,=203,=20args);=0A= +=0A+=20=20/*=20Convert=20to=20the=20final=20type.=20=20*/=0A+=20=20= se->expr=20=3D=20fold_convert=20(TREE_TYPE=20(args[0]),=20call);=0A+}=0A= +=0A+=0A=20/*=20Generate=20code=20for=20an=20intrinsic=20function=20from=20= the=20IEEE_ARITHMETIC=0A=20=20=20=20module.=20=20*/=0A=20=0A@@=20= -10221,6=20+10264,8=20@@=20gfc_conv_ieee_arithmetic_function=20(gfc_se=20= *=20se,=20gfc_expr=20*=20expr)=0A=20=20=20=20=20= conv_intrinsic_ieee_builtin=20(se,=20expr,=20BUILT_IN_ISFINITE,=201);=0A=20= =20=20else=20if=20(startswith=20(name,=20"_gfortran_ieee_unordered"))=0A=20= =20=20=20=20conv_intrinsic_ieee_builtin=20(se,=20expr,=20= BUILT_IN_ISUNORDERED,=202);=0A+=20=20else=20if=20(startswith=20(name,=20= "_gfortran_ieee_signbit"))=0A+=20=20=20=20conv_intrinsic_ieee_signbit=20= (se,=20expr);=0A=20=20=20else=20if=20(startswith=20(name,=20= "_gfortran_ieee_is_normal"))=0A=20=20=20=20=20= conv_intrinsic_ieee_is_normal=20(se,=20expr);=0A=20=20=20else=20if=20= (startswith=20(name,=20"_gfortran_ieee_is_negative"))=0A@@=20-10241,6=20= +10286,8=20@@=20gfc_conv_ieee_arithmetic_function=20(gfc_se=20*=20se,=20= gfc_expr=20*=20expr)=0A=20=20=20=20=20conv_intrinsic_ieee_class=20(se,=20= expr);=0A=20=20=20else=20if=20(startswith=20(name,=20"ieee_value_")=20&&=20= ISDIGIT=20(name[11]))=0A=20=20=20=20=20conv_intrinsic_ieee_value=20(se,=20= expr);=0A+=20=20else=20if=20(startswith=20(name,=20= "_gfortran_ieee_fma"))=0A+=20=20=20=20conv_intrinsic_ieee_fma=20(se,=20= expr);=0A=20=20=20else=0A=20=20=20=20=20/*=20It=20is=20not=20among=20the=20= functions=20we=20translate=20directly.=20=20We=20return=0A=20=20=20=20=20= =20=20=20false,=20so=20a=20library=20function=20call=20is=20emitted.=20=20= */=0Adiff=20--git=20a/gcc/testsuite/gfortran.dg/ieee/fma_1.f90=20= b/gcc/testsuite/gfortran.dg/ieee/fma_1.f90=0Anew=20file=20mode=20100644=0A= index=2000000000000..34636426c98=0A---=20/dev/null=0A+++=20= b/gcc/testsuite/gfortran.dg/ieee/fma_1.f90=0A@@=20-0,0=20+1,100=20@@=0A= +!=20Test=20IEEE_FMA=0A+!=20{=20dg-do=20run=20}=0A+=0A+=20=20use,=20= intrinsic=20::=20ieee_features=0A+=20=20use,=20intrinsic=20::=20= ieee_exceptions=0A+=20=20use,=20intrinsic=20::=20ieee_arithmetic=0A+=20=20= implicit=20none=0A+=0A+=20=20integer=20::=20ex=0A+=0A+=20=20real=20::=20= sx1,=20sx2,=20sx3=0A+=20=20double=20precision=20::=20dx1,=20dx2,=20dx3=0A= +=0A+=20=20!=20k1=20and=20k2=20will=20be=20large=20real=20kinds,=20if=20= supported,=20and=20single/double=0A+=20=20!=20otherwise=0A+=20=20= integer,=20parameter=20::=20k1=20=3D=20&=0A+=20=20=20=20= max(ieee_selected_real_kind(precision(0.d0)=20+=201),=20kind(0.))=0A+=20=20= integer,=20parameter=20::=20k2=20=3D=20&=0A+=20=20=20=20= max(ieee_selected_real_kind(precision(0._k1)=20+=201),=20kind(0.d0))=0A+=0A= +=20=20real(kind=3Dk1)=20::=20lx1,=20lx2,=20lx3=0A+=20=20real(kind=3Dk2)=20= ::=20wx1,=20wx2,=20wx3=0A+=0A+=20=20!=20Float=0A+=0A+=20=20sx1=20=3D=203=20= ;=20sx2=20=3D=202=20;=20sx3=20=3D=201=0A+=20=20if=20(ieee_fma(sx1,=20= sx2,=20sx3)=20/=3D=207)=20stop=201=0A+=20=20sx1=20=3D=200=20;=20sx2=20=3D=20= 2=20;=20sx3=20=3D=201=0A+=20=20if=20(ieee_fma(sx1,=20sx2,=20sx3)=20/=3D=20= 1)=20stop=202=0A+=20=20sx1=20=3D=203=20;=20sx2=20=3D=202=20;=20sx3=20=3D=20= 0=0A+=20=20if=20(ieee_fma(sx1,=20sx2,=20sx3)=20/=3D=206)=20stop=203=0A+=0A= +=20=20ex=20=3D=20int(log(rrspacing(real(1,=20kind(sx1))))=20/=20= log(real(2,=20kind(sx1))))=20-=201=0A+=20=20sx1=20=3D=201=20+=20= spacing(real(1,=20kind(sx1)))=0A+=20=20sx2=20=3D=202=20;=20sx2=20=3D=20= sx2=20**=20ex=20;=20sx2=20=3D=20sx2=20*=203=0A+=20=20sx3=20=3D=20-sx2=0A= +=0A+=20=20print=20*,=20sx1=20*=20sx2=20+=20sx3=0A+=20=20print=20*,=20= ieee_fma(sx1,=20sx2,=20sx3)=0A+=20=20if=20(ieee_fma(sx1,=20sx2,=20sx3)=20= /=3D=20real(3,=20kind(sx1))=20/=202)=20stop=204=0A+=20=20!if=20= (ieee_fma(sx1,=20sx2,=20sx3)=20=3D=3D=20sx1=20*=20sx2=20+=20sx3)=20stop=20= 5=0A+=0A+=20=20!=20Double=0A+=0A+=20=20dx1=20=3D=203=20;=20dx2=20=3D=202=20= ;=20dx3=20=3D=201=0A+=20=20if=20(ieee_fma(dx1,=20dx2,=20dx3)=20/=3D=207)=20= stop=201=0A+=20=20dx1=20=3D=200=20;=20dx2=20=3D=202=20;=20dx3=20=3D=201=0A= +=20=20if=20(ieee_fma(dx1,=20dx2,=20dx3)=20/=3D=201)=20stop=202=0A+=20=20= dx1=20=3D=203=20;=20dx2=20=3D=202=20;=20dx3=20=3D=200=0A+=20=20if=20= (ieee_fma(dx1,=20dx2,=20dx3)=20/=3D=206)=20stop=203=0A+=0A+=20=20ex=20=3D=20= int(log(rrspacing(real(1,=20kind(dx1))))=20/=20log(real(2,=20= kind(dx1))))=20-=201=0A+=20=20dx1=20=3D=201=20+=20spacing(real(1,=20= kind(dx1)))=0A+=20=20dx2=20=3D=202=20;=20dx2=20=3D=20dx2=20**=20ex=20;=20= dx2=20=3D=20dx2=20*=203=0A+=20=20dx3=20=3D=20-dx2=0A+=0A+=20=20print=20= *,=20dx1=20*=20dx2=20+=20dx3=0A+=20=20print=20*,=20ieee_fma(dx1,=20dx2,=20= dx3)=0A+=20=20if=20(ieee_fma(dx1,=20dx2,=20dx3)=20/=3D=20real(3,=20= kind(dx1))=20/=202)=20stop=204=0A+=20=20!if=20(ieee_fma(dx1,=20dx2,=20= dx3)=20=3D=3D=20dx1=20*=20dx2=20+=20dx3)=20stop=205=0A+=0A+=20=20!=20= Large=20kind=201=0A+=0A+=20=20lx1=20=3D=203=20;=20lx2=20=3D=202=20;=20= lx3=20=3D=201=0A+=20=20if=20(ieee_fma(lx1,=20lx2,=20lx3)=20/=3D=207)=20= stop=201=0A+=20=20lx1=20=3D=200=20;=20lx2=20=3D=202=20;=20lx3=20=3D=201=0A= +=20=20if=20(ieee_fma(lx1,=20lx2,=20lx3)=20/=3D=201)=20stop=202=0A+=20=20= lx1=20=3D=203=20;=20lx2=20=3D=202=20;=20lx3=20=3D=200=0A+=20=20if=20= (ieee_fma(lx1,=20lx2,=20lx3)=20/=3D=206)=20stop=203=0A+=0A+=20=20ex=20=3D=20= int(log(rrspacing(real(1,=20kind(lx1))))=20/=20log(real(2,=20= kind(lx1))))=20-=201=0A+=20=20lx1=20=3D=201=20+=20spacing(real(1,=20= kind(lx1)))=0A+=20=20lx2=20=3D=202=20;=20lx2=20=3D=20lx2=20**=20ex=20;=20= lx2=20=3D=20lx2=20*=203=0A+=20=20lx3=20=3D=20-lx2=0A+=0A+=20=20print=20= *,=20lx1=20*=20lx2=20+=20lx3=0A+=20=20print=20*,=20ieee_fma(lx1,=20lx2,=20= lx3)=0A+=20=20if=20(ieee_fma(lx1,=20lx2,=20lx3)=20/=3D=20real(3,=20= kind(lx1))=20/=202)=20stop=204=0A+=20=20if=20(ieee_fma(lx1,=20lx2,=20= lx3)=20=3D=3D=20lx1=20*=20lx2=20+=20lx3)=20stop=205=0A+=0A+=20=20!=20= Large=20kind=202=0A+=0A+=20=20wx1=20=3D=203=20;=20wx2=20=3D=202=20;=20= wx3=20=3D=201=0A+=20=20if=20(ieee_fma(wx1,=20wx2,=20wx3)=20/=3D=207)=20= stop=201=0A+=20=20wx1=20=3D=200=20;=20wx2=20=3D=202=20;=20wx3=20=3D=201=0A= +=20=20if=20(ieee_fma(wx1,=20wx2,=20wx3)=20/=3D=201)=20stop=202=0A+=20=20= wx1=20=3D=203=20;=20wx2=20=3D=202=20;=20wx3=20=3D=200=0A+=20=20if=20= (ieee_fma(wx1,=20wx2,=20wx3)=20/=3D=206)=20stop=203=0A+=0A+=20=20ex=20=3D=20= int(log(rrspacing(real(1,=20kind(wx1))))=20/=20log(real(2,=20= kind(wx1))))=20-=201=0A+=20=20wx1=20=3D=201=20+=20spacing(real(1,=20= kind(wx1)))=0A+=20=20wx2=20=3D=202=20;=20wx2=20=3D=20wx2=20**=20ex=20;=20= wx2=20=3D=20wx2=20*=203=0A+=20=20wx3=20=3D=20-wx2=0A+=0A+=20=20print=20= *,=20wx1=20*=20wx2=20+=20wx3=0A+=20=20print=20*,=20ieee_fma(wx1,=20wx2,=20= wx3)=0A+=20=20if=20(ieee_fma(wx1,=20wx2,=20wx3)=20/=3D=20real(3,=20= kind(wx1))=20/=202)=20stop=204=0A+=20=20if=20(ieee_fma(wx1,=20wx2,=20= wx3)=20=3D=3D=20wx1=20*=20wx2=20+=20wx3)=20stop=205=0A+=0A+end=0Adiff=20= --git=20a/gcc/testsuite/gfortran.dg/ieee/signbit_1.f90=20= b/gcc/testsuite/gfortran.dg/ieee/signbit_1.f90=0Anew=20file=20mode=20= 100644=0Aindex=2000000000000..5d6e41de739=0A---=20/dev/null=0A+++=20= b/gcc/testsuite/gfortran.dg/ieee/signbit_1.f90=0A@@=20-0,0=20+1,166=20@@=0A= +!=20Test=20IEEE_SIGNBIT=0A+!=20{=20dg-do=20run=20}=0A+=0A+=20=20use,=20= intrinsic=20::=20ieee_features=0A+=20=20use,=20intrinsic=20::=20= ieee_exceptions=0A+=20=20use,=20intrinsic=20::=20ieee_arithmetic=0A+=20=20= implicit=20none=0A+=0A+=20=20real=20::=20sx1=0A+=20=20double=20precision=20= ::=20dx1=0A+=0A+=20=20!=20k1=20and=20k2=20will=20be=20large=20real=20= kinds,=20if=20supported,=20and=20single/double=0A+=20=20!=20otherwise=0A= +=20=20integer,=20parameter=20::=20k1=20=3D=20&=0A+=20=20=20=20= max(ieee_selected_real_kind(precision(0.d0)=20+=201),=20kind(0.))=0A+=20=20= integer,=20parameter=20::=20k2=20=3D=20&=0A+=20=20=20=20= max(ieee_selected_real_kind(precision(0._k1)=20+=201),=20kind(0.d0))=0A+=0A= +=20=20real(kind=3Dk1)=20::=20xk1=0A+=20=20real(kind=3Dk2)=20::=20xk2=0A= +=0A+=20=20!=20Float=0A+=0A+=20=20sx1=20=3D=201.3=0A+=20=20if=20= (ieee_signbit(sx1))=20stop=201=0A+=20=20sx1=20=3D=20huge(sx1)=0A+=20=20= if=20(ieee_signbit(sx1))=20stop=202=0A+=20=20sx1=20=3D=20ieee_value(sx1,=20= ieee_positive_inf)=0A+=20=20if=20(ieee_signbit(sx1))=20stop=203=0A+=20=20= sx1=20=3D=20tiny(sx1)=0A+=20=20if=20(ieee_signbit(sx1))=20stop=204=0A+=20= =20sx1=20=3D=20tiny(sx1)=0A+=20=20sx1=20=3D=20sx1=20/=20101=0A+=20=20if=20= (ieee_signbit(sx1))=20stop=205=0A+=20=20sx1=20=3D=200=0A+=20=20if=20= (ieee_signbit(sx1))=20stop=206=0A+=20=20sx1=20=3D=20ieee_value(sx1,=20= ieee_quiet_nan)=0A+=20=20if=20(ieee_signbit(sx1))=20stop=207=0A+=0A+=20=20= sx1=20=3D=20-1.3=0A+=20=20if=20(.not.=20ieee_signbit(sx1))=20stop=208=0A= +=20=20sx1=20=3D=20-huge(sx1)=0A+=20=20if=20(.not.=20ieee_signbit(sx1))=20= stop=209=0A+=20=20sx1=20=3D=20-ieee_value(sx1,=20ieee_positive_inf)=0A+=20= =20if=20(.not.=20ieee_signbit(sx1))=20stop=2010=0A+=20=20sx1=20=3D=20= -tiny(sx1)=0A+=20=20if=20(.not.=20ieee_signbit(sx1))=20stop=2011=0A+=20=20= sx1=20=3D=20-tiny(sx1)=0A+=20=20sx1=20=3D=20sx1=20/=20101=0A+=20=20if=20= (.not.=20ieee_signbit(sx1))=20stop=2012=0A+=20=20sx1=20=3D=200=0A+=20=20= sx1=20=3D=20-sx1=0A+=20=20if=20(.not.=20ieee_signbit(sx1))=20stop=2013=0A= +=20=20sx1=20=3D=20ieee_value(sx1,=20ieee_quiet_nan)=0A+=20=20sx1=20=3D=20= -sx1=0A+=20=20if=20(.not.=20ieee_signbit(sx1))=20stop=2014=0A+=0A+=20=20= !=20Double=0A+=0A+=20=20dx1=20=3D=201.3=0A+=20=20if=20= (ieee_signbit(dx1))=20stop=201=0A+=20=20dx1=20=3D=20huge(dx1)=0A+=20=20= if=20(ieee_signbit(dx1))=20stop=202=0A+=20=20dx1=20=3D=20ieee_value(dx1,=20= ieee_positive_inf)=0A+=20=20if=20(ieee_signbit(dx1))=20stop=203=0A+=20=20= dx1=20=3D=20tiny(dx1)=0A+=20=20if=20(ieee_signbit(dx1))=20stop=204=0A+=20= =20dx1=20=3D=20tiny(dx1)=0A+=20=20dx1=20=3D=20dx1=20/=20101=0A+=20=20if=20= (ieee_signbit(dx1))=20stop=205=0A+=20=20dx1=20=3D=200=0A+=20=20if=20= (ieee_signbit(dx1))=20stop=206=0A+=20=20dx1=20=3D=20ieee_value(dx1,=20= ieee_quiet_nan)=0A+=20=20if=20(ieee_signbit(dx1))=20stop=207=0A+=0A+=20=20= dx1=20=3D=20-1.3=0A+=20=20if=20(.not.=20ieee_signbit(dx1))=20stop=208=0A= +=20=20dx1=20=3D=20-huge(dx1)=0A+=20=20if=20(.not.=20ieee_signbit(dx1))=20= stop=209=0A+=20=20dx1=20=3D=20-ieee_value(dx1,=20ieee_positive_inf)=0A+=20= =20if=20(.not.=20ieee_signbit(dx1))=20stop=2010=0A+=20=20dx1=20=3D=20= -tiny(dx1)=0A+=20=20if=20(.not.=20ieee_signbit(dx1))=20stop=2011=0A+=20=20= dx1=20=3D=20-tiny(dx1)=0A+=20=20dx1=20=3D=20dx1=20/=20101=0A+=20=20if=20= (.not.=20ieee_signbit(dx1))=20stop=2012=0A+=20=20dx1=20=3D=200=0A+=20=20= dx1=20=3D=20-dx1=0A+=20=20if=20(.not.=20ieee_signbit(dx1))=20stop=2013=0A= +=20=20dx1=20=3D=20ieee_value(dx1,=20ieee_quiet_nan)=0A+=20=20dx1=20=3D=20= -dx1=0A+=20=20if=20(.not.=20ieee_signbit(dx1))=20stop=2014=0A+=0A+=20=20= !=20Large=20kind=201=0A+=0A+=20=20xk1=20=3D=201.3=0A+=20=20if=20= (ieee_signbit(xk1))=20stop=201=0A+=20=20xk1=20=3D=20huge(xk1)=0A+=20=20= if=20(ieee_signbit(xk1))=20stop=202=0A+=20=20xk1=20=3D=20ieee_value(xk1,=20= ieee_positive_inf)=0A+=20=20if=20(ieee_signbit(xk1))=20stop=203=0A+=20=20= xk1=20=3D=20tiny(xk1)=0A+=20=20if=20(ieee_signbit(xk1))=20stop=204=0A+=20= =20xk1=20=3D=20tiny(xk1)=0A+=20=20xk1=20=3D=20xk1=20/=20101=0A+=20=20if=20= (ieee_signbit(xk1))=20stop=205=0A+=20=20xk1=20=3D=200=0A+=20=20if=20= (ieee_signbit(xk1))=20stop=206=0A+=20=20xk1=20=3D=20ieee_value(xk1,=20= ieee_quiet_nan)=0A+=20=20if=20(ieee_signbit(xk1))=20stop=207=0A+=0A+=20=20= xk1=20=3D=20-1.3=0A+=20=20if=20(.not.=20ieee_signbit(xk1))=20stop=208=0A= +=20=20xk1=20=3D=20-huge(xk1)=0A+=20=20if=20(.not.=20ieee_signbit(xk1))=20= stop=209=0A+=20=20xk1=20=3D=20-ieee_value(xk1,=20ieee_positive_inf)=0A+=20= =20if=20(.not.=20ieee_signbit(xk1))=20stop=2010=0A+=20=20xk1=20=3D=20= -tiny(xk1)=0A+=20=20if=20(.not.=20ieee_signbit(xk1))=20stop=2011=0A+=20=20= xk1=20=3D=20-tiny(xk1)=0A+=20=20xk1=20=3D=20xk1=20/=20101=0A+=20=20if=20= (.not.=20ieee_signbit(xk1))=20stop=2012=0A+=20=20xk1=20=3D=200=0A+=20=20= xk1=20=3D=20-xk1=0A+=20=20if=20(.not.=20ieee_signbit(xk1))=20stop=2013=0A= +=20=20xk1=20=3D=20ieee_value(xk1,=20ieee_quiet_nan)=0A+=20=20xk1=20=3D=20= -xk1=0A+=20=20if=20(.not.=20ieee_signbit(xk1))=20stop=2014=0A+=0A+=20=20= !=20Large=20kind=202=0A+=0A+=20=20xk2=20=3D=201.3=0A+=20=20if=20= (ieee_signbit(xk2))=20stop=201=0A+=20=20xk2=20=3D=20huge(xk2)=0A+=20=20= if=20(ieee_signbit(xk2))=20stop=202=0A+=20=20xk2=20=3D=20ieee_value(xk2,=20= ieee_positive_inf)=0A+=20=20if=20(ieee_signbit(xk2))=20stop=203=0A+=20=20= xk2=20=3D=20tiny(xk2)=0A+=20=20if=20(ieee_signbit(xk2))=20stop=204=0A+=20= =20xk2=20=3D=20tiny(xk2)=0A+=20=20xk2=20=3D=20xk2=20/=20101=0A+=20=20if=20= (ieee_signbit(xk2))=20stop=205=0A+=20=20xk2=20=3D=200=0A+=20=20if=20= (ieee_signbit(xk2))=20stop=206=0A+=20=20xk2=20=3D=20ieee_value(xk2,=20= ieee_quiet_nan)=0A+=20=20if=20(ieee_signbit(xk2))=20stop=207=0A+=0A+=20=20= xk2=20=3D=20-1.3=0A+=20=20if=20(.not.=20ieee_signbit(xk2))=20stop=208=0A= +=20=20xk2=20=3D=20-huge(xk2)=0A+=20=20if=20(.not.=20ieee_signbit(xk2))=20= stop=209=0A+=20=20xk2=20=3D=20-ieee_value(xk2,=20ieee_positive_inf)=0A+=20= =20if=20(.not.=20ieee_signbit(xk2))=20stop=2010=0A+=20=20xk2=20=3D=20= -tiny(xk2)=0A+=20=20if=20(.not.=20ieee_signbit(xk2))=20stop=2011=0A+=20=20= xk2=20=3D=20-tiny(xk2)=0A+=20=20xk2=20=3D=20xk2=20/=20101=0A+=20=20if=20= (.not.=20ieee_signbit(xk2))=20stop=2012=0A+=20=20xk2=20=3D=200=0A+=20=20= xk2=20=3D=20-xk2=0A+=20=20if=20(.not.=20ieee_signbit(xk2))=20stop=2013=0A= +=20=20xk2=20=3D=20ieee_value(xk2,=20ieee_quiet_nan)=0A+=20=20xk2=20=3D=20= -xk2=0A+=20=20if=20(.not.=20ieee_signbit(xk2))=20stop=2014=0A+=0A+end=0A= diff=20--git=20a/libgfortran/ieee/ieee_arithmetic.F90=20= b/libgfortran/ieee/ieee_arithmetic.F90=0Aindex=20= c8ef3e2faeb..4e01aa5504c=20100644=0A---=20= a/libgfortran/ieee/ieee_arithmetic.F90=0A+++=20= b/libgfortran/ieee/ieee_arithmetic.F90=0A@@=20-343,6=20+343,39=20@@=20= UNORDERED_MACRO(4,4)=0A=20=20=20end=20interface=0A=20=20=20public=20::=20= IEEE_UNORDERED=0A=20=0A+=20=20!=20IEEE_FMA=0A+=0A+=20=20interface=0A+=20=20= =20=20elemental=20real(kind=3D4)=20function=20_gfortran_ieee_fma_4=20(A,=20= B,=20C)=0A+=20=20=20=20=20=20real(kind=3D4),=20intent(in)=20::=20A,=20B,=20= C=0A+=20=20=20=20end=20function=0A+=20=20=20=20elemental=20real(kind=3D8)=20= function=20_gfortran_ieee_fma_8=20(A,=20B,=20C)=0A+=20=20=20=20=20=20= real(kind=3D8),=20intent(in)=20::=20A,=20B,=20C=0A+=20=20=20=20end=20= function=0A+#ifdef=20HAVE_GFC_REAL_10=0A+=20=20=20=20elemental=20= real(kind=3D10)=20function=20_gfortran_ieee_fma_10=20(A,=20B,=20C)=0A+=20= =20=20=20=20=20real(kind=3D10),=20intent(in)=20::=20A,=20B,=20C=0A+=20=20= =20=20end=20function=0A+#endif=0A+#ifdef=20HAVE_GFC_REAL_16=0A+=20=20=20=20= elemental=20real(kind=3D16)=20function=20_gfortran_ieee_fma_16=20(A,=20= B,=20C)=0A+=20=20=20=20=20=20real(kind=3D16),=20intent(in)=20::=20A,=20= B,=20C=0A+=20=20=20=20end=20function=0A+#endif=0A+=20=20end=20interface=0A= +=0A+=20=20interface=20IEEE_FMA=0A+=20=20=20=20procedure=20&=0A+#ifdef=20= HAVE_GFC_REAL_16=0A+=20=20=20=20=20=20_gfortran_ieee_fma_16,=20&=0A= +#endif=0A+#ifdef=20HAVE_GFC_REAL_10=0A+=20=20=20=20=20=20= _gfortran_ieee_fma_10,=20&=0A+#endif=0A+=20=20=20=20=20=20= _gfortran_ieee_fma_8,=20_gfortran_ieee_fma_4=0A+=20=20end=20interface=0A= +=20=20public=20::=20IEEE_FMA=0A+=0A=20=20=20!=20IEEE_LOGB=0A=20=0A=20=20= =20interface=0A@@=20-702,6=20+735,39=20@@=20REM_MACRO(4,4,4)=0A=20=20=20= end=20interface=0A=20=20=20public=20::=20IEEE_SCALB=0A=20=0A+=20=20!=20= IEEE_SIGNBIT=0A+=0A+=20=20interface=0A+=20=20=20=20elemental=20logical=20= function=20_gfortran_ieee_signbit_4=20(X)=0A+=20=20=20=20=20=20= real(kind=3D4),=20intent(in)=20::=20X=0A+=20=20=20=20end=20function=0A+=20= =20=20=20elemental=20logical=20function=20_gfortran_ieee_signbit_8=20(X)=0A= +=20=20=20=20=20=20real(kind=3D8),=20intent(in)=20::=20X=0A+=20=20=20=20= end=20function=0A+#ifdef=20HAVE_GFC_REAL_10=0A+=20=20=20=20elemental=20= logical=20function=20_gfortran_ieee_signbit_10=20(X)=0A+=20=20=20=20=20=20= real(kind=3D10),=20intent(in)=20::=20X=0A+=20=20=20=20end=20function=0A= +#endif=0A+#ifdef=20HAVE_GFC_REAL_16=0A+=20=20=20=20elemental=20logical=20= function=20_gfortran_ieee_signbit_16=20(X)=0A+=20=20=20=20=20=20= real(kind=3D16),=20intent(in)=20::=20X=0A+=20=20=20=20end=20function=0A= +#endif=0A+=20=20end=20interface=0A+=0A+=20=20interface=20IEEE_SIGNBIT=0A= +=20=20=20=20procedure=20&=0A+#ifdef=20HAVE_GFC_REAL_16=0A+=20=20=20=20=20= =20_gfortran_ieee_signbit_16,=20&=0A+#endif=0A+#ifdef=20HAVE_GFC_REAL_10=0A= +=20=20=20=20=20=20_gfortran_ieee_signbit_10,=20&=0A+#endif=0A+=20=20=20=20= =20=20_gfortran_ieee_signbit_8,=20_gfortran_ieee_signbit_4=0A+=20=20end=20= interface=0A+=20=20public=20::=20IEEE_SIGNBIT=0A+=0A=20=20=20!=20= IEEE_VALUE=0A=20=0A=20=20=20interface=20IEEE_VALUE=0A--=20=0A2.25.1=0A=0A= --Apple-Mail=_7A81D948-8EA6-4BCB-927A-87D80EF33D1C--