Fix missed replacements.
[official-gcc.git] / libgfortran / generated / reshape_i8.c
blobf58e9b28ad374f2876e2847d1b6da166811741f9
1 /* Implementation of the RESHAPE
2 Copyright 2002 Free Software Foundation, Inc.
3 Contributed by Paul Brook <paul@nowt.org>
5 This file is part of the GNU Fortran 95 runtime library (libgfortran).
7 Libgfortran is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combine
19 executable.)
21 Libgfortran is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public
27 License along with libgfortran; see the file COPYING. If not,
28 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, USA. */
31 #include "config.h"
32 #include <stdlib.h>
33 #include <assert.h>
34 #include "libgfortran.h"
36 typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type;
38 /* The shape parameter is ignored. We can currently deduce the shape from the
39 return array. */
41 extern void reshape_8 (gfc_array_i8 *, gfc_array_i8 *, shape_type *,
42 gfc_array_i8 *, shape_type *);
43 export_proto(reshape_8);
45 void
46 reshape_8 (gfc_array_i8 * ret, gfc_array_i8 * source, shape_type * shape,
47 gfc_array_i8 * pad, shape_type * order)
49 /* r.* indicates the return array. */
50 index_type rcount[GFC_MAX_DIMENSIONS - 1];
51 index_type rextent[GFC_MAX_DIMENSIONS - 1];
52 index_type rstride[GFC_MAX_DIMENSIONS - 1];
53 index_type rstride0;
54 index_type rdim;
55 index_type rsize;
56 GFC_INTEGER_8 *rptr;
57 /* s.* indicates the source array. */
58 index_type scount[GFC_MAX_DIMENSIONS - 1];
59 index_type sextent[GFC_MAX_DIMENSIONS - 1];
60 index_type sstride[GFC_MAX_DIMENSIONS - 1];
61 index_type sstride0;
62 index_type sdim;
63 index_type ssize;
64 const GFC_INTEGER_8 *sptr;
65 /* p.* indicates the pad array. */
66 index_type pcount[GFC_MAX_DIMENSIONS - 1];
67 index_type pextent[GFC_MAX_DIMENSIONS - 1];
68 index_type pstride[GFC_MAX_DIMENSIONS - 1];
69 index_type pdim;
70 index_type psize;
71 const GFC_INTEGER_8 *pptr;
73 const GFC_INTEGER_8 *src;
74 int n;
75 int dim;
77 if (ret->dim[0].stride == 0)
78 ret->dim[0].stride = 1;
79 if (source->dim[0].stride == 0)
80 source->dim[0].stride = 1;
81 if (shape->dim[0].stride == 0)
82 shape->dim[0].stride = 1;
83 if (pad && pad->dim[0].stride == 0)
84 pad->dim[0].stride = 1;
85 if (order && order->dim[0].stride == 0)
86 order->dim[0].stride = 1;
88 rdim = GFC_DESCRIPTOR_RANK (ret);
89 rsize = 1;
90 for (n = 0; n < rdim; n++)
92 if (order)
93 dim = order->data[n * order->dim[0].stride] - 1;
94 else
95 dim = n;
97 rcount[n] = 0;
98 rstride[n] = ret->dim[dim].stride;
99 rextent[n] = ret->dim[dim].ubound + 1 - ret->dim[dim].lbound;
101 if (rextent[n] != shape->data[dim * shape->dim[0].stride])
102 runtime_error ("shape and target do not conform");
104 if (rsize == rstride[n])
105 rsize *= rextent[n];
106 else
107 rsize = 0;
108 if (rextent[dim] <= 0)
109 return;
112 sdim = GFC_DESCRIPTOR_RANK (source);
113 ssize = 1;
114 for (n = 0; n < sdim; n++)
116 scount[n] = 0;
117 sstride[n] = source->dim[n].stride;
118 sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound;
119 if (sextent[n] <= 0)
120 abort ();
122 if (ssize == sstride[n])
123 ssize *= sextent[n];
124 else
125 ssize = 0;
128 if (pad)
130 if (pad->dim[0].stride == 0)
131 pad->dim[0].stride = 1;
132 pdim = GFC_DESCRIPTOR_RANK (pad);
133 psize = 1;
134 for (n = 0; n < pdim; n++)
136 pcount[n] = 0;
137 pstride[n] = pad->dim[n].stride;
138 pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound;
139 if (pextent[n] <= 0)
140 abort ();
141 if (psize == pstride[n])
142 psize *= pextent[n];
143 else
144 psize = 0;
146 pptr = pad->data;
148 else
150 pdim = 0;
151 psize = 1;
152 pptr = NULL;
155 if (rsize != 0 && ssize != 0 && psize != 0)
157 rsize *= 8;
158 ssize *= 8;
159 psize *= 8;
160 reshape_packed ((char *)ret->data, rsize, (char *)source->data,
161 ssize, pad ? (char *)pad->data : NULL, psize);
162 return;
164 rptr = ret->data;
165 src = sptr = source->data;
166 rstride0 = rstride[0];
167 sstride0 = sstride[0];
169 while (rptr)
171 /* Select between the source and pad arrays. */
172 *rptr = *src;
173 /* Advance to the next element. */
174 rptr += rstride0;
175 src += sstride0;
176 rcount[0]++;
177 scount[0]++;
178 /* Advance to the next destination element. */
179 n = 0;
180 while (rcount[n] == rextent[n])
182 /* When we get to the end of a dimension, reset it and increment
183 the next dimension. */
184 rcount[n] = 0;
185 /* We could precalculate these products, but this is a less
186 frequently used path so proabably not worth it. */
187 rptr -= rstride[n] * rextent[n];
188 n++;
189 if (n == rdim)
191 /* Break out of the loop. */
192 rptr = NULL;
193 break;
195 else
197 rcount[n]++;
198 rptr += rstride[n];
201 /* Advance to the next source element. */
202 n = 0;
203 while (scount[n] == sextent[n])
205 /* When we get to the end of a dimension, reset it and increment
206 the next dimension. */
207 scount[n] = 0;
208 /* We could precalculate these products, but this is a less
209 frequently used path so proabably not worth it. */
210 src -= sstride[n] * sextent[n];
211 n++;
212 if (n == sdim)
214 if (sptr && pad)
216 /* Switch to the pad array. */
217 sptr = NULL;
218 sdim = pdim;
219 for (dim = 0; dim < pdim; dim++)
221 scount[dim] = pcount[dim];
222 sextent[dim] = pextent[dim];
223 sstride[dim] = pstride[dim];
224 sstride0 = sstride[0];
227 /* We now start again from the beginning of the pad array. */
228 src = pptr;
229 break;
231 else
233 scount[n]++;
234 src += sstride[n];