[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Régénération des fichiers générés

Mikael Morin mikael@gcc.gnu.org
Fri Sep 19 20:06:41 GMT 2025


https://gcc.gnu.org/g:2d88221f5008fa3bcdf196a3ac1c78dee42eb7de

commit 2d88221f5008fa3bcdf196a3ac1c78dee42eb7de
Author: Mikael Morin <mikael@gcc.gnu.org>
Date:   Mon Sep 15 14:35:46 2025 +0200

    Régénération des fichiers générés

Diff:
---
 libgfortran/generated/bessel_r10.c       |  34 +-
 libgfortran/generated/bessel_r16.c       |  34 +-
 libgfortran/generated/bessel_r17.c       |  34 +-
 libgfortran/generated/bessel_r4.c        |  34 +-
 libgfortran/generated/bessel_r8.c        |  34 +-
 libgfortran/generated/findloc0_c10.c     |  32 +-
 libgfortran/generated/findloc0_c16.c     |  32 +-
 libgfortran/generated/findloc0_c17.c     |  32 +-
 libgfortran/generated/findloc0_c4.c      |  32 +-
 libgfortran/generated/findloc0_c8.c      |  32 +-
 libgfortran/generated/findloc0_i1.c      |  32 +-
 libgfortran/generated/findloc0_i16.c     |  32 +-
 libgfortran/generated/findloc0_i2.c      |  32 +-
 libgfortran/generated/findloc0_i4.c      |  32 +-
 libgfortran/generated/findloc0_i8.c      |  32 +-
 libgfortran/generated/findloc0_r10.c     |  32 +-
 libgfortran/generated/findloc0_r16.c     |  32 +-
 libgfortran/generated/findloc0_r17.c     |  32 +-
 libgfortran/generated/findloc0_r4.c      |  32 +-
 libgfortran/generated/findloc0_r8.c      |  32 +-
 libgfortran/generated/findloc0_s1.c      |  32 +-
 libgfortran/generated/findloc0_s4.c      |  32 +-
 libgfortran/generated/findloc2_s1.c      |   4 +-
 libgfortran/generated/findloc2_s4.c      |   4 +-
 libgfortran/generated/matmul_c10.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_c16.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_c17.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_c4.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_c8.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_i1.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_i16.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_i2.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_i4.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_i8.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_r10.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_r16.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_r17.c       | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_r4.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmul_r8.c        | 960 ++++++++++++++++---------------
 libgfortran/generated/matmulavx128_c10.c | 384 +++++++------
 libgfortran/generated/matmulavx128_c16.c | 384 +++++++------
 libgfortran/generated/matmulavx128_c17.c | 384 +++++++------
 libgfortran/generated/matmulavx128_c4.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_c8.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_i1.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_i16.c | 384 +++++++------
 libgfortran/generated/matmulavx128_i2.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_i4.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_i8.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_r10.c | 384 +++++++------
 libgfortran/generated/matmulavx128_r16.c | 384 +++++++------
 libgfortran/generated/matmulavx128_r17.c | 384 +++++++------
 libgfortran/generated/matmulavx128_r4.c  | 384 +++++++------
 libgfortran/generated/matmulavx128_r8.c  | 384 +++++++------
 libgfortran/generated/maxloc0_16_i1.c    |  38 +-
 libgfortran/generated/maxloc0_16_i16.c   |  38 +-
 libgfortran/generated/maxloc0_16_i2.c    |  38 +-
 libgfortran/generated/maxloc0_16_i4.c    |  38 +-
 libgfortran/generated/maxloc0_16_i8.c    |  38 +-
 libgfortran/generated/maxloc0_16_m1.c    |  38 +-
 libgfortran/generated/maxloc0_16_m16.c   |  38 +-
 libgfortran/generated/maxloc0_16_m2.c    |  38 +-
 libgfortran/generated/maxloc0_16_m4.c    |  38 +-
 libgfortran/generated/maxloc0_16_m8.c    |  38 +-
 libgfortran/generated/maxloc0_16_r10.c   |  38 +-
 libgfortran/generated/maxloc0_16_r16.c   |  38 +-
 libgfortran/generated/maxloc0_16_r17.c   |  38 +-
 libgfortran/generated/maxloc0_16_r4.c    |  38 +-
 libgfortran/generated/maxloc0_16_r8.c    |  38 +-
 libgfortran/generated/maxloc0_16_s1.c    |  26 +-
 libgfortran/generated/maxloc0_16_s4.c    |  26 +-
 libgfortran/generated/maxloc0_4_i1.c     |  38 +-
 libgfortran/generated/maxloc0_4_i16.c    |  38 +-
 libgfortran/generated/maxloc0_4_i2.c     |  38 +-
 libgfortran/generated/maxloc0_4_i4.c     |  38 +-
 libgfortran/generated/maxloc0_4_i8.c     |  38 +-
 libgfortran/generated/maxloc0_4_m1.c     |  38 +-
 libgfortran/generated/maxloc0_4_m16.c    |  38 +-
 libgfortran/generated/maxloc0_4_m2.c     |  38 +-
 libgfortran/generated/maxloc0_4_m4.c     |  38 +-
 libgfortran/generated/maxloc0_4_m8.c     |  38 +-
 libgfortran/generated/maxloc0_4_r10.c    |  38 +-
 libgfortran/generated/maxloc0_4_r16.c    |  38 +-
 libgfortran/generated/maxloc0_4_r17.c    |  38 +-
 libgfortran/generated/maxloc0_4_r4.c     |  38 +-
 libgfortran/generated/maxloc0_4_r8.c     |  38 +-
 libgfortran/generated/maxloc0_4_s1.c     |  26 +-
 libgfortran/generated/maxloc0_4_s4.c     |  26 +-
 libgfortran/generated/maxloc0_8_i1.c     |  38 +-
 libgfortran/generated/maxloc0_8_i16.c    |  38 +-
 libgfortran/generated/maxloc0_8_i2.c     |  38 +-
 libgfortran/generated/maxloc0_8_i4.c     |  38 +-
 libgfortran/generated/maxloc0_8_i8.c     |  38 +-
 libgfortran/generated/maxloc0_8_m1.c     |  38 +-
 libgfortran/generated/maxloc0_8_m16.c    |  38 +-
 libgfortran/generated/maxloc0_8_m2.c     |  38 +-
 libgfortran/generated/maxloc0_8_m4.c     |  38 +-
 libgfortran/generated/maxloc0_8_m8.c     |  38 +-
 libgfortran/generated/maxloc0_8_r10.c    |  38 +-
 libgfortran/generated/maxloc0_8_r16.c    |  38 +-
 libgfortran/generated/maxloc0_8_r17.c    |  38 +-
 libgfortran/generated/maxloc0_8_r4.c     |  38 +-
 libgfortran/generated/maxloc0_8_r8.c     |  38 +-
 libgfortran/generated/maxloc0_8_s1.c     |  26 +-
 libgfortran/generated/maxloc0_8_s4.c     |  26 +-
 libgfortran/generated/maxloc2_16_s1.c    |   2 +-
 libgfortran/generated/maxloc2_16_s4.c    |   2 +-
 libgfortran/generated/maxloc2_4_s1.c     |   2 +-
 libgfortran/generated/maxloc2_4_s4.c     |   2 +-
 libgfortran/generated/maxloc2_8_s1.c     |   2 +-
 libgfortran/generated/maxloc2_8_s4.c     |   2 +-
 libgfortran/generated/minloc0_16_i1.c    |  38 +-
 libgfortran/generated/minloc0_16_i16.c   |  38 +-
 libgfortran/generated/minloc0_16_i2.c    |  38 +-
 libgfortran/generated/minloc0_16_i4.c    |  38 +-
 libgfortran/generated/minloc0_16_i8.c    |  38 +-
 libgfortran/generated/minloc0_16_m1.c    |  38 +-
 libgfortran/generated/minloc0_16_m16.c   |  38 +-
 libgfortran/generated/minloc0_16_m2.c    |  38 +-
 libgfortran/generated/minloc0_16_m4.c    |  38 +-
 libgfortran/generated/minloc0_16_m8.c    |  38 +-
 libgfortran/generated/minloc0_16_r10.c   |  38 +-
 libgfortran/generated/minloc0_16_r16.c   |  38 +-
 libgfortran/generated/minloc0_16_r17.c   |  38 +-
 libgfortran/generated/minloc0_16_r4.c    |  38 +-
 libgfortran/generated/minloc0_16_r8.c    |  38 +-
 libgfortran/generated/minloc0_16_s1.c    |  26 +-
 libgfortran/generated/minloc0_16_s4.c    |  26 +-
 libgfortran/generated/minloc0_4_i1.c     |  38 +-
 libgfortran/generated/minloc0_4_i16.c    |  38 +-
 libgfortran/generated/minloc0_4_i2.c     |  38 +-
 libgfortran/generated/minloc0_4_i4.c     |  38 +-
 libgfortran/generated/minloc0_4_i8.c     |  38 +-
 libgfortran/generated/minloc0_4_m1.c     |  38 +-
 libgfortran/generated/minloc0_4_m16.c    |  38 +-
 libgfortran/generated/minloc0_4_m2.c     |  38 +-
 libgfortran/generated/minloc0_4_m4.c     |  38 +-
 libgfortran/generated/minloc0_4_m8.c     |  38 +-
 libgfortran/generated/minloc0_4_r10.c    |  38 +-
 libgfortran/generated/minloc0_4_r16.c    |  38 +-
 libgfortran/generated/minloc0_4_r17.c    |  38 +-
 libgfortran/generated/minloc0_4_r4.c     |  38 +-
 libgfortran/generated/minloc0_4_r8.c     |  38 +-
 libgfortran/generated/minloc0_4_s1.c     |  26 +-
 libgfortran/generated/minloc0_4_s4.c     |  26 +-
 libgfortran/generated/minloc0_8_i1.c     |  38 +-
 libgfortran/generated/minloc0_8_i16.c    |  38 +-
 libgfortran/generated/minloc0_8_i2.c     |  38 +-
 libgfortran/generated/minloc0_8_i4.c     |  38 +-
 libgfortran/generated/minloc0_8_i8.c     |  38 +-
 libgfortran/generated/minloc0_8_m1.c     |  38 +-
 libgfortran/generated/minloc0_8_m16.c    |  38 +-
 libgfortran/generated/minloc0_8_m2.c     |  38 +-
 libgfortran/generated/minloc0_8_m4.c     |  38 +-
 libgfortran/generated/minloc0_8_m8.c     |  38 +-
 libgfortran/generated/minloc0_8_r10.c    |  38 +-
 libgfortran/generated/minloc0_8_r16.c    |  38 +-
 libgfortran/generated/minloc0_8_r17.c    |  38 +-
 libgfortran/generated/minloc0_8_r4.c     |  38 +-
 libgfortran/generated/minloc0_8_r8.c     |  38 +-
 libgfortran/generated/minloc0_8_s1.c     |  26 +-
 libgfortran/generated/minloc0_8_s4.c     |  26 +-
 libgfortran/generated/minloc2_16_s1.c    |   2 +-
 libgfortran/generated/minloc2_16_s4.c    |   2 +-
 libgfortran/generated/minloc2_4_s1.c     |   2 +-
 libgfortran/generated/minloc2_4_s4.c     |   2 +-
 libgfortran/generated/minloc2_8_s1.c     |   2 +-
 libgfortran/generated/minloc2_8_s4.c     |   2 +-
 libgfortran/generated/pack_c10.c         |   2 +-
 libgfortran/generated/pack_c16.c         |   2 +-
 libgfortran/generated/pack_c17.c         |   2 +-
 libgfortran/generated/pack_c4.c          |   2 +-
 libgfortran/generated/pack_c8.c          |   2 +-
 libgfortran/generated/pack_i1.c          |   2 +-
 libgfortran/generated/pack_i16.c         |   2 +-
 libgfortran/generated/pack_i2.c          |   2 +-
 libgfortran/generated/pack_i4.c          |   2 +-
 libgfortran/generated/pack_i8.c          |   2 +-
 libgfortran/generated/pack_r10.c         |   2 +-
 libgfortran/generated/pack_r16.c         |   2 +-
 libgfortran/generated/pack_r17.c         |   2 +-
 libgfortran/generated/pack_r4.c          |   2 +-
 libgfortran/generated/pack_r8.c          |   2 +-
 libgfortran/generated/reshape_c10.c      |   6 +-
 libgfortran/generated/reshape_c16.c      |   6 +-
 libgfortran/generated/reshape_c17.c      |   6 +-
 libgfortran/generated/reshape_c4.c       |   6 +-
 libgfortran/generated/reshape_c8.c       |   6 +-
 libgfortran/generated/reshape_i16.c      |   6 +-
 libgfortran/generated/reshape_i4.c       |   6 +-
 libgfortran/generated/reshape_i8.c       |   6 +-
 libgfortran/generated/reshape_r10.c      |   6 +-
 libgfortran/generated/reshape_r16.c      |   6 +-
 libgfortran/generated/reshape_r17.c      |   6 +-
 libgfortran/generated/reshape_r4.c       |   6 +-
 libgfortran/generated/reshape_r8.c       |   6 +-
 libgfortran/generated/shape_i1.c         |   5 +-
 libgfortran/generated/shape_i16.c        |   5 +-
 libgfortran/generated/shape_i2.c         |   5 +-
 libgfortran/generated/shape_i4.c         |   5 +-
 libgfortran/generated/shape_i8.c         |   5 +-
 201 files changed, 12252 insertions(+), 12519 deletions(-)

diff --git a/libgfortran/generated/bessel_r10.c b/libgfortran/generated/bessel_r10.c
index 2b38e4c2fddb..07d378af6cdf 100644
--- a/libgfortran/generated/bessel_r10.c
+++ b/libgfortran/generated/bessel_r10.c
@@ -43,12 +43,9 @@ void
 bessel_jn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2, GFC_REAL_10 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_10 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -66,24 +63,22 @@ bessel_jn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2, GFC_REAL_10 x
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       ret->base_addr[0] = 1;
       for (i = 1; i <= n2-n1; i++)
-        ret->base_addr[i*stride] = 0;
+	GFC_DESCRIPTOR1_ELEM (ret, i) = 0;
       return;
     }
 
   last1 = MATHFUNC(jn) (n2, x);
