[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Régénération fichiers libgfortran

Mikael Morin mikael@gcc.gnu.org
Fri Jun 13 14:47:54 GMT 2025


https://gcc.gnu.org/g:55e9adf64466dc55fd6ab9cfacf8fd163b402f98

commit 55e9adf64466dc55fd6ab9cfacf8fd163b402f98
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Fri Jun 13 16:46:27 2025 +0200

    Régénération fichiers libgfortran

Diff:
---
 libgfortran/generated/maxloc1_16_i8.c  | 132 ++++++++++++++++++---------------
 libgfortran/generated/maxloc1_16_m16.c | 132 ++++++++++++++++++---------------
 libgfortran/generated/maxloc1_4_i16.c  | 132 ++++++++++++++++++---------------
 libgfortran/generated/maxloc1_4_i8.c   | 132 ++++++++++++++++++---------------
 libgfortran/generated/maxloc1_8_i16.c  | 132 ++++++++++++++++++---------------
 libgfortran/generated/maxloc1_8_i8.c   | 132 ++++++++++++++++++---------------
 6 files changed, 444 insertions(+), 348 deletions(-)

diff --git a/libgfortran/generated/maxloc1_16_i8.c b/libgfortran/generated/maxloc1_16_i8.c
index ee97c1ac552d..c56709f21795 100644
--- a/libgfortran/generated/maxloc1_16_i8.c
+++ b/libgfortran/generated/maxloc1_16_i8.c
@@ -43,8 +43,8 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_INTEGER_8 * restrict base;
   GFC_INTEGER_16 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_INTEGER_8_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 		    result = (GFC_INTEGER_16)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_16)n + 1;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_16 * restrict dest;
   const GFC_INTEGER_8 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	GFC_INTEGER_16 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_INTEGER_8_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_16)n + 1;
 		    }
+
+		  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_16)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_16 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_16_i8 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }
diff --git a/libgfortran/generated/maxloc1_16_m16.c b/libgfortran/generated/maxloc1_16_m16.c
index e6f1ae3607b6..dba58b0318a4 100644
--- a/libgfortran/generated/maxloc1_16_m16.c
+++ b/libgfortran/generated/maxloc1_16_m16.c
@@ -43,8 +43,8 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_UINTEGER_16 * restrict base;
   GFC_INTEGER_16 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_UINTEGER_16_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 		    result = (GFC_INTEGER_16)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_UINTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_16)n + 1;
 		  }
+
+		src = (const GFC_UINTEGER_16 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_UINTEGER_16*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_UINTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_UINTEGER_16*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_16 * restrict dest;
   const GFC_UINTEGER_16 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	GFC_INTEGER_16 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_UINTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_UINTEGER_16_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_16)n + 1;
 		    }
+
+		  src = (const GFC_UINTEGER_16 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_16)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_UINTEGER_16 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_UINTEGER_16*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_UINTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_UINTEGER_16*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_16 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_16);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_16);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_16);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_16_m16 (gfc_array_i16 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_16*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_16*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }
diff --git a/libgfortran/generated/maxloc1_4_i16.c b/libgfortran/generated/maxloc1_4_i16.c
index cb866c0c4298..d163afb3bfc5 100644
--- a/libgfortran/generated/maxloc1_4_i16.c
+++ b/libgfortran/generated/maxloc1_4_i16.c
@@ -43,8 +43,8 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_INTEGER_16 * restrict base;
   GFC_INTEGER_4 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_INTEGER_16_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 		    result = (GFC_INTEGER_4)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_4)n + 1;
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_4 * restrict dest;
   const GFC_INTEGER_16 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	GFC_INTEGER_4 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_INTEGER_16_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_4)n + 1;
 		    }
+
+		  src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_4)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_4 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_4_i16 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }
diff --git a/libgfortran/generated/maxloc1_4_i8.c b/libgfortran/generated/maxloc1_4_i8.c
index 31bff23b6200..6cd9afbdbaab 100644
--- a/libgfortran/generated/maxloc1_4_i8.c
+++ b/libgfortran/generated/maxloc1_4_i8.c
@@ -43,8 +43,8 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_INTEGER_8 * restrict base;
   GFC_INTEGER_4 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_INTEGER_8_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 		    result = (GFC_INTEGER_4)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_4)n + 1;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_4 * restrict dest;
   const GFC_INTEGER_8 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	GFC_INTEGER_4 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_INTEGER_8_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_4)n + 1;
 		    }
