[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Correction régression matmul_4

Mikael Morin mikael@gcc.gnu.org
Fri Jun 13 14:58:53 GMT 2025


https://gcc.gnu.org/g:163339c206c1c048fd9280d5c4d3f351b72917d0

commit 163339c206c1c048fd9280d5c4d3f351b72917d0
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Fri Apr 25 17:17:23 2025 +0200

    Correction régression matmul_4

Diff:
---
 libgfortran/generated/matmul_c10.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_c16.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_c17.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_c4.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_c8.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_i1.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_i16.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_i2.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_i4.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_i8.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_r10.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_r16.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_r17.c       | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_r4.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmul_r8.c        | 925 ++++++++++++++++---------------
 libgfortran/generated/matmulavx128_c10.c | 370 +++++++------
 libgfortran/generated/matmulavx128_c16.c | 370 +++++++------
 libgfortran/generated/matmulavx128_c17.c | 370 +++++++------
 libgfortran/generated/matmulavx128_c4.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_c8.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_i1.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_i16.c | 370 +++++++------
 libgfortran/generated/matmulavx128_i2.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_i4.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_i8.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_r10.c | 370 +++++++------
 libgfortran/generated/matmulavx128_r16.c | 370 +++++++------
 libgfortran/generated/matmulavx128_r17.c | 370 +++++++------
 libgfortran/generated/matmulavx128_r4.c  | 370 +++++++------
 libgfortran/generated/matmulavx128_r8.c  | 370 +++++++------
 libgfortran/m4/matmul_internal.m4        | 185 ++++---
 31 files changed, 9964 insertions(+), 9646 deletions(-)

diff --git a/libgfortran/generated/matmul_c10.c b/libgfortran/generated/matmul_c10.c
index 3ed77181f203..3ec53179d09c 100644
--- a/libgfortran/generated/matmul_c10.c
+++ b/libgfortran/generated/matmul_c10.c
@@ -302,8 +302,8 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_10 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_10 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_10 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_10 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_10 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_10 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_10 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_10 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_10 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_10 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_10 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_10 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_10 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_10 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_10 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_10 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_10 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_10 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_10 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_10 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_10, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_10, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_10, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_c16.c b/libgfortran/generated/matmul_c16.c
index a279ee6926b6..4d804d17c2e7 100644
--- a/libgfortran/generated/matmul_c16.c
+++ b/libgfortran/generated/matmul_c16.c
@@ -302,8 +302,8 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_c17.c b/libgfortran/generated/matmul_c17.c
index 947641592806..beef0b96e591 100644
--- a/libgfortran/generated/matmul_c17.c
+++ b/libgfortran/generated/matmul_c17.c
@@ -302,8 +302,8 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_17 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_17 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_17 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_17 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_17 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_17 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_17 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_17 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_17 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_17 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_17 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_17 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_17 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_17 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_17 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_17 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_17 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_17 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_17 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_17 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_17, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_17, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_17, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_c4.c b/libgfortran/generated/matmul_c4.c
index 5cafd7f8894a..d28003619c35 100644
--- a/libgfortran/generated/matmul_c4.c
+++ b/libgfortran/generated/matmul_c4.c
@@ -302,8 +302,8 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_4 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_4 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_4 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_4 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_4 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_4 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_4 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_4 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_4 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_4 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_4 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_4 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_4 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_4 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_4 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_4 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_4 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_4 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_4 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_4 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_4, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_4, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_4, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_c8.c b/libgfortran/generated/matmul_c8.c
index 980de9fff7c6..20856c0a01ad 100644
--- a/libgfortran/generated/matmul_c8.c
+++ b/libgfortran/generated/matmul_c8.c
@@ -302,8 +302,8 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_8 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_8 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_8 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_8 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_8 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_8 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_8 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_8 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_8 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_8 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_8 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_8 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_8 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_8 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_8 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_8 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_COMPLEX_8 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_COMPLEX_8 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_COMPLEX_8 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_COMPLEX_8 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * rxspacing + j * c_dim1) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_COMPLEX_8, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_COMPLEX_8, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_COMPLEX_8, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_i1.c b/libgfortran/generated/matmul_i1.c
index cbe86a89326a..0fa9a5cf0898 100644
--- a/libgfortran/generated/matmul_i1.c
+++ b/libgfortran/generated/matmul_i1.c
@@ -302,8 +302,8 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_1 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_1 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_1 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_1 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_1 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_1 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_1 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_1 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_1 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_1 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_1 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_1 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_1 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_1 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_1 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_1 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_1 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_1 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_1 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_1 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_1, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_1, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_1, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_i16.c b/libgfortran/generated/matmul_i16.c
index 48cf2abc572b..4f02e805c5b3 100644
--- a/libgfortran/generated/matmul_i16.c
+++ b/libgfortran/generated/matmul_i16.c
@@ -302,8 +302,8 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1101,38 +1107,38 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -1464,8 +1470,8 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -1479,20 +1485,23 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1544,20 +1553,20 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1566,7 +1575,7 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -1577,100 +1586,100 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -1682,38 +1691,38 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2059,8 +2068,8 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2074,20 +2083,23 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2139,20 +2151,20 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2161,7 +2173,7 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2172,100 +2184,100 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2277,38 +2289,38 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -2713,8 +2725,8 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_16 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -2728,20 +2740,23 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_16 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_16 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_16 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2793,20 +2808,20 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2815,7 +2830,7 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_16, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -2826,100 +2841,100 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -2931,38 +2946,38 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_16, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_16, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
diff --git a/libgfortran/generated/matmul_i2.c b/libgfortran/generated/matmul_i2.c
index 5ad141cfac9b..88884ddb06a5 100644
--- a/libgfortran/generated/matmul_i2.c
+++ b/libgfortran/generated/matmul_i2.c
@@ -302,8 +302,8 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_2 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -317,20 +317,23 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_2 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_2 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_2 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_2)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_2)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -382,20 +385,20 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -404,7 +407,7 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -415,100 +418,100 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f12 = c[i + (j + 1) * c_dim1];
-			      f13 = c[i + (j + 2) * c_dim1];
-			      f14 = c[i + (j + 3) * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1);
+			      f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1);
+			      f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2) * c_dim1);
+			      f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3) * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + (j + 1) * c_dim1] = f12;
-			      c[i + (j + 2) * c_dim1] = f13;
-			      c[i + (j + 3) * c_dim1] = f14;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2) * c_dim1) = f13;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3) * c_dim1) = f14;
 			    }
 			}
 		    }