-  ret->base_addr[(n2-n1)*stride] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(jn) (n2 - 1, x);
-  ret->base_addr[(n2-n1-1)*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1-1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -92,9 +87,9 @@ bessel_jn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2, GFC_REAL_10 x
 
   for (i = n2-n1-2; i >= 0; i--)
     {
-      ret->base_addr[i*stride] = x2rev * (i+1+n1) * last2 - last1;
+      GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i+1+n1) * last2 - last1;
       last1 = last2;
-      last2 = ret->base_addr[i*stride];
+      last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
     }
 }
 
@@ -110,12 +105,9 @@ bessel_yn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2,
 			 GFC_REAL_10 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_10 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -133,27 +125,25 @@ bessel_yn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2,
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       for (i = 0; i <= n2-n1; i++)
 #if defined(GFC_REAL_10_INFINITY)
-        ret->base_addr[i*stride] = -GFC_REAL_10_INFINITY;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_10_INFINITY;
 #else
-        ret->base_addr[i*stride] = -GFC_REAL_10_HUGE;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_10_HUGE;
 #endif
       return;
     }
 
   last1 = MATHFUNC(yn) (n1, x);
-  ret->base_addr[0] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, 0) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(yn) (n1 + 1, x);
-  ret->base_addr[1*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, 1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -165,14 +155,14 @@ bessel_yn_r10 (gfc_array_r10 * const restrict ret, int n1, int n2,
 #if defined(GFC_REAL_10_INFINITY)
       if (unlikely (last2 == -GFC_REAL_10_INFINITY))
 	{
-	  ret->base_addr[i*stride] = -GFC_REAL_10_INFINITY;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_10_INFINITY;
 	}
       else
 #endif
 	{
-	  ret->base_addr[i*stride] = x2rev * (i-1+n1) * last2 - last1;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i-1+n1) * last2 - last1;
 	  last1 = last2;
-	  last2 = ret->base_addr[i*stride];
+	  last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
 	}
     }
 }
