The attached patch fixes this regression and implements KIND=1 and KIND=2 compatible calls. The smallest KIND found of the arguments given by the caller is used to determine the results returned. New versions of the intrinsics with the KIND argument are provided. The previous versions are retained and these call the new with KIND= the respective call, 4 or 8.

The test case given here is provided for others to see the results and is not yet dejagnu=ized. It provides all possible combinations of kinds and types to test.

I did performance test this with various combinations of the timeit.f08 program to show the overhead is very very low. (also attached)

Regression tested on x86-64 and PowerPC. I am not set up to test on Cygwin/Windows platforms. If someone can do this, please do.

OK for trunk?


Regards,

Jerry

2015-03-07  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR fortran/64432
        * trans-decl (gfc_build_intrinsic_function_decls): Add a fourth
        argument to system_clock declarations.
        *trans-intrinisic.c (conv_intrinsic_system_clock): Build calls
        to include the smallest kind used as the fourth argument to be
        used by the runtime system_clock functions.

2015-03-07 Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR libgfortran/64432
        * gfortran.map: Add new section for new versions of
        system_clock intrinsics.
        * intrinsics/system_clock.c (system_clock4K, system_clock8K):
        New/revised functions to include a KIND argument to handle
        KIND=1 and KIND=2 cases. (system_clock4, system_clock8): Kept
        for backward compatibility. These call the new versions above.

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c	(revision 221248)
+++ gcc/fortran/trans-decl.c	(working copy)
@@ -3122,15 +3122,16 @@ gfc_build_intrinsic_function_decls (void)
   DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
   TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
 
