maxloc1.m4 revision 1.1.1.3 1 1.1 mrg `/* Implementation of the MAXLOC intrinsic
2 1.1.1.3 mrg Copyright (C) 2002-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Paul Brook <paul (a] nowt.org>
4 1.1 mrg
5 1.1 mrg This file is part of the GNU Fortran runtime library (libgfortran).
6 1.1 mrg
7 1.1 mrg Libgfortran is free software; you can redistribute it and/or
8 1.1 mrg modify it under the terms of the GNU General Public
9 1.1 mrg License as published by the Free Software Foundation; either
10 1.1 mrg version 3 of the License, or (at your option) any later version.
11 1.1 mrg
12 1.1 mrg Libgfortran is distributed in the hope that it will be useful,
13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 mrg GNU General Public License for more details.
16 1.1 mrg
17 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
18 1.1 mrg permissions described in the GCC Runtime Library Exception, version
19 1.1 mrg 3.1, as published by the Free Software Foundation.
20 1.1 mrg
21 1.1 mrg You should have received a copy of the GNU General Public License and
22 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
23 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 1.1 mrg <http://www.gnu.org/licenses/>. */
25 1.1 mrg
26 1.1 mrg #include "libgfortran.h"
27 1.1 mrg #include <assert.h>'
28 1.1 mrg
29 1.1 mrg include(iparm.m4)dnl
30 1.1 mrg include(ifunction.m4)dnl
31 1.1 mrg
32 1.1 mrg `#if defined (HAVE_'atype_name`) && defined (HAVE_'rtype_name`)'
33 1.1 mrg
34 1.1 mrg #define HAVE_BACK_ARG 1
35 1.1 mrg
36 1.1 mrg ARRAY_FUNCTION(0,
37 1.1 mrg ` atype_name maxval;
38 1.1 mrg #if defined ('atype_inf`)
39 1.1 mrg maxval = -atype_inf;
40 1.1 mrg #else
41 1.1 mrg maxval = atype_min;
42 1.1 mrg #endif
43 1.1 mrg result = 1;',
44 1.1 mrg `#if defined ('atype_nan`)
45 1.1 mrg for (n = 0; n < len; n++, src += delta)
46 1.1 mrg {
47 1.1 mrg if (*src >= maxval)
48 1.1 mrg {
49 1.1 mrg maxval = *src;
50 1.1 mrg result = (rtype_name)n + 1;
51 1.1 mrg break;
52 1.1 mrg }
53 1.1 mrg }
54 1.1 mrg #else
55 1.1 mrg n = 0;
56 1.1 mrg #endif
57 1.1 mrg for (; n < len; n++, src += delta)
58 1.1 mrg {
59 1.1 mrg if (back ? *src >= maxval : *src > maxval)
60 1.1 mrg {
61 1.1 mrg maxval = *src;
62 1.1 mrg result = (rtype_name)n + 1;
63 1.1 mrg }', `')
64 1.1 mrg
65 1.1 mrg MASKED_ARRAY_FUNCTION(0,
66 1.1 mrg ` atype_name maxval;
67 1.1 mrg #if defined ('atype_inf`)
68 1.1 mrg maxval = -atype_inf;
69 1.1 mrg #else
70 1.1 mrg maxval = atype_min;
71 1.1 mrg #endif
72 1.1 mrg #if defined ('atype_nan`)
73 1.1 mrg rtype_name result2 = 0;
74 1.1 mrg #endif
75 1.1 mrg result = 0;',
76 1.1 mrg ` if (*msrc)
77 1.1 mrg {
78 1.1 mrg #if defined ('atype_nan`)
79 1.1 mrg if (!result2)
80 1.1 mrg result2 = (rtype_name)n + 1;
81 1.1 mrg if (*src >= maxval)
82 1.1 mrg #endif
83 1.1 mrg {
84 1.1 mrg maxval = *src;
85 1.1 mrg result = (rtype_name)n + 1;
86 1.1 mrg break;
87 1.1 mrg }
88 1.1 mrg }
89 1.1 mrg }
90 1.1 mrg #if defined ('atype_nan`)
91 1.1 mrg if (unlikely (n >= len))
92 1.1 mrg result = result2;
93 1.1 mrg else
94 1.1 mrg #endif
95 1.1 mrg if (back)
96 1.1 mrg for (; n < len; n++, src += delta, msrc += mdelta)
97 1.1 mrg {
98 1.1 mrg if (*msrc && unlikely (*src >= maxval))
99 1.1 mrg {
100 1.1 mrg maxval = *src;
101 1.1 mrg result = (rtype_name)n + 1;
102 1.1 mrg }
103 1.1 mrg }
104 1.1 mrg else
105 1.1 mrg for (; n < len; n++, src += delta, msrc += mdelta)
106 1.1 mrg {
107 1.1 mrg if (*msrc && unlikely (*src > maxval))
108 1.1 mrg {
109 1.1 mrg maxval = *src;
110 1.1 mrg result = (rtype_name)n + 1;
111 1.1 mrg }')
112 1.1 mrg
113 1.1 mrg SCALAR_ARRAY_FUNCTION(0)
114 1.1 mrg
115 1.1 mrg #endif
116