aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2008-03-19 15:42:55 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2008-03-19 15:42:55 +0000
commit8e1d7686de136571f68185066dec9bcb28019a8d (patch)
tree370b9d6b0738999469c560cab3acf85bde3ceb2d /gcc
parentcd7e0bd4b185112f64b7b78264b0bfa6eb27d26b (diff)
downloadgcc-8e1d7686de136571f68185066dec9bcb28019a8d.zip
gcc-8e1d7686de136571f68185066dec9bcb28019a8d.tar.gz
gcc-8e1d7686de136571f68185066dec9bcb28019a8d.tar.bz2
re PR libfortran/32972 (performance of pack/unpack)
2008-03-19 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/32972 * Makefile.am (in_pack_c): Add in_pack_i1.c, in_pack_i2.c, in_pack_r4.c, in_pack_r8.c, in_pack_r10.c and in_pack_r16.c. (in_unpack_c): Add in_unpack_i1.c, in_unpack_i2.c, in_unpack_r4.c, in_unpack_r8.c, in_unpack_r10.c and in_unpack_r16.c. * Makefile.in: Regenerate. * libgfortran.h: Add prototypes for internal_pack_1, internal_pack_2, internal_pack_16, internal_pack_r4, internal_pack_r8, internal_pack_r10, internal_pack_r16, internal_pack_c10 and internal_pack_c16. Add prototypes for internal_unpack_1, internal_unpack_2, internal_unpack_16, internal_unpack_r4, internal_unpack_r8, internal_unpack_r10, internal_unpack_r16, internal_unpack_c10 and internal_unpack_c16. * runtime/in_pack_generic.c (internal_pack): Use sizeof instead of hardwired sizes. Add calls to internal_pack_1, internal_pack_2, internal_pack_16, internal_pack_r4, internal_pack_r8, internal_pack_r10, internal_pack_r16, internal_pack_c10 and internal_pack_c16. * runtime/in_unpack_generic.c (internal_unpack): Use sizeof instead of hardwired sizes. Add calls to internal_unpack_1, internal_unpack_2, internal_unpack_16, internal_unpack_r4, internal_unpack_r8, internal_unpack_r10, internal_unpack_r16, internal_unpack_c10 and internal_unpack_c16. * generated/in_pack_r4.c: New file. * generated/in_pack_i2.c: New file. * generated/in_unpack_i1.c: New file. * generated/in_pack_r10.c: New file. * generated/in_unpack_r4.c: New file. * generated/in_unpack_i2.c: New file. * generated/in_unpack_r16.c: New file. * generated/in_pack_r8.c: New file. * generated/in_unpack_r10.c: New file. * generated/in_unpack_r8.c: New file. * generated/in_pack_r16.c: New file. * generated/in_pack_i1.c: New file. 2008-03-19 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/32972 * gfortran.dg/internal_pack_1.f90: New test case. * gfortran.dg/internal_pack_2.f90: New test case. * gfortran.dg/internal_pack_3.f90: New test case. From-SVN: r133344
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_1.f9085
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_2.f9025
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_3.f9021
4 files changed, 138 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7365b81..0781ed5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2008-03-19 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/32972
+ * gfortran.dg/internal_pack_1.f90: New test case.
+ * gfortran.dg/internal_pack_2.f90: New test case.
+ * gfortran.dg/internal_pack_3.f90: New test case.
+
2008-03-19 Jan Hubicka <jh@suse.cz>
* gcc.dg/20050811-2.c: Update dumping flags.
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_1.f90 b/gcc/testsuite/gfortran.dg/internal_pack_1.f90
new file mode 100644
index 0000000..87565be
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/internal_pack_1.f90
@@ -0,0 +1,85 @@
+! { dg-do run }
+! Test that the internal pack and unpack routines work OK
+! for different data types
+
+program main
+ integer(kind=1), dimension(3) :: i1
+ integer(kind=2), dimension(3) :: i2
+ integer(kind=4), dimension(3) :: i4
+ integer(kind=8), dimension(3) :: i8
+ real(kind=4), dimension(3) :: r4
+ real(kind=8), dimension(3) :: r8
+
+ i1 = (/ -1, 1, -3 /)
+ call sub_i1(i1(1:3:2))
+ if (any(i1 /= (/ 3, 1, 2 /))) call abort
+
+ i2 = (/ -1, 1, -3 /)
+ call sub_i2(i2(1:3:2))
+ if (any(i2 /= (/ 3, 1, 2 /))) call abort
+
+ i4 = (/ -1, 1, -3 /)
+ call sub_i4(i4(1:3:2))
+ if (any(i4 /= (/ 3, 1, 2 /))) call abort
+
+ i8 = (/ -1, 1, -3 /)
+ call sub_i8(i8(1:3:2))
+ if (any(i8 /= (/ 3, 1, 2 /))) call abort
+
+ r4 = (/ -1.0, 1.0, -3.0 /)
+ call sub_r4(r4(1:3:2))
+ if (any(r4 /= (/ 3.0, 1.0, 2.0/))) call abort
+
+ r8 = (/ -1.0_8, 1.0_8, -3.0_8 /)
+ call sub_r8(r8(1:3:2))
+ if (any(r8 /= (/ 3.0_8, 1.0_8, 2.0_8/))) call abort
+
+end program main
+
+subroutine sub_i1(i)
+ integer(kind=1), dimension(2) :: i
+ if (i(1) /= -1) call abort
+ if (i(2) /= -3) call abort
+ i(1) = 3
+ i(2) = 2
+end subroutine sub_i1
+
+subroutine sub_i2(i)
+ integer(kind=2), dimension(2) :: i
+ if (i(1) /= -1) call abort
+ if (i(2) /= -3) call abort
+ i(1) = 3
+ i(2) = 2
+end subroutine sub_i2
+
+subroutine sub_i4(i)
+ integer(kind=4), dimension(2) :: i
+ if (i(1) /= -1) call abort
+ if (i(2) /= -3) call abort
+ i(1) = 3
+ i(2) = 2
+end subroutine sub_i4
+
+subroutine sub_i8(i)
+ integer(kind=8), dimension(2) :: i
+ if (i(1) /= -1) call abort
+ if (i(2) /= -3) call abort
+ i(1) = 3
+ i(2) = 2
+end subroutine sub_i8
+
+subroutine sub_r4(r)
+ real(kind=4), dimension(2) :: r
+ if (r(1) /= -1.) call abort
+ if (r(2) /= -3.) call abort
+ r(1) = 3.
+ r(2) = 2.
+end subroutine sub_r4
+
+subroutine sub_r8(r)
+ real(kind=8), dimension(2) :: r
+ if (r(1) /= -1._8) call abort
+ if (r(2) /= -3._8) call abort
+ r(1) = 3._8
+ r(2) = 2._8
+end subroutine sub_r8
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_2.f90 b/gcc/testsuite/gfortran.dg/internal_pack_2.f90
new file mode 100644
index 0000000..1966e7d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/internal_pack_2.f90
@@ -0,0 +1,25 @@
+! { dg-do run }
+! { dg-require-effective-target fortran_large_real }
+! Test that the internal pack and unpack routines work OK
+! for our large real type.
+
+program main
+ implicit none
+ integer,parameter :: k = selected_real_kind (precision (0.0_8) + 1)
+ real(kind=k), dimension(3) :: rk
+
+ rk = (/ -1.0_k, 1.0_k, -3.0_k /)
+ call sub_rk(rk(1:3:2))
+ if (any(rk /= (/ 3.0_k, 1.0_k, 2.0_k/))) call abort
+
+end program main
+
+subroutine sub_rk(r)
+ implicit none
+ integer,parameter :: k = selected_real_kind (precision (0.0_8) + 1)
+ real(kind=k), dimension(2) :: r
+ if (r(1) /= -1._k) call abort
+ if (r(2) /= -3._k) call abort
+ r(1) = 3._k
+ r(2) = 2._k
+end subroutine sub_rk
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_3.f90 b/gcc/testsuite/gfortran.dg/internal_pack_3.f90
new file mode 100644
index 0000000..8312e1d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/internal_pack_3.f90
@@ -0,0 +1,21 @@
+! { dg-do run }
+! { dg-require-effective-target fortran_large_int }
+! Test that the internal pack and unpack routines work OK
+! for our large integer type.
+
+program main
+ integer,parameter :: k = selected_int_kind (range (0_8) + 1)
+ integer(kind=k), dimension(3) :: ik
+
+ ik = (/ -1, 1, -3 /)
+ call sub_ik(ik(1:3:2))
+ if (any(ik /= (/ 3, 1, 2 /))) call abort
+end program main
+
+subroutine sub_ik(i)
+ integer(kind=k), dimension(2) :: i
+ if (i(1) /= -1) call abort
+ if (i(2) /= -3) call abort
+ i(1) = 3
+ i(2) = 2
+end subroutine sub_ik