FLANG
reduce.h
1//===-- include/flang/Runtime/reduce.h --------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// Defines the API for implementations of the transformational intrinsic
10// function REDUCE(); see F'2023 16.9.173.
11//
12// Similar to the definition of the APIs for SUM(), &c., in reduction.h,
13// there are typed functions here like ReduceInteger4() for total reductions
14// to scalars and void functions like ReduceInteger4Dim() for partial
15// reductions to smaller arrays.
16
17#ifndef FORTRAN_RUNTIME_REDUCE_H_
18#define FORTRAN_RUNTIME_REDUCE_H_
19
20#include "flang/Common/float128.h"
21#include "flang/Common/uint128.h"
22#include "flang/Runtime/cpp-type.h"
23#include "flang/Runtime/entry-names.h"
24#include <complex>
25#include <cstdint>
26
27namespace Fortran::runtime {
28
29class Descriptor;
30
31template <typename T>
32using ReferenceReductionOperation = T (*)(const T *, const T *);
33template <typename T> using ValueReductionOperation = T (*)(T, T);
34template <typename CHAR>
35using ReductionCharOperation = void (*)(CHAR *hiddenResult,
36 std::size_t resultLen, const CHAR *x, const CHAR *y, std::size_t xLen,
37 std::size_t yLen);
38using ReductionDerivedTypeOperation = void (*)(
39 void *hiddenResult, const void *x, const void *y);
40
41extern "C" {
42
43std::int8_t RTDECL(ReduceInteger1Ref)(const Descriptor &,
44 ReferenceReductionOperation<std::int8_t>, const char *source, int line,
45 int dim = 0, const Descriptor *mask = nullptr,
46 const std::int8_t *identity = nullptr, bool ordered = true);
47std::int8_t RTDECL(ReduceInteger1Value)(const Descriptor &,
48 ValueReductionOperation<std::int8_t>, const char *source, int line,
49 int dim = 0, const Descriptor *mask = nullptr,
50 const std::int8_t *identity = nullptr, bool ordered = true);
51void RTDECL(ReduceInteger1DimRef)(Descriptor &result, const Descriptor &array,
52 ReferenceReductionOperation<std::int8_t>, const char *source, int line,
53 int dim, const Descriptor *mask = nullptr,
54 const std::int8_t *identity = nullptr, bool ordered = true);
55void RTDECL(ReduceInteger1DimValue)(Descriptor &result, const Descriptor &array,
56 ValueReductionOperation<std::int8_t>, const char *source, int line, int dim,
57 const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr,
58 bool ordered = true);
59std::int16_t RTDECL(ReduceInteger2Ref)(const Descriptor &,
60 ReferenceReductionOperation<std::int16_t>, const char *source, int line,
61 int dim = 0, const Descriptor *mask = nullptr,
62 const std::int16_t *identity = nullptr, bool ordered = true);
63std::int16_t RTDECL(ReduceInteger2Value)(const Descriptor &,
64 ValueReductionOperation<std::int16_t>, const char *source, int line,
65 int dim = 0, const Descriptor *mask = nullptr,
66 const std::int16_t *identity = nullptr, bool ordered = true);
67void RTDECL(ReduceInteger2DimRef)(Descriptor &result, const Descriptor &array,
68 ReferenceReductionOperation<std::int16_t>, const char *source, int line,
69 int dim, const Descriptor *mask = nullptr,
70 const std::int16_t *identity = nullptr, bool ordered = true);
71void RTDECL(ReduceInteger2DimValue)(Descriptor &result, const Descriptor &array,
72 ValueReductionOperation<std::int16_t>, const char *source, int line,
73 int dim, const Descriptor *mask = nullptr,
74 const std::int16_t *identity = nullptr, bool ordered = true);
75std::int32_t RTDECL(ReduceInteger4Ref)(const Descriptor &,
76 ReferenceReductionOperation<std::int32_t>, const char *source, int line,
77 int dim = 0, const Descriptor *mask = nullptr,
78 const std::int32_t *identity = nullptr, bool ordered = true);
79std::int32_t RTDECL(ReduceInteger4Value)(const Descriptor &,
80 ValueReductionOperation<std::int32_t>, const char *source, int line,
81 int dim = 0, const Descriptor *mask = nullptr,
82 const std::int32_t *identity = nullptr, bool ordered = true);
83void RTDECL(ReduceInteger4DimRef)(Descriptor &result, const Descriptor &array,
84 ReferenceReductionOperation<std::int32_t>, const char *source, int line,
85 int dim, const Descriptor *mask = nullptr,
86 const std::int32_t *identity = nullptr, bool ordered = true);
87void RTDECL(ReduceInteger4DimValue)(Descriptor &result, const Descriptor &array,
88 ValueReductionOperation<std::int32_t>, const char *source, int line,
89 int dim, const Descriptor *mask = nullptr,
90 const std::int32_t *identity = nullptr, bool ordered = true);
91std::int64_t RTDECL(ReduceInteger8Ref)(const Descriptor &,
92 ReferenceReductionOperation<std::int64_t>, const char *source, int line,
93 int dim = 0, const Descriptor *mask = nullptr,
94 const std::int64_t *identity = nullptr, bool ordered = true);
95std::int64_t RTDECL(ReduceInteger8Value)(const Descriptor &,
96 ValueReductionOperation<std::int64_t>, const char *source, int line,
97 int dim = 0, const Descriptor *mask = nullptr,
98 const std::int64_t *identity = nullptr, bool ordered = true);
99void RTDECL(ReduceInteger8DimRef)(Descriptor &result, const Descriptor &array,
100 ReferenceReductionOperation<std::int64_t>, const char *source, int line,
101 int dim, const Descriptor *mask = nullptr,
102 const std::int64_t *identity = nullptr, bool ordered = true);
103void RTDECL(ReduceInteger8DimValue)(Descriptor &result, const Descriptor &array,
104 ValueReductionOperation<std::int64_t>, const char *source, int line,
105 int dim, const Descriptor *mask = nullptr,
106 const std::int64_t *identity = nullptr, bool ordered = true);
107#ifdef __SIZEOF_INT128__
108common::int128_t RTDECL(ReduceInteger16Ref)(const Descriptor &,
109 ReferenceReductionOperation<common::int128_t>, const char *source, int line,
110 int dim = 0, const Descriptor *mask = nullptr,
111 const common::int128_t *identity = nullptr, bool ordered = true);
112common::int128_t RTDECL(ReduceInteger16Value)(const Descriptor &,
113 ValueReductionOperation<common::int128_t>, const char *source, int line,
114 int dim = 0, const Descriptor *mask = nullptr,
115 const common::int128_t *identity = nullptr, bool ordered = true);
116void RTDECL(ReduceInteger16DimRef)(Descriptor &result, const Descriptor &array,
117 ReferenceReductionOperation<common::int128_t>, const char *source, int line,
118 int dim, const Descriptor *mask = nullptr,
119 const common::int128_t *identity = nullptr, bool ordered = true);
120void RTDECL(ReduceInteger16DimValue)(Descriptor &result,
121 const Descriptor &array, ValueReductionOperation<common::int128_t>,
122 const char *source, int line, int dim, const Descriptor *mask = nullptr,
123 const common::int128_t *identity = nullptr, bool ordered = true);
124#endif
125
126std::uint8_t RTDECL(ReduceUnsigned1Ref)(const Descriptor &,
127 ReferenceReductionOperation<std::uint8_t>, const char *source, int line,
128 int dim = 0, const Descriptor *mask = nullptr,
129 const std::uint8_t *identity = nullptr, bool ordered = true);
130std::uint8_t RTDECL(ReduceUnsigned1Value)(const Descriptor &,
131 ValueReductionOperation<std::uint8_t>, const char *source, int line,
132 int dim = 0, const Descriptor *mask = nullptr,
133 const std::uint8_t *identity = nullptr, bool ordered = true);
134void RTDECL(ReduceUnsigned1DimRef)(Descriptor &result, const Descriptor &array,
135 ReferenceReductionOperation<std::uint8_t>, const char *source, int line,
136 int dim, const Descriptor *mask = nullptr,
137 const std::uint8_t *identity = nullptr, bool ordered = true);
138void RTDECL(ReduceUnsigned1DimValue)(Descriptor &result,
139 const Descriptor &array, ValueReductionOperation<std::uint8_t>,
140 const char *source, int line, int dim, const Descriptor *mask = nullptr,
141 const std::uint8_t *identity = nullptr, bool ordered = true);
142std::uint16_t RTDECL(ReduceUnsigned2Ref)(const Descriptor &,
143 ReferenceReductionOperation<std::uint16_t>, const char *source, int line,
144 int dim = 0, const Descriptor *mask = nullptr,
145 const std::uint16_t *identity = nullptr, bool ordered = true);
146std::uint16_t RTDECL(ReduceUnsigned2Value)(const Descriptor &,
147 ValueReductionOperation<std::uint16_t>, const char *source, int line,
148 int dim = 0, const Descriptor *mask = nullptr,
149 const std::uint16_t *identity = nullptr, bool ordered = true);
150void RTDECL(ReduceUnsigned2DimRef)(Descriptor &result, const Descriptor &array,
151 ReferenceReductionOperation<std::uint16_t>, const char *source, int line,
152 int dim, const Descriptor *mask = nullptr,
153 const std::uint16_t *identity = nullptr, bool ordered = true);
154void RTDECL(ReduceUnsigned2DimValue)(Descriptor &result,
155 const Descriptor &array, ValueReductionOperation<std::uint16_t>,
156 const char *source, int line, int dim, const Descriptor *mask = nullptr,
157 const std::uint16_t *identity = nullptr, bool ordered = true);
158std::uint32_t RTDECL(ReduceUnsigned4Ref)(const Descriptor &,
159 ReferenceReductionOperation<std::uint32_t>, const char *source, int line,
160 int dim = 0, const Descriptor *mask = nullptr,
161 const std::uint32_t *identity = nullptr, bool ordered = true);
162std::uint32_t RTDECL(ReduceUnsigned4Value)(const Descriptor &,
163 ValueReductionOperation<std::uint32_t>, const char *source, int line,
164 int dim = 0, const Descriptor *mask = nullptr,
165 const std::uint32_t *identity = nullptr, bool ordered = true);
166void RTDECL(ReduceUnsigned4DimRef)(Descriptor &result, const Descriptor &array,
167 ReferenceReductionOperation<std::uint32_t>, const char *source, int line,
168 int dim, const Descriptor *mask = nullptr,
169 const std::uint32_t *identity = nullptr, bool ordered = true);
170void RTDECL(ReduceUnsigned4DimValue)(Descriptor &result,
171 const Descriptor &array, ValueReductionOperation<std::uint32_t>,
172 const char *source, int line, int dim, const Descriptor *mask = nullptr,
173 const std::uint32_t *identity = nullptr, bool ordered = true);
174std::uint64_t RTDECL(ReduceUnsigned8Ref)(const Descriptor &,
175 ReferenceReductionOperation<std::uint64_t>, const char *source, int line,
176 int dim = 0, const Descriptor *mask = nullptr,
177 const std::uint64_t *identity = nullptr, bool ordered = true);
178std::uint64_t RTDECL(ReduceUnsigned8Value)(const Descriptor &,
179 ValueReductionOperation<std::uint64_t>, const char *source, int line,
180 int dim = 0, const Descriptor *mask = nullptr,
181 const std::uint64_t *identity = nullptr, bool ordered = true);
182void RTDECL(ReduceUnsigned8DimRef)(Descriptor &result, const Descriptor &array,
183 ReferenceReductionOperation<std::uint64_t>, const char *source, int line,
184 int dim, const Descriptor *mask = nullptr,
185 const std::uint64_t *identity = nullptr, bool ordered = true);
186void RTDECL(ReduceUnsigned8DimValue)(Descriptor &result,
187 const Descriptor &array, ValueReductionOperation<std::uint64_t>,
188 const char *source, int line, int dim, const Descriptor *mask = nullptr,
189 const std::uint64_t *identity = nullptr, bool ordered = true);
190#ifdef __SIZEOF_INT128__
191common::uint128_t RTDECL(ReduceUnsigned16Ref)(const Descriptor &,
192 ReferenceReductionOperation<common::uint128_t>, const char *source,
193 int line, int dim = 0, const Descriptor *mask = nullptr,
194 const common::uint128_t *identity = nullptr, bool ordered = true);
195common::uint128_t RTDECL(ReduceUnsigned16Value)(const Descriptor &,
196 ValueReductionOperation<common::uint128_t>, const char *source, int line,
197 int dim = 0, const Descriptor *mask = nullptr,
198 const common::uint128_t *identity = nullptr, bool ordered = true);
199void RTDECL(ReduceUnsigned16DimRef)(Descriptor &result, const Descriptor &array,
200 ReferenceReductionOperation<common::uint128_t>, const char *source,
201 int line, int dim, const Descriptor *mask = nullptr,
202 const common::uint128_t *identity = nullptr, bool ordered = true);
203void RTDECL(ReduceUnsigned16DimValue)(Descriptor &result,
204 const Descriptor &array, ValueReductionOperation<common::uint128_t>,
205 const char *source, int line, int dim, const Descriptor *mask = nullptr,
206 const common::uint128_t *identity = nullptr, bool ordered = true);
207#endif
208
209// REAL/COMPLEX(2 & 3) return 32-bit float results for the caller to downconvert
210float RTDECL(ReduceReal2Ref)(const Descriptor &,
211 ReferenceReductionOperation<float>, const char *source, int line,
212 int dim = 0, const Descriptor *mask = nullptr,
213 const float *identity = nullptr, bool ordered = true);
214float RTDECL(ReduceReal2Value)(const Descriptor &,
215 ValueReductionOperation<float>, const char *source, int line, int dim = 0,
216 const Descriptor *mask = nullptr, const float *identity = nullptr,
217 bool ordered = true);
218void RTDECL(ReduceReal2DimRef)(Descriptor &result, const Descriptor &array,
219 ReferenceReductionOperation<float>, const char *source, int line, int dim,
220 const Descriptor *mask = nullptr, const float *identity = nullptr,
221 bool ordered = true);
222void RTDECL(ReduceReal2DimValue)(Descriptor &result, const Descriptor &array,
223 ValueReductionOperation<float>, const char *source, int line, int dim,
224 const Descriptor *mask = nullptr, const float *identity = nullptr,
225 bool ordered = true);
226float RTDECL(ReduceReal3Ref)(const Descriptor &,
227 ReferenceReductionOperation<float>, const char *source, int line,
228 int dim = 0, const Descriptor *mask = nullptr,
229 const float *identity = nullptr, bool ordered = true);
230float RTDECL(ReduceReal3Value)(const Descriptor &,
231 ValueReductionOperation<float>, const char *source, int line, int dim = 0,
232 const Descriptor *mask = nullptr, const float *identity = nullptr,
233 bool ordered = true);
234void RTDECL(ReduceReal3DimRef)(Descriptor &result, const Descriptor &array,
235 ReferenceReductionOperation<float>, const char *source, int line, int dim,
236 const Descriptor *mask = nullptr, const float *identity = nullptr,
237 bool ordered = true);
238void RTDECL(ReduceReal3DimValue)(Descriptor &result, const Descriptor &array,
239 ValueReductionOperation<float>, const char *source, int line, int dim,
240 const Descriptor *mask = nullptr, const float *identity = nullptr,
241 bool ordered = true);
242float RTDECL(ReduceReal4Ref)(const Descriptor &,
243 ReferenceReductionOperation<float>, const char *source, int line,
244 int dim = 0, const Descriptor *mask = nullptr,
245 const float *identity = nullptr, bool ordered = true);
246float RTDECL(ReduceReal4Value)(const Descriptor &,
247 ValueReductionOperation<float>, const char *source, int line, int dim = 0,
248 const Descriptor *mask = nullptr, const float *identity = nullptr,
249 bool ordered = true);
250void RTDECL(ReduceReal4DimRef)(Descriptor &result, const Descriptor &array,
251 ReferenceReductionOperation<float>, const char *source, int line, int dim,
252 const Descriptor *mask = nullptr, const float *identity = nullptr,
253 bool ordered = true);
254void RTDECL(ReduceReal4DimValue)(Descriptor &result, const Descriptor &array,
255 ValueReductionOperation<float>, const char *source, int line, int dim,
256 const Descriptor *mask = nullptr, const float *identity = nullptr,
257 bool ordered = true);
258double RTDECL(ReduceReal8Ref)(const Descriptor &,
259 ReferenceReductionOperation<double>, const char *source, int line,
260 int dim = 0, const Descriptor *mask = nullptr,
261 const double *identity = nullptr, bool ordered = true);
262double RTDECL(ReduceReal8Value)(const Descriptor &,
263 ValueReductionOperation<double>, const char *source, int line, int dim = 0,
264 const Descriptor *mask = nullptr, const double *identity = nullptr,
265 bool ordered = true);
266void RTDECL(ReduceReal8DimRef)(Descriptor &result, const Descriptor &array,
267 ReferenceReductionOperation<double>, const char *source, int line, int dim,
268 const Descriptor *mask = nullptr, const double *identity = nullptr,
269 bool ordered = true);
270void RTDECL(ReduceReal8DimValue)(Descriptor &result, const Descriptor &array,
271 ValueReductionOperation<double>, const char *source, int line, int dim,
272 const Descriptor *mask = nullptr, const double *identity = nullptr,
273 bool ordered = true);
274#if HAS_FLOAT80
275CppTypeFor<TypeCategory::Real, 10> RTDECL(ReduceReal10Ref)(const Descriptor &,
276 ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>>,
277 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
278 const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr,
279 bool ordered = true);
280CppTypeFor<TypeCategory::Real, 10> RTDECL(ReduceReal10Value)(const Descriptor &,
281 ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>>,
282 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
283 const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr,
284 bool ordered = true);
285void RTDECL(ReduceReal10DimRef)(Descriptor &result, const Descriptor &array,
286 ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>>,
287 const char *source, int line, int dim, const Descriptor *mask = nullptr,
288 const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr,
289 bool ordered = true);
290void RTDECL(ReduceReal10DimValue)(Descriptor &result, const Descriptor &array,
291 ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>>,
292 const char *source, int line, int dim, const Descriptor *mask = nullptr,
293 const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr,
294 bool ordered = true);
295#endif
296#if HAS_LDBL128 || HAS_FLOAT128
297CppFloat128Type RTDECL(ReduceReal16Ref)(const Descriptor &,
298 ReferenceReductionOperation<CppFloat128Type>, const char *source, int line,
299 int dim = 0, const Descriptor *mask = nullptr,
300 const CppFloat128Type *identity = nullptr, bool ordered = true);
301CppFloat128Type RTDECL(ReduceReal16Value)(const Descriptor &,
302 ValueReductionOperation<CppFloat128Type>, const char *source, int line,
303 int dim = 0, const Descriptor *mask = nullptr,
304 const CppFloat128Type *identity = nullptr, bool ordered = true);
305void RTDECL(ReduceReal16DimRef)(Descriptor &result, const Descriptor &array,
306 ReferenceReductionOperation<CppFloat128Type>, const char *source, int line,
307 int dim, const Descriptor *mask = nullptr,
308 const CppFloat128Type *identity = nullptr, bool ordered = true);
309void RTDECL(ReduceReal16DimValue)(Descriptor &result, const Descriptor &array,
310 ValueReductionOperation<CppFloat128Type>, const char *source, int line,
311 int dim, const Descriptor *mask = nullptr,
312 const CppFloat128Type *identity = nullptr, bool ordered = true);
313#endif
314
315void RTDECL(CppReduceComplex2Ref)(CppTypeFor<TypeCategory::Complex, 4> &,
316 const Descriptor &,
317 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
318 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
319 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
320 bool ordered = true);
321void RTDECL(CppReduceComplex2Value)(CppTypeFor<TypeCategory::Complex, 4> &,
322 const Descriptor &,
323 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
324 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
325 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
326 bool ordered = true);
327void RTDECL(CppReduceComplex2DimRef)(Descriptor &result,
328 const Descriptor &array,
329 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
330 const char *source, int line, int dim, const Descriptor *mask = nullptr,
331 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
332 bool ordered = true);
333void RTDECL(CppReduceComplex2DimValue)(Descriptor &result,
334 const Descriptor &array,
335 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
336 const char *source, int line, int dim, const Descriptor *mask = nullptr,
337 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
338 bool ordered = true);
339void RTDECL(CppReduceComplex3Ref)(CppTypeFor<TypeCategory::Complex, 4> &,
340 const Descriptor &,
341 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
342 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
343 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
344 bool ordered = true);
345void RTDECL(CppReduceComplex3Value)(CppTypeFor<TypeCategory::Complex, 4> &,
346 const Descriptor &,
347 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
348 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
349 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
350 bool ordered = true);
351void RTDECL(CppReduceComplex3DimRef)(Descriptor &result,
352 const Descriptor &array,
353 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
354 const char *source, int line, int dim, const Descriptor *mask = nullptr,
355 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
356 bool ordered = true);
357void RTDECL(CppReduceComplex3DimValue)(Descriptor &result,
358 const Descriptor &array,
359 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
360 const char *source, int line, int dim, const Descriptor *mask = nullptr,
361 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
362 bool ordered = true);
363void RTDECL(CppReduceComplex4Ref)(CppTypeFor<TypeCategory::Complex, 4> &,
364 const Descriptor &,
365 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
366 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
367 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
368 bool ordered = true);
369void RTDECL(CppReduceComplex4Value)(CppTypeFor<TypeCategory::Complex, 4> &,
370 const Descriptor &,
371 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
372 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
373 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
374 bool ordered = true);
375void RTDECL(CppReduceComplex4DimRef)(Descriptor &result,
376 const Descriptor &array,
377 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
378 const char *source, int line, int dim, const Descriptor *mask = nullptr,
379 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
380 bool ordered = true);
381void RTDECL(CppReduceComplex4DimValue)(Descriptor &result,
382 const Descriptor &array,
383 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>,
384 const char *source, int line, int dim, const Descriptor *mask = nullptr,
385 const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr,
386 bool ordered = true);
387void RTDECL(CppReduceComplex8Ref)(CppTypeFor<TypeCategory::Complex, 8> &,
388 const Descriptor &,
389 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>,
390 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
391 const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr,
392 bool ordered = true);
393void RTDECL(CppReduceComplex8Value)(CppTypeFor<TypeCategory::Complex, 8> &,
394 const Descriptor &,
395 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>,
396 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
397 const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr,
398 bool ordered = true);
399void RTDECL(CppReduceComplex8DimRef)(Descriptor &result,
400 const Descriptor &array,
401 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>,
402 const char *source, int line, int dim, const Descriptor *mask = nullptr,
403 const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr,
404 bool ordered = true);
405void RTDECL(CppReduceComplex8DimValue)(Descriptor &result,
406 const Descriptor &array,
407 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>,
408 const char *source, int line, int dim, const Descriptor *mask = nullptr,
409 const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr,
410 bool ordered = true);
411#if HAS_FLOAT80
412void RTDECL(CppReduceComplex10Ref)(CppTypeFor<TypeCategory::Complex, 10> &,
413 const Descriptor &,
414 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>,
415 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
416 const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr,
417 bool ordered = true);
418void RTDECL(CppReduceComplex10Value)(CppTypeFor<TypeCategory::Complex, 10> &,
419 const Descriptor &,
420 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>,
421 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
422 const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr,
423 bool ordered = true);
424void RTDECL(CppReduceComplex10DimRef)(Descriptor &result,
425 const Descriptor &array,
426 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>,
427 const char *source, int line, int dim, const Descriptor *mask = nullptr,
428 const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr,
429 bool ordered = true);
430void RTDECL(CppReduceComplex10DimValue)(Descriptor &result,
431 const Descriptor &array,
432 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>,
433 const char *source, int line, int dim, const Descriptor *mask = nullptr,
434 const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr,
435 bool ordered = true);
436#endif
437#if HAS_LDBL128 || HAS_FLOAT128
438void RTDECL(CppReduceComplex16Ref)(CppTypeFor<TypeCategory::Complex, 16> &,
439 const Descriptor &,
440 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>,
441 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
442 const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr,
443 bool ordered = true);
444void RTDECL(CppReduceComplex16Value)(CppTypeFor<TypeCategory::Complex, 16> &,
445 const Descriptor &,
446 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>,
447 const char *source, int line, int dim = 0, const Descriptor *mask = nullptr,
448 const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr,
449 bool ordered = true);
450void RTDECL(CppReduceComplex16DimRef)(Descriptor &result,
451 const Descriptor &array,
452 ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>,
453 const char *source, int line, int dim, const Descriptor *mask = nullptr,
454 const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr,
455 bool ordered = true);
456void RTDECL(CppReduceComplex16DimValue)(Descriptor &result,
457 const Descriptor &array,
458 ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>,
459 const char *source, int line, int dim, const Descriptor *mask = nullptr,
460 const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr,
461 bool ordered = true);
462#endif
463
464bool RTDECL(ReduceLogical1Ref)(const Descriptor &,
465 ReferenceReductionOperation<std::int8_t>, const char *source, int line,
466 int dim = 0, const Descriptor *mask = nullptr,
467 const std::int8_t *identity = nullptr, bool ordered = true);
468bool RTDECL(ReduceLogical1Value)(const Descriptor &,
469 ValueReductionOperation<std::int8_t>, const char *source, int line,
470 int dim = 0, const Descriptor *mask = nullptr,
471 const std::int8_t *identity = nullptr, bool ordered = true);
472void RTDECL(ReduceLogical1DimRef)(Descriptor &result, const Descriptor &array,
473 ReferenceReductionOperation<std::int8_t>, const char *source, int line,
474 int dim, const Descriptor *mask = nullptr,
475 const std::int8_t *identity = nullptr, bool ordered = true);
476void RTDECL(ReduceLogical1DimValue)(Descriptor &result, const Descriptor &array,
477 ValueReductionOperation<std::int8_t>, const char *source, int line, int dim,
478 const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr,
479 bool ordered = true);
480bool RTDECL(ReduceLogical2Ref)(const Descriptor &,
481 ReferenceReductionOperation<std::int16_t>, const char *source, int line,
482 int dim = 0, const Descriptor *mask = nullptr,
483 const std::int16_t *identity = nullptr, bool ordered = true);
484bool RTDECL(ReduceLogical2Value)(const Descriptor &,
485 ValueReductionOperation<std::int16_t>, const char *source, int line,
486 int dim = 0, const Descriptor *mask = nullptr,
487 const std::int16_t *identity = nullptr, bool ordered = true);
488void RTDECL(ReduceLogical2DimRef)(Descriptor &result, const Descriptor &array,
489 ReferenceReductionOperation<std::int16_t>, const char *source, int line,
490 int dim, const Descriptor *mask = nullptr,
491 const std::int16_t *identity = nullptr, bool ordered = true);
492void RTDECL(ReduceLogical2DimValue)(Descriptor &result, const Descriptor &array,
493 ValueReductionOperation<std::int16_t>, const char *source, int line,
494 int dim, const Descriptor *mask = nullptr,
495 const std::int16_t *identity = nullptr, bool ordered = true);
496bool RTDECL(ReduceLogical4Ref)(const Descriptor &,
497 ReferenceReductionOperation<std::int32_t>, const char *source, int line,
498 int dim = 0, const Descriptor *mask = nullptr,
499 const std::int32_t *identity = nullptr, bool ordered = true);
500bool RTDECL(ReduceLogical4Value)(const Descriptor &,
501 ValueReductionOperation<std::int32_t>, const char *source, int line,
502 int dim = 0, const Descriptor *mask = nullptr,
503 const std::int32_t *identity = nullptr, bool ordered = true);
504void RTDECL(ReduceLogical4DimRef)(Descriptor &result, const Descriptor &array,
505 ReferenceReductionOperation<std::int32_t>, const char *source, int line,
506 int dim, const Descriptor *mask = nullptr,
507 const std::int32_t *identity = nullptr, bool ordered = true);
508void RTDECL(ReduceLogical4DimValue)(Descriptor &result, const Descriptor &array,
509 ValueReductionOperation<std::int32_t>, const char *source, int line,
510 int dim, const Descriptor *mask = nullptr,
511 const std::int32_t *identity = nullptr, bool ordered = true);
512bool RTDECL(ReduceLogical8Ref)(const Descriptor &,
513 ReferenceReductionOperation<std::int64_t>, const char *source, int line,
514 int dim = 0, const Descriptor *mask = nullptr,
515 const std::int64_t *identity = nullptr, bool ordered = true);
516bool RTDECL(ReduceLogical8Value)(const Descriptor &,
517 ValueReductionOperation<std::int64_t>, const char *source, int line,
518 int dim = 0, const Descriptor *mask = nullptr,
519 const std::int64_t *identity = nullptr, bool ordered = true);
520void RTDECL(ReduceLogical8DimRef)(Descriptor &result, const Descriptor &array,
521 ReferenceReductionOperation<std::int64_t>, const char *source, int line,
522 int dim, const Descriptor *mask = nullptr,
523 const std::int64_t *identity = nullptr, bool ordered = true);
524void RTDECL(ReduceLogical8DimValue)(Descriptor &result, const Descriptor &array,
525 ValueReductionOperation<std::int64_t>, const char *source, int line,
526 int dim, const Descriptor *mask = nullptr,
527 const std::int64_t *identity = nullptr, bool ordered = true);
528
529void RTDECL(ReduceChar1)(char *result, const Descriptor &array,
530 ReductionCharOperation<char>, const char *source, int line, int dim = 0,
531 const Descriptor *mask = nullptr, const char *identity = nullptr,
532 bool ordered = true);
533void RTDECL(ReduceCharacter1Dim)(Descriptor &result, const Descriptor &array,
534 ReductionCharOperation<char>, const char *source, int line, int dim,
535 const Descriptor *mask = nullptr, const char *identity = nullptr,
536 bool ordered = true);
537void RTDECL(ReduceChar2)(char16_t *result, const Descriptor &array,
538 ReductionCharOperation<char16_t>, const char *source, int line, int dim = 0,
539 const Descriptor *mask = nullptr, const char16_t *identity = nullptr,
540 bool ordered = true);
541void RTDECL(ReduceCharacter2Dim)(Descriptor &result, const Descriptor &array,
542 ReductionCharOperation<char16_t>, const char *source, int line, int dim,
543 const Descriptor *mask = nullptr, const char16_t *identity = nullptr,
544 bool ordered = true);
545void RTDECL(ReduceChar4)(char32_t *result, const Descriptor &array,
546 ReductionCharOperation<char32_t>, const char *source, int line, int dim = 0,
547 const Descriptor *mask = nullptr, const char32_t *identity = nullptr,
548 bool ordered = true);
549void RTDECL(ReduceCharacter4Dim)(Descriptor &result, const Descriptor &array,
550 ReductionCharOperation<char32_t>, const char *source, int line, int dim,
551 const Descriptor *mask = nullptr, const char32_t *identity = nullptr,
552 bool ordered = true);
553
554void RTDECL(ReduceDerivedType)(char *result, const Descriptor &array,
555 ReductionDerivedTypeOperation, const char *source, int line, int dim = 0,
556 const Descriptor *mask = nullptr, const char *identity = nullptr,
557 bool ordered = true);
558void RTDECL(ReduceDerivedTypeDim)(Descriptor &result, const Descriptor &array,
559 ReductionDerivedTypeOperation, const char *source, int line, int dim,
560 const Descriptor *mask = nullptr, const char *identity = nullptr,
561 bool ordered = true);
562
563} // extern "C"
564} // namespace Fortran::runtime
565#endif // FORTRAN_RUNTIME_REDUCE_H_