diff --git a/libgfortran/generated/bessel_r16.c b/libgfortran/generated/bessel_r16.c
index bf809eba26f6..fbb74ee115d7 100644
--- a/libgfortran/generated/bessel_r16.c
+++ b/libgfortran/generated/bessel_r16.c
@@ -51,12 +51,9 @@ void
 bessel_jn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2, GFC_REAL_16 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_16 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -74,24 +71,22 @@ bessel_jn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2, GFC_REAL_16 x
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       ret->base_addr[0] = 1;
       for (i = 1; i <= n2-n1; i++)
-        ret->base_addr[i*stride] = 0;
+	GFC_DESCRIPTOR1_ELEM (ret, i) = 0;
       return;
     }
 
   last1 = MATHFUNC(jn) (n2, x);
-  ret->base_addr[(n2-n1)*stride] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(jn) (n2 - 1, x);
-  ret->base_addr[(n2-n1-1)*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1-1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -100,9 +95,9 @@ bessel_jn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2, GFC_REAL_16 x
 
   for (i = n2-n1-2; i >= 0; i--)
     {
-      ret->base_addr[i*stride] = x2rev * (i+1+n1) * last2 - last1;
+      GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i+1+n1) * last2 - last1;
       last1 = last2;
-      last2 = ret->base_addr[i*stride];
+      last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
     }
 }
 
@@ -118,12 +113,9 @@ bessel_yn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2,
 			 GFC_REAL_16 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_16 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -141,27 +133,25 @@ bessel_yn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2,
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       for (i = 0; i <= n2-n1; i++)
 #if defined(GFC_REAL_16_INFINITY)
-        ret->base_addr[i*stride] = -GFC_REAL_16_INFINITY;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_16_INFINITY;
 #else
-        ret->base_addr[i*stride] = -GFC_REAL_16_HUGE;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_16_HUGE;
 #endif
       return;
     }
 
   last1 = MATHFUNC(yn) (n1, x);
-  ret->base_addr[0] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, 0) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(yn) (n1 + 1, x);
-  ret->base_addr[1*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, 1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -173,14 +163,14 @@ bessel_yn_r16 (gfc_array_r16 * const restrict ret, int n1, int n2,
 #if defined(GFC_REAL_16_INFINITY)
       if (unlikely (last2 == -GFC_REAL_16_INFINITY))
 	{
-	  ret->base_addr[i*stride] = -GFC_REAL_16_INFINITY;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_16_INFINITY;
 	}
       else
 #endif
 	{
-	  ret->base_addr[i*stride] = x2rev * (i-1+n1) * last2 - last1;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i-1+n1) * last2 - last1;
 	  last1 = last2;
-	  last2 = ret->base_addr[i*stride];
+	  last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
 	}
     }
 }
diff --git a/libgfortran/generated/bessel_r17.c b/libgfortran/generated/bessel_r17.c
index a9e9e9788164..27c398fabd28 100644
--- a/libgfortran/generated/bessel_r17.c
+++ b/libgfortran/generated/bessel_r17.c
@@ -49,12 +49,9 @@ void
 bessel_jn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2, GFC_REAL_17 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_17 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -72,24 +69,22 @@ bessel_jn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2, GFC_REAL_17 x
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       ret->base_addr[0] = 1;
       for (i = 1; i <= n2-n1; i++)
-        ret->base_addr[i*stride] = 0;
+	GFC_DESCRIPTOR1_ELEM (ret, i) = 0;
       return;
     }
 
   last1 = MATHFUNC(jn) (n2, x);
-  ret->base_addr[(n2-n1)*stride] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(jn) (n2 - 1, x);
-  ret->base_addr[(n2-n1-1)*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1-1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -98,9 +93,9 @@ bessel_jn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2, GFC_REAL_17 x
 
   for (i = n2-n1-2; i >= 0; i--)
     {
-      ret->base_addr[i*stride] = x2rev * (i+1+n1) * last2 - last1;
+      GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i+1+n1) * last2 - last1;
       last1 = last2;
-      last2 = ret->base_addr[i*stride];
+      last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
     }
 }
 
@@ -116,12 +111,9 @@ bessel_yn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2,
 			 GFC_REAL_17 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_17 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -139,27 +131,25 @@ bessel_yn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2,
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       for (i = 0; i <= n2-n1; i++)
 #if defined(GFC_REAL_17_INFINITY)
-        ret->base_addr[i*stride] = -GFC_REAL_17_INFINITY;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_17_INFINITY;
 #else
-        ret->base_addr[i*stride] = -GFC_REAL_17_HUGE;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_17_HUGE;
 #endif
       return;
     }
 
   last1 = MATHFUNC(yn) (n1, x);
-  ret->base_addr[0] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, 0) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(yn) (n1 + 1, x);
-  ret->base_addr[1*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, 1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -171,14 +161,14 @@ bessel_yn_r17 (gfc_array_r17 * const restrict ret, int n1, int n2,
 #if defined(GFC_REAL_17_INFINITY)
       if (unlikely (last2 == -GFC_REAL_17_INFINITY))
 	{
-	  ret->base_addr[i*stride] = -GFC_REAL_17_INFINITY;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_17_INFINITY;
 	}
       else
 #endif
 	{
-	  ret->base_addr[i*stride] = x2rev * (i-1+n1) * last2 - last1;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i-1+n1) * last2 - last1;
 	  last1 = last2;
-	  last2 = ret->base_addr[i*stride];
+	  last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
 	}
     }
 }
