]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/generated/eoshift3_8.c
[multiple changes]
[thirdparty/gcc.git] / libgfortran / generated / eoshift3_8.c
CommitLineData
6de9cd9a 1/* Implementation of the EOSHIFT intrinsic
748086b7 2 Copyright 2002, 2005, 2007, 2009 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Paul Brook <paul@nowt.org>
4
57dea9f6 5This file is part of the GNU Fortran 95 runtime library (libgfortran).
6de9cd9a 6
57dea9f6
TM
7Libgfortran is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public
6de9cd9a 9License as published by the Free Software Foundation; either
748086b7 10version 3 of the License, or (at your option) any later version.
57dea9f6
TM
11
12Libgfortran is distributed in the hope that it will be useful,
6de9cd9a
DN
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
57dea9f6 15GNU General Public License for more details.
6de9cd9a 16
748086b7
JJ
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
6de9cd9a 25
36ae8a61 26#include "libgfortran.h"
6de9cd9a
DN
27#include <stdlib.h>
28#include <assert.h>
29#include <string.h>
36ae8a61 30
6de9cd9a 31
644cb69f
FXC
32#if defined (HAVE_GFC_INTEGER_8)
33
7823229b 34static void
64acfd99
JB
35eoshift3 (gfc_array_char * const restrict ret,
36 const gfc_array_char * const restrict array,
37 const gfc_array_i8 * const restrict h,
38 const gfc_array_char * const restrict bound,
39 const GFC_INTEGER_8 * const restrict pwhich,
dfb55fdc 40 const char * filler, index_type filler_len)
6de9cd9a
DN
41{
42 /* r.* indicates the return array. */
e33e218b 43 index_type rstride[GFC_MAX_DIMENSIONS];
6de9cd9a
DN
44 index_type rstride0;
45 index_type roffset;
46 char *rptr;
5863aacf 47 char * restrict dest;
6de9cd9a 48 /* s.* indicates the source array. */
e33e218b 49 index_type sstride[GFC_MAX_DIMENSIONS];
6de9cd9a
DN
50 index_type sstride0;
51 index_type soffset;
52 const char *sptr;
53 const char *src;
54 /* h.* indicates the shift array. */
e33e218b 55 index_type hstride[GFC_MAX_DIMENSIONS];
6de9cd9a
DN
56 index_type hstride0;
57 const GFC_INTEGER_8 *hptr;
58 /* b.* indicates the bound array. */
e33e218b 59 index_type bstride[GFC_MAX_DIMENSIONS];
6de9cd9a
DN
60 index_type bstride0;
61 const char *bptr;
62
e33e218b
TK
63 index_type count[GFC_MAX_DIMENSIONS];
64 index_type extent[GFC_MAX_DIMENSIONS];
6de9cd9a 65 index_type dim;
6de9cd9a
DN
66 index_type len;
67 index_type n;
dfb55fdc 68 index_type size;
16bff921 69 index_type arraysize;
6de9cd9a
DN
70 int which;
71 GFC_INTEGER_8 sh;
72 GFC_INTEGER_8 delta;
73
7672ae20
AJ
74 /* The compiler cannot figure out that these are set, initialize
75 them to avoid warnings. */
76 len = 0;
77 soffset = 0;
78 roffset = 0;
79
16bff921 80 arraysize = size0 ((array_t *) array);
dfb55fdc
TK
81 size = GFC_DESCRIPTOR_SIZE(array);
82
6de9cd9a
DN
83 if (pwhich)
84 which = *pwhich - 1;
85 else
86 which = 0;
87
0e6d033b
TK
88 if (ret->data == NULL)
89 {
90 int i;
91
16bff921 92 ret->data = internal_malloc_size (size * arraysize);
efd4dc1a 93 ret->offset = 0;
0e6d033b
TK
94 ret->dtype = array->dtype;
95 for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
96 {
dfb55fdc
TK
97 index_type ub, str;
98
99 ub = GFC_DESCRIPTOR_EXTENT(array,i) - 1;
0e6d033b
TK
100
101 if (i == 0)
dfb55fdc 102 str = 1;
0e6d033b 103 else
dfb55fdc
TK
104 str = GFC_DESCRIPTOR_EXTENT(ret,i-1)
105 * GFC_DESCRIPTOR_STRIDE(ret,i-1);
106
107 GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
108
0e6d033b 109 }
16bff921
TK
110 if (arraysize > 0)
111 ret->data = internal_malloc_size (size * arraysize);
112 else
113 ret->data = internal_malloc_size (1);
114
0e6d033b 115 }
16bff921
TK
116 else if (unlikely (compile_options.bounds_check))
117 {
118 bounds_equal_extents ((array_t *) ret, (array_t *) array,
119 "return value", "EOSHIFT");
120 }
121
122 if (unlikely (compile_options.bounds_check))
c44109aa 123 {
16bff921
TK
124 bounds_reduced_extents ((array_t *) h, (array_t *) array, which,
125 "SHIFT argument", "EOSHIFT");
c44109aa 126 }
0e6d033b 127
16bff921
TK
128 if (arraysize == 0)
129 return;
6de9cd9a
DN
130
131 extent[0] = 1;
132 count[0] = 0;
6de9cd9a
DN
133 n = 0;
134 for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
135 {
136 if (dim == which)
137 {
dfb55fdc 138 roffset = GFC_DESCRIPTOR_STRIDE_BYTES(ret,dim);
6de9cd9a
DN
139 if (roffset == 0)
140 roffset = size;
dfb55fdc 141 soffset = GFC_DESCRIPTOR_STRIDE_BYTES(array,dim);
6de9cd9a
DN
142 if (soffset == 0)
143 soffset = size;
dfb55fdc 144 len = GFC_DESCRIPTOR_EXTENT(array,dim);
6de9cd9a
DN
145 }
146 else
147 {
148 count[n] = 0;
dfb55fdc
TK
149 extent[n] = GFC_DESCRIPTOR_EXTENT(array,dim);
150 rstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(ret,dim);
151 sstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(array,dim);
6de9cd9a 152
dfb55fdc 153 hstride[n] = GFC_DESCRIPTOR_STRIDE(h,n);
6de9cd9a 154 if (bound)
dfb55fdc 155 bstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(bound,n);
6de9cd9a
DN
156 else
157 bstride[n] = 0;
158 n++;
159 }
160 }
161 if (sstride[0] == 0)
162 sstride[0] = size;
163 if (rstride[0] == 0)
164 rstride[0] = size;
165 if (hstride[0] == 0)
166 hstride[0] = 1;
167 if (bound && bstride[0] == 0)
168 bstride[0] = size;
169
170 dim = GFC_DESCRIPTOR_RANK (array);
171 rstride0 = rstride[0];
172 sstride0 = sstride[0];
173 hstride0 = hstride[0];
174 bstride0 = bstride[0];
175 rptr = ret->data;
176 sptr = array->data;
177 hptr = h->data;
178 if (bound)
179 bptr = bound->data;
180 else
7823229b 181 bptr = NULL;
6de9cd9a
DN
182
183 while (rptr)
184 {
185 /* Do the shift for this dimension. */
186 sh = *hptr;
47b3a403
TK
187 if (( sh >= 0 ? sh : -sh ) > len)
188 {
189 delta = len;
190 sh = len;
191 }
192 else
193 delta = (sh >= 0) ? sh: -sh;
194
6de9cd9a
DN
195 if (sh > 0)
196 {
197 src = &sptr[delta * soffset];
198 dest = rptr;
199 }
200 else
201 {
202 src = sptr;
203 dest = &rptr[delta * roffset];
204 }
205 for (n = 0; n < len - delta; n++)
206 {
207 memcpy (dest, src, size);
208 dest += roffset;
209 src += soffset;
210 }
211 if (sh < 0)
212 dest = rptr;
213 n = delta;
214
7823229b
RS
215 if (bptr)
216 while (n--)
217 {
218 memcpy (dest, bptr, size);
219 dest += roffset;
220 }
221 else
222 while (n--)
223 {
691da334
FXC
224 index_type i;
225
226 if (filler_len == 1)
227 memset (dest, filler[0], size);
228 else
229 for (i = 0; i < size; i += filler_len)
230 memcpy (&dest[i], filler, filler_len);
231
7823229b
RS
232 dest += roffset;
233 }
6de9cd9a
DN
234
235 /* Advance to the next section. */
236 rptr += rstride0;
237 sptr += sstride0;
238 hptr += hstride0;
239 bptr += bstride0;
240 count[0]++;
241 n = 0;
242 while (count[n] == extent[n])
243 {
244 /* When we get to the end of a dimension, reset it and increment
245 the next dimension. */
246 count[n] = 0;
247 /* We could precalculate these products, but this is a less
5d7adf7a 248 frequently used path so probably not worth it. */
6de9cd9a
DN
249 rptr -= rstride[n] * extent[n];
250 sptr -= sstride[n] * extent[n];
251 hptr -= hstride[n] * extent[n];
252 bptr -= bstride[n] * extent[n];
253 n++;
254 if (n >= dim - 1)
255 {
256 /* Break out of the loop. */
257 rptr = NULL;
258 break;
259 }
260 else
261 {
262 count[n]++;
263 rptr += rstride[n];
264 sptr += sstride[n];
265 hptr += hstride[n];
266 bptr += bstride[n];
267 }
268 }
269 }
270}
7823229b 271
64acfd99
JB
272extern void eoshift3_8 (gfc_array_char * const restrict,
273 const gfc_array_char * const restrict,
274 const gfc_array_i8 * const restrict,
275 const gfc_array_char * const restrict,
276 const GFC_INTEGER_8 *);
7823229b
RS
277export_proto(eoshift3_8);
278
279void
64acfd99
JB
280eoshift3_8 (gfc_array_char * const restrict ret,
281 const gfc_array_char * const restrict array,
282 const gfc_array_i8 * const restrict h,
283 const gfc_array_char * const restrict bound,
284 const GFC_INTEGER_8 * const restrict pwhich)
7823229b 285{
dfb55fdc 286 eoshift3 (ret, array, h, bound, pwhich, "\0", 1);
7823229b
RS
287}
288
691da334 289
64acfd99
JB
290extern void eoshift3_8_char (gfc_array_char * const restrict,
291 GFC_INTEGER_4,
292 const gfc_array_char * const restrict,
293 const gfc_array_i8 * const restrict,
294 const gfc_array_char * const restrict,
295 const GFC_INTEGER_8 * const restrict,
296 GFC_INTEGER_4, GFC_INTEGER_4);
7823229b
RS
297export_proto(eoshift3_8_char);
298
299void
64acfd99
JB
300eoshift3_8_char (gfc_array_char * const restrict ret,
301 GFC_INTEGER_4 ret_length __attribute__((unused)),
302 const gfc_array_char * const restrict array,
303 const gfc_array_i8 * const restrict h,
304 const gfc_array_char * const restrict bound,
305 const GFC_INTEGER_8 * const restrict pwhich,
dfb55fdc 306 GFC_INTEGER_4 array_length __attribute__((unused)),
64acfd99 307 GFC_INTEGER_4 bound_length __attribute__((unused)))
7823229b 308{
dfb55fdc 309 eoshift3 (ret, array, h, bound, pwhich, " ", 1);
691da334
FXC
310}
311
312
313extern void eoshift3_8_char4 (gfc_array_char * const restrict,
314 GFC_INTEGER_4,
315 const gfc_array_char * const restrict,
316 const gfc_array_i8 * const restrict,
317 const gfc_array_char * const restrict,
318 const GFC_INTEGER_8 * const restrict,
319 GFC_INTEGER_4, GFC_INTEGER_4);
320export_proto(eoshift3_8_char4);
321
322void
323eoshift3_8_char4 (gfc_array_char * const restrict ret,
324 GFC_INTEGER_4 ret_length __attribute__((unused)),
325 const gfc_array_char * const restrict array,
326 const gfc_array_i8 * const restrict h,
327 const gfc_array_char * const restrict bound,
328 const GFC_INTEGER_8 * const restrict pwhich,
dfb55fdc 329 GFC_INTEGER_4 array_length __attribute__((unused)),
691da334
FXC
330 GFC_INTEGER_4 bound_length __attribute__((unused)))
331{
332 static const gfc_char4_t space = (unsigned char) ' ';
dfb55fdc 333 eoshift3 (ret, array, h, bound, pwhich,
691da334 334 (const char *) &space, sizeof (gfc_char4_t));
7823229b 335}
644cb69f
FXC
336
337#endif