aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2024-09-24 21:59:10 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-09-24 21:59:10 +0200
commit5e918a4db9e4a5bdbeafec6881fa8b22a55d3789 (patch)
tree95bc57dc02c17a52e89b3d403815d7f85a0e8f3f /gcc
parent5d98fe096b5d17021875806ffc32ba41ea0e87b0 (diff)
downloadgcc-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.texi2
-rw-r--r--gcc/fortran/iresolve.cc19
-rw-r--r--gcc/fortran/simplify.cc11
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);