@@ -520,38 +523,38 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 			  i5 = ii + uisec - 1;
 			  for (i = ii; i <= i5; i += 4)
 			    {
-			      f11 = c[i + j * c_dim1];
-			      f21 = c[i + 1 + j * c_dim1];
-			      f31 = c[i + 2 + j * c_dim1];
-			      f41 = c[i + 3 + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1);
+			      f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1);
+			      f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1);
+			      f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
-			      c[i + 1 + j * c_dim1] = f21;
-			      c[i + 2 + j * c_dim1] = f31;
-			      c[i + 3 + j * c_dim1] = f41;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i) * c_dim0 + j * c_dim1) = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
 			    }
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1);
 			      i6 = ll + lsec - 1;
 			      for (l = ll; l <= i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 				}
-			      c[i + j * c_dim1] = f11;
+			      GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1) = f11;
 			    }
 			}
 		    }
@@ -883,8 +886,8 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
       const index_type m = xcount, n = ycount, k = count;
 
       /* System generated locals */
-      index_type a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset,
-		 i1, i2, i3, i4, i5, i6;
+      index_type a_dim0, a_dim1, a_offset, b_dim0, b_dim1, b_offset,
+		 c_dim0, c_dim1, c_offset, i1, i2, i3, i4, i5, i6;
 
       /* Local variables */
       GFC_UINTEGER_2 f11, f12, f21, f22, f31, f32, f41, f42,
@@ -898,20 +901,23 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
       c = retarray->base_addr;
 
       /* Parameter adjustments */
+      c_dim0 = rxspacing;
       c_dim1 = ryspacing;
-      c_offset = 1 + c_dim1;
-      c -= c_offset;
+      c_offset = rxspacing + c_dim1;
+      c = (GFC_UINTEGER_2 *) (((char*)c) - c_offset);
+      a_dim0 = axspacing;
       a_dim1 = ayspacing;
-      a_offset = 1 + a_dim1;
-      a -= a_offset;
+      a_offset = axspacing + a_dim1;
+      a = (GFC_UINTEGER_2 *) (((char*)a) - a_offset);
+      b_dim0 = bxspacing;
       b_dim1 = byspacing;
-      b_offset = 1 + b_dim1;
-      b -= b_offset;
+      b_offset = bxspacing + b_dim1;
+      b = (GFC_UINTEGER_2 *) (((char*)b) - b_offset);
 
       /* Empty c first.  */
       for (j=1; j<=n; j++)
 	for (i=1; i<=m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_2)0;
