annotate libgfortran/m4/iforeach.m4 @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 dnl Support macro file for intrinsic functions.
kono
parents:
diff changeset
2 dnl Contains the generic sections of the array functions.
kono
parents:
diff changeset
3 dnl This file is part of the GNU Fortran Runtime Library (libgfortran)
kono
parents:
diff changeset
4 dnl Distributed under the GNU GPL with exception. See COPYING for details.
kono
parents:
diff changeset
5 define(START_FOREACH_FUNCTION,
kono
parents:
diff changeset
6 `
kono
parents:
diff changeset
7 extern void name`'rtype_qual`_'atype_code (rtype * const restrict retarray,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
8 atype * const restrict array, GFC_LOGICAL_4);
111
kono
parents:
diff changeset
9 export_proto(name`'rtype_qual`_'atype_code);
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 void
kono
parents:
diff changeset
12 name`'rtype_qual`_'atype_code (rtype * const restrict retarray,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
13 atype * const restrict array, GFC_LOGICAL_4 back)
111
kono
parents:
diff changeset
14 {
kono
parents:
diff changeset
15 index_type count[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
16 index_type extent[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
17 index_type sstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
18 index_type dstride;
kono
parents:
diff changeset
19 const atype_name *base;
kono
parents:
diff changeset
20 rtype_name * restrict dest;
kono
parents:
diff changeset
21 index_type rank;
kono
parents:
diff changeset
22 index_type n;
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 rank = GFC_DESCRIPTOR_RANK (array);
kono
parents:
diff changeset
25 if (rank <= 0)
kono
parents:
diff changeset
26 runtime_error ("Rank of array needs to be > 0");
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 if (retarray->base_addr == NULL)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
31 retarray->dtype.rank = 1;
111
kono
parents:
diff changeset
32 retarray->offset = 0;
kono
parents:
diff changeset
33 retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
kono
parents:
diff changeset
34 }
kono
parents:
diff changeset
35 else
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 if (unlikely (compile_options.bounds_check))
kono
parents:
diff changeset
38 bounds_iforeach_return ((array_t *) retarray, (array_t *) array,
kono
parents:
diff changeset
39 "u_name");
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
kono
parents:
diff changeset
43 dest = retarray->base_addr;
kono
parents:
diff changeset
44 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
45 {
kono
parents:
diff changeset
46 sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
kono
parents:
diff changeset
47 extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
kono
parents:
diff changeset
48 count[n] = 0;
kono
parents:
diff changeset
49 if (extent[n] <= 0)
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 /* Set the return value. */
kono
parents:
diff changeset
52 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
53 dest[n * dstride] = 0;
kono
parents:
diff changeset
54 return;
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 base = array->base_addr;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 /* Initialize the return value. */
kono
parents:
diff changeset
61 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
62 dest[n * dstride] = 1;
kono
parents:
diff changeset
63 {
kono
parents:
diff changeset
64 ')dnl
kono
parents:
diff changeset
65 define(START_FOREACH_BLOCK,
kono
parents:
diff changeset
66 ` while (base)
kono
parents:
diff changeset
67 {
kono
parents:
diff changeset
68 /* Implementation start. */
kono
parents:
diff changeset
69 ')dnl
kono
parents:
diff changeset
70 define(FINISH_FOREACH_FUNCTION,
kono
parents:
diff changeset
71 ` /* Implementation end. */
kono
parents:
diff changeset
72 /* Advance to the next element. */
kono
parents:
diff changeset
73 base += sstride[0];
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75 while (++count[0] != extent[0]);
kono
parents:
diff changeset
76 n = 0;
kono
parents:
diff changeset
77 do
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 /* When we get to the end of a dimension, reset it and increment
kono
parents:
diff changeset
80 the next dimension. */
kono
parents:
diff changeset
81 count[n] = 0;
kono
parents:
diff changeset
82 /* We could precalculate these products, but this is a less
kono
parents:
diff changeset
83 frequently used path so probably not worth it. */
kono
parents:
diff changeset
84 base -= sstride[n] * extent[n];
kono
parents:
diff changeset
85 n++;
kono
parents:
diff changeset
86 if (n >= rank)
kono
parents:
diff changeset
87 {
kono
parents:
diff changeset
88 /* Break out of the loop. */
kono
parents:
diff changeset
89 base = NULL;
kono
parents:
diff changeset
90 break;
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92 else
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 count[n]++;
kono
parents:
diff changeset
95 base += sstride[n];
kono
parents:
diff changeset
96 }
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98 while (count[n] == extent[n]);
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101 }')dnl
kono
parents:
diff changeset
102 define(START_MASKED_FOREACH_FUNCTION,
kono
parents:
diff changeset
103 `
kono
parents:
diff changeset
104 extern void `m'name`'rtype_qual`_'atype_code (rtype * const restrict,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 atype * const restrict, gfc_array_l1 * const restrict,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 GFC_LOGICAL_4);
111
kono
parents:
diff changeset
107 export_proto(`m'name`'rtype_qual`_'atype_code);
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 void
kono
parents:
diff changeset
110 `m'name`'rtype_qual`_'atype_code (rtype * const restrict retarray,
kono
parents:
diff changeset
111 atype * const restrict array,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 gfc_array_l1 * const restrict mask, GFC_LOGICAL_4 back)
111
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 index_type count[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
115 index_type extent[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
116 index_type sstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
117 index_type mstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
118 index_type dstride;
kono
parents:
diff changeset
119 rtype_name *dest;
kono
parents:
diff changeset
120 const atype_name *base;
kono
parents:
diff changeset
121 GFC_LOGICAL_1 *mbase;
kono
parents:
diff changeset
122 int rank;
kono
parents:
diff changeset
123 index_type n;
kono
parents:
diff changeset
124 int mask_kind;
kono
parents:
diff changeset
125
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
127 if (mask == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
129 name`'rtype_qual`_'atype_code (retarray, array, back);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
130 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132
111
kono
parents:
diff changeset
133 rank = GFC_DESCRIPTOR_RANK (array);
kono
parents:
diff changeset
134 if (rank <= 0)
kono
parents:
diff changeset
135 runtime_error ("Rank of array needs to be > 0");
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 if (retarray->base_addr == NULL)
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 retarray->dtype.rank = 1;
111
kono
parents:
diff changeset
141 retarray->offset = 0;
kono
parents:
diff changeset
142 retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
kono
parents:
diff changeset
143 }
kono
parents:
diff changeset
144 else
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 if (unlikely (compile_options.bounds_check))
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 bounds_iforeach_return ((array_t *) retarray, (array_t *) array,
kono
parents:
diff changeset
150 "u_name");
kono
parents:
diff changeset
151 bounds_equal_extents ((array_t *) mask, (array_t *) array,
kono
parents:
diff changeset
152 "MASK argument", "u_name");
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 mask_kind = GFC_DESCRIPTOR_SIZE (mask);
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 mbase = mask->base_addr;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 if (mask_kind == 1 || mask_kind == 2 || mask_kind == 4 || mask_kind == 8
kono
parents:
diff changeset
161 #ifdef HAVE_GFC_LOGICAL_16
kono
parents:
diff changeset
162 || mask_kind == 16
kono
parents:
diff changeset
163 #endif
kono
parents:
diff changeset
164 )
kono
parents:
diff changeset
165 mbase = GFOR_POINTER_TO_L1 (mbase, mask_kind);
kono
parents:
diff changeset
166 else
kono
parents:
diff changeset
167 runtime_error ("Funny sized logical array");
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
kono
parents:
diff changeset
170 dest = retarray->base_addr;
kono
parents:
diff changeset
171 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
172 {
kono
parents:
diff changeset
173 sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n);
kono
parents:
diff changeset
174 mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
kono
parents:
diff changeset
175 extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
kono
parents:
diff changeset
176 count[n] = 0;
kono
parents:
diff changeset
177 if (extent[n] <= 0)
kono
parents:
diff changeset
178 {
kono
parents:
diff changeset
179 /* Set the return value. */
kono
parents:
diff changeset
180 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
181 dest[n * dstride] = 0;
kono
parents:
diff changeset
182 return;
kono
parents:
diff changeset
183 }
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 base = array->base_addr;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 /* Initialize the return value. */
kono
parents:
diff changeset
189 for (n = 0; n < rank; n++)
kono
parents:
diff changeset
190 dest[n * dstride] = 0;
kono
parents:
diff changeset
191 {
kono
parents:
diff changeset
192 ')dnl
kono
parents:
diff changeset
193 define(START_MASKED_FOREACH_BLOCK, `START_FOREACH_BLOCK')dnl
kono
parents:
diff changeset
194 define(FINISH_MASKED_FOREACH_FUNCTION,
kono
parents:
diff changeset
195 ` /* Implementation end. */
kono
parents:
diff changeset
196 /* Advance to the next element. */
kono
parents:
diff changeset
197 base += sstride[0];
kono
parents:
diff changeset
198 mbase += mstride[0];
kono
parents:
diff changeset
199 }
kono
parents:
diff changeset
200 while (++count[0] != extent[0]);
kono
parents:
diff changeset
201 n = 0;
kono
parents:
diff changeset
202 do
kono
parents:
diff changeset
203 {
kono
parents:
diff changeset
204 /* When we get to the end of a dimension, reset it and increment
kono
parents:
diff changeset
205 the next dimension. */
kono
parents:
diff changeset
206 count[n] = 0;
kono
parents:
diff changeset
207 /* We could precalculate these products, but this is a less
kono
parents:
diff changeset
208 frequently used path so probably not worth it. */
kono
parents:
diff changeset
209 base -= sstride[n] * extent[n];
kono
parents:
diff changeset
210 mbase -= mstride[n] * extent[n];
kono
parents:
diff changeset
211 n++;
kono
parents:
diff changeset
212 if (n >= rank)
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 /* Break out of the loop. */
kono
parents:
diff changeset
215 base = NULL;
kono
parents:
diff changeset
216 break;
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218 else
kono
parents:
diff changeset
219 {
kono
parents:
diff changeset
220 count[n]++;
kono
parents:
diff changeset
221 base += sstride[n];
kono
parents:
diff changeset
222 mbase += mstride[n];
kono
parents:
diff changeset
223 }
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225 while (count[n] == extent[n]);
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227 }
kono
parents:
diff changeset
228 }')dnl
kono
parents:
diff changeset
229 define(FOREACH_FUNCTION,
kono
parents:
diff changeset
230 `START_FOREACH_FUNCTION
kono
parents:
diff changeset
231 $1
kono
parents:
diff changeset
232 START_FOREACH_BLOCK
kono
parents:
diff changeset
233 $2
kono
parents:
diff changeset
234 FINISH_FOREACH_FUNCTION')dnl
kono
parents:
diff changeset
235 define(MASKED_FOREACH_FUNCTION,
kono
parents:
diff changeset
236 `START_MASKED_FOREACH_FUNCTION
kono
parents:
diff changeset
237 $1
kono
parents:
diff changeset
238 START_MASKED_FOREACH_BLOCK
kono
parents:
diff changeset
239 $2
kono
parents:
diff changeset
240 FINISH_MASKED_FOREACH_FUNCTION')dnl
kono
parents:
diff changeset
241 define(SCALAR_FOREACH_FUNCTION,
kono
parents:
diff changeset
242 `
kono
parents:
diff changeset
243 extern void `s'name`'rtype_qual`_'atype_code (rtype * const restrict,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
244 atype * const restrict, GFC_LOGICAL_4 *, GFC_LOGICAL_4);
111
kono
parents:
diff changeset
245 export_proto(`s'name`'rtype_qual`_'atype_code);
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 void
kono
parents:
diff changeset
248 `s'name`'rtype_qual`_'atype_code (rtype * const restrict retarray,
kono
parents:
diff changeset
249 atype * const restrict array,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back)
111
kono
parents:
diff changeset
251 {
kono
parents:
diff changeset
252 index_type rank;
kono
parents:
diff changeset
253 index_type dstride;
kono
parents:
diff changeset
254 index_type n;
kono
parents:
diff changeset
255 rtype_name *dest;
kono
parents:
diff changeset
256
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 if (mask == NULL || *mask)
111
kono
parents:
diff changeset
258 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
259 name`'rtype_qual`_'atype_code (retarray, array, back);
111
kono
parents:
diff changeset
260 return;
kono
parents:
diff changeset
261 }
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 rank = GFC_DESCRIPTOR_RANK (array);
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 if (rank <= 0)
kono
parents:
diff changeset
266 runtime_error ("Rank of array needs to be > 0");
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 if (retarray->base_addr == NULL)
kono
parents:
diff changeset
269 {
kono
parents:
diff changeset
270 GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
271 retarray->dtype.rank = 1;
111
kono
parents:
diff changeset
272 retarray->offset = 0;
kono
parents:
diff changeset
273 retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
kono
parents:
diff changeset
274 }
kono
parents:
diff changeset
275 else if (unlikely (compile_options.bounds_check))
kono
parents:
diff changeset
276 {
kono
parents:
diff changeset
277 bounds_iforeach_return ((array_t *) retarray, (array_t *) array,
kono
parents:
diff changeset
278 "u_name");
kono
parents:
diff changeset
279 }
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 dstride = GFC_DESCRIPTOR_STRIDE(retarray,0);
kono
parents:
diff changeset
282 dest = retarray->base_addr;
kono
parents:
diff changeset
283 for (n = 0; n<rank; n++)
kono
parents:
diff changeset
284 dest[n * dstride] = $1 ;
kono
parents:
diff changeset
285 }')dnl