aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/runtime/in_pack_generic.c
diff options
context:
space:
mode:
authorThomas Koenig <Thomas.Koenig@online.de>2005-06-11 19:39:13 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2005-06-11 19:39:13 +0000
commit3932808120dd6d485e823aea73a3fd935d0d3a64 (patch)
treeaad494096555f7a4cc32786401cfade71ce1dc21 /libgfortran/runtime/in_pack_generic.c
parent1fa5c70974c297a42a550aa776c6a47f645459e5 (diff)
downloadgcc-3932808120dd6d485e823aea73a3fd935d0d3a64.zip
gcc-3932808120dd6d485e823aea73a3fd935d0d3a64.tar.gz
gcc-3932808120dd6d485e823aea73a3fd935d0d3a64.tar.bz2
[multiple changes]
2005-06-11 Thomas Koenig <Thomas.Koenig@onlinde.de> PR libfortran/21333 * Makefile.am: Add in_pack_c4.c, in_pack_c8.c, in_unpack_c4.c and in_unpack_c8.c. * Makefile.in: Regenerate. * libgfortran.h: Declare internal_pack_c4, internal_pack_c8, internal_unpack_c4 and internal_unpack_c8. * m4/in_pack.m4: Use rtype_ccode insteald of rtype_kind in function name. Use sizeof (rtype_name) as size for memory allocation. * m4/in_unpack.m4: Use rtype_ccode insteald of rtype_kind in function name. Use sizeof (rtype_name) for calculation of sizes for memcpy. * runtime/in_pack_generic.c: For real, integer and logical call internal_pack_4 if size==4 and internal_pack_8 if size==8. For complex, call internal_pack_c4 if size==8 and internal_pack_c8 if size==16. * runtime/in_unpack_generic.c: For real, integer and logical call internal_unpack_4 if size==4 and internal_unpack_8 if size==8. For complex, call internal_unpack_c4 if size==8 and internal_unpack_c8 if size==16. * generated/in_pack_i4.c: Regenerated. * generated/in_pack_i8.c: Regenerated. * generated/in_unpack_i4.c: Regenerated. * generated/in_unpack_i8.c: Regenerated. * generated/in_pack_c4.c: New file. * generated/in_pack_c8.c: New file. * generated/in_unpack_c4.c: New file. * generated/in_unpack_c8.c: New file. 2005-05-11 Thomas Koenig <Thomas.Koenig@online.de> * gfortran.fortran-torture/execute/in-pack.f90: New test. From-SVN: r100842
Diffstat (limited to 'libgfortran/runtime/in_pack_generic.c')
-rw-r--r--libgfortran/runtime/in_pack_generic.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/libgfortran/runtime/in_pack_generic.c b/libgfortran/runtime/in_pack_generic.c
index 99fdb92..23810cf 100644
--- a/libgfortran/runtime/in_pack_generic.c
+++ b/libgfortran/runtime/in_pack_generic.c
@@ -52,6 +52,7 @@ internal_pack (gfc_array_char * source)
int n;
int packed;
index_type size;
+ int type;
if (source->dim[0].stride == 0)
{
@@ -59,14 +60,36 @@ internal_pack (gfc_array_char * source)
return source->data;
}
+ type = GFC_DESCRIPTOR_TYPE (source);
size = GFC_DESCRIPTOR_SIZE (source);
- switch (size)
+ switch (type)
{
- case 4:
- return internal_pack_4 ((gfc_array_i4 *)source);
-
- case 8:
- return internal_pack_8 ((gfc_array_i8 *)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 8:
+ return internal_pack_8 ((gfc_array_i8 *)source);
+ }
+ break;
+
+ case GFC_DTYPE_COMPLEX:
+ switch (size)
+ {
+ case 8:
+ return internal_pack_c4 ((gfc_array_c4 *)source);
+
+ case 16:
+ return internal_pack_c8 ((gfc_array_c8 *)source);
+ }
+ break;
+
+ default:
+ break;
}
dim = GFC_DESCRIPTOR_RANK (source);