+
+		  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_4)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_4 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_4);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_4);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_4);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_4_i8 (gfc_array_i4 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_4*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_4*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }
diff --git a/libgfortran/generated/maxloc1_8_i16.c b/libgfortran/generated/maxloc1_8_i16.c
index 6e8061a18bf6..83c0ddf85935 100644
--- a/libgfortran/generated/maxloc1_8_i16.c
+++ b/libgfortran/generated/maxloc1_8_i16.c
@@ -43,8 +43,8 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_INTEGER_16 * restrict base;
   GFC_INTEGER_8 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_INTEGER_16_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 		    result = (GFC_INTEGER_8)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_8)n + 1;
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_8 * restrict dest;
   const GFC_INTEGER_16 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	GFC_INTEGER_8 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_INTEGER_16_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_8)n + 1;
 		    }
+
+		  src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_8)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_INTEGER_16 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_16*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_16*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_8 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_8_i16 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }
diff --git a/libgfortran/generated/maxloc1_8_i8.c b/libgfortran/generated/maxloc1_8_i8.c
index d0c34950fff4..79b788ed7582 100644
--- a/libgfortran/generated/maxloc1_8_i8.c
+++ b/libgfortran/generated/maxloc1_8_i8.c
@@ -43,8 +43,8 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   const GFC_INTEGER_8 * restrict base;
   GFC_INTEGER_8 * restrict dest;
   index_type rank;
@@ -68,11 +68,11 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
   len = GFC_DESCRIPTOR_EXTENT(array,dim);
   if (len < 0)
     len = 0;
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -80,7 +80,7 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -94,20 +94,22 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -127,7 +129,7 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -155,12 +157,12 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	else
 	  {
 #if ! defined HAVE_BACK_ARG
-	    for (n = 0; n < len; n++, src += delta)
+	    for (n = 0; n < len; n++)
 	      {
 #endif
 
 #if defined (GFC_INTEGER_8_QUIET_NAN)
-     	     for (n = 0; n < len; n++, src += delta)
+     	     for (n = 0; n < len; n++)
 	       {
 		if (*src >= maxval)
 		  {
@@ -168,17 +170,21 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 		    result = (GFC_INTEGER_8)n + 1;
 		    break;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #else
 	    n = 0;
 #endif
-	    for (; n < len; n++, src += delta)
+	    for (; n < len; n++)
 	      {
 		if (back ? *src >= maxval : *src > maxval)
 		  {
 		    maxval = *src;
 		    result = (GFC_INTEGER_8)n + 1;
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*) src) + delta);
 	      }
 	    
 	    *dest = result;
@@ -186,8 +192,8 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -196,8 +202,8 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -208,8 +214,8 @@ maxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -229,9 +235,9 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
-  index_type mstride[GFC_MAX_DIMENSIONS];
+  index_type sspacing[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
+  index_type mspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_8 * restrict dest;
   const GFC_INTEGER_8 * restrict base;
   const GFC_LOGICAL_1 * restrict mbase;
@@ -281,13 +287,13 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
   else
     runtime_error ("Funny sized logical array");
 
-  delta = GFC_DESCRIPTOR_STRIDE(array,dim);
-  mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim);
+  delta = GFC_DESCRIPTOR_SPACING(array,dim);
+  mdelta = GFC_DESCRIPTOR_SPACING(mask,dim);
 
   for (n = 0; n < dim; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask,n);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
 
       if (extent[n] < 0)
@@ -296,8 +302,8 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
     }
   for (n = dim; n < rank; n++)
     {
-      sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1);
-      mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1);
+      sspacing[n] = GFC_DESCRIPTOR_SPACING(array,n + 1);
+      mspacing[n] = GFC_DESCRIPTOR_SPACING(mask, n + 1);
       extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1);
 
       if (extent[n] < 0)
@@ -311,20 +317,22 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str= GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -345,7 +353,7 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
       if (extent[n] <= 0)
 	return;
     }
@@ -372,7 +380,7 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	GFC_INTEGER_8 result2 = 0;
 #endif
 	result = 0;
-	for (n = 0; n < len; n++, src += delta, msrc += mdelta)
+	for (n = 0; n < len; n++, msrc += mdelta)
 	  {
 
 		if (*msrc)
@@ -388,6 +396,8 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 			break;
 		      }
 		  }
