diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-09-24 21:59:10 +0200 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-09-24 21:59:10 +0200 |
commit | 5e918a4db9e4a5bdbeafec6881fa8b22a55d3789 (patch) | |
tree | 95bc57dc02c17a52e89b3d403815d7f85a0e8f3f /gcc | |
parent | 5d98fe096b5d17021875806ffc32ba41ea0e87b0 (diff) | |
download | gcc-5e918a4db9e4a5bdbeafec6881fa8b22a55d3789.zip gcc-5e918a4db9e4a5bdbeafec6881fa8b22a55d3789.tar.gz gcc-5e918a4db9e4a5bdbeafec6881fa8b22a55d3789.tar.bz2 |
Implement SUM and PRODUCT for unsigned.
gcc/fortran/ChangeLog:
* gfortran.texi: Document SUM and PRODUCT.
* iresolve.cc (resolve_transformational): New argument,
use_integer, to translate calls to unsigned to calls to
integer.
(gfc_resolve_product): Use it
(gfc_resolve_sum): Use it.
* simplify.cc (init_result_expr): Handle BT_UNSIGNED.
libgfortran/ChangeLog:
* generated/product_c10.c: Regenerated.
* generated/product_c16.c: Regenerated.
* generated/product_c17.c: Regenerated.
* generated/product_c4.c: Regenerated.
* generated/product_c8.c: Regenerated.
* generated/product_i1.c: Regenerated.
* generated/product_i16.c: Regenerated.
* generated/product_i2.c: Regenerated.
* generated/product_i4.c: Regenerated.
* generated/product_i8.c: Regenarated.
* generated/product_r10.c: Regenerated.
* generated/product_r16.c: Regenerated.
* generated/product_r17.c: Regenerated.
* generated/product_r4.c: Regenerated.
* generated/product_r8.c: Regenarated.
* generated/sum_c10.c: Regenerated.
* generated/sum_c16.c: Regenerated.
* generated/sum_c17.c: Regenerated.
* generated/sum_c4.c: Regenerated.
* generated/sum_c8.c: Regenerated.
* generated/sum_i1.c: Regenerated.
* generated/sum_i16.c: Regenerated.
* generated/sum_i2.c: Regenerated.
* generated/sum_i4.c: Regenerated.
* generated/sum_i8.c: Regenerated.
* generated/sum_r10.c: Regenerated.
* generated/sum_r16.c: Regenerated.
* generated/sum_r17.c: Regenerated.
* generated/sum_r4.c: Regenerated.
* generated/sum_r8.c: Regenerated.
* m4/ifunction.m4: Whitespace fix.
* m4/product.m4: If type is integer, change to unsigned.
* m4/sum.m4: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/gfortran.texi | 2 | ||||
-rw-r--r-- | gcc/fortran/iresolve.cc | 19 | ||||
-rw-r--r-- | gcc/fortran/simplify.cc | 11 |
3 files changed, 26 insertions, 6 deletions
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 829ab00..e5ffe67 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -2788,7 +2788,7 @@ As of now, the following intrinsics take unsigned arguments: @item @code{MVBITS} @item @code{RANGE} @item @code{TRANSFER} -@item @code{MATMUL} and @code{DOT_PRODUCT} +@item @code{SUM}, @code{PRODUCT}, @code{MATMUL} and @code{DOT_PRODUCT} @end itemize This list will grow in the near future. @c --------------------------------------------------------------------- diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc index 32b3143..b4c9a63 100644 --- a/gcc/fortran/iresolve.cc +++ b/gcc/fortran/iresolve.cc @@ -175,9 +175,11 @@ resolve_bound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind, static void resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array, - gfc_expr *dim, gfc_expr *mask) + gfc_expr *dim, gfc_expr *mask, + bool use_integer = false) { const char *prefix; + bt type; f->ts = array->ts; @@ -200,9 +202,18 @@ resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array, gfc_resolve_dim_arg (dim); } + /* For those intrinsic like SUM where we use the integer version + actually uses unsigned, but we call it as the integer + version. */ + + if (use_integer && array->ts.type == BT_UNSIGNED) + type = BT_INTEGER; + else + type = array->ts.type; + f->value.function.name = gfc_get_string (PREFIX ("%s%s_%c%d"), prefix, name, - gfc_type_letter (array->ts.type), + gfc_type_letter (type), gfc_type_abi_kind (&array->ts)); } @@ -2333,7 +2344,7 @@ void gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask) { - resolve_transformational ("product", f, array, dim, mask); + resolve_transformational ("product", f, array, dim, mask, true); } @@ -2881,7 +2892,7 @@ gfc_resolve_storage_size (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED, void gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask) { - resolve_transformational ("sum", f, array, dim, mask); + resolve_transformational ("sum", f, array, dim, mask, true); } diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc index 83d0fdc..e5681c4 100644 --- a/gcc/fortran/simplify.cc +++ b/gcc/fortran/simplify.cc @@ -359,7 +359,16 @@ init_result_expr (gfc_expr *e, int init, gfc_expr *array) mpz_set_si (e->value.integer, init); break; - case BT_REAL: + case BT_UNSIGNED: + if (init == INT_MIN) + mpz_set_ui (e->value.integer, 0); + else if (init == INT_MAX) + mpz_set (e->value.integer, gfc_unsigned_kinds[i].huge); + else + mpz_set_ui (e->value.integer, init); + break; + + case BT_REAL: if (init == INT_MIN) { mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE); |