aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/iresolve.cc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2024-09-24 21:51:42 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2024-09-24 21:51:42 +0200
commit5d98fe096b5d17021875806ffc32ba41ea0e87b0 (patch)
tree03c4d94456c7c17ba3b5164ac17bf6a71cca4485 /gcc/fortran/iresolve.cc
parent650e91566561870f3d1c8d5b92e6613296ee1a8d (diff)
downloadgcc-5d98fe096b5d17021875806ffc32ba41ea0e87b0.zip
gcc-5d98fe096b5d17021875806ffc32ba41ea0e87b0.tar.gz
gcc-5d98fe096b5d17021875806ffc32ba41ea0e87b0.tar.bz2
Implement MATMUL and DOT_PRODUCT for unsigned.
gcc/fortran/ChangeLog: * arith.cc (gfc_arith_uminus): Fix warning. (gfc_arith_minus): Correctly truncate unsigneds. * check.cc (gfc_check_dot_product): Handle unsigned arguments. (gfc_check_matmul): Likewise. * expr.cc (gfc_get_unsigned_expr): New function. * gfortran.h (gfc_get_unsigned_expr): Add prototype. * iresolve.cc (gfc_resolve_matmul): If using UNSIGNED, use the signed integer version. * gfortran.texi: Document MATMUL and DOT_PRODUCT for unsigned. * simplify.cc (compute_dot_product): Handle unsigneds. libgfortran/ChangeLog: * m4/iparm.m4: Add UNSIGED if type is m. * m4/matmul.m4: If type is GFC_INTEGER, use GFC_UINTEGER instead. Whitespace fixes. * m4/matmul_internal.m4: Whitespace fixes. * generated/matmul_c10.c: Regenerated. * generated/matmul_c16.c: Regenerated. * generated/matmul_c17.c: Regenerated. * generated/matmul_c4.c: Regenerated. * generated/matmul_c8.c: Regeneraated. * generated/matmul_i1.c: Regenerated. * generated/matmul_i16.c: Regenerated. * generated/matmul_i2.c: Regenerated. * generated/matmul_i4.c: Regenerated. * generated/matmul_i8.c: Regenerated. * generated/matmul_r10.c: Regenerated. * generated/matmul_r16.c: Regenerated. * generated/matmul_r17.c: Regenerated. * generated/matmul_r4.c: Regenerated. * generated/matmul_r8.c: Regenerated. * libgfortran.h: Add array types for unsiged. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_25.f90: New test. * gfortran.dg/unsigned_26.f90: New test.
Diffstat (limited to 'gcc/fortran/iresolve.cc')
-rw-r--r--gcc/fortran/iresolve.cc11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc
index 4f1fa97..32b3143 100644
--- a/gcc/fortran/iresolve.cc
+++ b/gcc/fortran/iresolve.cc
@@ -1600,6 +1600,7 @@ void
gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
{
gfc_expr temp;
+ bt type;
if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
{
@@ -1648,8 +1649,16 @@ gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
}
}
+ /* We use the same library version of matmul for INTEGER and UNSIGNED,
+ which we call as the INTEGER version. */
+
+ if (f->ts.type == BT_UNSIGNED)
+ type = BT_INTEGER;
+ else
+ type = f->ts.type;
+
f->value.function.name
- = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
+ = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (type),
gfc_type_abi_kind (&f->ts));
}