diff options
Diffstat (limited to 'libgfortran/generated/eoshift3_16.c')
-rw-r--r-- | libgfortran/generated/eoshift3_16.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/libgfortran/generated/eoshift3_16.c b/libgfortran/generated/eoshift3_16.c index 8040b1e71d4..621fd6f0dc8 100644 --- a/libgfortran/generated/eoshift3_16.c +++ b/libgfortran/generated/eoshift3_16.c @@ -198,12 +198,24 @@ eoshift3 (gfc_array_char * const restrict ret, src = sptr; dest = &rptr[delta * roffset]; } - for (n = 0; n < len - delta; n++) - { - memcpy (dest, src, size); - dest += roffset; - src += soffset; - } + + /* If the elements are contiguous, perform a single block move. */ + if (soffset == size && roffset == size) + { + size_t chunk = size * (len - delta); + memcpy (dest, src, chunk); + dest += chunk; + } + else + { + for (n = 0; n < len - delta; n++) + { + memcpy (dest, src, size); + dest += roffset; + src += soffset; + } + } + if (sh < 0) dest = rptr; n = delta; |