xref: /llvm-project/flang/runtime/Float128Math/norm2.cpp (revision fc51c7f0cc1abf1679100d71d103fe5d943f580b)
1 //===-- runtime/Float128Math/norm2.cpp ------------------------------------===//
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 #include "math-entries.h"
10 #include "numeric-template-specs.h"
11 #include "reduction-templates.h"
12 
13 namespace Fortran::runtime {
14 extern "C" {
15 
16 #if HAS_LDBL128 || HAS_FLOAT128
17 CppTypeFor<TypeCategory::Real, 16> RTDEF(Norm2_16)(
18     const Descriptor &x, const char *source, int line, int dim) {
19   return GetTotalReduction<TypeCategory::Real, 16>(
20       x, source, line, dim, nullptr, Norm2Accumulator<16>{x}, "NORM2");
21 }
22 
23 void RTDEF(Norm2DimReal16)(Descriptor &result, const Descriptor &x, int dim,
24     const char *source, int line) {
25   Terminator terminator{source, line};
26   auto type{x.type().GetCategoryAndKind()};
27   RUNTIME_CHECK(terminator, type);
28   RUNTIME_CHECK(
29       terminator, type->first == TypeCategory::Real && type->second == 16);
30   Norm2Helper<16>{}(result, x, dim, nullptr, terminator);
31 }
32 #endif
33 
34 } // extern "C"
35 } // namespace Fortran::runtime
36