diff --git a/libgfortran/generated/bessel_r4.c b/libgfortran/generated/bessel_r4.c
index 316609fbd512..7f746cc9c1ba 100644
--- a/libgfortran/generated/bessel_r4.c
+++ b/libgfortran/generated/bessel_r4.c
@@ -43,12 +43,9 @@ void
 bessel_jn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2, GFC_REAL_4 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_4 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -66,24 +63,22 @@ bessel_jn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2, GFC_REAL_4 x)
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       ret->base_addr[0] = 1;
       for (i = 1; i <= n2-n1; i++)
-        ret->base_addr[i*stride] = 0;
+	GFC_DESCRIPTOR1_ELEM (ret, i) = 0;
       return;
     }
 
   last1 = MATHFUNC(jn) (n2, x);
-  ret->base_addr[(n2-n1)*stride] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(jn) (n2 - 1, x);
-  ret->base_addr[(n2-n1-1)*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1-1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -92,9 +87,9 @@ bessel_jn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2, GFC_REAL_4 x)
 
   for (i = n2-n1-2; i >= 0; i--)
     {
-      ret->base_addr[i*stride] = x2rev * (i+1+n1) * last2 - last1;
+      GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i+1+n1) * last2 - last1;
       last1 = last2;
-      last2 = ret->base_addr[i*stride];
+      last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
     }
 }
 
@@ -110,12 +105,9 @@ bessel_yn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2,
 			 GFC_REAL_4 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_4 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -133,27 +125,25 @@ bessel_yn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2,
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       for (i = 0; i <= n2-n1; i++)
 #if defined(GFC_REAL_4_INFINITY)
-        ret->base_addr[i*stride] = -GFC_REAL_4_INFINITY;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_4_INFINITY;
 #else
-        ret->base_addr[i*stride] = -GFC_REAL_4_HUGE;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_4_HUGE;
 #endif
       return;
     }
 
   last1 = MATHFUNC(yn) (n1, x);
-  ret->base_addr[0] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, 0) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(yn) (n1 + 1, x);
-  ret->base_addr[1*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, 1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -165,14 +155,14 @@ bessel_yn_r4 (gfc_array_r4 * const restrict ret, int n1, int n2,
 #if defined(GFC_REAL_4_INFINITY)
       if (unlikely (last2 == -GFC_REAL_4_INFINITY))
 	{
-	  ret->base_addr[i*stride] = -GFC_REAL_4_INFINITY;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_4_INFINITY;
 	}
       else
 #endif
 	{
-	  ret->base_addr[i*stride] = x2rev * (i-1+n1) * last2 - last1;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i-1+n1) * last2 - last1;
 	  last1 = last2;
-	  last2 = ret->base_addr[i*stride];
+	  last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
 	}
     }
 }
diff --git a/libgfortran/generated/bessel_r8.c b/libgfortran/generated/bessel_r8.c
index 66878a21e8e6..ff90e439c0f1 100644
--- a/libgfortran/generated/bessel_r8.c
+++ b/libgfortran/generated/bessel_r8.c
@@ -43,12 +43,9 @@ void
 bessel_jn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2, GFC_REAL_8 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_8 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -66,24 +63,22 @@ bessel_jn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2, GFC_REAL_8 x)
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       ret->base_addr[0] = 1;
       for (i = 1; i <= n2-n1; i++)
-        ret->base_addr[i*stride] = 0;
+	GFC_DESCRIPTOR1_ELEM (ret, i) = 0;
       return;
     }
 
   last1 = MATHFUNC(jn) (n2, x);
-  ret->base_addr[(n2-n1)*stride] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(jn) (n2 - 1, x);
-  ret->base_addr[(n2-n1-1)*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, n2-n1-1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -92,9 +87,9 @@ bessel_jn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2, GFC_REAL_8 x)
 
   for (i = n2-n1-2; i >= 0; i--)
     {
-      ret->base_addr[i*stride] = x2rev * (i+1+n1) * last2 - last1;
+      GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i+1+n1) * last2 - last1;
       last1 = last2;
-      last2 = ret->base_addr[i*stride];
+      last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
     }
 }
 
@@ -110,12 +105,9 @@ bessel_yn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2,
 			 GFC_REAL_8 x)
 {
   int i;
-  index_type stride;
 
   GFC_REAL_8 last1, last2, x2rev;
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (ret->base_addr == NULL)
     {
       size_t size = n2 < n1 ? 0 : n2-n1+1; 
@@ -133,27 +125,25 @@ bessel_yn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2,
 		  "(%ld vs. %ld)", (long int) n2-n1,
 		  (long int) GFC_DESCRIPTOR_EXTENT(ret,0));
 
-  stride = GFC_DESCRIPTOR_STRIDE(ret,0);
-
   if (unlikely (x == 0))
     {
       for (i = 0; i <= n2-n1; i++)
 #if defined(GFC_REAL_8_INFINITY)
-        ret->base_addr[i*stride] = -GFC_REAL_8_INFINITY;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_8_INFINITY;
 #else
-        ret->base_addr[i*stride] = -GFC_REAL_8_HUGE;
+        GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_8_HUGE;
 #endif
       return;
     }
 
   last1 = MATHFUNC(yn) (n1, x);
-  ret->base_addr[0] = last1;
+  GFC_DESCRIPTOR1_ELEM (ret, 0) = last1;
 
   if (n1 == n2)
     return;
 
   last2 = MATHFUNC(yn) (n1 + 1, x);
-  ret->base_addr[1*stride] = last2;
+  GFC_DESCRIPTOR1_ELEM (ret, 1) = last2;
 
   if (n1 + 1 == n2)
     return;
@@ -165,14 +155,14 @@ bessel_yn_r8 (gfc_array_r8 * const restrict ret, int n1, int n2,
 #if defined(GFC_REAL_8_INFINITY)
       if (unlikely (last2 == -GFC_REAL_8_INFINITY))
 	{
-	  ret->base_addr[i*stride] = -GFC_REAL_8_INFINITY;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = -GFC_REAL_8_INFINITY;
 	}
       else
 #endif
 	{
-	  ret->base_addr[i*stride] = x2rev * (i-1+n1) * last2 - last1;
+	  GFC_DESCRIPTOR1_ELEM (ret, i) = x2rev * (i-1+n1) * last2 - last1;
 	  last1 = last2;
-	  last2 = ret->base_addr[i*stride];
+	  last2 = GFC_DESCRIPTOR1_ELEM (ret, i);
 	}
     }
 }
