François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 1 | /* Implementation of the MINLOC intrinsic |
Jakub Jelinek | 83ffe9c | 2023-01-16 11:50:43 +0100 | [diff] [blame] | 2 | Copyright (C) 2002-2023 Free Software Foundation, Inc. |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 3 | Contributed by Paul Brook <paul@nowt.org> |
| 4 | |
Tobias Burnus | 0cd0559 | 2010-08-27 21:17:45 +0200 | [diff] [blame] | 5 | This file is part of the GNU Fortran runtime library (libgfortran). |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 6 | |
| 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 |
Jakub Jelinek | 748086b | 2009-04-09 17:00:19 +0200 | [diff] [blame] | 10 | version 3 of the License, or (at your option) any later version. |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 11 | |
| 12 | Libgfortran is distributed in the hope that it will be useful, |
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | GNU General Public License for more details. |
| 16 | |
Jakub Jelinek | 748086b | 2009-04-09 17:00:19 +0200 | [diff] [blame] | 17 | Under Section 7 of GPL version 3, you are granted additional |
| 18 | permissions described in the GCC Runtime Library Exception, version |
| 19 | 3.1, as published by the Free Software Foundation. |
| 20 | |
| 21 | You should have received a copy of the GNU General Public License and |
| 22 | a copy of the GCC Runtime Library Exception along with this program; |
| 23 | see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| 24 | <http://www.gnu.org/licenses/>. */ |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 25 | |
Francois-Xavier Coudert | 36ae8a6 | 2007-08-31 14:01:34 +0000 | [diff] [blame] | 26 | #include "libgfortran.h" |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 27 | #include <assert.h> |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 28 | |
| 29 | |
| 30 | #if defined (HAVE_GFC_REAL_10) && defined (HAVE_GFC_INTEGER_16) |
| 31 | |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 32 | #define HAVE_BACK_ARG 1 |
| 33 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 34 | |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 35 | extern void minloc1_16_r10 (gfc_array_i16 * const restrict, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 36 | gfc_array_r10 * const restrict, const index_type * const restrict, GFC_LOGICAL_4 back); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 37 | export_proto(minloc1_16_r10); |
| 38 | |
| 39 | void |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 40 | minloc1_16_r10 (gfc_array_i16 * const restrict retarray, |
| 41 | gfc_array_r10 * const restrict array, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 42 | const index_type * const restrict pdim, GFC_LOGICAL_4 back) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 43 | { |
| 44 | index_type count[GFC_MAX_DIMENSIONS]; |
| 45 | index_type extent[GFC_MAX_DIMENSIONS]; |
| 46 | index_type sstride[GFC_MAX_DIMENSIONS]; |
| 47 | index_type dstride[GFC_MAX_DIMENSIONS]; |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 48 | const GFC_REAL_10 * restrict base; |
| 49 | GFC_INTEGER_16 * restrict dest; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 50 | index_type rank; |
| 51 | index_type n; |
| 52 | index_type len; |
| 53 | index_type delta; |
| 54 | index_type dim; |
Thomas Koenig | da96f5a | 2008-05-04 19:07:28 +0000 | [diff] [blame] | 55 | int continue_loop; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 56 | |
| 57 | /* Make dim zero based to avoid confusion. */ |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 58 | rank = GFC_DESCRIPTOR_RANK (array) - 1; |
Thomas Koenig | cfdf6ff | 2017-07-31 09:34:36 +0000 | [diff] [blame] | 59 | dim = (*pdim) - 1; |
| 60 | |
| 61 | if (unlikely (dim < 0 || dim > rank)) |
| 62 | { |
| 63 | runtime_error ("Dim argument incorrect in MINLOC intrinsic: " |
| 64 | "is %ld, should be between 1 and %ld", |
| 65 | (long int) dim + 1, (long int) rank + 1); |
| 66 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 67 | |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 68 | len = GFC_DESCRIPTOR_EXTENT(array,dim); |
Thomas Koenig | da96f5a | 2008-05-04 19:07:28 +0000 | [diff] [blame] | 69 | if (len < 0) |
| 70 | len = 0; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 71 | delta = GFC_DESCRIPTOR_STRIDE(array,dim); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 72 | |
| 73 | for (n = 0; n < dim; n++) |
| 74 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 75 | sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n); |
| 76 | extent[n] = GFC_DESCRIPTOR_EXTENT(array,n); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 77 | |
| 78 | if (extent[n] < 0) |
| 79 | extent[n] = 0; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 80 | } |
| 81 | for (n = dim; n < rank; n++) |
| 82 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 83 | sstride[n] = GFC_DESCRIPTOR_STRIDE(array, n + 1); |
| 84 | extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 85 | |
| 86 | if (extent[n] < 0) |
| 87 | extent[n] = 0; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 88 | } |
| 89 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 90 | if (retarray->base_addr == NULL) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 91 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 92 | size_t alloc_size, str; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 93 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 94 | for (n = 0; n < rank; n++) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 95 | { |
| 96 | if (n == 0) |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 97 | str = 1; |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 98 | else |
| 99 | str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1]; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 100 | |
| 101 | GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str); |
| 102 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 103 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 104 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 105 | retarray->offset = 0; |
Steven G. Kargl | ca708a2 | 2018-06-01 20:20:35 +0000 | [diff] [blame] | 106 | retarray->dtype.rank = rank; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 107 | |
Janne Blomqvist | 92e6f3a | 2014-06-17 06:50:34 +0300 | [diff] [blame] | 108 | alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1]; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 109 | |
Janne Blomqvist | 92e6f3a | 2014-06-17 06:50:34 +0300 | [diff] [blame] | 110 | retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16)); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 111 | if (alloc_size == 0) |
Mikael Morin | 62715bf | 2023-11-07 11:24:04 +0100 | [diff] [blame] | 112 | return; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 113 | } |
| 114 | else |
| 115 | { |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 116 | if (rank != GFC_DESCRIPTOR_RANK (retarray)) |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 117 | runtime_error ("rank of return array incorrect in" |
Thomas Koenig | ccacefc | 2008-01-13 22:13:52 +0000 | [diff] [blame] | 118 | " MINLOC intrinsic: is %ld, should be %ld", |
| 119 | (long int) (GFC_DESCRIPTOR_RANK (retarray)), |
| 120 | (long int) rank); |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 121 | |
Tobias Burnus | 9731c4a | 2008-09-06 16:53:26 +0200 | [diff] [blame] | 122 | if (unlikely (compile_options.bounds_check)) |
Thomas Koenig | 16bff92 | 2009-07-19 15:07:21 +0000 | [diff] [blame] | 123 | bounds_ifunction_return ((array_t *) retarray, extent, |
| 124 | "return value", "MINLOC"); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 125 | } |
| 126 | |
| 127 | for (n = 0; n < rank; n++) |
| 128 | { |
| 129 | count[n] = 0; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 130 | dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 131 | if (extent[n] <= 0) |
Thomas Koenig | facc128 | 2011-03-12 22:39:33 +0000 | [diff] [blame] | 132 | return; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 133 | } |
| 134 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 135 | base = array->base_addr; |
| 136 | dest = retarray->base_addr; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 137 | |
Thomas Koenig | da96f5a | 2008-05-04 19:07:28 +0000 | [diff] [blame] | 138 | continue_loop = 1; |
| 139 | while (continue_loop) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 140 | { |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 141 | const GFC_REAL_10 * restrict src; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 142 | GFC_INTEGER_16 result; |
| 143 | src = base; |
| 144 | { |
| 145 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 146 | GFC_REAL_10 minval; |
| 147 | #if defined (GFC_REAL_10_INFINITY) |
| 148 | minval = GFC_REAL_10_INFINITY; |
| 149 | #else |
| 150 | minval = GFC_REAL_10_HUGE; |
| 151 | #endif |
| 152 | result = 1; |
| 153 | if (len <= 0) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 154 | *dest = 0; |
| 155 | else |
| 156 | { |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 157 | #if ! defined HAVE_BACK_ARG |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 158 | for (n = 0; n < len; n++, src += delta) |
| 159 | { |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 160 | #endif |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 161 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 162 | #if defined (GFC_REAL_10_QUIET_NAN) |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 163 | for (n = 0; n < len; n++, src += delta) |
| 164 | { |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 165 | if (*src <= minval) |
| 166 | { |
| 167 | minval = *src; |
| 168 | result = (GFC_INTEGER_16)n + 1; |
| 169 | break; |
| 170 | } |
| 171 | } |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 172 | #else |
| 173 | n = 0; |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 174 | #endif |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 175 | if (back) |
| 176 | for (; n < len; n++, src += delta) |
| 177 | { |
| 178 | if (unlikely (*src <= minval)) |
| 179 | { |
| 180 | minval = *src; |
| 181 | result = (GFC_INTEGER_16)n + 1; |
| 182 | } |
| 183 | } |
| 184 | else |
| 185 | for (; n < len; n++, src += delta) |
| 186 | { |
| 187 | if (unlikely (*src < minval)) |
| 188 | { |
| 189 | minval = *src; |
| 190 | result = (GFC_INTEGER_16) n + 1; |
| 191 | } |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 192 | } |
Tobias Burnus | 0cd0559 | 2010-08-27 21:17:45 +0200 | [diff] [blame] | 193 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 194 | *dest = result; |
| 195 | } |
| 196 | } |
| 197 | /* Advance to the next element. */ |
| 198 | count[0]++; |
| 199 | base += sstride[0]; |
| 200 | dest += dstride[0]; |
| 201 | n = 0; |
| 202 | while (count[n] == extent[n]) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 203 | { |
| 204 | /* When we get to the end of a dimension, reset it and increment |
| 205 | the next dimension. */ |
| 206 | count[n] = 0; |
| 207 | /* We could precalculate these products, but this is a less |
| 208 | frequently used path so probably not worth it. */ |
| 209 | base -= sstride[n] * extent[n]; |
| 210 | dest -= dstride[n] * extent[n]; |
| 211 | n++; |
Thomas Koenig | 80dd631 | 2017-03-10 19:42:46 +0000 | [diff] [blame] | 212 | if (n >= rank) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 213 | { |
Thomas Koenig | 80dd631 | 2017-03-10 19:42:46 +0000 | [diff] [blame] | 214 | /* Break out of the loop. */ |
Thomas Koenig | da96f5a | 2008-05-04 19:07:28 +0000 | [diff] [blame] | 215 | continue_loop = 0; |
| 216 | break; |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 217 | } |
| 218 | else |
| 219 | { |
| 220 | count[n]++; |
| 221 | base += sstride[n]; |
| 222 | dest += dstride[n]; |
| 223 | } |
| 224 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 225 | } |
| 226 | } |
| 227 | |
| 228 | |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 229 | extern void mminloc1_16_r10 (gfc_array_i16 * const restrict, |
| 230 | gfc_array_r10 * const restrict, const index_type * const restrict, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 231 | gfc_array_l1 * const restrict, GFC_LOGICAL_4 back); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 232 | export_proto(mminloc1_16_r10); |
| 233 | |
| 234 | void |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 235 | mminloc1_16_r10 (gfc_array_i16 * const restrict retarray, |
| 236 | gfc_array_r10 * const restrict array, |
| 237 | const index_type * const restrict pdim, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 238 | gfc_array_l1 * const restrict mask, GFC_LOGICAL_4 back) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 239 | { |
| 240 | index_type count[GFC_MAX_DIMENSIONS]; |
| 241 | index_type extent[GFC_MAX_DIMENSIONS]; |
| 242 | index_type sstride[GFC_MAX_DIMENSIONS]; |
| 243 | index_type dstride[GFC_MAX_DIMENSIONS]; |
| 244 | index_type mstride[GFC_MAX_DIMENSIONS]; |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 245 | GFC_INTEGER_16 * restrict dest; |
| 246 | const GFC_REAL_10 * restrict base; |
Thomas Koenig | 28dc6b3 | 2007-08-24 16:16:16 +0000 | [diff] [blame] | 247 | const GFC_LOGICAL_1 * restrict mbase; |
Thomas Koenig | cfdf6ff | 2017-07-31 09:34:36 +0000 | [diff] [blame] | 248 | index_type rank; |
| 249 | index_type dim; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 250 | index_type n; |
| 251 | index_type len; |
| 252 | index_type delta; |
| 253 | index_type mdelta; |
Thomas Koenig | 28dc6b3 | 2007-08-24 16:16:16 +0000 | [diff] [blame] | 254 | int mask_kind; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 255 | |
Thomas Koenig | 2ea47ee | 2018-12-31 14:59:46 +0000 | [diff] [blame] | 256 | if (mask == NULL) |
| 257 | { |
| 258 | #ifdef HAVE_BACK_ARG |
| 259 | minloc1_16_r10 (retarray, array, pdim, back); |
| 260 | #else |
| 261 | minloc1_16_r10 (retarray, array, pdim); |
| 262 | #endif |
| 263 | return; |
| 264 | } |
| 265 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 266 | dim = (*pdim) - 1; |
| 267 | rank = GFC_DESCRIPTOR_RANK (array) - 1; |
| 268 | |
Thomas Koenig | cfdf6ff | 2017-07-31 09:34:36 +0000 | [diff] [blame] | 269 | |
| 270 | if (unlikely (dim < 0 || dim > rank)) |
| 271 | { |
| 272 | runtime_error ("Dim argument incorrect in MINLOC intrinsic: " |
| 273 | "is %ld, should be between 1 and %ld", |
| 274 | (long int) dim + 1, (long int) rank + 1); |
| 275 | } |
| 276 | |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 277 | len = GFC_DESCRIPTOR_EXTENT(array,dim); |
Mikael Morin | 85a9688 | 2023-11-07 11:24:03 +0100 | [diff] [blame] | 278 | if (len < 0) |
| 279 | len = 0; |
Thomas Koenig | 28dc6b3 | 2007-08-24 16:16:16 +0000 | [diff] [blame] | 280 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 281 | mbase = mask->base_addr; |
Thomas Koenig | 28dc6b3 | 2007-08-24 16:16:16 +0000 | [diff] [blame] | 282 | |
| 283 | mask_kind = GFC_DESCRIPTOR_SIZE (mask); |
| 284 | |
| 285 | if (mask_kind == 1 || mask_kind == 2 || mask_kind == 4 || mask_kind == 8 |
| 286 | #ifdef HAVE_GFC_LOGICAL_16 |
| 287 | || mask_kind == 16 |
| 288 | #endif |
| 289 | ) |
| 290 | mbase = GFOR_POINTER_TO_L1 (mbase, mask_kind); |
| 291 | else |
| 292 | runtime_error ("Funny sized logical array"); |
| 293 | |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 294 | delta = GFC_DESCRIPTOR_STRIDE(array,dim); |
| 295 | mdelta = GFC_DESCRIPTOR_STRIDE_BYTES(mask,dim); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 296 | |
| 297 | for (n = 0; n < dim; n++) |
| 298 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 299 | sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n); |
| 300 | mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n); |
| 301 | extent[n] = GFC_DESCRIPTOR_EXTENT(array,n); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 302 | |
| 303 | if (extent[n] < 0) |
| 304 | extent[n] = 0; |
| 305 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 306 | } |
| 307 | for (n = dim; n < rank; n++) |
| 308 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 309 | sstride[n] = GFC_DESCRIPTOR_STRIDE(array,n + 1); |
| 310 | mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n + 1); |
| 311 | extent[n] = GFC_DESCRIPTOR_EXTENT(array, n + 1); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 312 | |
| 313 | if (extent[n] < 0) |
| 314 | extent[n] = 0; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 315 | } |
| 316 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 317 | if (retarray->base_addr == NULL) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 318 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 319 | size_t alloc_size, str; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 320 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 321 | for (n = 0; n < rank; n++) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 322 | { |
| 323 | if (n == 0) |
| 324 | str = 1; |
| 325 | else |
| 326 | str= GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1]; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 327 | |
| 328 | GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str); |
| 329 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 330 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 331 | |
Janne Blomqvist | 92e6f3a | 2014-06-17 06:50:34 +0300 | [diff] [blame] | 332 | alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1]; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 333 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 334 | retarray->offset = 0; |
Steven G. Kargl | ca708a2 | 2018-06-01 20:20:35 +0000 | [diff] [blame] | 335 | retarray->dtype.rank = rank; |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 336 | |
Mikael Morin | d56bf41 | 2023-11-07 11:24:02 +0100 | [diff] [blame] | 337 | retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16)); |
Thomas Koenig | 80ee04b | 2006-12-30 13:16:36 +0000 | [diff] [blame] | 338 | if (alloc_size == 0) |
Mikael Morin | 62715bf | 2023-11-07 11:24:04 +0100 | [diff] [blame] | 339 | return; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 340 | } |
| 341 | else |
| 342 | { |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 343 | if (rank != GFC_DESCRIPTOR_RANK (retarray)) |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 344 | runtime_error ("rank of return array incorrect in MINLOC intrinsic"); |
| 345 | |
Tobias Burnus | 9731c4a | 2008-09-06 16:53:26 +0200 | [diff] [blame] | 346 | if (unlikely (compile_options.bounds_check)) |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 347 | { |
Thomas Koenig | 16bff92 | 2009-07-19 15:07:21 +0000 | [diff] [blame] | 348 | bounds_ifunction_return ((array_t *) retarray, extent, |
| 349 | "return value", "MINLOC"); |
| 350 | bounds_equal_extents ((array_t *) mask, (array_t *) array, |
| 351 | "MASK argument", "MINLOC"); |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 352 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 353 | } |
| 354 | |
| 355 | for (n = 0; n < rank; n++) |
| 356 | { |
| 357 | count[n] = 0; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 358 | dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n); |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 359 | if (extent[n] <= 0) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 360 | return; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 361 | } |
| 362 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 363 | dest = retarray->base_addr; |
| 364 | base = array->base_addr; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 365 | |
| 366 | while (base) |
| 367 | { |
Janne Blomqvist | 64acfd9 | 2005-11-27 23:03:33 +0200 | [diff] [blame] | 368 | const GFC_REAL_10 * restrict src; |
Thomas Koenig | 28dc6b3 | 2007-08-24 16:16:16 +0000 | [diff] [blame] | 369 | const GFC_LOGICAL_1 * restrict msrc; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 370 | GFC_INTEGER_16 result; |
| 371 | src = base; |
| 372 | msrc = mbase; |
| 373 | { |
| 374 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 375 | GFC_REAL_10 minval; |
| 376 | #if defined (GFC_REAL_10_INFINITY) |
| 377 | minval = GFC_REAL_10_INFINITY; |
| 378 | #else |
| 379 | minval = GFC_REAL_10_HUGE; |
| 380 | #endif |
| 381 | #if defined (GFC_REAL_10_QUIET_NAN) |
| 382 | GFC_INTEGER_16 result2 = 0; |
| 383 | #endif |
| 384 | result = 0; |
Tobias Burnus | 036e177 | 2012-10-28 17:54:44 +0100 | [diff] [blame] | 385 | for (n = 0; n < len; n++, src += delta, msrc += mdelta) |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 386 | { |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 387 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 388 | if (*msrc) |
| 389 | { |
| 390 | #if defined (GFC_REAL_10_QUIET_NAN) |
| 391 | if (!result2) |
| 392 | result2 = (GFC_INTEGER_16)n + 1; |
| 393 | if (*src <= minval) |
| 394 | #endif |
| 395 | { |
| 396 | minval = *src; |
| 397 | result = (GFC_INTEGER_16)n + 1; |
| 398 | break; |
| 399 | } |
| 400 | } |
| 401 | } |
| 402 | #if defined (GFC_REAL_10_QUIET_NAN) |
| 403 | if (unlikely (n >= len)) |
| 404 | result = result2; |
| 405 | else |
| 406 | #endif |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 407 | if (back) |
| 408 | for (; n < len; n++, src += delta, msrc += mdelta) |
| 409 | { |
| 410 | if (*msrc && unlikely (*src <= minval)) |
| 411 | { |
| 412 | minval = *src; |
| 413 | result = (GFC_INTEGER_16)n + 1; |
| 414 | } |
| 415 | } |
| 416 | else |
| 417 | for (; n < len; n++, src += delta, msrc += mdelta) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 418 | { |
Thomas Koenig | b573f93 | 2018-05-08 07:47:19 +0000 | [diff] [blame] | 419 | if (*msrc && unlikely (*src < minval)) |
| 420 | { |
| 421 | minval = *src; |
| 422 | result = (GFC_INTEGER_16) n + 1; |
| 423 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 424 | } |
Tobias Burnus | 036e177 | 2012-10-28 17:54:44 +0100 | [diff] [blame] | 425 | *dest = result; |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 426 | } |
| 427 | /* Advance to the next element. */ |
| 428 | count[0]++; |
| 429 | base += sstride[0]; |
| 430 | mbase += mstride[0]; |
| 431 | dest += dstride[0]; |
| 432 | n = 0; |
| 433 | while (count[n] == extent[n]) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 434 | { |
| 435 | /* When we get to the end of a dimension, reset it and increment |
| 436 | the next dimension. */ |
| 437 | count[n] = 0; |
| 438 | /* We could precalculate these products, but this is a less |
| 439 | frequently used path so probably not worth it. */ |
| 440 | base -= sstride[n] * extent[n]; |
| 441 | mbase -= mstride[n] * extent[n]; |
| 442 | dest -= dstride[n] * extent[n]; |
| 443 | n++; |
Thomas Koenig | 80dd631 | 2017-03-10 19:42:46 +0000 | [diff] [blame] | 444 | if (n >= rank) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 445 | { |
Thomas Koenig | 80dd631 | 2017-03-10 19:42:46 +0000 | [diff] [blame] | 446 | /* Break out of the loop. */ |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 447 | base = NULL; |
| 448 | break; |
| 449 | } |
| 450 | else |
| 451 | { |
| 452 | count[n]++; |
| 453 | base += sstride[n]; |
| 454 | mbase += mstride[n]; |
| 455 | dest += dstride[n]; |
| 456 | } |
| 457 | } |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 458 | } |
| 459 | } |
| 460 | |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 461 | |
| 462 | extern void sminloc1_16_r10 (gfc_array_i16 * const restrict, |
| 463 | gfc_array_r10 * const restrict, const index_type * const restrict, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 464 | GFC_LOGICAL_4 *, GFC_LOGICAL_4 back); |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 465 | export_proto(sminloc1_16_r10); |
| 466 | |
| 467 | void |
| 468 | sminloc1_16_r10 (gfc_array_i16 * const restrict retarray, |
| 469 | gfc_array_r10 * const restrict array, |
| 470 | const index_type * const restrict pdim, |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 471 | GFC_LOGICAL_4 * mask, GFC_LOGICAL_4 back) |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 472 | { |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 473 | index_type count[GFC_MAX_DIMENSIONS]; |
| 474 | index_type extent[GFC_MAX_DIMENSIONS]; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 475 | index_type dstride[GFC_MAX_DIMENSIONS]; |
| 476 | GFC_INTEGER_16 * restrict dest; |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 477 | index_type rank; |
| 478 | index_type n; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 479 | index_type dim; |
| 480 | |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 481 | |
Thomas Koenig | 2ea47ee | 2018-12-31 14:59:46 +0000 | [diff] [blame] | 482 | if (mask == NULL || *mask) |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 483 | { |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 484 | #ifdef HAVE_BACK_ARG |
| 485 | minloc1_16_r10 (retarray, array, pdim, back); |
| 486 | #else |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 487 | minloc1_16_r10 (retarray, array, pdim); |
Thomas Koenig | 64b1806 | 2018-01-15 18:35:13 +0000 | [diff] [blame] | 488 | #endif |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 489 | return; |
| 490 | } |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 491 | /* Make dim zero based to avoid confusion. */ |
| 492 | dim = (*pdim) - 1; |
| 493 | rank = GFC_DESCRIPTOR_RANK (array) - 1; |
| 494 | |
Thomas Koenig | cfdf6ff | 2017-07-31 09:34:36 +0000 | [diff] [blame] | 495 | if (unlikely (dim < 0 || dim > rank)) |
| 496 | { |
| 497 | runtime_error ("Dim argument incorrect in MINLOC intrinsic: " |
| 498 | "is %ld, should be between 1 and %ld", |
| 499 | (long int) dim + 1, (long int) rank + 1); |
| 500 | } |
| 501 | |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 502 | for (n = 0; n < dim; n++) |
| 503 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 504 | extent[n] = GFC_DESCRIPTOR_EXTENT(array,n); |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 505 | |
| 506 | if (extent[n] <= 0) |
| 507 | extent[n] = 0; |
| 508 | } |
| 509 | |
| 510 | for (n = dim; n < rank; n++) |
| 511 | { |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 512 | extent[n] = |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 513 | GFC_DESCRIPTOR_EXTENT(array,n + 1); |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 514 | |
| 515 | if (extent[n] <= 0) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 516 | extent[n] = 0; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 517 | } |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 518 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 519 | if (retarray->base_addr == NULL) |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 520 | { |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 521 | size_t alloc_size, str; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 522 | |
| 523 | for (n = 0; n < rank; n++) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 524 | { |
| 525 | if (n == 0) |
| 526 | str = 1; |
| 527 | else |
| 528 | str = GFC_DESCRIPTOR_STRIDE(retarray,n-1) * extent[n-1]; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 529 | |
| 530 | GFC_DIMENSION_SET(retarray->dim[n], 0, extent[n] - 1, str); |
| 531 | |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 532 | } |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 533 | |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 534 | retarray->offset = 0; |
Steven G. Kargl | ca708a2 | 2018-06-01 20:20:35 +0000 | [diff] [blame] | 535 | retarray->dtype.rank = rank; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 536 | |
Janne Blomqvist | 92e6f3a | 2014-06-17 06:50:34 +0300 | [diff] [blame] | 537 | alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1]; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 538 | |
Mikael Morin | d56bf41 | 2023-11-07 11:24:02 +0100 | [diff] [blame] | 539 | retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16)); |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 540 | if (alloc_size == 0) |
Mikael Morin | 62715bf | 2023-11-07 11:24:04 +0100 | [diff] [blame] | 541 | return; |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 542 | } |
| 543 | else |
| 544 | { |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 545 | if (rank != GFC_DESCRIPTOR_RANK (retarray)) |
| 546 | runtime_error ("rank of return array incorrect in" |
| 547 | " MINLOC intrinsic: is %ld, should be %ld", |
| 548 | (long int) (GFC_DESCRIPTOR_RANK (retarray)), |
| 549 | (long int) rank); |
| 550 | |
Tobias Burnus | 9731c4a | 2008-09-06 16:53:26 +0200 | [diff] [blame] | 551 | if (unlikely (compile_options.bounds_check)) |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 552 | { |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 553 | for (n=0; n < rank; n++) |
| 554 | { |
| 555 | index_type ret_extent; |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 556 | |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 557 | ret_extent = GFC_DESCRIPTOR_EXTENT(retarray,n); |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 558 | if (extent[n] != ret_extent) |
| 559 | runtime_error ("Incorrect extent in return value of" |
| 560 | " MINLOC intrinsic in dimension %ld:" |
| 561 | " is %ld, should be %ld", (long int) n + 1, |
| 562 | (long int) ret_extent, (long int) extent[n]); |
| 563 | } |
Thomas Koenig | fd6590f | 2008-01-11 20:21:05 +0000 | [diff] [blame] | 564 | } |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 565 | } |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 566 | |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 567 | for (n = 0; n < rank; n++) |
| 568 | { |
| 569 | count[n] = 0; |
Thomas Koenig | dfb55fd | 2009-06-21 19:24:55 +0000 | [diff] [blame] | 570 | dstride[n] = GFC_DESCRIPTOR_STRIDE(retarray,n); |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 571 | } |
| 572 | |
Tobias Burnus | 21d1335 | 2012-03-10 18:22:31 +0100 | [diff] [blame] | 573 | dest = retarray->base_addr; |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 574 | |
| 575 | while(1) |
| 576 | { |
| 577 | *dest = 0; |
| 578 | count[0]++; |
| 579 | dest += dstride[0]; |
| 580 | n = 0; |
| 581 | while (count[n] == extent[n]) |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 582 | { |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 583 | /* When we get to the end of a dimension, reset it and increment |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 584 | the next dimension. */ |
| 585 | count[n] = 0; |
| 586 | /* We could precalculate these products, but this is a less |
| 587 | frequently used path so probably not worth it. */ |
| 588 | dest -= dstride[n] * extent[n]; |
| 589 | n++; |
Thomas Koenig | 80dd631 | 2017-03-10 19:42:46 +0000 | [diff] [blame] | 590 | if (n >= rank) |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 591 | return; |
Jakub Jelinek | 80927a5 | 2009-07-24 09:57:13 +0200 | [diff] [blame] | 592 | else |
| 593 | { |
| 594 | count[n]++; |
| 595 | dest += dstride[n]; |
| 596 | } |
Thomas Koenig | 802367d | 2008-04-30 16:56:01 +0000 | [diff] [blame] | 597 | } |
| 598 | } |
Thomas Koenig | 97a6203 | 2006-03-20 21:56:00 +0000 | [diff] [blame] | 599 | } |
| 600 | |
François-Xavier Coudert | 644cb69 | 2005-10-03 07:22:20 +0000 | [diff] [blame] | 601 | #endif |