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