diff --git a/libgfortran/generated/findloc0_c10.c b/libgfortran/generated/findloc0_c10.c
index 5b5b0e31daef..f25d697c5344 100644
--- a/libgfortran/generated/findloc0_c10.c
+++ b/libgfortran/generated/findloc0_c10.c
@@ -41,9 +41,7 @@ findloc0_c10 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_10 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_c10 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_c10 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_c10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_c10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_c10 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_10 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_c10 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_c10 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_c10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_c10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_c10 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_c10 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_c16.c b/libgfortran/generated/findloc0_c16.c
index 83d5c0e46c53..d6bd365c30ed 100644
--- a/libgfortran/generated/findloc0_c16.c
+++ b/libgfortran/generated/findloc0_c16.c
@@ -41,9 +41,7 @@ findloc0_c16 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_16 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_c16 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_c16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_c16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_c16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_c16 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_16 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_c16 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_c16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_c16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_c16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_c16 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_c16 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_c17.c b/libgfortran/generated/findloc0_c17.c
index cc6205803630..69e8a9e9e964 100644
--- a/libgfortran/generated/findloc0_c17.c
+++ b/libgfortran/generated/findloc0_c17.c
@@ -41,9 +41,7 @@ findloc0_c17 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_17 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_c17 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_c17 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_c17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_c17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_c17 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_17 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_c17 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_c17 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_c17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_c17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_c17 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_c17 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_c4.c b/libgfortran/generated/findloc0_c4.c
index 042a0be732fe..6d653f165468 100644
--- a/libgfortran/generated/findloc0_c4.c
+++ b/libgfortran/generated/findloc0_c4.c
@@ -41,9 +41,7 @@ findloc0_c4 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_4 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_c4 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_c4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_c4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_c4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_c4 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_4 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_c4 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_c4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_c4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_c4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_c4 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_c4 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_c8.c b/libgfortran/generated/findloc0_c8.c
index c928e30613a5..a04601f46e4e 100644
--- a/libgfortran/generated/findloc0_c8.c
+++ b/libgfortran/generated/findloc0_c8.c
@@ -41,9 +41,7 @@ findloc0_c8 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_8 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_c8 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_c8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_c8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_c8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_c8 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_COMPLEX_8 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_c8 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_c8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_c8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_c8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_c8 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_c8 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_i1.c b/libgfortran/generated/findloc0_i1.c
index f461b1d64449..9145a6557e0a 100644
--- a/libgfortran/generated/findloc0_i1.c
+++ b/libgfortran/generated/findloc0_i1.c
@@ -41,9 +41,7 @@ findloc0_i1 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_1 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_i1 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_i1 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_i1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_i1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_i1 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_1 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_i1 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_i1 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_i1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_i1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_i1 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_i1 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_i16.c b/libgfortran/generated/findloc0_i16.c
index 3daee388de26..67aad4ca2fdd 100644
--- a/libgfortran/generated/findloc0_i16.c
+++ b/libgfortran/generated/findloc0_i16.c
@@ -41,9 +41,7 @@ findloc0_i16 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_16 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_i16 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_i16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_i16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_i16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_i16 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_16 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_i16 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_i16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_i16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_i16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_i16 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_i16 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_i2.c b/libgfortran/generated/findloc0_i2.c
index 66080fc10ea7..d87f5811739a 100644
--- a/libgfortran/generated/findloc0_i2.c
+++ b/libgfortran/generated/findloc0_i2.c
@@ -41,9 +41,7 @@ findloc0_i2 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_2 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_i2 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_i2 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_i2 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_i2 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_i2 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_2 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_i2 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_i2 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_i2 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_i2 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_i2 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_i2 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_i4.c b/libgfortran/generated/findloc0_i4.c
index 9ece6a04f0db..9500694aa419 100644
--- a/libgfortran/generated/findloc0_i4.c
+++ b/libgfortran/generated/findloc0_i4.c
@@ -41,9 +41,7 @@ findloc0_i4 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_4 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_i4 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_i4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_i4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_i4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_i4 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_4 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_i4 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_i4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_i4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_i4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_i4 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_i4 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_i8.c b/libgfortran/generated/findloc0_i8.c
index d51818c92c2a..31c8e3ea1dec 100644
--- a/libgfortran/generated/findloc0_i8.c
+++ b/libgfortran/generated/findloc0_i8.c
@@ -41,9 +41,7 @@ findloc0_i8 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_8 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_i8 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_i8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_i8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_i8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_i8 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_INTEGER_8 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_i8 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_i8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_i8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_i8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_i8 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_i8 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_r10.c b/libgfortran/generated/findloc0_r10.c
index 53014d2cdda2..b256a739588e 100644
--- a/libgfortran/generated/findloc0_r10.c
+++ b/libgfortran/generated/findloc0_r10.c
@@ -41,9 +41,7 @@ findloc0_r10 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_10 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_r10 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_r10 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_r10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_r10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_r10 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_10 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_r10 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_r10 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_r10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_r10 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_r10 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_r10 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_r16.c b/libgfortran/generated/findloc0_r16.c
index 4220fb41c5a3..109c209892fe 100644
--- a/libgfortran/generated/findloc0_r16.c
+++ b/libgfortran/generated/findloc0_r16.c
@@ -41,9 +41,7 @@ findloc0_r16 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_16 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_r16 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_r16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_r16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_r16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_r16 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_16 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_r16 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_r16 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_r16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_r16 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_r16 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_r16 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_r17.c b/libgfortran/generated/findloc0_r17.c
index 5c09579d9087..ef296b2294e9 100644
--- a/libgfortran/generated/findloc0_r17.c
+++ b/libgfortran/generated/findloc0_r17.c
@@ -41,9 +41,7 @@ findloc0_r17 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_17 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_r17 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_r17 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_r17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_r17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_r17 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_17 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_r17 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_r17 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_r17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_r17 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_r17 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_r17 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_r4.c b/libgfortran/generated/findloc0_r4.c
index 4be93e94508a..b06bcb7f6b45 100644
--- a/libgfortran/generated/findloc0_r4.c
+++ b/libgfortran/generated/findloc0_r4.c
@@ -41,9 +41,7 @@ findloc0_r4 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_4 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_r4 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_r4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_r4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_r4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_r4 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_4 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_r4 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_r4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_r4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_r4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_r4 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_r4 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_r8.c b/libgfortran/generated/findloc0_r8.c
index e215854c55b0..893b27351c0b 100644
--- a/libgfortran/generated/findloc0_r8.c
+++ b/libgfortran/generated/findloc0_r8.c
@@ -41,9 +41,7 @@ findloc0_r8 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_8 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -66,12 +64,9 @@ findloc0_r8 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -88,7 +83,7 @@ findloc0_r8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -97,7 +92,7 @@ findloc0_r8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -134,7 +129,7 @@ findloc0_r8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -178,9 +173,7 @@ mfindloc0_r8 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_REAL_8 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -222,12 +215,9 @@ mfindloc0_r8 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -245,7 +235,7 @@ mfindloc0_r8 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * 1;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -254,7 +244,7 @@ mfindloc0_r8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -294,7 +284,7 @@ mfindloc0_r8 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && *base == value))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -338,8 +328,6 @@ sfindloc0_r8 (gfc_array_index_type * const restrict retarray,
 	    GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -366,10 +354,8 @@ sfindloc0_r8 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_s1.c b/libgfortran/generated/findloc0_s1.c
index 8a64d306b27c..2564ac505a36 100644
--- a/libgfortran/generated/findloc0_s1.c
+++ b/libgfortran/generated/findloc0_s1.c
@@ -42,9 +42,7 @@ findloc0_s1 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_UINTEGER_1 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -67,12 +65,9 @@ findloc0_s1 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -89,7 +84,7 @@ findloc0_s1 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * len_array;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -98,7 +93,7 @@ findloc0_s1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(compare_string (len_array, (char *) base, len_value, (char *) value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -135,7 +130,7 @@ findloc0_s1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(compare_string (len_array, (char *) base, len_value, (char *) value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -181,9 +176,7 @@ mfindloc0_s1 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_UINTEGER_1 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -225,12 +218,9 @@ mfindloc0_s1 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -248,7 +238,7 @@ mfindloc0_s1 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * len_array;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -257,7 +247,7 @@ mfindloc0_s1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && compare_string (len_array, (char *) base, len_value, (char *) value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -297,7 +287,7 @@ mfindloc0_s1 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && compare_string (len_array, (char *) base, len_value, (char *) value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -343,8 +333,6 @@ sfindloc0_s1 (gfc_array_index_type * const restrict retarray,
 	    gfc_charlen_type len_value)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -371,10 +359,8 @@ sfindloc0_s1 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc0_s4.c b/libgfortran/generated/findloc0_s4.c
index 50b7f673f7e3..3da682a5d639 100644
--- a/libgfortran/generated/findloc0_s4.c
+++ b/libgfortran/generated/findloc0_s4.c
@@ -42,9 +42,7 @@ findloc0_s4 (gfc_array_index_type * const restrict retarray,
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_UINTEGER_4 *base;
-  index_type * restrict dest;
   index_type rank;
   index_type n;
   index_type sz;
@@ -67,12 +65,9 @@ findloc0_s4 (gfc_array_index_type * const restrict retarray,
 				"FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -89,7 +84,7 @@ findloc0_s4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * len_array;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
 
       while (1)
         {
@@ -98,7 +93,7 @@ findloc0_s4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(compare_string_char4 (len_array, base, len_value, value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -135,7 +130,7 @@ findloc0_s4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(compare_string_char4 (len_array, base, len_value, value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -181,9 +176,7 @@ mfindloc0_s4 (gfc_array_index_type * const restrict retarray,
   index_type extent[GFC_MAX_DIMENSIONS];
   index_type sstride[GFC_MAX_DIMENSIONS];
   index_type mstride[GFC_MAX_DIMENSIONS];
-  index_type dstride;
   const GFC_UINTEGER_4 *base;
-  index_type * restrict dest;
   GFC_LOGICAL_1 *mbase;
   index_type rank;
   index_type n;
@@ -225,12 +218,9 @@ mfindloc0_s4 (gfc_array_index_type * const restrict retarray,
   else
     internal_error (NULL, "Funny sized logical array");
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
-
   /* Set the return value.  */
   for (n = 0; n < rank; n++)
-    dest[n * dstride] = 0;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0;
 
   sz = 1;
   for (n = 0; n < rank; n++)
@@ -248,7 +238,7 @@ mfindloc0_s4 (gfc_array_index_type * const restrict retarray,
 
   if (back)
     {
-      base = array->base_addr + (sz - 1) * len_array;
+      base = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, sz - 1);
       mbase = mbase + (sz - 1) * mask_kind;
       while (1)
         {
@@ -257,7 +247,7 @@ mfindloc0_s4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && compare_string_char4 (len_array, base, len_value, value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = extent[n] - count[n];
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = extent[n] - count[n];
 
 		  return;
 		}
@@ -297,7 +287,7 @@ mfindloc0_s4 (gfc_array_index_type * const restrict retarray,
 	      if (unlikely(*mbase && compare_string_char4 (len_array, base, len_value, value) == 0))
 	        {
 		  for (n = 0; n < rank; n++)
-		    dest[n * dstride] = count[n] + 1;
+		    GFC_DESCRIPTOR1_ELEM (retarray, n) = count[n] + 1;
 
 		  return;
 		}
@@ -343,8 +333,6 @@ sfindloc0_s4 (gfc_array_index_type * const restrict retarray,
 	    gfc_charlen_type len_value)
 {
   index_type rank;
-  index_type dstride;
-  index_type * restrict dest;
   index_type n;
 
   if (mask == NULL || *mask)
@@ -371,10 +359,8 @@ sfindloc0_s4 (gfc_array_index_type * const restrict retarray,
 			       "FINDLOC");
     }
 
-  dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
-  dest = retarray->base_addr;
   for (n = 0; n<rank; n++)
-    dest[n * dstride] = 0 ;
+    GFC_DESCRIPTOR1_ELEM (retarray, n) = 0 ;
 }
 
 #endif
diff --git a/libgfortran/generated/findloc2_s1.c b/libgfortran/generated/findloc2_s1.c
index eeea821d83c5..5a896631d79e 100644
--- a/libgfortran/generated/findloc2_s1.c
+++ b/libgfortran/generated/findloc2_s1.c
@@ -48,7 +48,7 @@ findloc2_s1 (gfc_array_s1 * const restrict array, const GFC_UINTEGER_1 * restric
   sstride = GFC_DESCRIPTOR_STRIDE(array,0) * len_array;
   if (back)
     {
-      src = array->base_addr + (extent - 1) * sstride;
+      src = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, extent - 1);
       for (i = extent; i > 0; i--)
 	{
 	  if (compare_string (len_array, (char *) src, len_value, (char *) value) == 0)
@@ -110,7 +110,7 @@ mfindloc2_s1 (gfc_array_s1 * const restrict array,
 
   if (back)
     {
-      src = array->base_addr + (extent - 1) * sstride;
+      src = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, extent - 1);
       mbase += (extent - 1) * mstride;
       for (i = extent; i > 0; i--)
 	{
diff --git a/libgfortran/generated/findloc2_s4.c b/libgfortran/generated/findloc2_s4.c
index a336e34122aa..f1da36bb4c05 100644
--- a/libgfortran/generated/findloc2_s4.c
+++ b/libgfortran/generated/findloc2_s4.c
@@ -48,7 +48,7 @@ findloc2_s4 (gfc_array_s4 * const restrict array, const GFC_UINTEGER_4 * restric
   sstride = GFC_DESCRIPTOR_STRIDE(array,0) * len_array;
   if (back)
     {
-      src = array->base_addr + (extent - 1) * sstride;
+      src = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, extent - 1);
       for (i = extent; i > 0; i--)
 	{
 	  if (compare_string_char4 (len_array, src, len_value, value) == 0)
@@ -110,7 +110,7 @@ mfindloc2_s4 (gfc_array_s4 * const restrict array,
 
   if (back)
     {
-      src = array->base_addr + (extent - 1) * sstride;
+      src = GFC_DESCRIPTOR1_ELEM_ADDRESS (array, extent - 1);
       mbase += (extent - 1) * mstride;
       for (i = extent; i > 0; i--)
 	{
diff --git a/libgfortran/generated/matmul_c10.c b/libgfortran/generated/matmul_c10.c
index 3099cad8bd9a..93ab625e0825 100644
--- a/libgfortran/generated/matmul_c10.c
+++ b/libgfortran/generated/matmul_c10.c
@@ -313,10 +313,19 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_10) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_c10_avx (gfc_array_c10 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_10) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_10)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_10)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_10) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_c10_avx2 (gfc_array_c10 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_10) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_10)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_10)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_10) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_c10_avx512f (gfc_array_c10 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_10) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_10)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_10)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_10) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_c10_vanilla (gfc_array_c10 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_10) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_10)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_10)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_10)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_10)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_10) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_10) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_10)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_10)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_c16.c b/libgfortran/generated/matmul_c16.c
index 65a9523553de..e6e4dfd5be2c 100644
--- a/libgfortran/generated/matmul_c16.c
+++ b/libgfortran/generated/matmul_c16.c
@@ -313,10 +313,19 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_c16_avx (gfc_array_c16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_c16_avx2 (gfc_array_c16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_c16_avx512f (gfc_array_c16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_c16_vanilla (gfc_array_c16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_c17.c b/libgfortran/generated/matmul_c17.c
index 19e955884db9..bdb1daad7f3c 100644
--- a/libgfortran/generated/matmul_c17.c
+++ b/libgfortran/generated/matmul_c17.c
@@ -313,10 +313,19 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_17) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_c17_avx (gfc_array_c17 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_17) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_17)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_17)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_17) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_c17_avx2 (gfc_array_c17 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_17) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_17)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_17)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_17) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_c17_avx512f (gfc_array_c17 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_17) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_17)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_17)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_17) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_c17_vanilla (gfc_array_c17 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_17) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_17)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_17)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_17)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_17)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_17) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_c17 (gfc_array_c17 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_17) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_17)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_17)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_c4.c b/libgfortran/generated/matmul_c4.c
index fda4ab5e2961..062595f9ee07 100644
--- a/libgfortran/generated/matmul_c4.c
+++ b/libgfortran/generated/matmul_c4.c
@@ -313,10 +313,19 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_4) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_c4_avx (gfc_array_c4 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_4) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_4)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_4)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_4) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_c4_avx2 (gfc_array_c4 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_4) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_4)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_4)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_4) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_c4_avx512f (gfc_array_c4 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_4) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_4)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_4)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_4) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_c4_vanilla (gfc_array_c4 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_4) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_4)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_4)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_4)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_4)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_4) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_4) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_4)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_4)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_c8.c b/libgfortran/generated/matmul_c8.c
index cca6a3220e33..f09f9b75a1d7 100644
--- a/libgfortran/generated/matmul_c8.c
+++ b/libgfortran/generated/matmul_c8.c
@@ -313,10 +313,19 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_8) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_c8_avx (gfc_array_c8 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_8) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_8)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_8)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_8) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_c8_avx2 (gfc_array_c8 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_8) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_8)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_8)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_8) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_c8_avx512f (gfc_array_c8 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_8) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_8)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_8)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_8) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_c8_vanilla (gfc_array_c8 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_8) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_8)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_8)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_COMPLEX_8)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_COMPLEX_8)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_COMPLEX_8) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_COMPLEX_8) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_COMPLEX_8)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_COMPLEX_8)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_i1.c b/libgfortran/generated/matmul_i1.c
index 08d18a36d0f5..d7b38bb05c3a 100644
--- a/libgfortran/generated/matmul_i1.c
+++ b/libgfortran/generated/matmul_i1.c
@@ -313,10 +313,19 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_1) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_i1_avx (gfc_array_m1 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_1) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_1)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_1)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_1) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_i1_avx2 (gfc_array_m1 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_1) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_1)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_1)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_1) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_i1_avx512f (gfc_array_m1 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_1) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_1)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_1)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_1) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_i1_vanilla (gfc_array_m1 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_1) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_1)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_1)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_1)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_1)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_1) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_i1 (gfc_array_m1 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_1) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_1)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_1)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_i16.c b/libgfortran/generated/matmul_i16.c
index d6f63d7afb5a..a0372e65df71 100644
--- a/libgfortran/generated/matmul_i16.c
+++ b/libgfortran/generated/matmul_i16.c
@@ -313,10 +313,19 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_i16_avx (gfc_array_m16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_i16_avx2 (gfc_array_m16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1632,38 +1665,38 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1672,6 +1705,9 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1706,7 +1742,7 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1721,23 +1757,23 @@ matmul_i16_avx512f (gfc_array_m16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2016,10 +2052,19 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2071,20 +2116,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2093,7 +2138,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2104,100 +2149,100 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2209,38 +2254,38 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2249,6 +2294,9 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2283,7 +2331,7 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2298,23 +2346,23 @@ matmul_i16_vanilla (gfc_array_m16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -2652,10 +2700,19 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_16)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_16)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -2707,20 +2764,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -2729,7 +2786,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -2740,100 +2797,100 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -2845,38 +2902,38 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -2885,6 +2942,9 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -2919,7 +2979,7 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_16) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -2934,23 +2994,23 @@ matmul_i16 (gfc_array_m16 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_16) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_16)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_16)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
diff --git a/libgfortran/generated/matmul_i2.c b/libgfortran/generated/matmul_i2.c
index da5f184d1ac6..0c70489c26a7 100644
--- a/libgfortran/generated/matmul_i2.c
+++ b/libgfortran/generated/matmul_i2.c
@@ -313,10 +313,19 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_2)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_2)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -368,20 +377,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -390,7 +399,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -401,100 +410,100 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -506,38 +515,38 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -546,6 +555,9 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -580,7 +592,7 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_2) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -595,23 +607,23 @@ matmul_i2_avx (gfc_array_m2 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_2) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_2)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_2)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -876,10 +888,19 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_2)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_2)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -931,20 +952,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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -953,7 +974,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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -964,100 +985,100 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 1) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 1);
 				  f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 2) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 2);
 				  f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + (j + 3) * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j + 3);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i, j + 1) = f12;