+
+		src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 	      }
 #if defined (GFC_INTEGER_8_QUIET_NAN)
 	    if (unlikely (n >= len))
@@ -395,30 +405,34 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	    else
 #endif
 	    if (back)
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	      	{
 		  if (*msrc && unlikely (*src >= maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_8)n + 1;
 		    }
+
+		  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
 		}
 	    else
-	      for (; n < len; n++, src += delta, msrc += mdelta)
+	      for (; n < len; n++, msrc += mdelta)
 	        {
 		  if (*msrc && unlikely (*src > maxval))
 		    {
 		      maxval = *src;
 		      result = (GFC_INTEGER_8)n + 1;
 		    }
-	  }
+
+	  src = (const GFC_INTEGER_8 * restrict) (((char*)src) + delta);
+	}
 	*dest = result;
       }
       /* Advance to the next element.  */
       count[0]++;
-      base += sstride[0];
-      mbase += mstride[0];
-      dest += dstride[0];
+      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[0]);
+      mbase += mspacing[0];
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -427,9 +441,9 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  base -= sstride[n] * extent[n];
-	  mbase -= mstride[n] * extent[n];
-	  dest -= dstride[n] * extent[n];
+	  base = (GFC_INTEGER_8*) (((char*)base) - sspacing[n] * extent[n]);
+	  mbase -= mspacing[n] * extent[n];
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    {
@@ -440,9 +454,9 @@ mmaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	  else
 	    {
 	      count[n]++;
-	      base += sstride[n];
-	      mbase += mstride[n];
-	      dest += dstride[n];
+	      base = (GFC_INTEGER_8*) (((char*)base) + sspacing[n]);
+	      mbase += mspacing[n];
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
 	}
     }
@@ -462,7 +476,7 @@ smaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 {
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
-  index_type dstride[GFC_MAX_DIMENSIONS];
+  index_type dspacing[GFC_MAX_DIMENSIONS];
   GFC_INTEGER_8 * restrict dest;
   index_type rank;
   index_type n;
@@ -513,20 +527,22 @@ smaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
       for (n = 0; n < rank; n++)
 	{
 	  if (n == 0)
-	    str = 1;
+	    str = sizeof (GFC_INTEGER_8);
 	  else
-	    str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1];
+	    str = GFC_DESCRIPTOR_SPACING(retarray,n-1) * extent[n-1];
 
-	  GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str);
+	  GFC_DESCRIPTOR_DIMENSION_SET(retarray, n, 0, extent[n] - 1, str);
 
 	}
 
       retarray->offset = 0;
       retarray->dtype.rank = rank;
+      GFC_DESCRIPTOR_SIZE (retarray) = sizeof (GFC_INTEGER_8);
+      GFC_DESCRIPTOR_SPAN (retarray) = sizeof (GFC_INTEGER_8);
 
-      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+      alloc_size = GFC_DESCRIPTOR_SPACING(retarray,rank-1) * extent[rank-1];
 
-      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+      retarray->base_addr = xmalloc (alloc_size);
       if (alloc_size == 0)
 	return;
     }
@@ -557,7 +573,7 @@ smaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
   for (n = 0; n < rank; n++)
     {
       count[n] = 0;
-      dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n);
+      dspacing[n] = GFC_DESCRIPTOR_SPACING(retarray,n);
     }
 
   dest = retarray->base_addr;
@@ -566,7 +582,7 @@ smaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
     {
       *dest = 0;
       count[0]++;
-      dest += dstride[0];
+      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[0]);
       n = 0;
       while (count[n] == extent[n])
 	{
@@ -575,14 +591,14 @@ smaxloc1_8_i8 (gfc_array_i8 * const restrict retarray,
 	  count[n] = 0;
 	  /* We could precalculate these products, but this is a less
 	     frequently used path so probably not worth it.  */
-	  dest -= dstride[n] * extent[n];
+	  dest = (GFC_INTEGER_8*) (((char*)dest) - dspacing[n] * extent[n]);
 	  n++;
 	  if (n >= rank)
 	    return;
 	  else
 	    {
 	      count[n]++;
-	      dest += dstride[n];
+	      dest = (GFC_INTEGER_8*) (((char*)dest) + dspacing[n]);
 	    }
       	}
     }


More information about the Gcc-cvs mailing list