Re: [power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes
Hi Jakub, This test FAILs because f951: Error: '-mabi=ieeelongdouble' requires full ISA 2.06 support compiler exited with status 1 FAIL: gfortran.dg/pr47614.f -O0 (test for excess errors) As powerpc64le* only supports -mcpu=power8 and newer, I think we shouldn't be testing with that option. Ok for power-ieee128? OK (I would also consider it obvious). Though, I'm still unsure on what we should do with the array descriptors. typedef struct dtype_type { size_t elem_len; int version; signed char rank; signed char type; signed short attribute; } dtype_type; Is elem_len really element length, or kind, or both? It is specified as a length, and should be set correctly also for complex (where it is twice the length). It seems a lot of code uses that interchangeably, is there anything where we'd rely on whether it is the IBM extended real(kind=16) or IEEE quad real(kind=16) (either in libgfortran or elsewhere)? I think we use sizeof in all relevant files. At least in libgfortran/generates/*, GFC_DESCRIPTOR_SIZE is mostly used as mask_kind (I think the mask arrays are always logical not real/complex, right?), or for logical stuff like matmul_l*. Yes, masks are always of type logical, so that should not be an issue. There are two direct uses of elem_len in caf/singe.c, one in date_and_time.c and one in io/transfer.c. There is also some use of a variable of that name ISO_Fortran_binding.c, which can be checked later. Best regards Thomas
Re: [power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes
Hi! This test FAILs because f951: Error: '-mabi=ieeelongdouble' requires full ISA 2.06 support compiler exited with status 1 FAIL: gfortran.dg/pr47614.f -O0 (test for excess errors) As powerpc64le* only supports -mcpu=power8 and newer, I think we shouldn't be testing with that option. Ok for power-ieee128? All the remaining FAILs I get are due to the -flto -mgnu-attribute issues or FAIL also with -mabi=ibmlongdouble. Though, I'm still unsure on what we should do with the array descriptors. typedef struct dtype_type { size_t elem_len; int version; signed char rank; signed char type; signed short attribute; } dtype_type; Is elem_len really element length, or kind, or both? It seems a lot of code uses that interchangeably, is there anything where we'd rely on whether it is the IBM extended real(kind=16) or IEEE quad real(kind=16) (either in libgfortran or elsewhere)? At least in libgfortran/generates/*, GFC_DESCRIPTOR_SIZE is mostly used as mask_kind (I think the mask arrays are always logical not real/complex, right?), or for logical stuff like matmul_l*. 2022-01-04 Jakub Jelinek * gfortran.dg/pr47614.f: Don't use -mcpu=power4 for powerpc64le*-*-linux*. --- gcc/testsuite/gfortran.dg/pr47614.f.jj 2021-12-31 11:00:53.733041354 + +++ gcc/testsuite/gfortran.dg/pr47614.f 2022-01-04 17:51:05.422663254 + @@ -1,6 +1,7 @@ ! { dg-do run { target { powerpc*-*-* } } } ! { dg-skip-if "" { powerpc*-*-darwin* } } ! { dg-options "-O3 -funroll-loops -ffast-math -mcpu=power4" } +! { dg-options "-O3 -funroll-loops -ffast-math" { target powerpc64le*-*-linux* } } SUBROUTINE SFCPAR(ZET,NZ,ZMH,TSL,TMES) Jakub
Re: [power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes
On 04.01.22 15:23, Jakub Jelinek via Fortran wrote: Ok for power-ieee128? Also OK. Best regards Thomas
[power-ieee128] fortran, libgfortran: Assorted -mabi=ieeelongdouble I/O fixes
Hi! Another patch, this fixes: FAIL: gfortran.dg/intrinsic_spread_2.f90 -O0 execution test FAIL: gfortran.dg/intrinsic_spread_2.f90 -O1 execution test FAIL: gfortran.dg/intrinsic_spread_2.f90 -O2 execution test FAIL: gfortran.dg/intrinsic_spread_2.f90 -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions execution test FAIL: gfortran.dg/intrinsic_spread_2.f90 -O3 -g execution test FAIL: gfortran.dg/intrinsic_spread_2.f90 -Os execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -O0 execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -O1 execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -O2 execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -O3 -g execution test FAIL: gfortran.dg/intrinsic_unpack_2.f90 -Os execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -O0 execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -O1 execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -O2 execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -O3 -g execution test FAIL: gfortran.dg/large_real_kind_form_io_1.f90 -Os execution test FAIL: gfortran.dg/quad_2.f90 -O0 execution test FAIL: gfortran.dg/quad_2.f90 -O1 execution test FAIL: gfortran.dg/quad_2.f90 -O2 execution test FAIL: gfortran.dg/quad_2.f90 -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions execution test FAIL: gfortran.dg/quad_2.f90 -O3 -g execution test FAIL: gfortran.dg/quad_2.f90 -Os execution test Ok for power-ieee128? 2022-01-04 Jakub Jelinek gcc/fortran/ * trans-io.c (transfer_array_desc): Pass abi kind instead of kind to libgfortran. libgfortran/ * io/read.c (convert_real): Add missing break; for the HAVE_GFC_REAL_17 case. --- gcc/fortran/trans-io.c.jj 2022-01-04 10:27:56.498322942 + +++ gcc/fortran/trans-io.c 2022-01-04 13:51:50.336998696 + @@ -2528,7 +2528,7 @@ transfer_array_desc (gfc_se * se, gfc_ty else charlen_arg = build_int_cst (gfc_charlen_type_node, 0); - kind_arg = build_int_cst (integer_type_node, ts->kind); + kind_arg = build_int_cst (integer_type_node, gfc_type_abi_kind (ts)); tmp = gfc_build_addr_expr (NULL_TREE, dt_parm); if (last_dt == READ) --- libgfortran/io/read.c.jj2022-01-04 10:27:56.518323381 + +++ libgfortran/io/read.c 2022-01-04 13:58:51.676285518 + @@ -203,6 +203,7 @@ convert_real (st_parameter_dt *dtp, void # else *((GFC_REAL_17*) dest) = __qmath_(strtoflt128) (buffer, ); # endif + break; #endif default: Jakub