+			      C_ARRAY_ELEM (i, j + 2) = f13;
+			      C_ARRAY_ELEM (i, j + 3) = f14;
 			    }
 			}
 		    }
@@ -1069,38 +1090,38 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 			  i5 = ii + uisec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f21 = C_ARRAY_ELEM (i + 1, j);
+			      f31 = C_ARRAY_ELEM (i + 2, j);
+			      f41 = C_ARRAY_ELEM (i + 3, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      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;
+			      C_ARRAY_ELEM (i, j) = f11;
+			      C_ARRAY_ELEM (i + 1, j) = f21;
+			      C_ARRAY_ELEM (i + 2, j) = f31;
+			      C_ARRAY_ELEM (i + 3, j) = f41;
 			    }
 			  i5 = ii + isec;
 			  for (i = ii + uisec; i < i5; ++i)
 			    {
-			      f11 = c[i + j * c_dim1];
+			      f11 = C_ARRAY_ELEM (i, j);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				}
-			      c[i + j * c_dim1] = f11;
+			      C_ARRAY_ELEM (i, j) = f11;
 			    }
 			}
 		    }
@@ -1109,6 +1130,9 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 	}
       free(t1);
       return;
+#undef A_ARRAY_ELEM
+#undef B_ARRAY_ELEM
+#undef C_ARRAY_ELEM
     }
   else if (rxstride == 1 && aystride == 1 && bxstride == 1)
     {
@@ -1143,7 +1167,7 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 	      bbase_y = &bbase[y*bystride];
 	      s = (GFC_UINTEGER_2) 0;
 	      for (n = 0; n < count; n++)
-		s += abase[n*axstride] * bbase_y[n];
+		s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n];
 	      dest[y*rystride] = s;
 	    }
 	}
