Index: Makefile.am =================================================================== --- Makefile.am (revision 133308) +++ Makefile.am (working copy) @@ -380,18 +380,30 @@ $(srcdir)/generated/cshift1_8.c \ $(srcdir)/generated/cshift1_16.c in_pack_c = \ +$(srcdir)/generated/in_pack_i1.c \ +$(srcdir)/generated/in_pack_i2.c \ $(srcdir)/generated/in_pack_i4.c \ $(srcdir)/generated/in_pack_i8.c \ $(srcdir)/generated/in_pack_i16.c \ +$(srcdir)/generated/in_pack_r4.c \ +$(srcdir)/generated/in_pack_r8.c \ +$(srcdir)/generated/in_pack_r10.c \ +$(srcdir)/generated/in_pack_r16.c \ $(srcdir)/generated/in_pack_c4.c \ $(srcdir)/generated/in_pack_c8.c \ $(srcdir)/generated/in_pack_c10.c \ $(srcdir)/generated/in_pack_c16.c in_unpack_c = \ +$(srcdir)/generated/in_unpack_i1.c \ +$(srcdir)/generated/in_unpack_i2.c \ $(srcdir)/generated/in_unpack_i4.c \ $(srcdir)/generated/in_unpack_i8.c \ $(srcdir)/generated/in_unpack_i16.c \ +$(srcdir)/generated/in_unpack_r4.c \ +$(srcdir)/generated/in_unpack_r8.c \ +$(srcdir)/generated/in_unpack_r10.c \ +$(srcdir)/generated/in_unpack_r16.c \ $(srcdir)/generated/in_unpack_c4.c \ $(srcdir)/generated/in_unpack_c8.c \ $(srcdir)/generated/in_unpack_c10.c \ Index: libgfortran.h =================================================================== --- libgfortran.h (revision 133308) +++ libgfortran.h (working copy) @@ -609,10 +609,15 @@ extern void reshape_packed (char *, inde const char *, index_type); internal_proto(reshape_packed); -/* Repacking functions. */ +/* Repacking functions. These are called internally by internal_pack + and internal_unpack. */ + +GFC_INTEGER_1 *internal_pack_1 (gfc_array_i1 *); +internal_proto(internal_pack_1); + +GFC_INTEGER_2 *internal_pack_2 (gfc_array_i2 *); +internal_proto(internal_pack_2); -/* ??? These aren't currently used by the compiler, though we - certainly could do so. */ GFC_INTEGER_4 *internal_pack_4 (gfc_array_i4 *); internal_proto(internal_pack_4); @@ -624,6 +629,22 @@ GFC_INTEGER_16 *internal_pack_16 (gfc_ar internal_proto(internal_pack_16); #endif +GFC_REAL_4 *internal_pack_r4 (gfc_array_r4 *); +internal_proto(internal_pack_r4); + +GFC_REAL_8 *internal_pack_r8 (gfc_array_r8 *); +internal_proto(internal_pack_r8); + +#if defined HAVE_GFC_REAL_10 +GFC_REAL_10 *internal_pack_r10 (gfc_array_r10 *); +internal_proto(internal_pack_r10); +#endif + +#if defined HAVE_GFC_REAL_16 +GFC_REAL_16 *internal_pack_r16 (gfc_array_r16 *); +internal_proto(internal_pack_r16); +#endif + GFC_COMPLEX_4 *internal_pack_c4 (gfc_array_c4 *); internal_proto(internal_pack_c4); @@ -635,6 +656,17 @@ GFC_COMPLEX_10 *internal_pack_c10 (gfc_a internal_proto(internal_pack_c10); #endif +#if defined HAVE_GFC_COMPLEX_16 +GFC_COMPLEX_16 *internal_pack_c16 (gfc_array_c16 *); +internal_proto(internal_pack_c16); +#endif + +extern void internal_unpack_1 (gfc_array_i1 *, const GFC_INTEGER_1 *); +internal_proto(internal_unpack_1); + +extern void internal_unpack_2 (gfc_array_i2 *, const GFC_INTEGER_2 *); +internal_proto(internal_unpack_2); + extern void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *); internal_proto(internal_unpack_4); @@ -646,6 +678,22 @@ extern void internal_unpack_16 (gfc_arra internal_proto(internal_unpack_16); #endif +extern void internal_unpack_r4 (gfc_array_r4 *, const GFC_REAL_4 *); +internal_proto(internal_unpack_r4); + +extern void internal_unpack_r8 (gfc_array_r8 *, const GFC_REAL_8 *); +internal_proto(internal_unpack_r8); + +#if defined HAVE_GFC_REAL_10 +extern void internal_unpack_r10 (gfc_array_r10 *, const GFC_REAL_10 *); +internal_proto(internal_unpack_r10); +#endif + +#if defined HAVE_GFC_REAL_16 +extern void internal_unpack_r16 (gfc_array_r16 *, const GFC_REAL_16 *); +internal_proto(internal_unpack_r16); +#endif + extern void internal_unpack_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *); internal_proto(internal_unpack_c4); Index: runtime/in_pack_generic.c =================================================================== --- runtime/in_pack_generic.c (revision 133308) +++ runtime/in_pack_generic.c (working copy) @@ -65,25 +65,65 @@ internal_pack (gfc_array_char * source) { case GFC_DTYPE_INTEGER: case GFC_DTYPE_LOGICAL: - case GFC_DTYPE_REAL: switch (size) { - case 4: - return internal_pack_4 ((gfc_array_i4 *)source); + case sizeof (GFC_INTEGER_1): + return internal_pack_1 ((gfc_array_i1 *) source); + + case sizeof (GFC_INTEGER_2): + return internal_pack_2 ((gfc_array_i2 *) source); + + case sizeof (GFC_INTEGER_4): + return internal_pack_4 ((gfc_array_i4 *) source); - case 8: - return internal_pack_8 ((gfc_array_i8 *)source); + case sizeof (GFC_INTEGER_8): + return internal_pack_8 ((gfc_array_i8 *) source); + +#if defined(HAVE_GFC_INTEGER_16) + case sizeof (GFC_INTEGER_16): + return internal_pack_16 (gfc_array_i16 *) source); +#endif } break; + case GFC_DTYPE_REAL: + switch (size) + { + case sizeof (GFC_REAL_4): + return internal_pack_r4 ((gfc_array_r4 *) source); + + case sizeof (GFC_REAL_8): + return internal_pack_r8 ((gfc_array_r8 *) source); + +#if defined (HAVE_GFC_REAL_10) + case sizeof (GFC_REAL_10): + return internal_pack_r10 ((gfc_array_r10 *) source); +#endif + +#if defined (HAVE_GFC_REAL_16) + case sizeof (GFC_REAL_16): + return internal_pack_r16 ((gfc_array_r16 *) source); +#endif + } case GFC_DTYPE_COMPLEX: switch (size) { - case 8: - return internal_pack_c4 ((gfc_array_c4 *)source); + case sizeof (GFC_COMPLEX_4): + return internal_pack_c4 ((gfc_array_c4 *) source); - case 16: - return internal_pack_c8 ((gfc_array_c8 *)source); + case sizeof (GFC_COMPLEX_8): + return internal_pack_c8 ((gfc_array_c8 *) source); + +#if defined (HAVE_GFC_COMPLEX_10) + case sizeof (GFC_COMPLEX_10): + return internal_pack_c10 ((gfc_array_c10 *) source); +#endif + +#if defined (HAVE_GFC_COMPLEX_16) + case sizeof (GFC_COMPLEX_16): + return internal_pack_c16 ((gfc_array_c16 *) source); +#endif + } break; Index: runtime/in_unpack_generic.c =================================================================== --- runtime/in_unpack_generic.c (revision 133308) +++ runtime/in_unpack_generic.c (working copy) @@ -62,29 +62,80 @@ internal_unpack (gfc_array_char * d, con { case GFC_DTYPE_INTEGER: case GFC_DTYPE_LOGICAL: - case GFC_DTYPE_REAL: switch (size) { - case 4: - internal_unpack_4 ((gfc_array_i4 *)d, (const GFC_INTEGER_4 *)s); + case sizeof (GFC_INTEGER_1): + internal_unpack_1 ((gfc_array_i1 *) d, (const GFC_INTEGER_1 *) s); + return; + + case sizeof (GFC_INTEGER_2): + internal_unpack_2 ((gfc_array_i2 *) d, (const GFC_INTEGER_2 *) s); + return; + + case sizeof (GFC_INTEGER_4): + internal_unpack_4 ((gfc_array_i4 *) d, (const GFC_INTEGER_4 *) s); + return; + + case sizeof (GFC_INTEGER_8): + internal_unpack_8 ((gfc_array_i8 *) d, (const GFC_INTEGER_8 *) s); return; - case 8: - internal_unpack_8 ((gfc_array_i8 *)d, (const GFC_INTEGER_8 *)s); +#if defined (HAVE_GFC_INTEGER_16) + case sizeof (GFC_INTEGER_16): + internal_unpack_16 ((gfc_array_i16 *) d, (const GFC_INTEGER_16 *) s); return; +#endif } break; + case GFC_DTYPE_REAL: + switch (size) + { + case sizeof (GFC_REAL_4): + internal_unpack_r4 ((gfc_array_r4 *) d, (const GFC_REAL_4 *) s); + return; + + case sizeof (GFC_REAL_8): + internal_unpack_r8 ((gfc_array_r8 *) d, (const GFC_REAL_8 *) s); + return; + +#if defined(HAVE_GFC_REAL_10) + case sizeof (GFC_REAL_10): + internal_unpack_r10 ((gfc_array_r10 *) d, (const GFC_REAL_10 *) s); + return; +#endif + +#if defined(HAVE_GFC_REAL_16) + case sizeof (GFC_REAL_16): + internal_unpack_r16 ((gfc_array_r16 *) d, (const GFC_REAL_16 *) s); + return; +#endif + + } + case GFC_DTYPE_COMPLEX: switch (size) { - case 8: + case sizeof (GFC_COMPLEX_4): internal_unpack_c4 ((gfc_array_c4 *)d, (const GFC_COMPLEX_4 *)s); return; - case 16: + case sizeof (GFC_COMPLEX_8): internal_unpack_c8 ((gfc_array_c8 *)d, (const GFC_COMPLEX_8 *)s); return; + +#if defined(HAVE_GFC_COMPLEX_10) + case sizeof (GFC_COMPLEX_10): + internal_unpack_c10 ((gfc_array_c10 *) d, (const GFC_COMPLEX_10 *) s); + return; +#endif + +#if defined(HAVE_GFC_COMPLEX_16) + case sizeof (GFC_COMPLEX_16): + internal_unpack_c16 ((gfc_array_c16 *) d, (const GFC_COMPLEX_16 *) s); + return; +#endif + } default: break;