public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/omp/gcc-11] Fortran: Fix c_float128 and c_float128_complex definitions.
@ 2021-08-20 3:06 Sandra Loosemore
0 siblings, 0 replies; only message in thread
From: Sandra Loosemore @ 2021-08-20 3:06 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d554155c07771935778f557e9ef649cc3624d1ce
commit d554155c07771935778f557e9ef649cc3624d1ce
Author: Sandra Loosemore <sandra@codesourcery.com>
Date: Wed Aug 11 19:24:17 2021 -0700
Fortran: Fix c_float128 and c_float128_complex definitions.
gfc_float128_type_node is only non-NULL on targets that support a
128-bit type that is not long double. Use float128_type_node instead
when computing the value of the kind constants c_float128 and
c_float128_complex from the ISO_C_BINDING intrinsic module; this also
ensures it actually corresponds to __float128 (the IEEE encoding) and
not some other 128-bit floating-point type.
2021-08-11 Sandra Loosemore <sandra@codesourcery.com>
gcc/fortran/
* iso-c-binding.def (c_float128, c_float128_complex): Check
float128_type_node instead of gfc_float128_type_node.
* trans-types.c (gfc_init_kinds, gfc_build_real_type):
Update comments re supported 128-bit floating-point types.
(cherry picked from commit 58340a7cd3670024bafdbbc6ca63a9af841df98a)
Diff:
---
gcc/fortran/ChangeLog.omp | 11 +++++++++++
gcc/fortran/iso-c-binding.def | 15 +++++++++++----
gcc/fortran/trans-types.c | 12 ++++++++++--
3 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 88c3c52c32a..a6acea420df 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,14 @@
+2021-08-11 Sandra Loosemore <sandra@codesourcery.com>
+
+ Backported from master:
+
+ 2021-08-11 Sandra Loosemore <sandra@codesourcery.com>
+
+ * iso-c-binding.def (c_float128, c_float128_complex): Check
+ float128_type_node instead of gfc_float128_type_node.
+ * trans-types.c (gfc_init_kinds, gfc_build_real_type):
+ Update comments re supported 128-bit floating-point types.
+
2021-08-11 Sandra Loosemore <sandra@codesourcery.com>
Backported from master:
diff --git a/gcc/fortran/iso-c-binding.def b/gcc/fortran/iso-c-binding.def
index 8bf69eff99d..e65c750faca 100644
--- a/gcc/fortran/iso-c-binding.def
+++ b/gcc/fortran/iso-c-binding.def
@@ -114,9 +114,14 @@ NAMED_REALCST (ISOCBINDING_DOUBLE, "c_double", \
get_real_kind_from_node (double_type_node), GFC_STD_F2003)
NAMED_REALCST (ISOCBINDING_LONG_DOUBLE, "c_long_double", \
get_real_kind_from_node (long_double_type_node), GFC_STD_F2003)
+
+/* GNU Extension. Note that the equivalence here is specifically to
+ the IEEE 128-bit type __float128; if that does not map onto a type
+ otherwise supported by the Fortran front end, get_real_kind_from_node
+ will reject it as unsupported. */
NAMED_REALCST (ISOCBINDING_FLOAT128, "c_float128", \
- gfc_float128_type_node == NULL_TREE \
- ? -4 : get_real_kind_from_node (gfc_float128_type_node), \
+ (float128_type_node == NULL_TREE \
+ ? -4 : get_real_kind_from_node (float128_type_node)), \
GFC_STD_GNU)
NAMED_CMPXCST (ISOCBINDING_FLOAT_COMPLEX, "c_float_complex", \
get_real_kind_from_node (float_type_node), GFC_STD_F2003)
@@ -124,9 +129,11 @@ NAMED_CMPXCST (ISOCBINDING_DOUBLE_COMPLEX, "c_double_complex", \
get_real_kind_from_node (double_type_node), GFC_STD_F2003)
NAMED_CMPXCST (ISOCBINDING_LONG_DOUBLE_COMPLEX, "c_long_double_complex", \
get_real_kind_from_node (long_double_type_node), GFC_STD_F2003)
+
+/* GNU Extension. Similar issues to c_float128 above. */
NAMED_CMPXCST (ISOCBINDING_FLOAT128_COMPLEX, "c_float128_complex", \
- gfc_float128_type_node == NULL_TREE \
- ? -4 : get_real_kind_from_node (gfc_float128_type_node), \
+ (float128_type_node == NULL_TREE \
+ ? -4 : get_real_kind_from_node (float128_type_node)), \
GFC_STD_GNU)
NAMED_LOGCST (ISOCBINDING_BOOL, "c_bool", \
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 604e816dc27..18fc4d265d5 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -446,7 +446,7 @@ gfc_init_kinds (void)
if (!targetm.scalar_mode_supported_p (mode))
continue;
- /* Only let float, double, long double and __float128 go through.
+ /* Only let float, double, long double and TFmode go through.
Runtime support for others is not provided, so they would be
useless. */
if (!targetm.libgcc_floating_mode_supported_p (mode))
@@ -471,7 +471,14 @@ gfc_init_kinds (void)
We round up so as to handle IA-64 __floatreg (RFmode), which is an
82 bit type. Not to be confused with __float80 (XFmode), which is
an 80 bit type also supported by IA-64. So XFmode should come out
- to be kind=10, and RFmode should come out to be kind=11. Egads. */
+ to be kind=10, and RFmode should come out to be kind=11. Egads.
+
+ TODO: The kind calculation has to be modified to support all
+ three 128-bit floating-point modes on PowerPC as IFmode, KFmode,
+ and TFmode since the following line would all map to kind=16.
+ However, currently only float, double, long double, and TFmode
+ reach this code.
+ */
kind = (GET_MODE_PRECISION (mode) + 7) / 8;
@@ -851,6 +858,7 @@ gfc_build_real_type (gfc_real_info *info)
info->c_long_double = 1;
if (mode_precision != LONG_DOUBLE_TYPE_SIZE && mode_precision == 128)
{
+ /* TODO: see PR101835. */
info->c_float128 = 1;
gfc_real16_is_float128 = true;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-08-20 3:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-20 3:06 [gcc/devel/omp/gcc-11] Fortran: Fix c_float128 and c_float128_complex definitions Sandra Loosemore
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).