@@ -1158,23 +1182,23 @@ matmul_i2_avx2 (gfc_array_m2 * const restrict retarray,
 	  bbase_y = &bbase[y*bystride];
 	  s = (GFC_UINTEGER_2) 0;
 	  for (n = 0; n < count; n++)
-	    s += abase[n*axstride] * bbase_y[n*bxstride];
-	  dest[y*rxstride] = s;
+	    s += GFC_DESCRIPTOR1_ELEM (a, n) * bbase_y[n*bxstride];
+	  GFC_DESCRIPTOR1_ELEM (retarray, y) = s;
 	}
     }
   else if (axstride < aystride)
     {
       for (y = 0; y < ycount; y++)
 	for (x = 0; x < xcount; x++)
-	  dest[x*rxstride + y*rystride] = (GFC_UINTEGER_2)0;
+	  GFC_DESCRIPTOR2_ELEM (retarray, x, y) = (GFC_UINTEGER_2)0;
 
       for (y = 0; y < ycount; y++)
 	for (n = 0; n < count; n++)
 	  for (x = 0; x < xcount; x++)
 	    /* dest[x,y] += a[x,n] * b[n,y] */
-	    dest[x*rxstride + y*rystride] +=
-					abase[x*axstride + n*aystride] *
-					bbase[n*bxstride + y*bystride];
+	    GFC_DESCRIPTOR2_ELEM (retarray, x, y)
+		    += GFC_DESCRIPTOR2_ELEM (a, x, n)
+		       * GFC_DESCRIPTOR2_ELEM (b, n, y);
     }
   else
     {
@@ -1439,10 +1463,19 @@ matmul_i2_avx512f (gfc_array_m2 * const restrict retarray,
       a_dim1 = aystride;
       b_dim1 = bystride;
 
+#define A_ARRAY_ELEM(i,j) \
+    a[(i) + (j) * a_dim1]
+
+#define B_ARRAY_ELEM(i,j) \
+    b[(i) + (j) * b_dim1]
+
+#define C_ARRAY_ELEM(i,j) \
+    c[(i) + (j) * c_dim1]
+
       /* Empty c first.  */
       for (j=0; j<n; j++)
 	for (i=0; i<m; i++)
-	  c[i + j * c_dim1] = (GFC_UINTEGER_2)0;
+	  C_ARRAY_ELEM (i, j) = (GFC_UINTEGER_2)0;
 
       /* Early exit if possible */
       if (m == 0 || n == 0 || k == 0)
@@ -1494,20 +1527,20 @@ matmul_i2_avx512f (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];
+					A_ARRAY_ELEM (i, l);
 			  t1[l - ll + 2 + ((i - ii + 1) << 8) - 257] =
-					a[i + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i, l + 1);
 			  t1[l - ll + 1 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + l * a_dim1];
+					A_ARRAY_ELEM (i + 1, l);
 			  t1[l - ll + 2 + ((i - ii + 2) << 8) - 257] =
-					a[i + 1 + (l + 1) * a_dim1];
+					A_ARRAY_ELEM (i + 1, l + 1);
 			}
 		      if (uisec < isec)
 			{
 			  t1[l - ll + 1 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + l * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l);
 			  t1[l - ll + 2 + (isec << 8) - 257] =
-				    a[ii + isec - 1 + (l + 1) * a_dim1];
+				    A_ARRAY_ELEM (ii + isec - 1, l + 1);
 			}
 		    }
 		  if (ulsec < lsec)
