//===-- runtime/numeric.h ---------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // Defines API between compiled code and the implementations of various numeric // intrinsic functions in the runtime library. #ifndef FORTRAN_RUNTIME_NUMERIC_H_ #define FORTRAN_RUNTIME_NUMERIC_H_ #include "cpp-type.h" #include "entry-names.h" namespace Fortran::runtime { extern "C" { // AINT CppTypeFor RTNAME(Aint4_4)( CppTypeFor); CppTypeFor RTNAME(Aint4_8)( CppTypeFor); CppTypeFor RTNAME(Aint4_10)( CppTypeFor); CppTypeFor RTNAME(Aint4_16)( CppTypeFor); CppTypeFor RTNAME(Aint8_4)( CppTypeFor); CppTypeFor RTNAME(Aint8_8)( CppTypeFor); CppTypeFor RTNAME(Aint8_10)( CppTypeFor); CppTypeFor RTNAME(Aint8_16)( CppTypeFor); CppTypeFor RTNAME(Aint10_4)( CppTypeFor); CppTypeFor RTNAME(Aint10_8)( CppTypeFor); CppTypeFor RTNAME(Aint10_10)( CppTypeFor); CppTypeFor RTNAME(Aint16_4)( CppTypeFor); CppTypeFor RTNAME(Aint16_8)( CppTypeFor); CppTypeFor RTNAME(Aint16_16)( CppTypeFor); // ANINT CppTypeFor RTNAME(Anint4_4)( CppTypeFor); CppTypeFor RTNAME(Anint4_8)( CppTypeFor); CppTypeFor RTNAME(Anint4_10)( CppTypeFor); CppTypeFor RTNAME(Anint4_16)( CppTypeFor); CppTypeFor RTNAME(Anint8_4)( CppTypeFor); CppTypeFor RTNAME(Anint8_8)( CppTypeFor); CppTypeFor RTNAME(Anint8_10)( CppTypeFor); CppTypeFor RTNAME(Anint8_16)( CppTypeFor); CppTypeFor RTNAME(Anint10_4)( CppTypeFor); CppTypeFor RTNAME(Anint10_8)( CppTypeFor); CppTypeFor RTNAME(Anint10_10)( CppTypeFor); CppTypeFor RTNAME(Anint16_4)( CppTypeFor); CppTypeFor RTNAME(Anint16_8)( CppTypeFor); CppTypeFor RTNAME(Anint16_16)( CppTypeFor); // CEILING CppTypeFor RTNAME(Ceiling4_1)( CppTypeFor); CppTypeFor RTNAME(Ceiling4_2)( CppTypeFor); CppTypeFor RTNAME(Ceiling4_4)( CppTypeFor); CppTypeFor RTNAME(Ceiling4_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Ceiling4_16)( CppTypeFor); #endif CppTypeFor RTNAME(Ceiling8_1)( CppTypeFor); CppTypeFor RTNAME(Ceiling8_2)( CppTypeFor); CppTypeFor RTNAME(Ceiling8_4)( CppTypeFor); CppTypeFor RTNAME(Ceiling8_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Ceiling8_16)( CppTypeFor); #endif CppTypeFor RTNAME(Ceiling10_1)( CppTypeFor); CppTypeFor RTNAME(Ceiling10_2)( CppTypeFor); CppTypeFor RTNAME(Ceiling10_4)( CppTypeFor); CppTypeFor RTNAME(Ceiling10_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Ceiling10_16)( CppTypeFor); #endif CppTypeFor RTNAME(Ceiling16_1)( CppTypeFor); CppTypeFor RTNAME(Ceiling16_2)( CppTypeFor); CppTypeFor RTNAME(Ceiling16_4)( CppTypeFor); CppTypeFor RTNAME(Ceiling16_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Ceiling16_16)( CppTypeFor); #endif // EXPONENT is defined to return default INTEGER; support INTEGER(4 & 8) CppTypeFor RTNAME(Exponent4_4)( CppTypeFor); CppTypeFor RTNAME(Exponent4_8)( CppTypeFor); CppTypeFor RTNAME(Exponent8_4)( CppTypeFor); CppTypeFor RTNAME(Exponent8_8)( CppTypeFor); CppTypeFor RTNAME(Exponent10_4)( CppTypeFor); CppTypeFor RTNAME(Exponent10_8)( CppTypeFor); CppTypeFor RTNAME(Exponent16_4)( CppTypeFor); CppTypeFor RTNAME(Exponent16_8)( CppTypeFor); // FLOOR CppTypeFor RTNAME(Floor4_1)( CppTypeFor); CppTypeFor RTNAME(Floor4_2)( CppTypeFor); CppTypeFor RTNAME(Floor4_4)( CppTypeFor); CppTypeFor RTNAME(Floor4_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Floor4_16)( CppTypeFor); #endif CppTypeFor RTNAME(Floor8_1)( CppTypeFor); CppTypeFor RTNAME(Floor8_2)( CppTypeFor); CppTypeFor RTNAME(Floor8_4)( CppTypeFor); CppTypeFor RTNAME(Floor8_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Floor8_16)( CppTypeFor); #endif CppTypeFor RTNAME(Floor10_1)( CppTypeFor); CppTypeFor RTNAME(Floor10_2)( CppTypeFor); CppTypeFor RTNAME(Floor10_4)( CppTypeFor); CppTypeFor RTNAME(Floor10_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Floor10_16)( CppTypeFor); #endif CppTypeFor RTNAME(Floor16_1)( CppTypeFor); CppTypeFor RTNAME(Floor16_2)( CppTypeFor); CppTypeFor RTNAME(Floor16_4)( CppTypeFor); CppTypeFor RTNAME(Floor16_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Floor16_16)( CppTypeFor); #endif // FRACTION CppTypeFor RTNAME(Fraction4)( CppTypeFor); CppTypeFor RTNAME(Fraction8)( CppTypeFor); CppTypeFor RTNAME(Fraction10)( CppTypeFor); CppTypeFor RTNAME(Fraction16)( CppTypeFor); // ISNAN / IEEE_IS_NAN bool RTNAME(IsNaN4)(CppTypeFor); bool RTNAME(IsNaN8)(CppTypeFor); bool RTNAME(IsNaN10)(CppTypeFor); bool RTNAME(IsNaN16)(CppTypeFor); // MOD & MODULO CppTypeFor RTNAME(ModInteger1)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModInteger2)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModInteger4)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModInteger8)( CppTypeFor, CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(ModInteger16)( CppTypeFor, CppTypeFor); #endif CppTypeFor RTNAME(ModReal4)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModReal8)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModReal10)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModReal16)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloInteger1)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloInteger2)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloInteger4)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloInteger8)( CppTypeFor, CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(ModuloInteger16)( CppTypeFor, CppTypeFor); #endif CppTypeFor RTNAME(ModuloReal4)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloReal8)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloReal10)( CppTypeFor, CppTypeFor); CppTypeFor RTNAME(ModuloReal16)( CppTypeFor, CppTypeFor); // NINT CppTypeFor RTNAME(Nint4_1)( CppTypeFor); CppTypeFor RTNAME(Nint4_2)( CppTypeFor); CppTypeFor RTNAME(Nint4_4)( CppTypeFor); CppTypeFor RTNAME(Nint4_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Nint4_16)( CppTypeFor); #endif CppTypeFor RTNAME(Nint8_1)( CppTypeFor); CppTypeFor RTNAME(Nint8_2)( CppTypeFor); CppTypeFor RTNAME(Nint8_4)( CppTypeFor); CppTypeFor RTNAME(Nint8_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Nint8_16)( CppTypeFor); #endif CppTypeFor RTNAME(Nint10_1)( CppTypeFor); CppTypeFor RTNAME(Nint10_2)( CppTypeFor); CppTypeFor RTNAME(Nint10_4)( CppTypeFor); CppTypeFor RTNAME(Nint10_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Nint10_16)( CppTypeFor); #endif CppTypeFor RTNAME(Nint16_1)( CppTypeFor); CppTypeFor RTNAME(Nint16_2)( CppTypeFor); CppTypeFor RTNAME(Nint16_4)( CppTypeFor); CppTypeFor RTNAME(Nint16_8)( CppTypeFor); #ifdef __SIZEOF_INT128__ CppTypeFor RTNAME(Nint16_16)( CppTypeFor); #endif // NEAREST // The second argument to NEAREST is the result of a comparison // to zero (i.e., S > 0) CppTypeFor RTNAME(Nearest4)( CppTypeFor, bool positive); CppTypeFor RTNAME(Nearest8)( CppTypeFor, bool positive); CppTypeFor RTNAME(Nearest10)( CppTypeFor, bool positive); CppTypeFor RTNAME(Nearest16)( CppTypeFor, bool positive); // RRSPACING CppTypeFor RTNAME(RRSpacing4)( CppTypeFor); CppTypeFor RTNAME(RRSpacing8)( CppTypeFor); CppTypeFor RTNAME(RRSpacing10)( CppTypeFor); CppTypeFor RTNAME(RRSpacing16)( CppTypeFor); // SET_EXPONENT's I= argument can be any INTEGER kind; upcast it to 64-bit CppTypeFor RTNAME(SetExponent4)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(SetExponent8)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(SetExponent10)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(SetExponent16)( CppTypeFor, std::int64_t); // SCALE CppTypeFor RTNAME(Scale4)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(Scale8)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(Scale10)( CppTypeFor, std::int64_t); CppTypeFor RTNAME(Scale16)( CppTypeFor, std::int64_t); // SPACING CppTypeFor RTNAME(Spacing4)( CppTypeFor); CppTypeFor RTNAME(Spacing8)( CppTypeFor); CppTypeFor RTNAME(Spacing10)( CppTypeFor); CppTypeFor RTNAME(Spacing16)( CppTypeFor); } // extern "C" } // namespace Fortran::runtime #endif // FORTRAN_RUNTIME_NUMERIC_H_