+
   gfor_fndecl_system_clock4 = gfc_build_library_function_decl (
-	get_identifier (PREFIX("system_clock_4")),
-	void_type_node, 3, gfc_pint4_type_node, gfc_pint4_type_node,
-	gfc_pint4_type_node);
+	get_identifier (PREFIX("system_clock_4K")),
+	void_type_node, 4, gfc_pint4_type_node, gfc_pint4_type_node,
+	gfc_pint4_type_node, gfc_pint4_type_node);
 
   gfor_fndecl_system_clock8 = gfc_build_library_function_decl (
-	get_identifier (PREFIX("system_clock_8")),
+	get_identifier (PREFIX("system_clock_8K")),
 	void_type_node, 3, gfc_pint8_type_node, gfc_pint8_type_node,
-	gfc_pint8_type_node);
+	gfc_pint8_type_node, gfc_pint4_type_node);
 
   /* Power functions.  */
   {
Index: gcc/fortran/trans-intrinsic.c
===================================================================
--- gcc/fortran/trans-intrinsic.c	(revision 221248)
+++ gcc/fortran/trans-intrinsic.c	(working copy)
@@ -2670,23 +2670,15 @@ conv_intrinsic_system_clock (gfc_code *code)
 {
   stmtblock_t block;
   gfc_se count_se, count_rate_se, count_max_se;
-  tree arg1 = NULL_TREE, arg2 = NULL_TREE, arg3 = NULL_TREE;
-  tree type, tmp;
-  int kind;
+  tree arg1 = NULL_TREE, arg2 = NULL_TREE, arg3 = NULL_TREE,
+	      arg4 = NULL_TREE;
+  tree tmp;
+  int least, most;
 
   gfc_expr *count = code->ext.actual->expr;
   gfc_expr *count_rate = code->ext.actual->next->expr;
   gfc_expr *count_max = code->ext.actual->next->next->expr;
 
-  /* The INTEGER(8) version has higher precision, it is used if both COUNT
-     and COUNT_MAX can hold 64-bit values, or are absent.  */
-  if ((!count || count->ts.kind >= 8)
-      && (!count_max || count_max->ts.kind >= 8))
-    kind = 8;
-  else
-    kind = gfc_default_integer_kind;
-  type = gfc_get_int_type (kind);
-
   /* Evaluate our arguments.  */
   if (count)
     {
@@ -2706,37 +2698,84 @@ conv_intrinsic_system_clock (gfc_code *code)
       gfc_conv_expr (&count_max_se, count_max);
     }
 
+  /* Find the smallest kind found of the arguments. We will pass this to
+     the runtime library.  */
+  least = 16;
+  least = (count && count->ts.kind < least) ? count->ts.kind : least;
+  least = (count_rate && count_rate->ts.kind < least) ? count_rate->ts.kind
+						      : least;
+  least = (count_max && count_max->ts.kind < least) ? count_max->ts.kind
+						    : least;
+  arg4 = build_int_cst (gfc_get_int_type (4), least);
+
+					       
+  /* Find the largest kind.  This is used to decide which runtime call
+     to build.  */
+  most = 1;
+  most = (count && count->ts.kind > most) ? count->ts.kind : most;
+  most = (count_rate && count_rate->ts.kind > most) ? count_rate->ts.kind
+						    : most;
+  most = (count_max && count_max->ts.kind > most) ? count_max->ts.kind
+						  : most;
+
   /* Prepare temporary variables if we need them.  */
-  if (count && count->ts.kind != kind)
-    arg1 = gfc_create_var (type, "count");
-  else if (count)
-    arg1 = count_se.expr;
 
-  if (count_rate && (count_rate->ts.kind != kind
-		     || count_rate->ts.type != BT_INTEGER))
-    arg2 = gfc_create_var (type, "count_rate");
-  else if (count_rate)
-    arg2 = count_rate_se.expr;
+  if (count)
+    {
+      if (most >= 8)
+	arg1 = gfc_create_var (gfc_get_int_type (8), "count");
+      else
+	arg1 = gfc_create_var (gfc_get_int_type (4), "count");
+    }
 
-  if (count_max && count_max->ts.kind != kind)
-    arg3 = gfc_create_var (type, "count_max");
-  else if (count_max)
-    arg3 = count_max_se.expr;
+  if (count_rate)
+    {
+      if (most >= 8)
+	arg2 = gfc_create_var (gfc_get_int_type (8), "count_rate");
+      else
+	arg2 = gfc_create_var (gfc_get_int_type (4), "count_rate");
+    }
 
+  if (count_max)
+    {
+      if (most >= 8)
+	arg3 = gfc_create_var (gfc_get_int_type (8), "count_max");
+      else
+	arg3 = gfc_create_var (gfc_get_int_type (4), "count_max");
+    }
+
   /* Make the function call.  */
   gfc_init_block (&block);
-  tmp = build_call_expr_loc (input_location,
-			     kind == 4 ? gfor_fndecl_system_clock4
-				       : gfor_fndecl_system_clock8,
-                             3,
-			     arg1 ? gfc_build_addr_expr (NULL_TREE, arg1)
-				  : null_pointer_node,
-			     arg2 ? gfc_build_addr_expr (NULL_TREE, arg2)
-				  : null_pointer_node,
-			     arg3 ? gfc_build_addr_expr (NULL_TREE, arg3)
-				  : null_pointer_node);
-  gfc_add_expr_to_block (&block, tmp);
 
+  if (most <= 4)
+    {
+      tmp = build_call_expr_loc (input_location,
+	      gfor_fndecl_system_clock4, 4,
+	      arg1 ? gfc_build_addr_expr (NULL_TREE, arg1)
+		     : null_pointer_node,
+	      arg2 ? gfc_build_addr_expr (NULL_TREE, arg2)
+		     : null_pointer_node,
+	      arg3 ? gfc_build_addr_expr (NULL_TREE, arg3)
+		     : null_pointer_node,
+	      arg4 ? gfc_build_addr_expr (NULL_TREE, arg4)
+		     : null_pointer_node);
+      gfc_add_expr_to_block (&block, tmp);
+    }
+  /* Handle kind>=8, 10, o4 16 arguments */
+  if (most >= 8)
+    {
+      tmp = build_call_expr_loc (input_location,
+	      gfor_fndecl_system_clock8, 4,
+	      arg1 ? gfc_build_addr_expr (NULL_TREE, arg1)
+		     : null_pointer_node,
+	      arg2 ? gfc_build_addr_expr (NULL_TREE, arg2)
+		     : null_pointer_node,
+	      arg3 ? gfc_build_addr_expr (NULL_TREE, arg3)
+		     : null_pointer_node,
+	      arg4 ? gfc_build_addr_expr (NULL_TREE, arg4)
+		     : null_pointer_node);
+      gfc_add_expr_to_block (&block, tmp);
+    }
   /* And store values back if needed.  */
   if (arg1 && arg1 != count_se.expr)
     gfc_add_modify (&block, count_se.expr,
Index: libgfortran/gfortran.map
===================================================================
--- libgfortran/gfortran.map	(revision 221248)
+++ libgfortran/gfortran.map	(working copy)
@@ -1274,8 +1274,14 @@ GFORTRAN_1.6 {
     __ieee_exceptions_MOD_ieee_support_flag_noarg;
     __ieee_exceptions_MOD_ieee_support_halting;
     __ieee_exceptions_MOD_ieee_usual;
-} GFORTRAN_1.5; 
+} GFORTRAN_1.5;
 
+GFORTRAN_1.7 {
+  global:
+    _gfortran_system_clock_4K;
+    _gfortran_system_clock_8K;
+} GFORTRAN_1.6; 
+
 F2C_1.0 {
   global:
     _gfortran_f2c_specific__abs_c4;
Index: libgfortran/intrinsics/system_clock.c
===================================================================
--- libgfortran/intrinsics/system_clock.c	(revision 221248)
+++ libgfortran/intrinsics/system_clock.c	(working copy)
@@ -109,37 +109,77 @@ gf_gettime_mono (time_t * secs, long * fracsecs, l
 
 #endif /* !__MINGW32 && !__CYGWIN__  */
 
-extern void system_clock_4 (GFC_INTEGER_4 *, GFC_INTEGER_4 *, GFC_INTEGER_4 *);
+extern void
+system_clock_4 (GFC_INTEGER_4 *count, GFC_INTEGER_4 *count_rate,
+		GFC_INTEGER_4 *count_max);
 export_proto(system_clock_4);
 
-extern void system_clock_8 (GFC_INTEGER_8 *, GFC_INTEGER_8 *, GFC_INTEGER_8 *);
+extern void
+system_clock_8 (GFC_INTEGER_8 *count, GFC_INTEGER_8 *count_rate,
+		GFC_INTEGER_8 *count_max);
 export_proto(system_clock_8);
 
+extern void
+system_clock_4K (GFC_INTEGER_4 *, GFC_INTEGER_4 *,
+		 GFC_INTEGER_4 *, GFC_INTEGER_4 * );
+export_proto(system_clock_4K);
 
-/* prefix(system_clock_4) is the INTEGER(4) version of the SYSTEM_CLOCK
+extern void
+system_clock_8K (GFC_INTEGER_8 *, GFC_INTEGER_8 *,
+		 GFC_INTEGER_8 *, GFC_INTEGER_4 *);
+export_proto(system_clock_8K);
+
+
+
+/* prefix(system_clock_4K) is the INTEGER(4) version of the SYSTEM_CLOCK
    intrinsic subroutine.  It returns the number of clock ticks for the current
    system time, the number of ticks per second, and the maximum possible value
    for COUNT.  */
 
 void
-system_clock_4(GFC_INTEGER_4 *count, GFC_INTEGER_4 *count_rate,
-	       GFC_INTEGER_4 *count_max)
+system_clock_4K (GFC_INTEGER_4 *count, GFC_INTEGER_4 *count_rate,
+	       GFC_INTEGER_4 *count_max, GFC_INTEGER_4 *kind)
 {
-#if defined(__MINGW32__) || defined(__CYGWIN__) 
-  if (count)
+#if defined(__MINGW32__) || defined(__CYGWIN__)
+  /* Use GetTickCount here as the resolution and range is
+     sufficient for the INTEGER(kind=4) version, and
+     QueryPerformanceCounter has potential issues.  */
+  if (likely(*kind == 4))
     {
-      /* Use GetTickCount here as the resolution and range is
-	 sufficient for the INTEGER(kind=4) version, and
-	 QueryPerformanceCounter has potential issues.  */
-      uint32_t cnt = GetTickCount ();
-      if (cnt > GFC_INTEGER_4_HUGE)
-	cnt = cnt - GFC_INTEGER_4_HUGE - 1;
-      *count = cnt;
+      if (count)
+	{
+	  uint32_t cnt = GetTickCount ();
+	  cnt = cnt > GFC_INTEGER_4_HUGE ? cnt
+		      : cnt - GFC_INTEGER_4_HUGE - 1;
+	  *count = cnt;
+	}
+      if (count_rate)
+	*count_rate = 1000;
+      if (count_max)
+	*count_max = GFC_INTEGER_4_HUGE;
     }
-  if (count_rate)
-    *count_rate = 1000;
-  if (count_max)
-    *count_max = GFC_INTEGER_4_HUGE;
+  else
+    {
+      if (count)
+	{
+	  uint32_t cnt = GetTickCount ();
+	  if (*kind == 1)
+	    {
+	      cnt /= 1000;
+	      cnt = cnt > GFC_INTEGER_1_HUGE ? cnt
+			  : cnt - GFC_INTEGER_1_HUGE - 1;
+	    }
+	  else
+	    cnt = cnt > GFC_INTEGER_2_HUGE ? cnt
+			  : cnt - GFC_INTEGER_2_HUGE - 1;
+	  *count = cnt;
+	}
+      if (count_rate)
+	* count_rate = *kind == 1 ? 1 : 1000
+      if (count_max)
+	*count_max =  *kind == 1 ? GFC_INTEGER_1_HUGE;
+				 : GFC_INTEGER_2_HUGE;
+    }
 #else
   time_t secs;
   long fracsecs, tck;
@@ -146,18 +186,54 @@ void
 
   if (gf_gettime_mono (&secs, &fracsecs, &tck) == 0)
     {
-      long tck_out = tck > 1000 ? 1000 : tck;
-      long tck_r = tck / tck_out;
-      GFC_UINTEGER_4 ucnt = (GFC_UINTEGER_4) secs * tck_out;
-      ucnt += fracsecs / tck_r;
-      if (ucnt > GFC_INTEGER_4_HUGE)
-	ucnt = ucnt - GFC_INTEGER_4_HUGE - 1;
-      if (count)
-	*count = ucnt;
-      if (count_rate)
-	*count_rate = tck_out;
-      if (count_max)
-	*count_max = GFC_INTEGER_4_HUGE;
+      if (likely(*kind == 4))
+	{
+	  long tck_out = tck > 1000 ? 1000 : tck;
+	  long tck_r = tck / tck_out;
+	  GFC_UINTEGER_4 ucnt = (GFC_UINTEGER_4) secs * tck_out;
+	  ucnt += fracsecs / tck_r;
+	  if (ucnt > GFC_INTEGER_4_HUGE)
+	    ucnt = ucnt - GFC_INTEGER_4_HUGE - 1;
+	  if (count)
+	    *count = ucnt;
+	  if (count_rate)
+	    *count_rate = tck_out;
+	  if (count_max)
+	    *count_max = GFC_INTEGER_4_HUGE;
+	}
+      else
+	{
+	  long tck_out = tck > 1000 ? 1000 : tck;
+	  long tck_r = tck / tck_out;
+	  GFC_UINTEGER_2 ucnt = (GFC_UINTEGER_2) secs * tck_out;
+	  ucnt += fracsecs / tck_r;
+	  if (count)
+	    {
+	      if (*kind == 1)
+		{
+		  ucnt = tck_out < 1000 ? 0 : ucnt / 512;
+		  if (ucnt > GFC_INTEGER_1_HUGE)
+		    ucnt = ucnt - GFC_INTEGER_1_HUGE - 1;
+		}
+	      else
+		{
+		  if (ucnt > GFC_INTEGER_2_HUGE)
+		    ucnt = ucnt - GFC_INTEGER_2_HUGE - 1;
+		}
+	      *count = ucnt;
+	    }
+	  if (count_rate)
+	    {
+	      if (*kind == 1)
+		*count_rate = tck_out < 1000 ? 0 : 1;
+	      else
+		*count_rate = tck_out;
+	    }
+	  if (count_max)
+	    *count_max = (*kind == 1) ? GFC_INTEGER_1_HUGE
+				      : GFC_INTEGER_2_HUGE;
+	    
+	}
     }
   else
     {
@@ -175,8 +251,8 @@ void
 /* INTEGER(8) version of the above routine.  */
 
 void
-system_clock_8 (GFC_INTEGER_8 *count, GFC_INTEGER_8 *count_rate,
-		GFC_INTEGER_8 *count_max)
+system_clock_8K (GFC_INTEGER_8 *count, GFC_INTEGER_8 *count_rate,
+		 GFC_INTEGER_8 *count_max, GFC_INTEGER_4 *kind)
 {
 #if defined(__MINGW32__) || defined(__CYGWIN__) 
   LARGE_INTEGER cnt;
@@ -186,40 +262,134 @@ void
     fail = true;
   if (count_rate && !QueryPerformanceFrequency (&freq))
     fail = true;
-  if (fail)
+  if (likely(kind >= 8))
     {
+      if (fail)
+	{
+	  if (count)
+	    *count = - GFC_INTEGER_8_HUGE;
+	  if (count_rate)
+	    *count_rate = 0;
+	  if (count_max)
+	    *count_max = 0;
+	}
+      else
+	{
+	  if (count)
+	    *count = cnt.QuadPart;
+	  if (count_rate)
+	    *count_rate = freq.QuadPart;
+	  if (count_max)
+	    *count_max = GFC_INTEGER_8_HUGE;
+	}
+    }
+  else if (*kind == 4)
+    {
       if (count)
-	*count = - GFC_INTEGER_8_HUGE;
+	{
+	  /* Use GetTickCount here as the resolution and range is
+	     sufficient for the INTEGER(kind=4) version, and
+	     QueryPerformanceCounter has potential issues.  */
+	  uint32_t cnt = GetTickCount ();
+	  if (cnt > GFC_INTEGER_4_HUGE)
+	    cnt = cnt - GFC_INTEGER_4_HUGE - 1;
+	  *count = cnt;
+	}
       if (count_rate)
-	*count_rate = 0;
+	*count_rate = 1000;
       if (count_max)
-	*count_max = 0;
+	*count_max = GFC_INTEGER_4_HUGE;
     }
   else
     {
       if (count)
-	*count = cnt.QuadPart;
+	{
+	  /* Use GetTickCount here as the resolution and range is
+	     sufficient for the INTEGER(kind=4) version, and
+	     QueryPerformanceCounter has potential issues.  */
+	  uint32_t cnt = GetTickCount ();
+	  if (*kind == 1)
+	    {
+	      cnt /= 1000;
+	      cnt = cnt > GFC_INTEGER_1_HUGE ? cnt
+			  : cnt - GFC_INTEGER_1_HUGE - 1;
+	    }
+	  else
+	      cnt = cnt > GFC_INTEGER_2_HUGE ? cnt
+			  : cnt - GFC_INTEGER_2_HUGE - 1;
+	  *count = cnt;
+	}
       if (count_rate)
-	*count_rate = freq.QuadPart;
+	* count_rate = *kind == 1 ? 1 : 1000
       if (count_max)
-	*count_max = GFC_INTEGER_8_HUGE;
+	*count_max =  *kind == 1 ? GFC_INTEGER_1_HUGE;
+				 : GFC_INTEGER_2_HUGE;
     }
 #else
   time_t secs;
   long fracsecs, tck;
-
   if (gf_gettime_mono (&secs, &fracsecs, &tck) == 0)
     {
-      GFC_UINTEGER_8 ucnt = (GFC_UINTEGER_8) secs * tck;
-      ucnt += fracsecs;
-      if (ucnt > GFC_INTEGER_8_HUGE)
-	ucnt = ucnt - GFC_INTEGER_8_HUGE - 1;
-      if (count)
-	*count = ucnt;
-      if (count_rate)
-	*count_rate = tck;
-      if (count_max)
-	*count_max = GFC_INTEGER_8_HUGE;
+      if (likely(*kind >= 8))
+	{
+	  GFC_UINTEGER_8 ucnt = (GFC_UINTEGER_8) secs * tck;
+	  ucnt += fracsecs;
+	  if (ucnt > GFC_INTEGER_8_HUGE)
+	    ucnt = ucnt - GFC_INTEGER_8_HUGE - 1;
+	  if (count)
+	    *count = ucnt;
+	  if (count_rate)
+	    *count_rate = tck;
+	  if (count_max)
+	    *count_max = GFC_INTEGER_8_HUGE;
+	}
+      else if (*kind == 4)
+	{
+	  long tck_out = tck > 1000 ? 1000 : tck;
+	  long tck_r = tck / tck_out;
+	  GFC_UINTEGER_4 ucnt = (GFC_UINTEGER_4) secs * tck_out;
+	  ucnt += fracsecs / tck_r;
+	  if (ucnt > GFC_INTEGER_4_HUGE)
+	    ucnt = ucnt - GFC_INTEGER_4_HUGE - 1;
+	  if (count)
+	    *count = ucnt;
+	  if (count_rate)
+	    *count_rate = tck_out;
+	  if (count_max)
+	    *count_max = GFC_INTEGER_4_HUGE;
+	}
+      else
+	{
+	  long tck_out = tck > 1000 ? 1000 : tck;
+	  long tck_r = tck / tck_out;
+	  GFC_UINTEGER_2 ucnt = (GFC_UINTEGER_2) secs * tck_out;
+	  ucnt += fracsecs / tck_r;
+	  if (count)
+	    {
+	      if (*kind == 1)
+		{
+		  ucnt = tck_out < 1000 ? 0 : ucnt / 512;
+		  if (ucnt > GFC_INTEGER_1_HUGE)
+		    ucnt = ucnt - GFC_INTEGER_1_HUGE - 1;
+		}
+	      else
+		{
+		  if (ucnt > GFC_INTEGER_2_HUGE)
+		    ucnt = ucnt - GFC_INTEGER_2_HUGE - 1;
+		}
+	      *count = ucnt;
+	    }
+	  if (count_rate)
+	    {
+	      if (*kind == 1)
+		*count_rate = tck_out < 1000 ? 0 : 1;
+	      else
+		*count_rate = tck_out;
+	    }
+	  if (count_max)
+	    *count_max = *kind == 1 ? GFC_INTEGER_1_HUGE
+				    : GFC_INTEGER_2_HUGE;
+	}
     }
   else
     {
@@ -232,3 +402,21 @@ void
     }
 #endif
 }
+
+/* For backward compatibility with previous library ABI.  */
+void
+system_clock_4 (GFC_INTEGER_4 *count, GFC_INTEGER_4 *count_rate,
+		GFC_INTEGER_4 *count_max)
+{
+  GFC_INTEGER_4 kind = 4;
+  return system_clock_4K (count, count_rate, count_max, &kind);
+}
+
+void
+system_clock_8 (GFC_INTEGER_8 *count, GFC_INTEGER_8 *count_rate,
+		GFC_INTEGER_8 *count_max)
+{
+  GFC_INTEGER_4 kind = 8;
+  return system_clock_8K (count, count_rate, count_max, &kind);
+}
+
program test
  implicit none
  real(4) :: real_rate4
  real(8) :: real_rate8
  real(10) :: real_rate10
  real(16) :: real_rate16
  integer(1) :: int_count1, int_max1, int_rate1
  integer(2) :: int_count2, int_max2, int_rate2
  integer(4) :: int_count4, int_max4, int_rate4
  integer(8) :: int_count8, int_max8, int_rate8
  integer(16) :: int_count16, int_max16, int_rate16

  call system_clock (int_count1, real_rate4, int_max1)
  print *, int_count1, real_rate4, int_max1
  call system_clock (int_count1, real_rate4, int_max2)
  print *, int_count1, real_rate4, int_max2
  call system_clock (int_count1, real_rate4, int_max4)
  print *, int_count1, real_rate4, int_max4
  call system_clock (int_count1, real_rate4, int_max8)
  print *, int_count1, real_rate4, int_max8
  call system_clock (int_count1, real_rate4, int_max16)
  print *, int_count1, real_rate4, int_max16
  call system_clock (int_count1, real_rate8, int_max1)
  print *, int_count1, real_rate8, int_max1
  call system_clock (int_count1, real_rate8, int_max2)
  print *, int_count1, real_rate8, int_max2
  call system_clock (int_count1, real_rate8, int_max4)
  print *, int_count1, real_rate8, int_max4
  call system_clock (int_count1, real_rate8, int_max8)
  print *, int_count1, real_rate8, int_max8
  call system_clock (int_count1, real_rate8, int_max16)
  print *, int_count1, real_rate8, int_max16
  call system_clock (int_count1, real_rate10, int_max1)
  print *, int_count1, real_rate10, int_max1
  call system_clock (int_count1, real_rate10, int_max2)
  print *, int_count1, real_rate10, int_max2
  call system_clock (int_count1, real_rate10, int_max4)
  print *, int_count1, real_rate10, int_max4
  call system_clock (int_count1, real_rate10, int_max8)
  print *, int_count1, real_rate10, int_max8
  call system_clock (int_count1, real_rate10, int_max16)
  print *, int_count1, real_rate10, int_max16
  call system_clock (int_count1, real_rate16, int_max1)
  print *, int_count1, real_rate16, int_max1
  call system_clock (int_count1, real_rate16, int_max2)
  print *, int_count1, real_rate16, int_max2
  call system_clock (int_count1, real_rate16, int_max4)
  print *, int_count1, real_rate16, int_max4
  call system_clock (int_count1, real_rate16, int_max8)
  print *, int_count1, real_rate16, int_max8
  call system_clock (int_count1, real_rate16, int_max16)
  print *, int_count1, real_rate16, int_max16
  call system_clock (int_count2, real_rate4, int_max1)
  print *, int_count2, real_rate4, int_max1
  call system_clock (int_count2, real_rate4, int_max2)
  print *, int_count2, real_rate4, int_max2
  call system_clock (int_count2, real_rate4, int_max4)
  print *, int_count2, real_rate4, int_max4
  call system_clock (int_count2, real_rate4, int_max8)
  print *, int_count2, real_rate4, int_max8
  call system_clock (int_count2, real_rate4, int_max16)
  print *, int_count2, real_rate4, int_max16
  call system_clock (int_count2, real_rate8, int_max1)
  print *, int_count2, real_rate8, int_max1
  call system_clock (int_count2, real_rate8, int_max2)
  print *, int_count2, real_rate8, int_max2
  call system_clock (int_count2, real_rate8, int_max4)
  print *, int_count2, real_rate8, int_max4
  call system_clock (int_count2, real_rate8, int_max8)
  print *, int_count2, real_rate8, int_max8
  call system_clock (int_count2, real_rate8, int_max16)
  print *, int_count2, real_rate8, int_max16
  call system_clock (int_count2, real_rate10, int_max1)
  print *, int_count2, real_rate10, int_max1
  call system_clock (int_count2, real_rate10, int_max2)
  print *, int_count2, real_rate10, int_max2
  call system_clock (int_count2, real_rate10, int_max4)
  print *, int_count2, real_rate10, int_max4
  call system_clock (int_count2, real_rate10, int_max8)
  print *, int_count2, real_rate10, int_max8
  call system_clock (int_count2, real_rate10, int_max16)
  print *, int_count2, real_rate10, int_max16
  call system_clock (int_count2, real_rate16, int_max1)
  print *, int_count2, real_rate16, int_max1
  call system_clock (int_count2, real_rate16, int_max2)
  print *, int_count2, real_rate16, int_max2
  call system_clock (int_count2, real_rate16, int_max4)
  print *, int_count2, real_rate16, int_max4
  call system_clock (int_count2, real_rate16, int_max8)
  print *, int_count2, real_rate16, int_max8
  call system_clock (int_count2, real_rate16, int_max16)
  print *, int_count2, real_rate16, int_max16
  call system_clock (int_count4, real_rate4, int_max1)
  print *, int_count4, real_rate4, int_max1
  call system_clock (int_count4, real_rate4, int_max2)
  print *, int_count4, real_rate4, int_max2
  call system_clock (int_count4, real_rate4, int_max4)
  print *, int_count4, real_rate4, int_max4
  call system_clock (int_count4, real_rate4, int_max8)
  print *, int_count4, real_rate4, int_max8
  call system_clock (int_count4, real_rate4, int_max16)
  print *, int_count4, real_rate4, int_max16
  call system_clock (int_count4, real_rate8, int_max1)
  print *, int_count4, real_rate8, int_max1
  call system_clock (int_count4, real_rate8, int_max2)
  print *, int_count4, real_rate8, int_max2
  call system_clock (int_count4, real_rate8, int_max4)
  print *, int_count4, real_rate8, int_max4
  call system_clock (int_count4, real_rate8, int_max8)
  print *, int_count4, real_rate8, int_max8
  call system_clock (int_count4, real_rate8, int_max16)
  print *, int_count4, real_rate8, int_max16
  call system_clock (int_count4, real_rate10, int_max1)
  print *, int_count4, real_rate10, int_max1
  call system_clock (int_count4, real_rate10, int_max2)
  print *, int_count4, real_rate10, int_max2
  call system_clock (int_count4, real_rate10, int_max4)
  print *, int_count4, real_rate10, int_max4
  call system_clock (int_count4, real_rate10, int_max8)
  print *, int_count4, real_rate10, int_max8
  call system_clock (int_count4, real_rate10, int_max16)
  print *, int_count4, real_rate10, int_max16
  call system_clock (int_count4, real_rate16, int_max1)
  print *, int_count4, real_rate16, int_max1
  call system_clock (int_count4, real_rate16, int_max2)
  print *, int_count4, real_rate16, int_max2
  call system_clock (int_count4, real_rate16, int_max4)
  print *, int_count4, real_rate16, int_max4
  call system_clock (int_count4, real_rate16, int_max8)
  print *, int_count4, real_rate16, int_max8
  call system_clock (int_count4, real_rate16, int_max16)
  print *, int_count4, real_rate16, int_max16
  call system_clock (int_count8, real_rate4, int_max1)
  print *, int_count8, real_rate4, int_max1
  call system_clock (int_count8, real_rate4, int_max2)
  print *, int_count8, real_rate4, int_max2
  call system_clock (int_count8, real_rate4, int_max4)
  print *, int_count8, real_rate4, int_max4
  call system_clock (int_count8, real_rate4, int_max8)
  print *, int_count8, real_rate4, int_max8
  call system_clock (int_count8, real_rate4, int_max16)
  print *, int_count8, real_rate4, int_max16
  call system_clock (int_count8, real_rate8, int_max1)
  print *, int_count8, real_rate8, int_max1
  call system_clock (int_count8, real_rate8, int_max2)
  print *, int_count8, real_rate8, int_max2
  call system_clock (int_count8, real_rate8, int_max4)
  print *, int_count8, real_rate8, int_max4
  call system_clock (int_count8, real_rate8, int_max8)
  print *, int_count8, real_rate8, int_max8
  call system_clock (int_count8, real_rate8, int_max16)
  print *, int_count8, real_rate8, int_max16
  call system_clock (int_count8, real_rate10, int_max1)
  print *, int_count8, real_rate10, int_max1
  call system_clock (int_count8, real_rate10, int_max2)
  print *, int_count8, real_rate10, int_max2
  call system_clock (int_count8, real_rate10, int_max4)
  print *, int_count8, real_rate10, int_max4
  call system_clock (int_count8, real_rate10, int_max8)
  print *, int_count8, real_rate10, int_max8
  call system_clock (int_count8, real_rate10, int_max16)
  print *, int_count8, real_rate10, int_max16
  call system_clock (int_count8, real_rate16, int_max1)
  print *, int_count8, real_rate16, int_max1
  call system_clock (int_count8, real_rate16, int_max2)
  print *, int_count8, real_rate16, int_max2
  call system_clock (int_count8, real_rate16, int_max4)
  print *, int_count8, real_rate16, int_max4
  call system_clock (int_count8, real_rate16, int_max8)
  print *, int_count8, real_rate16, int_max8
  call system_clock (int_count8, real_rate16, int_max16)
  print *, int_count8, real_rate16, int_max16
  call system_clock (int_count16, real_rate4, int_max1)
  print *, int_count16, real_rate4, int_max1
  call system_clock (int_count16, real_rate4, int_max2)
  print *, int_count16, real_rate4, int_max2
  call system_clock (int_count16, real_rate4, int_max4)
  print *, int_count16, real_rate4, int_max4
  call system_clock (int_count16, real_rate4, int_max8)
  print *, int_count16, real_rate4, int_max8
  call system_clock (int_count16, real_rate4, int_max16)
  print *, int_count16, real_rate4, int_max16
  call system_clock (int_count16, real_rate8, int_max1)
  print *, int_count16, real_rate8, int_max1
  call system_clock (int_count16, real_rate8, int_max2)
  print *, int_count16, real_rate8, int_max2
  call system_clock (int_count16, real_rate8, int_max4)
  print *, int_count16, real_rate8, int_max4
  call system_clock (int_count16, real_rate8, int_max8)
  print *, int_count16, real_rate8, int_max8
  call system_clock (int_count16, real_rate8, int_max16)
  print *, int_count16, real_rate8, int_max16
  call system_clock (int_count16, real_rate10, int_max1)
  print *, int_count16, real_rate10, int_max1
  call system_clock (int_count16, real_rate10, int_max2)
  print *, int_count16, real_rate10, int_max2
  call system_clock (int_count16, real_rate10, int_max4)
  print *, int_count16, real_rate10, int_max4
  call system_clock (int_count16, real_rate10, int_max8)
  print *, int_count16, real_rate10, int_max8
  call system_clock (int_count16, real_rate10, int_max16)
  print *, int_count16, real_rate10, int_max16
  call system_clock (int_count16, real_rate16, int_max1)
  print *, int_count16, real_rate16, int_max1
  call system_clock (int_count16, real_rate16, int_max2)
  print *, int_count16, real_rate16, int_max2
  call system_clock (int_count16, real_rate16, int_max4)
  print *, int_count16, real_rate16, int_max4
  call system_clock (int_count16, real_rate16, int_max8)
  print *, int_count16, real_rate16, int_max8
  call system_clock (int_count16, real_rate16, int_max16)
  print *, int_count16, real_rate16, int_max16
end program test

program test
  implicit none
  integer, parameter  :: np = 16
  integer(np) :: int_count, int_max, int_rate
  integer(np) :: start, finish
  integer(4) :: i,j,k
  real(8) :: real_rate
  k = 1000000000
  call system_clock (start, count_rate=int_rate)
  do i = 1, k
    call system_clock (int_count)
  end do
  call system_clock (finish, count_rate=int_rate)
  print *, finish-start, int_rate
  real_rate = real(finish-start, 8) / real(int_rate, 8)
  print *, real_rate, " seconds"
  print *, real_rate/real(k,8), " seconds/call"
  print *, int_rate
end program test

Reply via email to