@@ -1516,7 +1549,7 @@ matmul_i2_avx512f (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];
+				    A_ARRAY_ELEM (i, ll + lsec - 1);
 			}
 		    }
 
@@ -1527,100 +1560,100 @@ matmul_i2_avx512f (gfc_array_m2 * const restrict retarray,
 		      i5 = ii + uisec;
 		      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 = C_ARRAY_ELEM (i, j);
+			  f21 = C_ARRAY_ELEM (i + 1, j);
+			  f12 = C_ARRAY_ELEM (i, j + 1);
+			  f22 = C_ARRAY_ELEM (i + 1, j + 1);
+			  f13 = C_ARRAY_ELEM (i, j + 2);
+			  f23 = C_ARRAY_ELEM (i + 1, j + 2);
+			  f14 = C_ARRAY_ELEM (i, j + 3);
+			  f24 = C_ARRAY_ELEM (i + 1, j + 3);
+			  f31 = C_ARRAY_ELEM (i + 2, j);
+			  f41 = C_ARRAY_ELEM (i + 3, j);
+			  f32 = C_ARRAY_ELEM (i + 2, j + 1);
+			  f42 = C_ARRAY_ELEM (i + 3, j + 1);
+			  f33 = C_ARRAY_ELEM (i + 2, j + 2);
+			  f43 = C_ARRAY_ELEM (i + 3, j + 2);
+			  f34 = C_ARRAY_ELEM (i + 2, j + 3);
+			  f44 = C_ARRAY_ELEM (i + 3, j + 3);
 			  i6 = ll + lsec;
 			  for (l = ll; l < i6; ++l)
 			    {
 			      f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f21 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f12 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f22 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f13 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f23 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f14 += t1[l - ll + 1 + ((i - ii + 1) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f24 += t1[l - ll + 1 + ((i - ii + 2) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f31 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f41 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + j * b_dim1];
+				      * B_ARRAY_ELEM (l, j);
 			      f32 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f42 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 1) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 1);
 			      f33 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f43 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 2) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 2);
 			      f34 += t1[l - ll + 1 + ((i - ii + 3) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			      f44 += t1[l - ll + 1 + ((i - ii + 4) << 8) - 257]
-				      * b[l + (j + 3) * b_dim1];
+				      * B_ARRAY_ELEM (l, j + 3);
 			    }
-			  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;
+			  C_ARRAY_ELEM (i, j) = f11;
+			  C_ARRAY_ELEM (i + 1, j) = f21;
+			  C_ARRAY_ELEM (i, j + 1) = f12;
+			  C_ARRAY_ELEM (i + 1, j + 1) = f22;
+			  C_ARRAY_ELEM (i, j + 2) = f13;
+			  C_ARRAY_ELEM (i + 1, j + 2) = f23;
+			  C_ARRAY_ELEM (i, j + 3) = f14;
+			  C_ARRAY_ELEM (i + 1, j + 3) = f24;
+			  C_ARRAY_ELEM (i + 2, j) = f31;
+			  C_ARRAY_ELEM (i + 3, j) = f41;
+			  C_ARRAY_ELEM (i + 2, j + 1) = f32;
+			  C_ARRAY_ELEM (i + 3, j + 1) = f42;
+			  C_ARRAY_ELEM (i + 2, j + 2) = f33;
+			  C_ARRAY_ELEM (i + 3, j + 2) = f43;
+			  C_ARRAY_ELEM (i + 2, j + 3) = f34;
+			  C_ARRAY_ELEM (i + 3, j + 3) = f44;
 			}
 		      if (uisec < isec)
 			{
 			  i5 = ii + isec;
 			  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 = C_ARRAY_ELEM (i, j);
+			      f12 = C_ARRAY_ELEM (i, j + 1);
+			      f13 = C_ARRAY_ELEM (i, j + 2);
+			      f14 = C_ARRAY_ELEM (i, j + 3);
 			      i6 = ll + lsec;
 			      for (l = ll; l < i6; ++l)
 				{
 				  f11 += t1[l - ll + 1 + ((i - ii + 1) << 8) -
-					  257] * b[l + j * b_dim1];
+					  257] * B_ARRAY_ELEM (l, j);
 				  f12 += t1[l - ll + 1 + ((i[...]

[diff truncated at 524288 bytes]


More information about the Gcc-cvs mailing list