+	  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * rxspacing + j * c_dim1) = (GFC_UINTEGER_2)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -963,20 +969,20 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 		      for (i = ii; i <= i5; i += 2)
 			{
 			  t1[l - ll + 1 + ((i - ii + 1) << 8) - 257] =
-					a[i + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + (l + 1) * a_dim1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (i + 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (i + 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (ii + isec - 1) * a_dim0 + l * a_dim1);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, (ii + isec - 1) * a_dim0 + (l + 1) * a_dim1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -985,7 +991,7 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 		      for (i = ii; i<= i4; ++i)
 			{
 			  t1[lsec + ((i - ii + 1) << 8) - 257] =
-				    a[i + (ll + lsec - 1) * a_dim1];
+				    GFC_ARRAY_ELEM (GFC_UINTEGER_2, a, i * a_dim0 + (ll + lsec - 1) * a_dim1);
 			}
 		    }
 
@@ -996,100 +1002,100 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 		      i5 = ii + uisec - 1;
 		      for (i = ii; i <= i5; i += 4)
 			{
-			  f11 = c[i + j * c_dim1];
-			  f21 = c[i + 1 + j * c_dim1];
-			  f12 = c[i + (j + 1) * c_dim1];
-			  f22 = c[i + 1 + (j + 1) * c_dim1];
-			  f13 = c[i + (j + 2) * c_dim1];
-			  f23 = c[i + 1 + (j + 2) * c_dim1];
-			  f14 = c[i + (j + 3) * c_dim1];
-			  f24 = c[i + 1 + (j + 3) * c_dim1];
-			  f31 = c[i + 2 + j * c_dim1];
-			  f41 = c[i + 3 + j * c_dim1];
-			  f32 = c[i + 2 + (j + 1) * c_dim1];
-			  f42 = c[i + 3 + (j + 1) * c_dim1];
-			  f33 = c[i + 2 + (j + 2) * c_dim1];
-			  f43 = c[i + 3 + (j + 2) * c_dim1];
-			  f34 = c[i + 2 + (j + 3) * c_dim1];
-			  f44 = c[i + 3 + (j + 3) * c_dim1];
+			  f11 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1);
+			  f21 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1);
+			  f12 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1);
+			  f22 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 1) * c_dim1);
+			  f13 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2) * c_dim1);
+			  f23 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 2) * c_dim1);
+			  f14 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3) * c_dim1);
+			  f24 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 3) * c_dim1);
+			  f31 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1);
+			  f41 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1);
+			  f32 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 1) * c_dim1);
+			  f42 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 1) * c_dim1);
+			  f33 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 2) * c_dim1);
+			  f43 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 2) * c_dim1);
+			  f34 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 3) * c_dim1);
+			  f44 = GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 3) * c_dim1);
 			  i6 = ll + lsec - 1;
 			  for (l = ll; l <= i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + j * b_dim1);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 1) * b_dim1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 2) * b_dim1);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * GFC_ARRAY_ELEM (GFC_UINTEGER_2, b, l * b_dim0 + (j + 3) * b_dim1);
 			    }
-			  c[i + j * c_dim1] = f11;
-			  c[i + 1 + j * c_dim1] = f21;
-			  c[i + (j + 1) * c_dim1] = f12;
-			  c[i + 1 + (j + 1) * c_dim1] = f22;
-			  c[i + (j + 2) * c_dim1] = f13;
-			  c[i + 1 + (j + 2) * c_dim1] = f23;
-			  c[i + (j + 3) * c_dim1] = f14;
-			  c[i + 1 + (j + 3) * c_dim1] = f24;
-			  c[i + 2 + j * c_dim1] = f31;
-			  c[i + 3 + j * c_dim1] = f41;
-			  c[i + 2 + (j + 1) * c_dim1] = f32;
-			  c[i + 3 + (j + 1) * c_dim1] = f42;
-			  c[i + 2 + (j + 2) * c_dim1] = f33;
-			  c[i + 3 + (j + 2) * c_dim1] = f43;
-			  c[i + 2 + (j + 3) * c_dim1] = f34;
-			  c[i + 3 + (j + 3) * c_dim1] = f44;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + j * c_dim1) = f11;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + j * c_dim1) = f21;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 1) * c_dim1) = f12;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 1) * c_dim1) = f22;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 2)  * c_dim1) = f13;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 2) * c_dim1) = f23;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, i * c_dim0 + (j + 3)  * c_dim1) = f14;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 1) * c_dim0 + (j + 3) * c_dim1) = f24;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + j * c_dim1) = f31;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + j * c_dim1) = f41;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 1) * c_dim1) = f32;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 1) * c_dim1) = f42;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 2) * c_dim1) = f33;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 2) * c_dim1) = f43;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 2) * c_dim0 + (j + 3) * c_dim1) = f34;
+			  GFC_ARRAY_ELEM (GFC_UINTEGER_2, c, (i + 3) * c_dim0 + (j + 3) * c_dim1) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec - 1;
 			  for (i = ii + uisec; i <= i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
-	[...]

[diff truncated at 524288 bytes]


More information about the Gcc-cvs mailing list