Hi, on 2024/5/9 06:01, Steve Kargl wrote: > On Wed, May 08, 2024 at 01:27:53PM +0800, Kewen.Lin wrote: >> >> Previously effective target fortran_real_c_float128 never >> passes on Power regardless of the default 128 long double >> is ibmlongdouble or ieeelongdouble. It's due to that TF >> mode is always used for kind 16 real, which has precision >> 127, while the node float128_type_node for c_float128 has >> 128 type precision, get_real_kind_from_node can't find a >> matching as it only checks gfc_real_kinds[i].mode_precision >> and type precision. >> >> With changing TFmode/IFmode/KFmode to have the same mode >> precision 128, now fortran_real_c_float12 can pass with >> ieeelongdouble enabled by default and test cases guarded >> with it get tested accordingly. But with ibmlongdouble >> enabled by default, since TFmode has precision 128 which >> is the same as type precision 128 of float128_type_node, >> get_real_kind_from_node considers kind for TFmode matches >> float128_type_node, but it's wrong as at this time point >> TFmode is with ibm extended format. So this patch is to >> teach get_real_kind_from_node to check one more field which >> can be differentiable from the underlying real format, it >> can avoid the unexpected matching when there more than one >> modes have the same precision. >> >> Bootstrapped and regress-tested on: >> - powerpc64-linux-gnu P8/P9 (with ibm128 by default) >> - powerpc64le-linux-gnu P9/P10 (with ibm128 by default) >> - powerpc64le-linux-gnu P9 (with ieee128 by default) >> >> BR, >> Kewen >> ----- >> PR target/112993 >>
> OK from the fortran point of view. > Thanks. > > First, I have no issue with Mikael's OK for committing the > patch. Thanks to both! > > That said, Fortran has the concept of model numbers, which > are set in arith.c. Does this change give the expected > value for ibm128? For example, with "REAL(16) X", one > has "DIGITS(X) = 113", which is the precision on the > of the underlying IEEE754 binary128 type. > With some testings locally, I noticed that currently DIGITS has been already correct even without this change. For "REAL(16) X", with -mabi=ibmlongdouble it's long double with ibm128 format and its DIGITS(X) is 106, while with -mabi=ieeelongdouble it's long double with ieee128 format and its DIGITS(X) is 113. BR, Kewen