xref: /llvm-project/flang/runtime/Float128Math/numeric-template-specs.h (revision 0699749cb45db77e8393f198b1837945a958aebf)
1 //===-- runtime/Float128Math/numeric-template-specs.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 #ifndef FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
10 #define FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
11 
12 #include "math-entries.h"
13 #include "numeric-templates.h"
14 
15 namespace Fortran::runtime {
16 using F128Type = CppTypeFor<TypeCategory::Real, 16>;
17 
18 template <> struct ABSTy<F128Type> {
19   static F128Type compute(F128Type x) { return Abs<true>::invoke(x); }
20 };
21 
22 template <> struct FREXPTy<F128Type> {
23   static F128Type compute(F128Type x, int *e) {
24     return Frexp<true>::invoke(x, e);
25   }
26 };
27 
28 template <> struct ILOGBTy<F128Type> {
29   static int compute(F128Type x) { return Ilogb<true>::invoke(x); }
30 };
31 
32 template <> struct ISINFTy<F128Type> {
33   static bool compute(F128Type x) { return Isinf<true>::invoke(x); }
34 };
35 
36 template <> struct ISNANTy<F128Type> {
37   static bool compute(F128Type x) { return Isnan<true>::invoke(x); }
38 };
39 
40 template <> struct LDEXPTy<F128Type> {
41   template <typename ET> static F128Type compute(F128Type x, ET p) {
42     return Ldexp<true>::invoke(x, p);
43   }
44 };
45 
46 template <> struct QNANTy<F128Type> {
47   static F128Type compute() { return F128_RT_QNAN; }
48 };
49 
50 template <> struct SQRTTy<F128Type> {
51   static F128Type compute(F128Type x) { return Sqrt<true>::invoke(x); }
52 };
53 
54 } // namespace Fortran::runtime
55 #endif // FORTRAN_RUNTIME_FLOAT128MATH_NUMERIC_TEMPLATE_SPECS_H_
56