xref: /aosp_15_r20/external/armnn/third-party/half/half.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker // half - IEEE 754-based half-precision floating point library.
2*89c4ff92SAndroid Build Coastguard Worker //
3*89c4ff92SAndroid Build Coastguard Worker // Copyright (c) 2012-2017 Christian Rau <[email protected]>
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
6*89c4ff92SAndroid Build Coastguard Worker //
7*89c4ff92SAndroid Build Coastguard Worker // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
8*89c4ff92SAndroid Build Coastguard Worker // files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
9*89c4ff92SAndroid Build Coastguard Worker // modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
10*89c4ff92SAndroid Build Coastguard Worker // Software is furnished to do so, subject to the following conditions:
11*89c4ff92SAndroid Build Coastguard Worker //
12*89c4ff92SAndroid Build Coastguard Worker // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
13*89c4ff92SAndroid Build Coastguard Worker //
14*89c4ff92SAndroid Build Coastguard Worker // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
15*89c4ff92SAndroid Build Coastguard Worker // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16*89c4ff92SAndroid Build Coastguard Worker // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
17*89c4ff92SAndroid Build Coastguard Worker // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker // Version 1.12.0
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker /// \file
22*89c4ff92SAndroid Build Coastguard Worker /// Main header file for half precision functionality.
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker #ifndef HALF_HALF_HPP
25*89c4ff92SAndroid Build Coastguard Worker #define HALF_HALF_HPP
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker /// Combined gcc version number.
28*89c4ff92SAndroid Build Coastguard Worker #define HALF_GNUC_VERSION (__GNUC__*100+__GNUC_MINOR__)
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker //check C++11 language features
31*89c4ff92SAndroid Build Coastguard Worker #if defined(__clang__)										//clang
32*89c4ff92SAndroid Build Coastguard Worker 	#if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
33*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
34*89c4ff92SAndroid Build Coastguard Worker 	#endif
35*89c4ff92SAndroid Build Coastguard Worker 	#if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
36*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_CONSTEXPR 1
37*89c4ff92SAndroid Build Coastguard Worker 	#endif
38*89c4ff92SAndroid Build Coastguard Worker 	#if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
39*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_NOEXCEPT 1
40*89c4ff92SAndroid Build Coastguard Worker 	#endif
41*89c4ff92SAndroid Build Coastguard Worker 	#if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
42*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_USER_LITERALS 1
43*89c4ff92SAndroid Build Coastguard Worker 	#endif
44*89c4ff92SAndroid Build Coastguard Worker 	#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)
45*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_LONG_LONG 1
46*89c4ff92SAndroid Build Coastguard Worker 	#endif
47*89c4ff92SAndroid Build Coastguard Worker /*#elif defined(__INTEL_COMPILER)								//Intel C++
48*89c4ff92SAndroid Build Coastguard Worker 	#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)		????????
49*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
50*89c4ff92SAndroid Build Coastguard Worker 	#endif
51*89c4ff92SAndroid Build Coastguard Worker 	#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)			????????
52*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_CONSTEXPR 1
53*89c4ff92SAndroid Build Coastguard Worker 	#endif
54*89c4ff92SAndroid Build Coastguard Worker 	#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)			????????
55*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_NOEXCEPT 1
56*89c4ff92SAndroid Build Coastguard Worker 	#endif
57*89c4ff92SAndroid Build Coastguard Worker 	#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_LONG_LONG)			????????
58*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_LONG_LONG 1
59*89c4ff92SAndroid Build Coastguard Worker 	#endif*/
60*89c4ff92SAndroid Build Coastguard Worker #elif defined(__GNUC__)										//gcc
61*89c4ff92SAndroid Build Coastguard Worker 	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
62*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
63*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
64*89c4ff92SAndroid Build Coastguard Worker 		#endif
65*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
66*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_CONSTEXPR 1
67*89c4ff92SAndroid Build Coastguard Worker 		#endif
68*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
69*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_NOEXCEPT 1
70*89c4ff92SAndroid Build Coastguard Worker 		#endif
71*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_GNUC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
72*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_USER_LITERALS 1
73*89c4ff92SAndroid Build Coastguard Worker 		#endif
74*89c4ff92SAndroid Build Coastguard Worker 		#if !defined(HALF_ENABLE_CPP11_LONG_LONG)
75*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_LONG_LONG 1
76*89c4ff92SAndroid Build Coastguard Worker 		#endif
77*89c4ff92SAndroid Build Coastguard Worker 	#endif
78*89c4ff92SAndroid Build Coastguard Worker #elif defined(_MSC_VER)										//Visual C++
79*89c4ff92SAndroid Build Coastguard Worker 	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
80*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_CONSTEXPR 1
81*89c4ff92SAndroid Build Coastguard Worker 	#endif
82*89c4ff92SAndroid Build Coastguard Worker 	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
83*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_NOEXCEPT 1
84*89c4ff92SAndroid Build Coastguard Worker 	#endif
85*89c4ff92SAndroid Build Coastguard Worker 	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
86*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_USER_LITERALS 1
87*89c4ff92SAndroid Build Coastguard Worker 	#endif
88*89c4ff92SAndroid Build Coastguard Worker 	#if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
89*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
90*89c4ff92SAndroid Build Coastguard Worker 	#endif
91*89c4ff92SAndroid Build Coastguard Worker 	#if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
92*89c4ff92SAndroid Build Coastguard Worker 		#define HALF_ENABLE_CPP11_LONG_LONG 1
93*89c4ff92SAndroid Build Coastguard Worker 	#endif
94*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_POP_WARNINGS 1
95*89c4ff92SAndroid Build Coastguard Worker 	#pragma warning(push)
96*89c4ff92SAndroid Build Coastguard Worker 	#pragma warning(disable : 4099 4127 4146)	//struct vs class, constant in if, negative unsigned
97*89c4ff92SAndroid Build Coastguard Worker #endif
98*89c4ff92SAndroid Build Coastguard Worker 
99*89c4ff92SAndroid Build Coastguard Worker //check C++11 library features
100*89c4ff92SAndroid Build Coastguard Worker #include <utility>
101*89c4ff92SAndroid Build Coastguard Worker #if defined(_LIBCPP_VERSION)								//libc++
102*89c4ff92SAndroid Build Coastguard Worker 	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
103*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
104*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
105*89c4ff92SAndroid Build Coastguard Worker 		#endif
106*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_CSTDINT
107*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_CSTDINT 1
108*89c4ff92SAndroid Build Coastguard Worker 		#endif
109*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_CMATH
110*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_CMATH 1
111*89c4ff92SAndroid Build Coastguard Worker 		#endif
112*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_HASH
113*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_HASH 1
114*89c4ff92SAndroid Build Coastguard Worker 		#endif
115*89c4ff92SAndroid Build Coastguard Worker 	#endif
116*89c4ff92SAndroid Build Coastguard Worker #elif defined(__GLIBCXX__)									//libstdc++
117*89c4ff92SAndroid Build Coastguard Worker 	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
118*89c4ff92SAndroid Build Coastguard Worker 		#ifdef __clang__
119*89c4ff92SAndroid Build Coastguard Worker 			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
120*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
121*89c4ff92SAndroid Build Coastguard Worker 			#endif
122*89c4ff92SAndroid Build Coastguard Worker 			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)
123*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_CSTDINT 1
124*89c4ff92SAndroid Build Coastguard Worker 			#endif
125*89c4ff92SAndroid Build Coastguard Worker 			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)
126*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_CMATH 1
127*89c4ff92SAndroid Build Coastguard Worker 			#endif
128*89c4ff92SAndroid Build Coastguard Worker 			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)
129*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_HASH 1
130*89c4ff92SAndroid Build Coastguard Worker 			#endif
131*89c4ff92SAndroid Build Coastguard Worker 		#else
132*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)
133*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_CSTDINT 1
134*89c4ff92SAndroid Build Coastguard Worker 			#endif
135*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)
136*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_CMATH 1
137*89c4ff92SAndroid Build Coastguard Worker 			#endif
138*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)
139*89c4ff92SAndroid Build Coastguard Worker 				#define HALF_ENABLE_CPP11_HASH 1
140*89c4ff92SAndroid Build Coastguard Worker 			#endif
141*89c4ff92SAndroid Build Coastguard Worker 		#endif
142*89c4ff92SAndroid Build Coastguard Worker 	#endif
143*89c4ff92SAndroid Build Coastguard Worker #elif defined(_CPPLIB_VER)									//Dinkumware/Visual C++
144*89c4ff92SAndroid Build Coastguard Worker 	#if _CPPLIB_VER >= 520
145*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
146*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
147*89c4ff92SAndroid Build Coastguard Worker 		#endif
148*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_CSTDINT
149*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_CSTDINT 1
150*89c4ff92SAndroid Build Coastguard Worker 		#endif
151*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_HASH
152*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_HASH 1
153*89c4ff92SAndroid Build Coastguard Worker 		#endif
154*89c4ff92SAndroid Build Coastguard Worker 	#endif
155*89c4ff92SAndroid Build Coastguard Worker 	#if _CPPLIB_VER >= 610
156*89c4ff92SAndroid Build Coastguard Worker 		#ifndef HALF_ENABLE_CPP11_CMATH
157*89c4ff92SAndroid Build Coastguard Worker 			#define HALF_ENABLE_CPP11_CMATH 1
158*89c4ff92SAndroid Build Coastguard Worker 		#endif
159*89c4ff92SAndroid Build Coastguard Worker 	#endif
160*89c4ff92SAndroid Build Coastguard Worker #endif
161*89c4ff92SAndroid Build Coastguard Worker #undef HALF_GNUC_VERSION
162*89c4ff92SAndroid Build Coastguard Worker 
163*89c4ff92SAndroid Build Coastguard Worker //support constexpr
164*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_CONSTEXPR
165*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_CONSTEXPR			constexpr
166*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_CONSTEXPR_CONST	constexpr
167*89c4ff92SAndroid Build Coastguard Worker #else
168*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_CONSTEXPR
169*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_CONSTEXPR_CONST	const
170*89c4ff92SAndroid Build Coastguard Worker #endif
171*89c4ff92SAndroid Build Coastguard Worker 
172*89c4ff92SAndroid Build Coastguard Worker //support noexcept
173*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_NOEXCEPT
174*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_NOEXCEPT	noexcept
175*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_NOTHROW	noexcept
176*89c4ff92SAndroid Build Coastguard Worker #else
177*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_NOEXCEPT
178*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_NOTHROW	throw()
179*89c4ff92SAndroid Build Coastguard Worker #endif
180*89c4ff92SAndroid Build Coastguard Worker 
181*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
182*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
183*89c4ff92SAndroid Build Coastguard Worker #include <limits>
184*89c4ff92SAndroid Build Coastguard Worker #include <climits>
185*89c4ff92SAndroid Build Coastguard Worker #include <cmath>
186*89c4ff92SAndroid Build Coastguard Worker #include <cstring>
187*89c4ff92SAndroid Build Coastguard Worker #include <cstdlib>
188*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_TYPE_TRAITS
189*89c4ff92SAndroid Build Coastguard Worker 	#include <type_traits>
190*89c4ff92SAndroid Build Coastguard Worker #endif
191*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_CSTDINT
192*89c4ff92SAndroid Build Coastguard Worker 	#include <cstdint>
193*89c4ff92SAndroid Build Coastguard Worker #endif
194*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_HASH
195*89c4ff92SAndroid Build Coastguard Worker 	#include <functional>
196*89c4ff92SAndroid Build Coastguard Worker #endif
197*89c4ff92SAndroid Build Coastguard Worker 
198*89c4ff92SAndroid Build Coastguard Worker 
199*89c4ff92SAndroid Build Coastguard Worker /// Default rounding mode.
200*89c4ff92SAndroid Build Coastguard Worker /// This specifies the rounding mode used for all conversions between [half](\ref half_float::half)s and `float`s as well as
201*89c4ff92SAndroid Build Coastguard Worker /// for the half_cast() if not specifying a rounding mode explicitly. It can be redefined (before including half.hpp) to one
202*89c4ff92SAndroid Build Coastguard Worker /// of the standard rounding modes using their respective constants or the equivalent values of `std::float_round_style`:
203*89c4ff92SAndroid Build Coastguard Worker ///
204*89c4ff92SAndroid Build Coastguard Worker /// `std::float_round_style`         | value | rounding
205*89c4ff92SAndroid Build Coastguard Worker /// ---------------------------------|-------|-------------------------
206*89c4ff92SAndroid Build Coastguard Worker /// `std::round_indeterminate`       | -1    | fastest (default)
207*89c4ff92SAndroid Build Coastguard Worker /// `std::round_toward_zero`         | 0     | toward zero
208*89c4ff92SAndroid Build Coastguard Worker /// `std::round_to_nearest`          | 1     | to nearest
209*89c4ff92SAndroid Build Coastguard Worker /// `std::round_toward_infinity`     | 2     | toward positive infinity
210*89c4ff92SAndroid Build Coastguard Worker /// `std::round_toward_neg_infinity` | 3     | toward negative infinity
211*89c4ff92SAndroid Build Coastguard Worker ///
212*89c4ff92SAndroid Build Coastguard Worker /// By default this is set to `-1` (`std::round_indeterminate`), which uses truncation (round toward zero, but with overflows
213*89c4ff92SAndroid Build Coastguard Worker /// set to infinity) and is the fastest rounding mode possible. It can even be set to `std::numeric_limits<float>::round_style`
214*89c4ff92SAndroid Build Coastguard Worker /// to synchronize the rounding mode with that of the underlying single-precision implementation.
215*89c4ff92SAndroid Build Coastguard Worker #ifndef HALF_ROUND_STYLE
216*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_ROUND_STYLE	-1			// = std::round_indeterminate
217*89c4ff92SAndroid Build Coastguard Worker #endif
218*89c4ff92SAndroid Build Coastguard Worker 
219*89c4ff92SAndroid Build Coastguard Worker /// Tie-breaking behaviour for round to nearest.
220*89c4ff92SAndroid Build Coastguard Worker /// This specifies if ties in round to nearest should be resolved by rounding to the nearest even value. By default this is
221*89c4ff92SAndroid Build Coastguard Worker /// defined to `0` resulting in the faster but slightly more biased behaviour of rounding away from zero in half-way cases (and
222*89c4ff92SAndroid Build Coastguard Worker /// thus equal to the round() function), but can be redefined to `1` (before including half.hpp) if more IEEE-conformant
223*89c4ff92SAndroid Build Coastguard Worker /// behaviour is needed.
224*89c4ff92SAndroid Build Coastguard Worker #ifndef HALF_ROUND_TIES_TO_EVEN
225*89c4ff92SAndroid Build Coastguard Worker 	#define HALF_ROUND_TIES_TO_EVEN	0		// ties away from zero
226*89c4ff92SAndroid Build Coastguard Worker #endif
227*89c4ff92SAndroid Build Coastguard Worker 
228*89c4ff92SAndroid Build Coastguard Worker /// Value signaling overflow.
229*89c4ff92SAndroid Build Coastguard Worker /// In correspondence with `HUGE_VAL[F|L]` from `<cmath>` this symbol expands to a positive value signaling the overflow of an
230*89c4ff92SAndroid Build Coastguard Worker /// operation, in particular it just evaluates to positive infinity.
231*89c4ff92SAndroid Build Coastguard Worker #define HUGE_VALH	std::numeric_limits<half_float::half>::infinity()
232*89c4ff92SAndroid Build Coastguard Worker 
233*89c4ff92SAndroid Build Coastguard Worker /// Fast half-precision fma function.
234*89c4ff92SAndroid Build Coastguard Worker /// This symbol is only defined if the fma() function generally executes as fast as, or faster than, a separate
235*89c4ff92SAndroid Build Coastguard Worker /// half-precision multiplication followed by an addition. Due to the internal single-precision implementation of all
236*89c4ff92SAndroid Build Coastguard Worker /// arithmetic operations, this is in fact always the case.
237*89c4ff92SAndroid Build Coastguard Worker #define FP_FAST_FMAH	1
238*89c4ff92SAndroid Build Coastguard Worker 
239*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_ILOGB0
240*89c4ff92SAndroid Build Coastguard Worker 	#define FP_ILOGB0		INT_MIN
241*89c4ff92SAndroid Build Coastguard Worker #endif
242*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_ILOGBNAN
243*89c4ff92SAndroid Build Coastguard Worker 	#define FP_ILOGBNAN		INT_MAX
244*89c4ff92SAndroid Build Coastguard Worker #endif
245*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_SUBNORMAL
246*89c4ff92SAndroid Build Coastguard Worker 	#define FP_SUBNORMAL	0
247*89c4ff92SAndroid Build Coastguard Worker #endif
248*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_ZERO
249*89c4ff92SAndroid Build Coastguard Worker 	#define FP_ZERO			1
250*89c4ff92SAndroid Build Coastguard Worker #endif
251*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_NAN
252*89c4ff92SAndroid Build Coastguard Worker 	#define FP_NAN			2
253*89c4ff92SAndroid Build Coastguard Worker #endif
254*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_INFINITE
255*89c4ff92SAndroid Build Coastguard Worker 	#define FP_INFINITE		3
256*89c4ff92SAndroid Build Coastguard Worker #endif
257*89c4ff92SAndroid Build Coastguard Worker #ifndef FP_NORMAL
258*89c4ff92SAndroid Build Coastguard Worker 	#define FP_NORMAL		4
259*89c4ff92SAndroid Build Coastguard Worker #endif
260*89c4ff92SAndroid Build Coastguard Worker 
261*89c4ff92SAndroid Build Coastguard Worker 
262*89c4ff92SAndroid Build Coastguard Worker /// Main namespace for half precision functionality.
263*89c4ff92SAndroid Build Coastguard Worker /// This namespace contains all the functionality provided by the library.
264*89c4ff92SAndroid Build Coastguard Worker namespace half_float
265*89c4ff92SAndroid Build Coastguard Worker {
266*89c4ff92SAndroid Build Coastguard Worker 	class half;
267*89c4ff92SAndroid Build Coastguard Worker 
268*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_USER_LITERALS
269*89c4ff92SAndroid Build Coastguard Worker 	/// Library-defined half-precision literals.
270*89c4ff92SAndroid Build Coastguard Worker 	/// Import this namespace to enable half-precision floating point literals:
271*89c4ff92SAndroid Build Coastguard Worker 	/// ~~~~{.cpp}
272*89c4ff92SAndroid Build Coastguard Worker 	/// using namespace half_float::literal;
273*89c4ff92SAndroid Build Coastguard Worker 	/// half_float::half = 4.2_h;
274*89c4ff92SAndroid Build Coastguard Worker 	/// ~~~~
275*89c4ff92SAndroid Build Coastguard Worker 	namespace literal
276*89c4ff92SAndroid Build Coastguard Worker 	{
277*89c4ff92SAndroid Build Coastguard Worker 		half operator""_h(long double);
278*89c4ff92SAndroid Build Coastguard Worker 	}
279*89c4ff92SAndroid Build Coastguard Worker #endif
280*89c4ff92SAndroid Build Coastguard Worker 
281*89c4ff92SAndroid Build Coastguard Worker 	/// \internal
282*89c4ff92SAndroid Build Coastguard Worker 	/// \brief Implementation details.
283*89c4ff92SAndroid Build Coastguard Worker 	namespace detail
284*89c4ff92SAndroid Build Coastguard Worker 	{
285*89c4ff92SAndroid Build Coastguard Worker 	#if HALF_ENABLE_CPP11_TYPE_TRAITS
286*89c4ff92SAndroid Build Coastguard Worker 		/// Conditional type.
287*89c4ff92SAndroid Build Coastguard Worker 		template<bool B,typename T,typename F> struct conditional : std::conditional<B,T,F> {};
288*89c4ff92SAndroid Build Coastguard Worker 
289*89c4ff92SAndroid Build Coastguard Worker 		/// Helper for tag dispatching.
290*89c4ff92SAndroid Build Coastguard Worker 		template<bool B> struct bool_type : std::integral_constant<bool,B> {};
291*89c4ff92SAndroid Build Coastguard Worker 		using std::true_type;
292*89c4ff92SAndroid Build Coastguard Worker 		using std::false_type;
293*89c4ff92SAndroid Build Coastguard Worker 
294*89c4ff92SAndroid Build Coastguard Worker 		/// Type traits for floating point types.
295*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct is_float : std::is_floating_point<T> {};
296*89c4ff92SAndroid Build Coastguard Worker 	#else
297*89c4ff92SAndroid Build Coastguard Worker 		/// Conditional type.
298*89c4ff92SAndroid Build Coastguard Worker 		template<bool,typename T,typename> struct conditional { typedef T type; };
299*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename F> struct conditional<false,T,F> { typedef F type; };
300*89c4ff92SAndroid Build Coastguard Worker 
301*89c4ff92SAndroid Build Coastguard Worker 		/// Helper for tag dispatching.
302*89c4ff92SAndroid Build Coastguard Worker 		template<bool> struct bool_type {};
303*89c4ff92SAndroid Build Coastguard Worker 		typedef bool_type<true> true_type;
304*89c4ff92SAndroid Build Coastguard Worker 		typedef bool_type<false> false_type;
305*89c4ff92SAndroid Build Coastguard Worker 
306*89c4ff92SAndroid Build Coastguard Worker 		/// Type traits for floating point types.
307*89c4ff92SAndroid Build Coastguard Worker 		template<typename> struct is_float : false_type {};
308*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct is_float<const T> : is_float<T> {};
309*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct is_float<volatile T> : is_float<T> {};
310*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct is_float<const volatile T> : is_float<T> {};
311*89c4ff92SAndroid Build Coastguard Worker 		template<> struct is_float<float> : true_type {};
312*89c4ff92SAndroid Build Coastguard Worker 		template<> struct is_float<double> : true_type {};
313*89c4ff92SAndroid Build Coastguard Worker 		template<> struct is_float<long double> : true_type {};
314*89c4ff92SAndroid Build Coastguard Worker 	#endif
315*89c4ff92SAndroid Build Coastguard Worker 
316*89c4ff92SAndroid Build Coastguard Worker 		/// Type traits for floating point bits.
317*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct bits { typedef unsigned char type; };
318*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct bits<const T> : bits<T> {};
319*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct bits<volatile T> : bits<T> {};
320*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct bits<const volatile T> : bits<T> {};
321*89c4ff92SAndroid Build Coastguard Worker 
322*89c4ff92SAndroid Build Coastguard Worker 	#if HALF_ENABLE_CPP11_CSTDINT
323*89c4ff92SAndroid Build Coastguard Worker 		/// Unsigned integer of (at least) 16 bits width.
324*89c4ff92SAndroid Build Coastguard Worker 		typedef std::uint_least16_t uint16;
325*89c4ff92SAndroid Build Coastguard Worker 
326*89c4ff92SAndroid Build Coastguard Worker 		/// Unsigned integer of (at least) 32 bits width.
327*89c4ff92SAndroid Build Coastguard Worker 		template<> struct bits<float> { typedef std::uint_least32_t type; };
328*89c4ff92SAndroid Build Coastguard Worker 
329*89c4ff92SAndroid Build Coastguard Worker 		/// Unsigned integer of (at least) 64 bits width.
330*89c4ff92SAndroid Build Coastguard Worker 		template<> struct bits<double> { typedef std::uint_least64_t type; };
331*89c4ff92SAndroid Build Coastguard Worker 	#else
332*89c4ff92SAndroid Build Coastguard Worker 		/// Unsigned integer of (at least) 16 bits width.
333*89c4ff92SAndroid Build Coastguard Worker 		typedef unsigned short uint16;
334*89c4ff92SAndroid Build Coastguard Worker 
335*89c4ff92SAndroid Build Coastguard Worker 		/// Unsigned integer of (at least) 32 bits width.
336*89c4ff92SAndroid Build Coastguard Worker 		template<> struct bits<float> : conditional<std::numeric_limits<unsigned int>::digits>=32,unsigned int,unsigned long> {};
337*89c4ff92SAndroid Build Coastguard Worker 
338*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_LONG_LONG
339*89c4ff92SAndroid Build Coastguard Worker 			/// Unsigned integer of (at least) 64 bits width.
340*89c4ff92SAndroid Build Coastguard Worker 			template<> struct bits<double> : conditional<std::numeric_limits<unsigned long>::digits>=64,unsigned long,unsigned long long> {};
341*89c4ff92SAndroid Build Coastguard Worker 		#else
342*89c4ff92SAndroid Build Coastguard Worker 			/// Unsigned integer of (at least) 64 bits width.
343*89c4ff92SAndroid Build Coastguard Worker 			template<> struct bits<double> { typedef unsigned long type; };
344*89c4ff92SAndroid Build Coastguard Worker 		#endif
345*89c4ff92SAndroid Build Coastguard Worker 	#endif
346*89c4ff92SAndroid Build Coastguard Worker 
347*89c4ff92SAndroid Build Coastguard Worker 		/// Tag type for binary construction.
348*89c4ff92SAndroid Build Coastguard Worker 		struct binary_t {};
349*89c4ff92SAndroid Build Coastguard Worker 
350*89c4ff92SAndroid Build Coastguard Worker 		/// Tag for binary construction.
351*89c4ff92SAndroid Build Coastguard Worker 		HALF_CONSTEXPR_CONST binary_t binary = binary_t();
352*89c4ff92SAndroid Build Coastguard Worker 
353*89c4ff92SAndroid Build Coastguard Worker 		/// Temporary half-precision expression.
354*89c4ff92SAndroid Build Coastguard Worker 		/// This class represents a half-precision expression which just stores a single-precision value internally.
355*89c4ff92SAndroid Build Coastguard Worker 		struct expr
356*89c4ff92SAndroid Build Coastguard Worker 		{
357*89c4ff92SAndroid Build Coastguard Worker 			/// Conversion constructor.
358*89c4ff92SAndroid Build Coastguard Worker 			/// \param f single-precision value to convert
exprhalf_float::detail::expr359*89c4ff92SAndroid Build Coastguard Worker 			explicit HALF_CONSTEXPR expr(float f) HALF_NOEXCEPT : value_(f) {}
360*89c4ff92SAndroid Build Coastguard Worker 
361*89c4ff92SAndroid Build Coastguard Worker 			/// Conversion to single-precision.
362*89c4ff92SAndroid Build Coastguard Worker 			/// \return single precision value representing expression value
operator floathalf_float::detail::expr363*89c4ff92SAndroid Build Coastguard Worker 			HALF_CONSTEXPR operator float() const HALF_NOEXCEPT { return value_; }
364*89c4ff92SAndroid Build Coastguard Worker 
365*89c4ff92SAndroid Build Coastguard Worker 		private:
366*89c4ff92SAndroid Build Coastguard Worker 			/// Internal expression value stored in single-precision.
367*89c4ff92SAndroid Build Coastguard Worker 			float value_;
368*89c4ff92SAndroid Build Coastguard Worker 		};
369*89c4ff92SAndroid Build Coastguard Worker 
370*89c4ff92SAndroid Build Coastguard Worker 		/// SFINAE helper for generic half-precision functions.
371*89c4ff92SAndroid Build Coastguard Worker 		/// This class template has to be specialized for each valid combination of argument types to provide a corresponding
372*89c4ff92SAndroid Build Coastguard Worker 		/// `type` member equivalent to \a T.
373*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to return
374*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename,typename=void,typename=void> struct enable {};
375*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,void,void> { typedef T type; };
376*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,void,void> { typedef T type; };
377*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,half,void> { typedef T type; };
378*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,expr,void> { typedef T type; };
379*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,half,void> { typedef T type; };
380*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,expr,void> { typedef T type; };
381*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,half,half> { typedef T type; };
382*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,half,expr> { typedef T type; };
383*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,expr,half> { typedef T type; };
384*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,half,expr,expr> { typedef T type; };
385*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,half,half> { typedef T type; };
386*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,half,expr> { typedef T type; };
387*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,expr,half> { typedef T type; };
388*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct enable<T,expr,expr,expr> { typedef T type; };
389*89c4ff92SAndroid Build Coastguard Worker 
390*89c4ff92SAndroid Build Coastguard Worker 		/// Return type for specialized generic 2-argument half-precision functions.
391*89c4ff92SAndroid Build Coastguard Worker 		/// This class template has to be specialized for each valid combination of argument types to provide a corresponding
392*89c4ff92SAndroid Build Coastguard Worker 		/// `type` member denoting the appropriate return type.
393*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T first argument type
394*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam U first argument type
395*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> struct result : enable<expr,T,U> {};
396*89c4ff92SAndroid Build Coastguard Worker 		template<> struct result<half,half> { typedef half type; };
397*89c4ff92SAndroid Build Coastguard Worker 
398*89c4ff92SAndroid Build Coastguard Worker 		/// \name Classification helpers
399*89c4ff92SAndroid Build Coastguard Worker 		/// \{
400*89c4ff92SAndroid Build Coastguard Worker 
401*89c4ff92SAndroid Build Coastguard Worker 		/// Check for infinity.
402*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T argument type (builtin floating point type)
403*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg value to query
404*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if infinity
405*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
builtin_isinf(T arg)406*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> bool builtin_isinf(T arg)
407*89c4ff92SAndroid Build Coastguard Worker 		{
408*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_CMATH
409*89c4ff92SAndroid Build Coastguard Worker 			return std::isinf(arg);
410*89c4ff92SAndroid Build Coastguard Worker 		#elif defined(_MSC_VER)
411*89c4ff92SAndroid Build Coastguard Worker 			return !::_finite(static_cast<double>(arg)) && !::_isnan(static_cast<double>(arg));
412*89c4ff92SAndroid Build Coastguard Worker 		#else
413*89c4ff92SAndroid Build Coastguard Worker 			return arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();
414*89c4ff92SAndroid Build Coastguard Worker 		#endif
415*89c4ff92SAndroid Build Coastguard Worker 		}
416*89c4ff92SAndroid Build Coastguard Worker 
417*89c4ff92SAndroid Build Coastguard Worker 		/// Check for NaN.
418*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T argument type (builtin floating point type)
419*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg value to query
420*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if not a number
421*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
builtin_isnan(T arg)422*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> bool builtin_isnan(T arg)
423*89c4ff92SAndroid Build Coastguard Worker 		{
424*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_CMATH
425*89c4ff92SAndroid Build Coastguard Worker 			return std::isnan(arg);
426*89c4ff92SAndroid Build Coastguard Worker 		#elif defined(_MSC_VER)
427*89c4ff92SAndroid Build Coastguard Worker 			return ::_isnan(static_cast<double>(arg)) != 0;
428*89c4ff92SAndroid Build Coastguard Worker 		#else
429*89c4ff92SAndroid Build Coastguard Worker 			return arg != arg;
430*89c4ff92SAndroid Build Coastguard Worker 		#endif
431*89c4ff92SAndroid Build Coastguard Worker 		}
432*89c4ff92SAndroid Build Coastguard Worker 
433*89c4ff92SAndroid Build Coastguard Worker 		/// Check sign.
434*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T argument type (builtin floating point type)
435*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg value to query
436*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if signbit set
437*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
builtin_signbit(T arg)438*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> bool builtin_signbit(T arg)
439*89c4ff92SAndroid Build Coastguard Worker 		{
440*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_CMATH
441*89c4ff92SAndroid Build Coastguard Worker 			return std::signbit(arg);
442*89c4ff92SAndroid Build Coastguard Worker 		#else
443*89c4ff92SAndroid Build Coastguard Worker 			return arg < T() || (arg == T() && T(1)/arg < T());
444*89c4ff92SAndroid Build Coastguard Worker 		#endif
445*89c4ff92SAndroid Build Coastguard Worker 		}
446*89c4ff92SAndroid Build Coastguard Worker 
447*89c4ff92SAndroid Build Coastguard Worker 		/// \}
448*89c4ff92SAndroid Build Coastguard Worker 		/// \name Conversion
449*89c4ff92SAndroid Build Coastguard Worker 		/// \{
450*89c4ff92SAndroid Build Coastguard Worker 
451*89c4ff92SAndroid Build Coastguard Worker 		/// Convert IEEE single-precision to half-precision.
452*89c4ff92SAndroid Build Coastguard Worker 		/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).
453*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
454*89c4ff92SAndroid Build Coastguard Worker 		/// \param value single-precision value
455*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
float2half_impl(float value,true_type)456*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R> uint16 float2half_impl(float value, true_type)
457*89c4ff92SAndroid Build Coastguard Worker 		{
458*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<float>::type uint32;
459*89c4ff92SAndroid Build Coastguard Worker 			uint32 bits;// = *reinterpret_cast<uint32*>(&value);		//violating strict aliasing!
460*89c4ff92SAndroid Build Coastguard Worker 			std::memcpy(&bits, &value, sizeof(float));
461*89c4ff92SAndroid Build Coastguard Worker /*			uint16 hbits = (bits>>16) & 0x8000;
462*89c4ff92SAndroid Build Coastguard Worker 			bits &= 0x7FFFFFFF;
463*89c4ff92SAndroid Build Coastguard Worker 			int exp = bits >> 23;
464*89c4ff92SAndroid Build Coastguard Worker 			if(exp == 255)
465*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7C00 | (0x3FF&-static_cast<unsigned>((bits&0x7FFFFF)!=0));
466*89c4ff92SAndroid Build Coastguard Worker 			if(exp > 142)
467*89c4ff92SAndroid Build Coastguard Worker 			{
468*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_infinity)
469*89c4ff92SAndroid Build Coastguard Worker 					return hbits | 0x7C00 - (hbits>>15);
470*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_neg_infinity)
471*89c4ff92SAndroid Build Coastguard Worker 					return hbits | 0x7BFF + (hbits>>15);
472*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7BFF + (R!=std::round_toward_zero);
473*89c4ff92SAndroid Build Coastguard Worker 			}
474*89c4ff92SAndroid Build Coastguard Worker 			int g, s;
475*89c4ff92SAndroid Build Coastguard Worker 			if(exp > 112)
476*89c4ff92SAndroid Build Coastguard Worker 			{
477*89c4ff92SAndroid Build Coastguard Worker 				g = (bits>>12) & 1;
478*89c4ff92SAndroid Build Coastguard Worker 				s = (bits&0xFFF) != 0;
479*89c4ff92SAndroid Build Coastguard Worker 				hbits |= ((exp-112)<<10) | ((bits>>13)&0x3FF);
480*89c4ff92SAndroid Build Coastguard Worker 			}
481*89c4ff92SAndroid Build Coastguard Worker 			else if(exp > 101)
482*89c4ff92SAndroid Build Coastguard Worker 			{
483*89c4ff92SAndroid Build Coastguard Worker 				int i = 125 - exp;
484*89c4ff92SAndroid Build Coastguard Worker 				bits = (bits&0x7FFFFF) | 0x800000;
485*89c4ff92SAndroid Build Coastguard Worker 				g = (bits>>i) & 1;
486*89c4ff92SAndroid Build Coastguard Worker 				s = (bits&((1L<<i)-1)) != 0;
487*89c4ff92SAndroid Build Coastguard Worker 				hbits |= bits >> (i+1);
488*89c4ff92SAndroid Build Coastguard Worker 			}
489*89c4ff92SAndroid Build Coastguard Worker 			else
490*89c4ff92SAndroid Build Coastguard Worker 			{
491*89c4ff92SAndroid Build Coastguard Worker 				g = 0;
492*89c4ff92SAndroid Build Coastguard Worker 				s = bits != 0;
493*89c4ff92SAndroid Build Coastguard Worker 			}
494*89c4ff92SAndroid Build Coastguard Worker 			if(R == std::round_to_nearest)
495*89c4ff92SAndroid Build Coastguard Worker 				#if HALF_ROUND_TIES_TO_EVEN
496*89c4ff92SAndroid Build Coastguard Worker 					hbits += g & (s|hbits);
497*89c4ff92SAndroid Build Coastguard Worker 				#else
498*89c4ff92SAndroid Build Coastguard Worker 					hbits += g;
499*89c4ff92SAndroid Build Coastguard Worker 				#endif
500*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_infinity)
501*89c4ff92SAndroid Build Coastguard Worker 				hbits += ~(hbits>>15) & (s|g);
502*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_neg_infinity)
503*89c4ff92SAndroid Build Coastguard Worker 				hbits += (hbits>>15) & (g|s);
504*89c4ff92SAndroid Build Coastguard Worker */			static const uint16 base_table[512] = {
505*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
506*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
507*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
508*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
509*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
510*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
511*89c4ff92SAndroid Build Coastguard Worker 				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
512*89c4ff92SAndroid Build Coastguard Worker 				0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,
513*89c4ff92SAndroid Build Coastguard Worker 				0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7C00,
514*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
515*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
516*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
517*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
518*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
519*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
520*89c4ff92SAndroid Build Coastguard Worker 				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
521*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
522*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
523*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
524*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
525*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
526*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
527*89c4ff92SAndroid Build Coastguard Worker 				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100,
528*89c4ff92SAndroid Build Coastguard Worker 				0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00,
529*89c4ff92SAndroid Build Coastguard Worker 				0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFC00,
530*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
531*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
532*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
533*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
534*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
535*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
536*89c4ff92SAndroid Build Coastguard Worker 				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00 };
537*89c4ff92SAndroid Build Coastguard Worker 			static const unsigned char shift_table[512] = {
538*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
539*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
540*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
541*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
542*89c4ff92SAndroid Build Coastguard Worker 				13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
543*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
544*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
545*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13,
546*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
547*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
548*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
549*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
550*89c4ff92SAndroid Build Coastguard Worker 				13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
551*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
552*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
553*89c4ff92SAndroid Build Coastguard Worker 				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13 };
554*89c4ff92SAndroid Build Coastguard Worker 			uint16 hbits = base_table[bits>>23] + static_cast<uint16>((bits&0x7FFFFF)>>shift_table[bits>>23]);
555*89c4ff92SAndroid Build Coastguard Worker 			if(R == std::round_to_nearest)
556*89c4ff92SAndroid Build Coastguard Worker 				hbits += (((bits&0x7FFFFF)>>(shift_table[bits>>23]-1))|(((bits>>23)&0xFF)==102)) & ((hbits&0x7C00)!=0x7C00)
557*89c4ff92SAndroid Build Coastguard Worker 				#if HALF_ROUND_TIES_TO_EVEN
558*89c4ff92SAndroid Build Coastguard Worker 					& (((((static_cast<uint32>(1)<<(shift_table[bits>>23]-1))-1)&bits)!=0)|hbits)
559*89c4ff92SAndroid Build Coastguard Worker 				#endif
560*89c4ff92SAndroid Build Coastguard Worker 				;
561*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_zero)
562*89c4ff92SAndroid Build Coastguard Worker 				hbits -= ((hbits&0x7FFF)==0x7C00) & ~shift_table[bits>>23];
563*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_infinity)
564*89c4ff92SAndroid Build Coastguard Worker 				hbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=102)&
565*89c4ff92SAndroid Build Coastguard Worker 					((bits>>23)!=0)))&(hbits<0x7C00)) - ((hbits==0xFC00)&((bits>>23)!=511));
566*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_neg_infinity)
567*89c4ff92SAndroid Build Coastguard Worker 				hbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=358)&
568*89c4ff92SAndroid Build Coastguard Worker 					((bits>>23)!=256)))&(hbits<0xFC00)&(hbits>>15)) - ((hbits==0x7C00)&((bits>>23)!=255));
569*89c4ff92SAndroid Build Coastguard Worker 			return hbits;
570*89c4ff92SAndroid Build Coastguard Worker 		}
571*89c4ff92SAndroid Build Coastguard Worker 
572*89c4ff92SAndroid Build Coastguard Worker 		/// Convert IEEE double-precision to half-precision.
573*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
574*89c4ff92SAndroid Build Coastguard Worker 		/// \param value double-precision value
575*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
float2half_impl(double value,true_type)576*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R> uint16 float2half_impl(double value, true_type)
577*89c4ff92SAndroid Build Coastguard Worker 		{
578*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<float>::type uint32;
579*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<double>::type uint64;
580*89c4ff92SAndroid Build Coastguard Worker 			uint64 bits;// = *reinterpret_cast<uint64*>(&value);		//violating strict aliasing!
581*89c4ff92SAndroid Build Coastguard Worker 			std::memcpy(&bits, &value, sizeof(double));
582*89c4ff92SAndroid Build Coastguard Worker 			uint32 hi = bits >> 32, lo = bits & 0xFFFFFFFF;
583*89c4ff92SAndroid Build Coastguard Worker 			uint16 hbits = (hi>>16) & 0x8000;
584*89c4ff92SAndroid Build Coastguard Worker 			hi &= 0x7FFFFFFF;
585*89c4ff92SAndroid Build Coastguard Worker 			int exp = hi >> 20;
586*89c4ff92SAndroid Build Coastguard Worker 			if(exp == 2047)
587*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7C00 | (0x3FF&-static_cast<unsigned>((bits&0xFFFFFFFFFFFFF)!=0));
588*89c4ff92SAndroid Build Coastguard Worker 			if(exp > 1038)
589*89c4ff92SAndroid Build Coastguard Worker 			{
590*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_infinity)
591*89c4ff92SAndroid Build Coastguard Worker 					return hbits | 0x7C00 - (hbits>>15);
592*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_neg_infinity)
593*89c4ff92SAndroid Build Coastguard Worker 					return hbits | 0x7BFF + (hbits>>15);
594*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7BFF + (R!=std::round_toward_zero);
595*89c4ff92SAndroid Build Coastguard Worker 			}
596*89c4ff92SAndroid Build Coastguard Worker 			int g, s = lo != 0;
597*89c4ff92SAndroid Build Coastguard Worker 			if(exp > 1008)
598*89c4ff92SAndroid Build Coastguard Worker 			{
599*89c4ff92SAndroid Build Coastguard Worker 				g = (hi>>9) & 1;
600*89c4ff92SAndroid Build Coastguard Worker 				s |= (hi&0x1FF) != 0;
601*89c4ff92SAndroid Build Coastguard Worker 				hbits |= ((exp-1008)<<10) | ((hi>>10)&0x3FF);
602*89c4ff92SAndroid Build Coastguard Worker 			}
603*89c4ff92SAndroid Build Coastguard Worker 			else if(exp > 997)
604*89c4ff92SAndroid Build Coastguard Worker 			{
605*89c4ff92SAndroid Build Coastguard Worker 				int i = 1018 - exp;
606*89c4ff92SAndroid Build Coastguard Worker 				hi = (hi&0xFFFFF) | 0x100000;
607*89c4ff92SAndroid Build Coastguard Worker 				g = (hi>>i) & 1;
608*89c4ff92SAndroid Build Coastguard Worker 				s |= (hi&((1L<<i)-1)) != 0;
609*89c4ff92SAndroid Build Coastguard Worker 				hbits |= hi >> (i+1);
610*89c4ff92SAndroid Build Coastguard Worker 			}
611*89c4ff92SAndroid Build Coastguard Worker 			else
612*89c4ff92SAndroid Build Coastguard Worker 			{
613*89c4ff92SAndroid Build Coastguard Worker 				g = 0;
614*89c4ff92SAndroid Build Coastguard Worker 				s |= hi != 0;
615*89c4ff92SAndroid Build Coastguard Worker 			}
616*89c4ff92SAndroid Build Coastguard Worker 			if(R == std::round_to_nearest)
617*89c4ff92SAndroid Build Coastguard Worker 				#if HALF_ROUND_TIES_TO_EVEN
618*89c4ff92SAndroid Build Coastguard Worker 					hbits += g & (s|hbits);
619*89c4ff92SAndroid Build Coastguard Worker 				#else
620*89c4ff92SAndroid Build Coastguard Worker 					hbits += g;
621*89c4ff92SAndroid Build Coastguard Worker 				#endif
622*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_infinity)
623*89c4ff92SAndroid Build Coastguard Worker 				hbits += ~(hbits>>15) & (s|g);
624*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_neg_infinity)
625*89c4ff92SAndroid Build Coastguard Worker 				hbits += (hbits>>15) & (g|s);
626*89c4ff92SAndroid Build Coastguard Worker 			return hbits;
627*89c4ff92SAndroid Build Coastguard Worker 		}
628*89c4ff92SAndroid Build Coastguard Worker 
629*89c4ff92SAndroid Build Coastguard Worker 		/// Convert non-IEEE floating point to half-precision.
630*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
631*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T source type (builtin floating point type)
632*89c4ff92SAndroid Build Coastguard Worker 		/// \param value floating point value
633*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
float2half_impl(T value,...)634*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,typename T> uint16 float2half_impl(T value, ...)
635*89c4ff92SAndroid Build Coastguard Worker 		{
636*89c4ff92SAndroid Build Coastguard Worker 			uint16 hbits = static_cast<unsigned>(builtin_signbit(value)) << 15;
637*89c4ff92SAndroid Build Coastguard Worker 			if(value == T())
638*89c4ff92SAndroid Build Coastguard Worker 				return hbits;
639*89c4ff92SAndroid Build Coastguard Worker 			if(builtin_isnan(value))
640*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7FFF;
641*89c4ff92SAndroid Build Coastguard Worker 			if(builtin_isinf(value))
642*89c4ff92SAndroid Build Coastguard Worker 				return hbits | 0x7C00;
643*89c4ff92SAndroid Build Coastguard Worker 			int exp;
644*89c4ff92SAndroid Build Coastguard Worker 			std::frexp(value, &exp);
645*89c4ff92SAndroid Build Coastguard Worker 			if(exp > 16)
646*89c4ff92SAndroid Build Coastguard Worker 			{
647*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_infinity)
648*89c4ff92SAndroid Build Coastguard Worker 					return hbits | (0x7C00-(hbits>>15));
649*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
650*89c4ff92SAndroid Build Coastguard Worker 					return hbits | (0x7BFF+(hbits>>15));
651*89c4ff92SAndroid Build Coastguard Worker 				return hbits | (0x7BFF+(R!=std::round_toward_zero));
652*89c4ff92SAndroid Build Coastguard Worker 			}
653*89c4ff92SAndroid Build Coastguard Worker 			if(exp < -13)
654*89c4ff92SAndroid Build Coastguard Worker 				value = std::ldexp(value, 24);
655*89c4ff92SAndroid Build Coastguard Worker 			else
656*89c4ff92SAndroid Build Coastguard Worker 			{
657*89c4ff92SAndroid Build Coastguard Worker 				value = std::ldexp(value, 11-exp);
658*89c4ff92SAndroid Build Coastguard Worker 				hbits |= ((exp+13)<<10);
659*89c4ff92SAndroid Build Coastguard Worker 			}
660*89c4ff92SAndroid Build Coastguard Worker 			T ival, frac = std::modf(value, &ival);
661*89c4ff92SAndroid Build Coastguard Worker 			hbits += static_cast<uint16>(std::abs(static_cast<int>(ival)));
662*89c4ff92SAndroid Build Coastguard Worker 			if(R == std::round_to_nearest)
663*89c4ff92SAndroid Build Coastguard Worker 			{
664*89c4ff92SAndroid Build Coastguard Worker 				frac = std::abs(frac);
665*89c4ff92SAndroid Build Coastguard Worker 				#if HALF_ROUND_TIES_TO_EVEN
666*89c4ff92SAndroid Build Coastguard Worker 					hbits += (frac>T(0.5)) | ((frac==T(0.5))&hbits);
667*89c4ff92SAndroid Build Coastguard Worker 				#else
668*89c4ff92SAndroid Build Coastguard Worker 					hbits += frac >= T(0.5);
669*89c4ff92SAndroid Build Coastguard Worker 				#endif
670*89c4ff92SAndroid Build Coastguard Worker 			}
671*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_infinity)
672*89c4ff92SAndroid Build Coastguard Worker 				hbits += frac > T();
673*89c4ff92SAndroid Build Coastguard Worker 			else if(R == std::round_toward_neg_infinity)
674*89c4ff92SAndroid Build Coastguard Worker 				hbits += frac < T();
675*89c4ff92SAndroid Build Coastguard Worker 			return hbits;
676*89c4ff92SAndroid Build Coastguard Worker 		}
677*89c4ff92SAndroid Build Coastguard Worker 
678*89c4ff92SAndroid Build Coastguard Worker 		/// Convert floating point to half-precision.
679*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
680*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T source type (builtin floating point type)
681*89c4ff92SAndroid Build Coastguard Worker 		/// \param value floating point value
682*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
float2half(T value)683*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,typename T> uint16 float2half(T value)
684*89c4ff92SAndroid Build Coastguard Worker 		{
685*89c4ff92SAndroid Build Coastguard Worker 			return float2half_impl<R>(value, bool_type<std::numeric_limits<T>::is_iec559&&sizeof(typename bits<T>::type)==sizeof(T)>());
686*89c4ff92SAndroid Build Coastguard Worker 		}
687*89c4ff92SAndroid Build Coastguard Worker 
688*89c4ff92SAndroid Build Coastguard Worker 		/// Convert integer to half-precision floating point.
689*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
690*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam S `true` if value negative, `false` else
691*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert (builtin integer type)
692*89c4ff92SAndroid Build Coastguard Worker 		/// \param value non-negative integral value
693*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
int2half_impl(T value)694*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,bool S,typename T> uint16 int2half_impl(T value)
695*89c4ff92SAndroid Build Coastguard Worker 		{
696*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
697*89c4ff92SAndroid Build Coastguard Worker 			static_assert(std::is_integral<T>::value, "int to half conversion only supports builtin integer types");
698*89c4ff92SAndroid Build Coastguard Worker 		#endif
699*89c4ff92SAndroid Build Coastguard Worker 			if(S)
700*89c4ff92SAndroid Build Coastguard Worker 				value = -value;
701*89c4ff92SAndroid Build Coastguard Worker 			uint16 bits = S << 15;
702*89c4ff92SAndroid Build Coastguard Worker 			if(value > 0xFFFF)
703*89c4ff92SAndroid Build Coastguard Worker 			{
704*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_infinity)
705*89c4ff92SAndroid Build Coastguard Worker 					bits |= 0x7C00 - S;
706*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
707*89c4ff92SAndroid Build Coastguard Worker 					bits |= 0x7BFF + S;
708*89c4ff92SAndroid Build Coastguard Worker 				else
709*89c4ff92SAndroid Build Coastguard Worker 					bits |= 0x7BFF + (R!=std::round_toward_zero);
710*89c4ff92SAndroid Build Coastguard Worker 			}
711*89c4ff92SAndroid Build Coastguard Worker 			else if(value)
712*89c4ff92SAndroid Build Coastguard Worker 			{
713*89c4ff92SAndroid Build Coastguard Worker 				unsigned int m = value, exp = 24;
714*89c4ff92SAndroid Build Coastguard Worker 				for(; m<0x400; m<<=1,--exp) ;
715*89c4ff92SAndroid Build Coastguard Worker 				for(; m>0x7FF; m>>=1,++exp) ;
716*89c4ff92SAndroid Build Coastguard Worker 				bits |= (exp<<10) + m;
717*89c4ff92SAndroid Build Coastguard Worker 				if(exp > 24)
718*89c4ff92SAndroid Build Coastguard Worker 				{
719*89c4ff92SAndroid Build Coastguard Worker 					if(R == std::round_to_nearest)
720*89c4ff92SAndroid Build Coastguard Worker 						bits += (value>>(exp-25)) & 1
721*89c4ff92SAndroid Build Coastguard Worker 						#if HALF_ROUND_TIES_TO_EVEN
722*89c4ff92SAndroid Build Coastguard Worker 							& (((((1<<(exp-25))-1)&value)!=0)|bits)
723*89c4ff92SAndroid Build Coastguard Worker 						#endif
724*89c4ff92SAndroid Build Coastguard Worker 						;
725*89c4ff92SAndroid Build Coastguard Worker 					else if(R == std::round_toward_infinity)
726*89c4ff92SAndroid Build Coastguard Worker 						bits += ((value&((1<<(exp-24))-1))!=0) & !S;
727*89c4ff92SAndroid Build Coastguard Worker 					else if(R == std::round_toward_neg_infinity)
728*89c4ff92SAndroid Build Coastguard Worker 						bits += ((value&((1<<(exp-24))-1))!=0) & S;
729*89c4ff92SAndroid Build Coastguard Worker 				}
730*89c4ff92SAndroid Build Coastguard Worker 			}
731*89c4ff92SAndroid Build Coastguard Worker 			return bits;
732*89c4ff92SAndroid Build Coastguard Worker 		}
733*89c4ff92SAndroid Build Coastguard Worker 
734*89c4ff92SAndroid Build Coastguard Worker 		/// Convert integer to half-precision floating point.
735*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
736*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert (builtin integer type)
737*89c4ff92SAndroid Build Coastguard Worker 		/// \param value integral value
738*89c4ff92SAndroid Build Coastguard Worker 		/// \return binary representation of half-precision value
int2half(T value)739*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,typename T> uint16 int2half(T value)
740*89c4ff92SAndroid Build Coastguard Worker 		{
741*89c4ff92SAndroid Build Coastguard Worker 			return (value<0) ? int2half_impl<R,true>(value) : int2half_impl<R,false>(value);
742*89c4ff92SAndroid Build Coastguard Worker 		}
743*89c4ff92SAndroid Build Coastguard Worker 
744*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision to IEEE single-precision.
745*89c4ff92SAndroid Build Coastguard Worker 		/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).
746*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
747*89c4ff92SAndroid Build Coastguard Worker 		/// \return single-precision value
half2float_impl(uint16 value,float,true_type)748*89c4ff92SAndroid Build Coastguard Worker 		inline float half2float_impl(uint16 value, float, true_type)
749*89c4ff92SAndroid Build Coastguard Worker 		{
750*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<float>::type uint32;
751*89c4ff92SAndroid Build Coastguard Worker /*			uint32 bits = static_cast<uint32>(value&0x8000) << 16;
752*89c4ff92SAndroid Build Coastguard Worker 			int abs = value & 0x7FFF;
753*89c4ff92SAndroid Build Coastguard Worker 			if(abs)
754*89c4ff92SAndroid Build Coastguard Worker 			{
755*89c4ff92SAndroid Build Coastguard Worker 				bits |= 0x38000000 << static_cast<unsigned>(abs>=0x7C00);
756*89c4ff92SAndroid Build Coastguard Worker 				for(; abs<0x400; abs<<=1,bits-=0x800000) ;
757*89c4ff92SAndroid Build Coastguard Worker 				bits += static_cast<uint32>(abs) << 13;
758*89c4ff92SAndroid Build Coastguard Worker 			}
759*89c4ff92SAndroid Build Coastguard Worker */			static const uint32 mantissa_table[2048] = {
760*89c4ff92SAndroid Build Coastguard Worker 				0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000,
761*89c4ff92SAndroid Build Coastguard Worker 				0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000, 0x35F00000, 0x35F80000,
762*89c4ff92SAndroid Build Coastguard Worker 				0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000, 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000,
763*89c4ff92SAndroid Build Coastguard Worker 				0x36400000, 0x36440000, 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000, 0x36700000, 0x36740000, 0x36780000, 0x367C0000,
764*89c4ff92SAndroid Build Coastguard Worker 				0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000, 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000,
765*89c4ff92SAndroid Build Coastguard Worker 				0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000, 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000,
766*89c4ff92SAndroid Build Coastguard Worker 				0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000, 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000, 0x36DC0000, 0x36DE0000,
767*89c4ff92SAndroid Build Coastguard Worker 				0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000, 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000,
768*89c4ff92SAndroid Build Coastguard Worker 				0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000, 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000,
769*89c4ff92SAndroid Build Coastguard Worker 				0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000,
770*89c4ff92SAndroid Build Coastguard Worker 				0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000,
771*89c4ff92SAndroid Build Coastguard Worker 				0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000, 0x373E0000, 0x373F0000,
772*89c4ff92SAndroid Build Coastguard Worker 				0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000,
773*89c4ff92SAndroid Build Coastguard Worker 				0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000, 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000,
774*89c4ff92SAndroid Build Coastguard Worker 				0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000,
775*89c4ff92SAndroid Build Coastguard Worker 				0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000,
776*89c4ff92SAndroid Build Coastguard Worker 				0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000,
777*89c4ff92SAndroid Build Coastguard Worker 				0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000, 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000,
778*89c4ff92SAndroid Build Coastguard Worker 				0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000,
779*89c4ff92SAndroid Build Coastguard Worker 				0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000, 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000,
780*89c4ff92SAndroid Build Coastguard Worker 				0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000, 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000,
781*89c4ff92SAndroid Build Coastguard Worker 				0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000, 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000, 0x37AF0000, 0x37AF8000,
782*89c4ff92SAndroid Build Coastguard Worker 				0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000, 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000,
783*89c4ff92SAndroid Build Coastguard Worker 				0x37B80000, 0x37B88000, 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000, 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000,
784*89c4ff92SAndroid Build Coastguard Worker 				0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000, 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000,
785*89c4ff92SAndroid Build Coastguard Worker 				0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000, 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000,
786*89c4ff92SAndroid Build Coastguard Worker 				0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000, 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000, 0x37D70000, 0x37D78000,
787*89c4ff92SAndroid Build Coastguard Worker 				0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000, 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000,
788*89c4ff92SAndroid Build Coastguard Worker 				0x37E00000, 0x37E08000, 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000, 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000,
789*89c4ff92SAndroid Build Coastguard Worker 				0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000, 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000,
790*89c4ff92SAndroid Build Coastguard Worker 				0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000, 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000,
791*89c4ff92SAndroid Build Coastguard Worker 				0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000, 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000, 0x37FF0000, 0x37FF8000,
792*89c4ff92SAndroid Build Coastguard Worker 				0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000, 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000,
793*89c4ff92SAndroid Build Coastguard Worker 				0x38040000, 0x38044000, 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000, 0x38070000, 0x38074000, 0x38078000, 0x3807C000,
794*89c4ff92SAndroid Build Coastguard Worker 				0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000, 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000,
795*89c4ff92SAndroid Build Coastguard Worker 				0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000, 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000,
796*89c4ff92SAndroid Build Coastguard Worker 				0x38100000, 0x38104000, 0x38108000, 0x3810C000, 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000, 0x38138000, 0x3813C000,
797*89c4ff92SAndroid Build Coastguard Worker 				0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000, 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000,
798*89c4ff92SAndroid Build Coastguard Worker 				0x38180000, 0x38184000, 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000, 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000,
799*89c4ff92SAndroid Build Coastguard Worker 				0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000, 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000,
800*89c4ff92SAndroid Build Coastguard Worker 				0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000, 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000,
801*89c4ff92SAndroid Build Coastguard Worker 				0x38240000, 0x38244000, 0x38248000, 0x3824C000, 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000, 0x38278000, 0x3827C000,
802*89c4ff92SAndroid Build Coastguard Worker 				0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000, 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000,
803*89c4ff92SAndroid Build Coastguard Worker 				0x382C0000, 0x382C4000, 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000, 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000,
804*89c4ff92SAndroid Build Coastguard Worker 				0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000, 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000,
805*89c4ff92SAndroid Build Coastguard Worker 				0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000, 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000,
806*89c4ff92SAndroid Build Coastguard Worker 				0x38380000, 0x38384000, 0x38388000, 0x3838C000, 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000, 0x383B8000, 0x383BC000,
807*89c4ff92SAndroid Build Coastguard Worker 				0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000, 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000,
808*89c4ff92SAndroid Build Coastguard Worker 				0x38400000, 0x38404000, 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000, 0x38430000, 0x38434000, 0x38438000, 0x3843C000,
809*89c4ff92SAndroid Build Coastguard Worker 				0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000, 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000,
810*89c4ff92SAndroid Build Coastguard Worker 				0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000, 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000,
811*89c4ff92SAndroid Build Coastguard Worker 				0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000, 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000, 0x384F8000, 0x384FC000,
812*89c4ff92SAndroid Build Coastguard Worker 				0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000, 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000,
813*89c4ff92SAndroid Build Coastguard Worker 				0x38540000, 0x38544000, 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000, 0x38570000, 0x38574000, 0x38578000, 0x3857C000,
814*89c4ff92SAndroid Build Coastguard Worker 				0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000, 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000,
815*89c4ff92SAndroid Build Coastguard Worker 				0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000, 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000,
816*89c4ff92SAndroid Build Coastguard Worker 				0x38600000, 0x38604000, 0x38608000, 0x3860C000, 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000, 0x38638000, 0x3863C000,
817*89c4ff92SAndroid Build Coastguard Worker 				0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000, 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000,
818*89c4ff92SAndroid Build Coastguard Worker 				0x38680000, 0x38684000, 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000, 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000,
819*89c4ff92SAndroid Build Coastguard Worker 				0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000, 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000,
820*89c4ff92SAndroid Build Coastguard Worker 				0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000, 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000,
821*89c4ff92SAndroid Build Coastguard Worker 				0x38740000, 0x38744000, 0x38748000, 0x3874C000, 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000, 0x38778000, 0x3877C000,
822*89c4ff92SAndroid Build Coastguard Worker 				0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000, 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000,
823*89c4ff92SAndroid Build Coastguard Worker 				0x387C0000, 0x387C4000, 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000, 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000,
824*89c4ff92SAndroid Build Coastguard Worker 				0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000, 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000,
825*89c4ff92SAndroid Build Coastguard Worker 				0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000,
826*89c4ff92SAndroid Build Coastguard Worker 				0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000, 0x3805C000, 0x3805E000,
827*89c4ff92SAndroid Build Coastguard Worker 				0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000,
828*89c4ff92SAndroid Build Coastguard Worker 				0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000,
829*89c4ff92SAndroid Build Coastguard Worker 				0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000, 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000,
830*89c4ff92SAndroid Build Coastguard Worker 				0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000, 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000,
831*89c4ff92SAndroid Build Coastguard Worker 				0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000, 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000, 0x380FC000, 0x380FE000,
832*89c4ff92SAndroid Build Coastguard Worker 				0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000,
833*89c4ff92SAndroid Build Coastguard Worker 				0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000,
834*89c4ff92SAndroid Build Coastguard Worker 				0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000, 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000,
835*89c4ff92SAndroid Build Coastguard Worker 				0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000,
836*89c4ff92SAndroid Build Coastguard Worker 				0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000, 0x3819C000, 0x3819E000,
837*89c4ff92SAndroid Build Coastguard Worker 				0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000, 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000,
838*89c4ff92SAndroid Build Coastguard Worker 				0x381C0000, 0x381C2000, 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000, 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000,
839*89c4ff92SAndroid Build Coastguard Worker 				0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000, 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000,
840*89c4ff92SAndroid Build Coastguard Worker 				0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000,
841*89c4ff92SAndroid Build Coastguard Worker 				0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000, 0x3823C000, 0x3823E000,
842*89c4ff92SAndroid Build Coastguard Worker 				0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000,
843*89c4ff92SAndroid Build Coastguard Worker 				0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000,
844*89c4ff92SAndroid Build Coastguard Worker 				0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000, 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000,
845*89c4ff92SAndroid Build Coastguard Worker 				0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000, 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000,
846*89c4ff92SAndroid Build Coastguard Worker 				0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000, 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000, 0x382DC000, 0x382DE000,
847*89c4ff92SAndroid Build Coastguard Worker 				0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000, 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000,
848*89c4ff92SAndroid Build Coastguard Worker 				0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000,
849*89c4ff92SAndroid Build Coastguard Worker 				0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000, 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000,
850*89c4ff92SAndroid Build Coastguard Worker 				0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000,
851*89c4ff92SAndroid Build Coastguard Worker 				0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000, 0x3837C000, 0x3837E000,
852*89c4ff92SAndroid Build Coastguard Worker 				0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000,
853*89c4ff92SAndroid Build Coastguard Worker 				0x383A0000, 0x383A2000, 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000, 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000,
854*89c4ff92SAndroid Build Coastguard Worker 				0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000, 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000,
855*89c4ff92SAndroid Build Coastguard Worker 				0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000, 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000,
856*89c4ff92SAndroid Build Coastguard Worker 				0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000, 0x3841C000, 0x3841E000,
857*89c4ff92SAndroid Build Coastguard Worker 				0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000,
858*89c4ff92SAndroid Build Coastguard Worker 				0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000,
859*89c4ff92SAndroid Build Coastguard Worker 				0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000, 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000,
860*89c4ff92SAndroid Build Coastguard Worker 				0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000,
861*89c4ff92SAndroid Build Coastguard Worker 				0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000, 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000, 0x384BC000, 0x384BE000,
862*89c4ff92SAndroid Build Coastguard Worker 				0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000, 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000,
863*89c4ff92SAndroid Build Coastguard Worker 				0x384E0000, 0x384E2000, 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000, 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000,
864*89c4ff92SAndroid Build Coastguard Worker 				0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000, 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000,
865*89c4ff92SAndroid Build Coastguard Worker 				0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000,
866*89c4ff92SAndroid Build Coastguard Worker 				0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000, 0x3855C000, 0x3855E000,
867*89c4ff92SAndroid Build Coastguard Worker 				0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000,
868*89c4ff92SAndroid Build Coastguard Worker 				0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000,
869*89c4ff92SAndroid Build Coastguard Worker 				0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000, 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000,
870*89c4ff92SAndroid Build Coastguard Worker 				0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000, 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000,
871*89c4ff92SAndroid Build Coastguard Worker 				0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000, 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000, 0x385FC000, 0x385FE000,
872*89c4ff92SAndroid Build Coastguard Worker 				0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000,
873*89c4ff92SAndroid Build Coastguard Worker 				0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000,
874*89c4ff92SAndroid Build Coastguard Worker 				0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000, 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000,
875*89c4ff92SAndroid Build Coastguard Worker 				0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000,
876*89c4ff92SAndroid Build Coastguard Worker 				0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000, 0x3869C000, 0x3869E000,
877*89c4ff92SAndroid Build Coastguard Worker 				0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000, 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000,
878*89c4ff92SAndroid Build Coastguard Worker 				0x386C0000, 0x386C2000, 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000, 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000,
879*89c4ff92SAndroid Build Coastguard Worker 				0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000, 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000,
880*89c4ff92SAndroid Build Coastguard Worker 				0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000,
881*89c4ff92SAndroid Build Coastguard Worker 				0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000, 0x3873C000, 0x3873E000,
882*89c4ff92SAndroid Build Coastguard Worker 				0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000,
883*89c4ff92SAndroid Build Coastguard Worker 				0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000,
884*89c4ff92SAndroid Build Coastguard Worker 				0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000, 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000,
885*89c4ff92SAndroid Build Coastguard Worker 				0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000, 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000,
886*89c4ff92SAndroid Build Coastguard Worker 				0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000, 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000, 0x387DC000, 0x387DE000,
887*89c4ff92SAndroid Build Coastguard Worker 				0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000, 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000 };
888*89c4ff92SAndroid Build Coastguard Worker 			static const uint32 exponent_table[64] = {
889*89c4ff92SAndroid Build Coastguard Worker 				0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000,
890*89c4ff92SAndroid Build Coastguard Worker 				0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000, 0x0F000000, 0x47800000,
891*89c4ff92SAndroid Build Coastguard Worker 				0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,
892*89c4ff92SAndroid Build Coastguard Worker 				0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000, 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000 };
893*89c4ff92SAndroid Build Coastguard Worker 			static const unsigned short offset_table[64] = {
894*89c4ff92SAndroid Build Coastguard Worker 				   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
895*89c4ff92SAndroid Build Coastguard Worker 				   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 };
896*89c4ff92SAndroid Build Coastguard Worker 			uint32 bits = mantissa_table[offset_table[value>>10]+(value&0x3FF)] + exponent_table[value>>10];
897*89c4ff92SAndroid Build Coastguard Worker //			return *reinterpret_cast<float*>(&bits);			//violating strict aliasing!
898*89c4ff92SAndroid Build Coastguard Worker 			float out;
899*89c4ff92SAndroid Build Coastguard Worker 			std::memcpy(&out, &bits, sizeof(float));
900*89c4ff92SAndroid Build Coastguard Worker 			return out;
901*89c4ff92SAndroid Build Coastguard Worker 		}
902*89c4ff92SAndroid Build Coastguard Worker 
903*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision to IEEE double-precision.
904*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
905*89c4ff92SAndroid Build Coastguard Worker 		/// \return double-precision value
half2float_impl(uint16 value,double,true_type)906*89c4ff92SAndroid Build Coastguard Worker 		inline double half2float_impl(uint16 value, double, true_type)
907*89c4ff92SAndroid Build Coastguard Worker 		{
908*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<float>::type uint32;
909*89c4ff92SAndroid Build Coastguard Worker 			typedef bits<double>::type uint64;
910*89c4ff92SAndroid Build Coastguard Worker 			uint32 hi = static_cast<uint32>(value&0x8000) << 16;
911*89c4ff92SAndroid Build Coastguard Worker 			int abs = value & 0x7FFF;
912*89c4ff92SAndroid Build Coastguard Worker 			if(abs)
913*89c4ff92SAndroid Build Coastguard Worker 			{
914*89c4ff92SAndroid Build Coastguard Worker 				hi |= 0x3F000000 << static_cast<unsigned>(abs>=0x7C00);
915*89c4ff92SAndroid Build Coastguard Worker 				for(; abs<0x400; abs<<=1,hi-=0x100000) ;
916*89c4ff92SAndroid Build Coastguard Worker 				hi += static_cast<uint32>(abs) << 10;
917*89c4ff92SAndroid Build Coastguard Worker 			}
918*89c4ff92SAndroid Build Coastguard Worker 			uint64 bits = static_cast<uint64>(hi) << 32;
919*89c4ff92SAndroid Build Coastguard Worker //			return *reinterpret_cast<double*>(&bits);			//violating strict aliasing!
920*89c4ff92SAndroid Build Coastguard Worker 			double out;
921*89c4ff92SAndroid Build Coastguard Worker 			std::memcpy(&out, &bits, sizeof(double));
922*89c4ff92SAndroid Build Coastguard Worker 			return out;
923*89c4ff92SAndroid Build Coastguard Worker 		}
924*89c4ff92SAndroid Build Coastguard Worker 
925*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision to non-IEEE floating point.
926*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert to (builtin integer type)
927*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
928*89c4ff92SAndroid Build Coastguard Worker 		/// \return floating point value
half2float_impl(uint16 value,T,...)929*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> T half2float_impl(uint16 value, T, ...)
930*89c4ff92SAndroid Build Coastguard Worker 		{
931*89c4ff92SAndroid Build Coastguard Worker 			T out;
932*89c4ff92SAndroid Build Coastguard Worker 			int abs = value & 0x7FFF;
933*89c4ff92SAndroid Build Coastguard Worker 			if(abs > 0x7C00)
934*89c4ff92SAndroid Build Coastguard Worker 				out = std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : T();
935*89c4ff92SAndroid Build Coastguard Worker 			else if(abs == 0x7C00)
936*89c4ff92SAndroid Build Coastguard Worker 				out = std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : std::numeric_limits<T>::max();
937*89c4ff92SAndroid Build Coastguard Worker 			else if(abs > 0x3FF)
938*89c4ff92SAndroid Build Coastguard Worker 				out = std::ldexp(static_cast<T>((abs&0x3FF)|0x400), (abs>>10)-25);
939*89c4ff92SAndroid Build Coastguard Worker 			else
940*89c4ff92SAndroid Build Coastguard Worker 				out = std::ldexp(static_cast<T>(abs), -24);
941*89c4ff92SAndroid Build Coastguard Worker 			return (value&0x8000) ? -out : out;
942*89c4ff92SAndroid Build Coastguard Worker 		}
943*89c4ff92SAndroid Build Coastguard Worker 
944*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision to floating point.
945*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert to (builtin integer type)
946*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
947*89c4ff92SAndroid Build Coastguard Worker 		/// \return floating point value
half2float(uint16 value)948*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> T half2float(uint16 value)
949*89c4ff92SAndroid Build Coastguard Worker 		{
950*89c4ff92SAndroid Build Coastguard Worker 			return half2float_impl(value, T(), bool_type<std::numeric_limits<T>::is_iec559&&sizeof(typename bits<T>::type)==sizeof(T)>());
951*89c4ff92SAndroid Build Coastguard Worker 		}
952*89c4ff92SAndroid Build Coastguard Worker 
953*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision floating point to integer.
954*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
955*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam E `true` for round to even, `false` for round away from zero
956*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
957*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
958*89c4ff92SAndroid Build Coastguard Worker 		/// \return integral value
half2int_impl(uint16 value)959*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,bool E,typename T> T half2int_impl(uint16 value)
960*89c4ff92SAndroid Build Coastguard Worker 		{
961*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
962*89c4ff92SAndroid Build Coastguard Worker 			static_assert(std::is_integral<T>::value, "half to int conversion only supports builtin integer types");
963*89c4ff92SAndroid Build Coastguard Worker 		#endif
964*89c4ff92SAndroid Build Coastguard Worker 			unsigned int e = value & 0x7FFF;
965*89c4ff92SAndroid Build Coastguard Worker 			if(e >= 0x7C00)
966*89c4ff92SAndroid Build Coastguard Worker 				return (value&0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
967*89c4ff92SAndroid Build Coastguard Worker 			if(e < 0x3800)
968*89c4ff92SAndroid Build Coastguard Worker 			{
969*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_toward_infinity)
970*89c4ff92SAndroid Build Coastguard Worker 					return T(~(value>>15)&(e!=0));
971*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
972*89c4ff92SAndroid Build Coastguard Worker 					return -T(value>0x8000);
973*89c4ff92SAndroid Build Coastguard Worker 				return T();
974*89c4ff92SAndroid Build Coastguard Worker 			}
975*89c4ff92SAndroid Build Coastguard Worker 			unsigned int m = (value&0x3FF) | 0x400;
976*89c4ff92SAndroid Build Coastguard Worker 			e >>= 10;
977*89c4ff92SAndroid Build Coastguard Worker 			if(e < 25)
978*89c4ff92SAndroid Build Coastguard Worker 			{
979*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_to_nearest)
980*89c4ff92SAndroid Build Coastguard Worker 					m += (1<<(24-e)) - (~(m>>(25-e))&E);
981*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_infinity)
982*89c4ff92SAndroid Build Coastguard Worker 					m += ((value>>15)-1) & ((1<<(25-e))-1U);
983*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
984*89c4ff92SAndroid Build Coastguard Worker 					m += -(value>>15) & ((1<<(25-e))-1U);
985*89c4ff92SAndroid Build Coastguard Worker 				m >>= 25 - e;
986*89c4ff92SAndroid Build Coastguard Worker 			}
987*89c4ff92SAndroid Build Coastguard Worker 			else
988*89c4ff92SAndroid Build Coastguard Worker 				m <<= e - 25;
989*89c4ff92SAndroid Build Coastguard Worker 			return (value&0x8000) ? -static_cast<T>(m) : static_cast<T>(m);
990*89c4ff92SAndroid Build Coastguard Worker 		}
991*89c4ff92SAndroid Build Coastguard Worker 
992*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision floating point to integer.
993*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
994*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
995*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
996*89c4ff92SAndroid Build Coastguard Worker 		/// \return integral value
half2int(uint16 value)997*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,typename T> T half2int(uint16 value) { return half2int_impl<R,HALF_ROUND_TIES_TO_EVEN,T>(value); }
998*89c4ff92SAndroid Build Coastguard Worker 
999*89c4ff92SAndroid Build Coastguard Worker 		/// Convert half-precision floating point to integer using round-to-nearest-away-from-zero.
1000*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
1001*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
1002*89c4ff92SAndroid Build Coastguard Worker 		/// \return integral value
half2int_up(uint16 value)1003*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> T half2int_up(uint16 value) { return half2int_impl<std::round_to_nearest,0,T>(value); }
1004*89c4ff92SAndroid Build Coastguard Worker 
1005*89c4ff92SAndroid Build Coastguard Worker 		/// Round half-precision number to nearest integer value.
1006*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
1007*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam E `true` for round to even, `false` for round away from zero
1008*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
1009*89c4ff92SAndroid Build Coastguard Worker 		/// \return half-precision bits for nearest integral value
round_half_impl(uint16 value)1010*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R,bool E> uint16 round_half_impl(uint16 value)
1011*89c4ff92SAndroid Build Coastguard Worker 		{
1012*89c4ff92SAndroid Build Coastguard Worker 			unsigned int e = value & 0x7FFF;
1013*89c4ff92SAndroid Build Coastguard Worker 			uint16 result = value;
1014*89c4ff92SAndroid Build Coastguard Worker 			if(e < 0x3C00)
1015*89c4ff92SAndroid Build Coastguard Worker 			{
1016*89c4ff92SAndroid Build Coastguard Worker 				result &= 0x8000;
1017*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_to_nearest)
1018*89c4ff92SAndroid Build Coastguard Worker 					result |= 0x3C00U & -(e>=(0x3800+E));
1019*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_infinity)
1020*89c4ff92SAndroid Build Coastguard Worker 					result |= 0x3C00U & -(~(value>>15)&(e!=0));
1021*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
1022*89c4ff92SAndroid Build Coastguard Worker 					result |= 0x3C00U & -(value>0x8000);
1023*89c4ff92SAndroid Build Coastguard Worker 			}
1024*89c4ff92SAndroid Build Coastguard Worker 			else if(e < 0x6400)
1025*89c4ff92SAndroid Build Coastguard Worker 			{
1026*89c4ff92SAndroid Build Coastguard Worker 				e = 25 - (e>>10);
1027*89c4ff92SAndroid Build Coastguard Worker 				unsigned int mask = (1<<e) - 1;
1028*89c4ff92SAndroid Build Coastguard Worker 				if(R == std::round_to_nearest)
1029*89c4ff92SAndroid Build Coastguard Worker 					result += (1<<(e-1)) - (~(result>>e)&E);
1030*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_infinity)
1031*89c4ff92SAndroid Build Coastguard Worker 					result += mask & ((value>>15)-1);
1032*89c4ff92SAndroid Build Coastguard Worker 				else if(R == std::round_toward_neg_infinity)
1033*89c4ff92SAndroid Build Coastguard Worker 					result += mask & -(value>>15);
1034*89c4ff92SAndroid Build Coastguard Worker 				result &= ~mask;
1035*89c4ff92SAndroid Build Coastguard Worker 			}
1036*89c4ff92SAndroid Build Coastguard Worker 			return result;
1037*89c4ff92SAndroid Build Coastguard Worker 		}
1038*89c4ff92SAndroid Build Coastguard Worker 
1039*89c4ff92SAndroid Build Coastguard Worker 		/// Round half-precision number to nearest integer value.
1040*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
1041*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
1042*89c4ff92SAndroid Build Coastguard Worker 		/// \return half-precision bits for nearest integral value
round_half(uint16 value)1043*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R> uint16 round_half(uint16 value) { return round_half_impl<R,HALF_ROUND_TIES_TO_EVEN>(value); }
1044*89c4ff92SAndroid Build Coastguard Worker 
1045*89c4ff92SAndroid Build Coastguard Worker 		/// Round half-precision number to nearest integer value using round-to-nearest-away-from-zero.
1046*89c4ff92SAndroid Build Coastguard Worker 		/// \param value binary representation of half-precision value
1047*89c4ff92SAndroid Build Coastguard Worker 		/// \return half-precision bits for nearest integral value
round_half_up(uint16 value)1048*89c4ff92SAndroid Build Coastguard Worker 		inline uint16 round_half_up(uint16 value) { return round_half_impl<std::round_to_nearest,0>(value); }
1049*89c4ff92SAndroid Build Coastguard Worker 		/// \}
1050*89c4ff92SAndroid Build Coastguard Worker 
1051*89c4ff92SAndroid Build Coastguard Worker 		struct functions;
1052*89c4ff92SAndroid Build Coastguard Worker 		template<typename> struct unary_specialized;
1053*89c4ff92SAndroid Build Coastguard Worker 		template<typename,typename> struct binary_specialized;
1054*89c4ff92SAndroid Build Coastguard Worker 		template<typename,typename,std::float_round_style> struct half_caster;
1055*89c4ff92SAndroid Build Coastguard Worker 	}
1056*89c4ff92SAndroid Build Coastguard Worker 
1057*89c4ff92SAndroid Build Coastguard Worker 	/// Half-precision floating point type.
1058*89c4ff92SAndroid Build Coastguard Worker 	/// This class implements an IEEE-conformant half-precision floating point type with the usual arithmetic operators and
1059*89c4ff92SAndroid Build Coastguard Worker 	/// conversions. It is implicitly convertible to single-precision floating point, which makes artihmetic expressions and
1060*89c4ff92SAndroid Build Coastguard Worker 	/// functions with mixed-type operands to be of the most precise operand type. Additionally all arithmetic operations
1061*89c4ff92SAndroid Build Coastguard Worker 	/// (and many mathematical functions) are carried out in single-precision internally. All conversions from single- to
1062*89c4ff92SAndroid Build Coastguard Worker 	/// half-precision are done using the library's default rounding mode, but temporary results inside chained arithmetic
1063*89c4ff92SAndroid Build Coastguard Worker 	/// expressions are kept in single-precision as long as possible (while of course still maintaining a strong half-precision type).
1064*89c4ff92SAndroid Build Coastguard Worker 	///
1065*89c4ff92SAndroid Build Coastguard Worker 	/// According to the C++98/03 definition, the half type is not a POD type. But according to C++11's less strict and
1066*89c4ff92SAndroid Build Coastguard Worker 	/// extended definitions it is both a standard layout type and a trivially copyable type (even if not a POD type), which
1067*89c4ff92SAndroid Build Coastguard Worker 	/// means it can be standard-conformantly copied using raw binary copies. But in this context some more words about the
1068*89c4ff92SAndroid Build Coastguard Worker 	/// actual size of the type. Although the half is representing an IEEE 16-bit type, it does not neccessarily have to be of
1069*89c4ff92SAndroid Build Coastguard Worker 	/// exactly 16-bits size. But on any reasonable implementation the actual binary representation of this type will most
1070*89c4ff92SAndroid Build Coastguard Worker 	/// probably not ivolve any additional "magic" or padding beyond the simple binary representation of the underlying 16-bit
1071*89c4ff92SAndroid Build Coastguard Worker 	/// IEEE number, even if not strictly guaranteed by the standard. But even then it only has an actual size of 16 bits if
1072*89c4ff92SAndroid Build Coastguard Worker 	/// your C++ implementation supports an unsigned integer type of exactly 16 bits width. But this should be the case on
1073*89c4ff92SAndroid Build Coastguard Worker 	/// nearly any reasonable platform.
1074*89c4ff92SAndroid Build Coastguard Worker 	///
1075*89c4ff92SAndroid Build Coastguard Worker 	/// So if your C++ implementation is not totally exotic or imposes special alignment requirements, it is a reasonable
1076*89c4ff92SAndroid Build Coastguard Worker 	/// assumption that the data of a half is just comprised of the 2 bytes of the underlying IEEE representation.
1077*89c4ff92SAndroid Build Coastguard Worker 	class half
1078*89c4ff92SAndroid Build Coastguard Worker 	{
1079*89c4ff92SAndroid Build Coastguard Worker 		friend struct detail::functions;
1080*89c4ff92SAndroid Build Coastguard Worker 		friend struct detail::unary_specialized<half>;
1081*89c4ff92SAndroid Build Coastguard Worker 		friend struct detail::binary_specialized<half,half>;
1082*89c4ff92SAndroid Build Coastguard Worker 		template<typename,typename,std::float_round_style> friend struct detail::half_caster;
1083*89c4ff92SAndroid Build Coastguard Worker 		friend class std::numeric_limits<half>;
1084*89c4ff92SAndroid Build Coastguard Worker 	#if HALF_ENABLE_CPP11_HASH
1085*89c4ff92SAndroid Build Coastguard Worker 		friend struct std::hash<half>;
1086*89c4ff92SAndroid Build Coastguard Worker 	#endif
1087*89c4ff92SAndroid Build Coastguard Worker 	#if HALF_ENABLE_CPP11_USER_LITERALS
1088*89c4ff92SAndroid Build Coastguard Worker 		friend half literal::operator""_h(long double);
1089*89c4ff92SAndroid Build Coastguard Worker 	#endif
1090*89c4ff92SAndroid Build Coastguard Worker 
1091*89c4ff92SAndroid Build Coastguard Worker 	public:
1092*89c4ff92SAndroid Build Coastguard Worker 		/// Default constructor.
1093*89c4ff92SAndroid Build Coastguard Worker 		/// This initializes the half to 0. Although this does not match the builtin types' default-initialization semantics
1094*89c4ff92SAndroid Build Coastguard Worker 		/// and may be less efficient than no initialization, it is needed to provide proper value-initialization semantics.
half()1095*89c4ff92SAndroid Build Coastguard Worker 		HALF_CONSTEXPR half() HALF_NOEXCEPT : data_() {}
1096*89c4ff92SAndroid Build Coastguard Worker 
1097*89c4ff92SAndroid Build Coastguard Worker 		/// Copy constructor.
1098*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1099*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to copy from
half(detail::expr rhs)1100*89c4ff92SAndroid Build Coastguard Worker 		half(detail::expr rhs) : data_(detail::float2half<round_style>(static_cast<float>(rhs))) {}
1101*89c4ff92SAndroid Build Coastguard Worker 
1102*89c4ff92SAndroid Build Coastguard Worker 		/// Conversion constructor.
1103*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs float to convert
half(float rhs)1104*89c4ff92SAndroid Build Coastguard Worker 		explicit half(float rhs) : data_(detail::float2half<round_style>(rhs)) {}
1105*89c4ff92SAndroid Build Coastguard Worker 
1106*89c4ff92SAndroid Build Coastguard Worker 		/// Conversion to single-precision.
1107*89c4ff92SAndroid Build Coastguard Worker 		/// \return single precision value representing expression value
operator float() const1108*89c4ff92SAndroid Build Coastguard Worker 		operator float() const { return detail::half2float<float>(data_); }
1109*89c4ff92SAndroid Build Coastguard Worker 
1110*89c4ff92SAndroid Build Coastguard Worker 		/// Assignment operator.
1111*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1112*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to copy from
1113*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator =(detail::expr rhs)1114*89c4ff92SAndroid Build Coastguard Worker 		half& operator=(detail::expr rhs) { return *this = static_cast<float>(rhs); }
1115*89c4ff92SAndroid Build Coastguard Worker 
1116*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1117*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1118*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to add
1119*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator +=(T rhs)1120*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> typename detail::enable<half&,T>::type operator+=(T rhs) { return *this += static_cast<float>(rhs); }
1121*89c4ff92SAndroid Build Coastguard Worker 
1122*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1123*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1124*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to subtract
1125*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator -=(T rhs)1126*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> typename detail::enable<half&,T>::type operator-=(T rhs) { return *this -= static_cast<float>(rhs); }
1127*89c4ff92SAndroid Build Coastguard Worker 
1128*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1129*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1130*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to multiply with
1131*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator *=(T rhs)1132*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> typename detail::enable<half&,T>::type operator*=(T rhs) { return *this *= static_cast<float>(rhs); }
1133*89c4ff92SAndroid Build Coastguard Worker 
1134*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1135*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T type of concrete half expression
1136*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs half expression to divide by
1137*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator /=(T rhs)1138*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> typename detail::enable<half&,T>::type operator/=(T rhs) { return *this /= static_cast<float>(rhs); }
1139*89c4ff92SAndroid Build Coastguard Worker 
1140*89c4ff92SAndroid Build Coastguard Worker 		/// Assignment operator.
1141*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs single-precision value to copy from
1142*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator =(float rhs)1143*89c4ff92SAndroid Build Coastguard Worker 		half& operator=(float rhs) { data_ = detail::float2half<round_style>(rhs); return *this; }
1144*89c4ff92SAndroid Build Coastguard Worker 
1145*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1146*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs single-precision value to add
1147*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator +=(float rhs)1148*89c4ff92SAndroid Build Coastguard Worker 		half& operator+=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)+rhs); return *this; }
1149*89c4ff92SAndroid Build Coastguard Worker 
1150*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1151*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs single-precision value to subtract
1152*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator -=(float rhs)1153*89c4ff92SAndroid Build Coastguard Worker 		half& operator-=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)-rhs); return *this; }
1154*89c4ff92SAndroid Build Coastguard Worker 
1155*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1156*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs single-precision value to multiply with
1157*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator *=(float rhs)1158*89c4ff92SAndroid Build Coastguard Worker 		half& operator*=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)*rhs); return *this; }
1159*89c4ff92SAndroid Build Coastguard Worker 
1160*89c4ff92SAndroid Build Coastguard Worker 		/// Arithmetic assignment.
1161*89c4ff92SAndroid Build Coastguard Worker 		/// \param rhs single-precision value to divide by
1162*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to this half
operator /=(float rhs)1163*89c4ff92SAndroid Build Coastguard Worker 		half& operator/=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)/rhs); return *this; }
1164*89c4ff92SAndroid Build Coastguard Worker 
1165*89c4ff92SAndroid Build Coastguard Worker 		/// Prefix increment.
1166*89c4ff92SAndroid Build Coastguard Worker 		/// \return incremented half value
operator ++()1167*89c4ff92SAndroid Build Coastguard Worker 		half& operator++() { return *this += 1.0f; }
1168*89c4ff92SAndroid Build Coastguard Worker 
1169*89c4ff92SAndroid Build Coastguard Worker 		/// Prefix decrement.
1170*89c4ff92SAndroid Build Coastguard Worker 		/// \return decremented half value
operator --()1171*89c4ff92SAndroid Build Coastguard Worker 		half& operator--() { return *this -= 1.0f; }
1172*89c4ff92SAndroid Build Coastguard Worker 
1173*89c4ff92SAndroid Build Coastguard Worker 		/// Postfix increment.
1174*89c4ff92SAndroid Build Coastguard Worker 		/// \return non-incremented half value
operator ++(int)1175*89c4ff92SAndroid Build Coastguard Worker 		half operator++(int) { half out(*this); ++*this; return out; }
1176*89c4ff92SAndroid Build Coastguard Worker 
1177*89c4ff92SAndroid Build Coastguard Worker 		/// Postfix decrement.
1178*89c4ff92SAndroid Build Coastguard Worker 		/// \return non-decremented half value
operator --(int)1179*89c4ff92SAndroid Build Coastguard Worker 		half operator--(int) { half out(*this); --*this; return out; }
1180*89c4ff92SAndroid Build Coastguard Worker 
1181*89c4ff92SAndroid Build Coastguard Worker 	private:
1182*89c4ff92SAndroid Build Coastguard Worker 		/// Rounding mode to use
1183*89c4ff92SAndroid Build Coastguard Worker 		static const std::float_round_style round_style = (std::float_round_style)(HALF_ROUND_STYLE);
1184*89c4ff92SAndroid Build Coastguard Worker 
1185*89c4ff92SAndroid Build Coastguard Worker 		/// Constructor.
1186*89c4ff92SAndroid Build Coastguard Worker 		/// \param bits binary representation to set half to
half(detail::binary_t,detail::uint16 bits)1187*89c4ff92SAndroid Build Coastguard Worker 		HALF_CONSTEXPR half(detail::binary_t, detail::uint16 bits) HALF_NOEXCEPT : data_(bits) {}
1188*89c4ff92SAndroid Build Coastguard Worker 
1189*89c4ff92SAndroid Build Coastguard Worker 		/// Internal binary representation
1190*89c4ff92SAndroid Build Coastguard Worker 		detail::uint16 data_;
1191*89c4ff92SAndroid Build Coastguard Worker 	};
1192*89c4ff92SAndroid Build Coastguard Worker 
1193*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_USER_LITERALS
1194*89c4ff92SAndroid Build Coastguard Worker 	namespace literal
1195*89c4ff92SAndroid Build Coastguard Worker 	{
1196*89c4ff92SAndroid Build Coastguard Worker 		/// Half literal.
1197*89c4ff92SAndroid Build Coastguard Worker 		/// While this returns an actual half-precision value, half literals can unfortunately not be constant expressions due
1198*89c4ff92SAndroid Build Coastguard Worker 		/// to rather involved conversions.
1199*89c4ff92SAndroid Build Coastguard Worker 		/// \param value literal value
1200*89c4ff92SAndroid Build Coastguard Worker 		/// \return half with given value (if representable)
operator ""_h(long double value)1201*89c4ff92SAndroid Build Coastguard Worker 		inline half operator""_h(long double value) { return half(detail::binary, detail::float2half<half::round_style>(value)); }
1202*89c4ff92SAndroid Build Coastguard Worker 	}
1203*89c4ff92SAndroid Build Coastguard Worker #endif
1204*89c4ff92SAndroid Build Coastguard Worker 
1205*89c4ff92SAndroid Build Coastguard Worker 	namespace detail
1206*89c4ff92SAndroid Build Coastguard Worker 	{
1207*89c4ff92SAndroid Build Coastguard Worker 		/// Wrapper implementing unspecialized half-precision functions.
1208*89c4ff92SAndroid Build Coastguard Worker 		struct functions
1209*89c4ff92SAndroid Build Coastguard Worker 		{
1210*89c4ff92SAndroid Build Coastguard Worker 			/// Addition implementation.
1211*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1212*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1213*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision sum stored in single-precision
plushalf_float::detail::functions1214*89c4ff92SAndroid Build Coastguard Worker 			static expr plus(float x, float y) { return expr(x+y); }
1215*89c4ff92SAndroid Build Coastguard Worker 
1216*89c4ff92SAndroid Build Coastguard Worker 			/// Subtraction implementation.
1217*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1218*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1219*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision difference stored in single-precision
minushalf_float::detail::functions1220*89c4ff92SAndroid Build Coastguard Worker 			static expr minus(float x, float y) { return expr(x-y); }
1221*89c4ff92SAndroid Build Coastguard Worker 
1222*89c4ff92SAndroid Build Coastguard Worker 			/// Multiplication implementation.
1223*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1224*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1225*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision product stored in single-precision
multiplieshalf_float::detail::functions1226*89c4ff92SAndroid Build Coastguard Worker 			static expr multiplies(float x, float y) { return expr(x*y); }
1227*89c4ff92SAndroid Build Coastguard Worker 
1228*89c4ff92SAndroid Build Coastguard Worker 			/// Division implementation.
1229*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1230*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1231*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision quotient stored in single-precision
divideshalf_float::detail::functions1232*89c4ff92SAndroid Build Coastguard Worker 			static expr divides(float x, float y) { return expr(x/y); }
1233*89c4ff92SAndroid Build Coastguard Worker 
1234*89c4ff92SAndroid Build Coastguard Worker 			/// Output implementation.
1235*89c4ff92SAndroid Build Coastguard Worker 			/// \param out stream to write to
1236*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to write
1237*89c4ff92SAndroid Build Coastguard Worker 			/// \return reference to stream
writehalf_float::detail::functions1238*89c4ff92SAndroid Build Coastguard Worker 			template<typename charT,typename traits> static std::basic_ostream<charT,traits>& write(std::basic_ostream<charT,traits> &out, float arg) { return out << arg; }
1239*89c4ff92SAndroid Build Coastguard Worker 
1240*89c4ff92SAndroid Build Coastguard Worker 			/// Input implementation.
1241*89c4ff92SAndroid Build Coastguard Worker 			/// \param in stream to read from
1242*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg half to read into
1243*89c4ff92SAndroid Build Coastguard Worker 			/// \return reference to stream
readhalf_float::detail::functions1244*89c4ff92SAndroid Build Coastguard Worker 			template<typename charT,typename traits> static std::basic_istream<charT,traits>& read(std::basic_istream<charT,traits> &in, half &arg)
1245*89c4ff92SAndroid Build Coastguard Worker 			{
1246*89c4ff92SAndroid Build Coastguard Worker 				float f;
1247*89c4ff92SAndroid Build Coastguard Worker 				if(in >> f)
1248*89c4ff92SAndroid Build Coastguard Worker 					arg = f;
1249*89c4ff92SAndroid Build Coastguard Worker 				return in;
1250*89c4ff92SAndroid Build Coastguard Worker 			}
1251*89c4ff92SAndroid Build Coastguard Worker 
1252*89c4ff92SAndroid Build Coastguard Worker 			/// Modulo implementation.
1253*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1254*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1255*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision division remainder stored in single-precision
fmodhalf_float::detail::functions1256*89c4ff92SAndroid Build Coastguard Worker 			static expr fmod(float x, float y) { return expr(std::fmod(x, y)); }
1257*89c4ff92SAndroid Build Coastguard Worker 
1258*89c4ff92SAndroid Build Coastguard Worker 			/// Remainder implementation.
1259*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1260*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1261*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision division remainder stored in single-precision
remainderhalf_float::detail::functions1262*89c4ff92SAndroid Build Coastguard Worker 			static expr remainder(float x, float y)
1263*89c4ff92SAndroid Build Coastguard Worker 			{
1264*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1265*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::remainder(x, y));
1266*89c4ff92SAndroid Build Coastguard Worker 			#else
1267*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(x) || builtin_isnan(y))
1268*89c4ff92SAndroid Build Coastguard Worker 					return expr(std::numeric_limits<float>::quiet_NaN());
1269*89c4ff92SAndroid Build Coastguard Worker 				float ax = std::fabs(x), ay = std::fabs(y);
1270*89c4ff92SAndroid Build Coastguard Worker 				if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
1271*89c4ff92SAndroid Build Coastguard Worker 					return expr(std::numeric_limits<float>::quiet_NaN());
1272*89c4ff92SAndroid Build Coastguard Worker 				if(ay >= 65536.0f)
1273*89c4ff92SAndroid Build Coastguard Worker 					return expr(x);
1274*89c4ff92SAndroid Build Coastguard Worker 				if(ax == ay)
1275*89c4ff92SAndroid Build Coastguard Worker 					return expr(builtin_signbit(x) ? -0.0f : 0.0f);
1276*89c4ff92SAndroid Build Coastguard Worker 				ax = std::fmod(ax, ay+ay);
1277*89c4ff92SAndroid Build Coastguard Worker 				float y2 = 0.5f * ay;
1278*89c4ff92SAndroid Build Coastguard Worker 				if(ax > y2)
1279*89c4ff92SAndroid Build Coastguard Worker 				{
1280*89c4ff92SAndroid Build Coastguard Worker 					ax -= ay;
1281*89c4ff92SAndroid Build Coastguard Worker 					if(ax >= y2)
1282*89c4ff92SAndroid Build Coastguard Worker 						ax -= ay;
1283*89c4ff92SAndroid Build Coastguard Worker 				}
1284*89c4ff92SAndroid Build Coastguard Worker 				return expr(builtin_signbit(x) ? -ax : ax);
1285*89c4ff92SAndroid Build Coastguard Worker 			#endif
1286*89c4ff92SAndroid Build Coastguard Worker 			}
1287*89c4ff92SAndroid Build Coastguard Worker 
1288*89c4ff92SAndroid Build Coastguard Worker 			/// Remainder implementation.
1289*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1290*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1291*89c4ff92SAndroid Build Coastguard Worker 			/// \param quo address to store quotient bits at
1292*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision division remainder stored in single-precision
remquohalf_float::detail::functions1293*89c4ff92SAndroid Build Coastguard Worker 			static expr remquo(float x, float y, int *quo)
1294*89c4ff92SAndroid Build Coastguard Worker 			{
1295*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1296*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::remquo(x, y, quo));
1297*89c4ff92SAndroid Build Coastguard Worker 			#else
1298*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(x) || builtin_isnan(y))
1299*89c4ff92SAndroid Build Coastguard Worker 					return expr(std::numeric_limits<float>::quiet_NaN());
1300*89c4ff92SAndroid Build Coastguard Worker 				bool sign = builtin_signbit(x), qsign = static_cast<bool>(sign^builtin_signbit(y));
1301*89c4ff92SAndroid Build Coastguard Worker 				float ax = std::fabs(x), ay = std::fabs(y);
1302*89c4ff92SAndroid Build Coastguard Worker 				if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
1303*89c4ff92SAndroid Build Coastguard Worker 					return expr(std::numeric_limits<float>::quiet_NaN());
1304*89c4ff92SAndroid Build Coastguard Worker 				if(ay >= 65536.0f)
1305*89c4ff92SAndroid Build Coastguard Worker 					return expr(x);
1306*89c4ff92SAndroid Build Coastguard Worker 				if(ax == ay)
1307*89c4ff92SAndroid Build Coastguard Worker 					return *quo = qsign ? -1 : 1, expr(sign ? -0.0f : 0.0f);
1308*89c4ff92SAndroid Build Coastguard Worker 				ax = std::fmod(ax, 8.0f*ay);
1309*89c4ff92SAndroid Build Coastguard Worker 				int cquo = 0;
1310*89c4ff92SAndroid Build Coastguard Worker 				if(ax >= 4.0f * ay)
1311*89c4ff92SAndroid Build Coastguard Worker 				{
1312*89c4ff92SAndroid Build Coastguard Worker 					ax -= 4.0f * ay;
1313*89c4ff92SAndroid Build Coastguard Worker 					cquo += 4;
1314*89c4ff92SAndroid Build Coastguard Worker 				}
1315*89c4ff92SAndroid Build Coastguard Worker 				if(ax >= 2.0f * ay)
1316*89c4ff92SAndroid Build Coastguard Worker 				{
1317*89c4ff92SAndroid Build Coastguard Worker 					ax -= 2.0f * ay;
1318*89c4ff92SAndroid Build Coastguard Worker 					cquo += 2;
1319*89c4ff92SAndroid Build Coastguard Worker 				}
1320*89c4ff92SAndroid Build Coastguard Worker 				float y2 = 0.5f * ay;
1321*89c4ff92SAndroid Build Coastguard Worker 				if(ax > y2)
1322*89c4ff92SAndroid Build Coastguard Worker 				{
1323*89c4ff92SAndroid Build Coastguard Worker 					ax -= ay;
1324*89c4ff92SAndroid Build Coastguard Worker 					++cquo;
1325*89c4ff92SAndroid Build Coastguard Worker 					if(ax >= y2)
1326*89c4ff92SAndroid Build Coastguard Worker 					{
1327*89c4ff92SAndroid Build Coastguard Worker 						ax -= ay;
1328*89c4ff92SAndroid Build Coastguard Worker 						++cquo;
1329*89c4ff92SAndroid Build Coastguard Worker 					}
1330*89c4ff92SAndroid Build Coastguard Worker 				}
1331*89c4ff92SAndroid Build Coastguard Worker 				return *quo = qsign ? -cquo : cquo, expr(sign ? -ax : ax);
1332*89c4ff92SAndroid Build Coastguard Worker 			#endif
1333*89c4ff92SAndroid Build Coastguard Worker 			}
1334*89c4ff92SAndroid Build Coastguard Worker 
1335*89c4ff92SAndroid Build Coastguard Worker 			/// Positive difference implementation.
1336*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1337*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1338*89c4ff92SAndroid Build Coastguard Worker 			/// \return Positive difference stored in single-precision
fdimhalf_float::detail::functions1339*89c4ff92SAndroid Build Coastguard Worker 			static expr fdim(float x, float y)
1340*89c4ff92SAndroid Build Coastguard Worker 			{
1341*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1342*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::fdim(x, y));
1343*89c4ff92SAndroid Build Coastguard Worker 			#else
1344*89c4ff92SAndroid Build Coastguard Worker 				return expr((x<=y) ? 0.0f : (x-y));
1345*89c4ff92SAndroid Build Coastguard Worker 			#endif
1346*89c4ff92SAndroid Build Coastguard Worker 			}
1347*89c4ff92SAndroid Build Coastguard Worker 
1348*89c4ff92SAndroid Build Coastguard Worker 			/// Fused multiply-add implementation.
1349*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1350*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1351*89c4ff92SAndroid Build Coastguard Worker 			/// \param z third operand
1352*89c4ff92SAndroid Build Coastguard Worker 			/// \return \a x * \a y + \a z stored in single-precision
fmahalf_float::detail::functions1353*89c4ff92SAndroid Build Coastguard Worker 			static expr fma(float x, float y, float z)
1354*89c4ff92SAndroid Build Coastguard Worker 			{
1355*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH && defined(FP_FAST_FMAF)
1356*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::fma(x, y, z));
1357*89c4ff92SAndroid Build Coastguard Worker 			#else
1358*89c4ff92SAndroid Build Coastguard Worker 				return expr(x*y+z);
1359*89c4ff92SAndroid Build Coastguard Worker 			#endif
1360*89c4ff92SAndroid Build Coastguard Worker 			}
1361*89c4ff92SAndroid Build Coastguard Worker 
1362*89c4ff92SAndroid Build Coastguard Worker 			/// Get NaN.
1363*89c4ff92SAndroid Build Coastguard Worker 			/// \return Half-precision quiet NaN
nanhhalf_float::detail::functions1364*89c4ff92SAndroid Build Coastguard Worker 			static half nanh() { return half(binary, 0x7FFF); }
1365*89c4ff92SAndroid Build Coastguard Worker 
1366*89c4ff92SAndroid Build Coastguard Worker 			/// Exponential implementation.
1367*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1368*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
exphalf_float::detail::functions1369*89c4ff92SAndroid Build Coastguard Worker 			static expr exp(float arg) { return expr(std::exp(arg)); }
1370*89c4ff92SAndroid Build Coastguard Worker 
1371*89c4ff92SAndroid Build Coastguard Worker 			/// Exponential implementation.
1372*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1373*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
expm1half_float::detail::functions1374*89c4ff92SAndroid Build Coastguard Worker 			static expr expm1(float arg)
1375*89c4ff92SAndroid Build Coastguard Worker 			{
1376*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1377*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::expm1(arg));
1378*89c4ff92SAndroid Build Coastguard Worker 			#else
1379*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(std::exp(static_cast<double>(arg))-1.0));
1380*89c4ff92SAndroid Build Coastguard Worker 			#endif
1381*89c4ff92SAndroid Build Coastguard Worker 			}
1382*89c4ff92SAndroid Build Coastguard Worker 
1383*89c4ff92SAndroid Build Coastguard Worker 			/// Binary exponential implementation.
1384*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1385*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
exp2half_float::detail::functions1386*89c4ff92SAndroid Build Coastguard Worker 			static expr exp2(float arg)
1387*89c4ff92SAndroid Build Coastguard Worker 			{
1388*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1389*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::exp2(arg));
1390*89c4ff92SAndroid Build Coastguard Worker 			#else
1391*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(std::exp(arg*0.69314718055994530941723212145818)));
1392*89c4ff92SAndroid Build Coastguard Worker 			#endif
1393*89c4ff92SAndroid Build Coastguard Worker 			}
1394*89c4ff92SAndroid Build Coastguard Worker 
1395*89c4ff92SAndroid Build Coastguard Worker 			/// Logarithm implementation.
1396*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1397*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
loghalf_float::detail::functions1398*89c4ff92SAndroid Build Coastguard Worker 			static expr log(float arg) { return expr(std::log(arg)); }
1399*89c4ff92SAndroid Build Coastguard Worker 
1400*89c4ff92SAndroid Build Coastguard Worker 			/// Common logarithm implementation.
1401*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1402*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
log10half_float::detail::functions1403*89c4ff92SAndroid Build Coastguard Worker 			static expr log10(float arg) { return expr(std::log10(arg)); }
1404*89c4ff92SAndroid Build Coastguard Worker 
1405*89c4ff92SAndroid Build Coastguard Worker 			/// Logarithm implementation.
1406*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1407*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
log1phalf_float::detail::functions1408*89c4ff92SAndroid Build Coastguard Worker 			static expr log1p(float arg)
1409*89c4ff92SAndroid Build Coastguard Worker 			{
1410*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1411*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::log1p(arg));
1412*89c4ff92SAndroid Build Coastguard Worker 			#else
1413*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(std::log(1.0+arg)));
1414*89c4ff92SAndroid Build Coastguard Worker 			#endif
1415*89c4ff92SAndroid Build Coastguard Worker 			}
1416*89c4ff92SAndroid Build Coastguard Worker 
1417*89c4ff92SAndroid Build Coastguard Worker 			/// Binary logarithm implementation.
1418*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1419*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
log2half_float::detail::functions1420*89c4ff92SAndroid Build Coastguard Worker 			static expr log2(float arg)
1421*89c4ff92SAndroid Build Coastguard Worker 			{
1422*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1423*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::log2(arg));
1424*89c4ff92SAndroid Build Coastguard Worker 			#else
1425*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(std::log(static_cast<double>(arg))*1.4426950408889634073599246810019));
1426*89c4ff92SAndroid Build Coastguard Worker 			#endif
1427*89c4ff92SAndroid Build Coastguard Worker 			}
1428*89c4ff92SAndroid Build Coastguard Worker 
1429*89c4ff92SAndroid Build Coastguard Worker 			/// Square root implementation.
1430*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1431*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
sqrthalf_float::detail::functions1432*89c4ff92SAndroid Build Coastguard Worker 			static expr sqrt(float arg) { return expr(std::sqrt(arg)); }
1433*89c4ff92SAndroid Build Coastguard Worker 
1434*89c4ff92SAndroid Build Coastguard Worker 			/// Cubic root implementation.
1435*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1436*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
cbrthalf_float::detail::functions1437*89c4ff92SAndroid Build Coastguard Worker 			static expr cbrt(float arg)
1438*89c4ff92SAndroid Build Coastguard Worker 			{
1439*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1440*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::cbrt(arg));
1441*89c4ff92SAndroid Build Coastguard Worker 			#else
1442*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(arg) || builtin_isinf(arg))
1443*89c4ff92SAndroid Build Coastguard Worker 					return expr(arg);
1444*89c4ff92SAndroid Build Coastguard Worker 				return expr(builtin_signbit(arg) ? -static_cast<float>(std::pow(-static_cast<double>(arg), 1.0/3.0)) :
1445*89c4ff92SAndroid Build Coastguard Worker 					static_cast<float>(std::pow(static_cast<double>(arg), 1.0/3.0)));
1446*89c4ff92SAndroid Build Coastguard Worker 			#endif
1447*89c4ff92SAndroid Build Coastguard Worker 			}
1448*89c4ff92SAndroid Build Coastguard Worker 
1449*89c4ff92SAndroid Build Coastguard Worker 			/// Hypotenuse implementation.
1450*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first argument
1451*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second argument
1452*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
hypothalf_float::detail::functions1453*89c4ff92SAndroid Build Coastguard Worker 			static expr hypot(float x, float y)
1454*89c4ff92SAndroid Build Coastguard Worker 			{
1455*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1456*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::hypot(x, y));
1457*89c4ff92SAndroid Build Coastguard Worker 			#else
1458*89c4ff92SAndroid Build Coastguard Worker 				return expr((builtin_isinf(x) || builtin_isinf(y)) ? std::numeric_limits<float>::infinity() :
1459*89c4ff92SAndroid Build Coastguard Worker 					static_cast<float>(std::sqrt(static_cast<double>(x)*x+static_cast<double>(y)*y)));
1460*89c4ff92SAndroid Build Coastguard Worker 			#endif
1461*89c4ff92SAndroid Build Coastguard Worker 			}
1462*89c4ff92SAndroid Build Coastguard Worker 
1463*89c4ff92SAndroid Build Coastguard Worker 			/// Power implementation.
1464*89c4ff92SAndroid Build Coastguard Worker 			/// \param base value to exponentiate
1465*89c4ff92SAndroid Build Coastguard Worker 			/// \param exp power to expontiate to
1466*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
powhalf_float::detail::functions1467*89c4ff92SAndroid Build Coastguard Worker 			static expr pow(float base, float exp) { return expr(std::pow(base, exp)); }
1468*89c4ff92SAndroid Build Coastguard Worker 
1469*89c4ff92SAndroid Build Coastguard Worker 			/// Sine implementation.
1470*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1471*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
sinhalf_float::detail::functions1472*89c4ff92SAndroid Build Coastguard Worker 			static expr sin(float arg) { return expr(std::sin(arg)); }
1473*89c4ff92SAndroid Build Coastguard Worker 
1474*89c4ff92SAndroid Build Coastguard Worker 			/// Cosine implementation.
1475*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1476*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
coshalf_float::detail::functions1477*89c4ff92SAndroid Build Coastguard Worker 			static expr cos(float arg) { return expr(std::cos(arg)); }
1478*89c4ff92SAndroid Build Coastguard Worker 
1479*89c4ff92SAndroid Build Coastguard Worker 			/// Tan implementation.
1480*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1481*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
tanhalf_float::detail::functions1482*89c4ff92SAndroid Build Coastguard Worker 			static expr tan(float arg) { return expr(std::tan(arg)); }
1483*89c4ff92SAndroid Build Coastguard Worker 
1484*89c4ff92SAndroid Build Coastguard Worker 			/// Arc sine implementation.
1485*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1486*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
asinhalf_float::detail::functions1487*89c4ff92SAndroid Build Coastguard Worker 			static expr asin(float arg) { return expr(std::asin(arg)); }
1488*89c4ff92SAndroid Build Coastguard Worker 
1489*89c4ff92SAndroid Build Coastguard Worker 			/// Arc cosine implementation.
1490*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1491*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
acoshalf_float::detail::functions1492*89c4ff92SAndroid Build Coastguard Worker 			static expr acos(float arg) { return expr(std::acos(arg)); }
1493*89c4ff92SAndroid Build Coastguard Worker 
1494*89c4ff92SAndroid Build Coastguard Worker 			/// Arc tangent implementation.
1495*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1496*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
atanhalf_float::detail::functions1497*89c4ff92SAndroid Build Coastguard Worker 			static expr atan(float arg) { return expr(std::atan(arg)); }
1498*89c4ff92SAndroid Build Coastguard Worker 
1499*89c4ff92SAndroid Build Coastguard Worker 			/// Arc tangent implementation.
1500*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first argument
1501*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second argument
1502*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
atan2half_float::detail::functions1503*89c4ff92SAndroid Build Coastguard Worker 			static expr atan2(float x, float y) { return expr(std::atan2(x, y)); }
1504*89c4ff92SAndroid Build Coastguard Worker 
1505*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic sine implementation.
1506*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1507*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
sinhhalf_float::detail::functions1508*89c4ff92SAndroid Build Coastguard Worker 			static expr sinh(float arg) { return expr(std::sinh(arg)); }
1509*89c4ff92SAndroid Build Coastguard Worker 
1510*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic cosine implementation.
1511*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1512*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
coshhalf_float::detail::functions1513*89c4ff92SAndroid Build Coastguard Worker 			static expr cosh(float arg) { return expr(std::cosh(arg)); }
1514*89c4ff92SAndroid Build Coastguard Worker 
1515*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic tangent implementation.
1516*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1517*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
tanhhalf_float::detail::functions1518*89c4ff92SAndroid Build Coastguard Worker 			static expr tanh(float arg) { return expr(std::tanh(arg)); }
1519*89c4ff92SAndroid Build Coastguard Worker 
1520*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic area sine implementation.
1521*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1522*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
asinhhalf_float::detail::functions1523*89c4ff92SAndroid Build Coastguard Worker 			static expr asinh(float arg)
1524*89c4ff92SAndroid Build Coastguard Worker 			{
1525*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1526*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::asinh(arg));
1527*89c4ff92SAndroid Build Coastguard Worker 			#else
1528*89c4ff92SAndroid Build Coastguard Worker 				return expr((arg==-std::numeric_limits<float>::infinity()) ? arg : static_cast<float>(std::log(arg+std::sqrt(arg*arg+1.0))));
1529*89c4ff92SAndroid Build Coastguard Worker 			#endif
1530*89c4ff92SAndroid Build Coastguard Worker 			}
1531*89c4ff92SAndroid Build Coastguard Worker 
1532*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic area cosine implementation.
1533*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1534*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
acoshhalf_float::detail::functions1535*89c4ff92SAndroid Build Coastguard Worker 			static expr acosh(float arg)
1536*89c4ff92SAndroid Build Coastguard Worker 			{
1537*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1538*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::acosh(arg));
1539*89c4ff92SAndroid Build Coastguard Worker 			#else
1540*89c4ff92SAndroid Build Coastguard Worker 				return expr((arg<-1.0f) ? std::numeric_limits<float>::quiet_NaN() : static_cast<float>(std::log(arg+std::sqrt(arg*arg-1.0))));
1541*89c4ff92SAndroid Build Coastguard Worker 			#endif
1542*89c4ff92SAndroid Build Coastguard Worker 			}
1543*89c4ff92SAndroid Build Coastguard Worker 
1544*89c4ff92SAndroid Build Coastguard Worker 			/// Hyperbolic area tangent implementation.
1545*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1546*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
atanhhalf_float::detail::functions1547*89c4ff92SAndroid Build Coastguard Worker 			static expr atanh(float arg)
1548*89c4ff92SAndroid Build Coastguard Worker 			{
1549*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1550*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::atanh(arg));
1551*89c4ff92SAndroid Build Coastguard Worker 			#else
1552*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(0.5*std::log((1.0+arg)/(1.0-arg))));
1553*89c4ff92SAndroid Build Coastguard Worker 			#endif
1554*89c4ff92SAndroid Build Coastguard Worker 			}
1555*89c4ff92SAndroid Build Coastguard Worker 
1556*89c4ff92SAndroid Build Coastguard Worker 			/// Error function implementation.
1557*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1558*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
erfhalf_float::detail::functions1559*89c4ff92SAndroid Build Coastguard Worker 			static expr erf(float arg)
1560*89c4ff92SAndroid Build Coastguard Worker 			{
1561*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1562*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::erf(arg));
1563*89c4ff92SAndroid Build Coastguard Worker 			#else
1564*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(erf(static_cast<double>(arg))));
1565*89c4ff92SAndroid Build Coastguard Worker 			#endif
1566*89c4ff92SAndroid Build Coastguard Worker 			}
1567*89c4ff92SAndroid Build Coastguard Worker 
1568*89c4ff92SAndroid Build Coastguard Worker 			/// Complementary implementation.
1569*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1570*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
erfchalf_float::detail::functions1571*89c4ff92SAndroid Build Coastguard Worker 			static expr erfc(float arg)
1572*89c4ff92SAndroid Build Coastguard Worker 			{
1573*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1574*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::erfc(arg));
1575*89c4ff92SAndroid Build Coastguard Worker 			#else
1576*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(1.0-erf(static_cast<double>(arg))));
1577*89c4ff92SAndroid Build Coastguard Worker 			#endif
1578*89c4ff92SAndroid Build Coastguard Worker 			}
1579*89c4ff92SAndroid Build Coastguard Worker 
1580*89c4ff92SAndroid Build Coastguard Worker 			/// Gamma logarithm implementation.
1581*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1582*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
lgammahalf_float::detail::functions1583*89c4ff92SAndroid Build Coastguard Worker 			static expr lgamma(float arg)
1584*89c4ff92SAndroid Build Coastguard Worker 			{
1585*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1586*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::lgamma(arg));
1587*89c4ff92SAndroid Build Coastguard Worker 			#else
1588*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isinf(arg))
1589*89c4ff92SAndroid Build Coastguard Worker 					return expr(std::numeric_limits<float>::infinity());
1590*89c4ff92SAndroid Build Coastguard Worker 				if(arg < 0.0f)
1591*89c4ff92SAndroid Build Coastguard Worker 				{
1592*89c4ff92SAndroid Build Coastguard Worker 					float i, f = std::modf(-arg, &i);
1593*89c4ff92SAndroid Build Coastguard Worker 					if(f == 0.0f)
1594*89c4ff92SAndroid Build Coastguard Worker 						return expr(std::numeric_limits<float>::infinity());
1595*89c4ff92SAndroid Build Coastguard Worker 					return expr(static_cast<float>(1.1447298858494001741434273513531-
1596*89c4ff92SAndroid Build Coastguard Worker 						std::log(std::abs(std::sin(3.1415926535897932384626433832795*f)))-lgamma(1.0-arg)));
1597*89c4ff92SAndroid Build Coastguard Worker 				}
1598*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(lgamma(static_cast<double>(arg))));
1599*89c4ff92SAndroid Build Coastguard Worker 			#endif
1600*89c4ff92SAndroid Build Coastguard Worker 			}
1601*89c4ff92SAndroid Build Coastguard Worker 
1602*89c4ff92SAndroid Build Coastguard Worker 			/// Gamma implementation.
1603*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1604*89c4ff92SAndroid Build Coastguard Worker 			/// \return function value stored in single-preicision
tgammahalf_float::detail::functions1605*89c4ff92SAndroid Build Coastguard Worker 			static expr tgamma(float arg)
1606*89c4ff92SAndroid Build Coastguard Worker 			{
1607*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
1608*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::tgamma(arg));
1609*89c4ff92SAndroid Build Coastguard Worker 			#else
1610*89c4ff92SAndroid Build Coastguard Worker 				if(arg == 0.0f)
1611*89c4ff92SAndroid Build Coastguard Worker 					return builtin_signbit(arg) ? expr(-std::numeric_limits<float>::infinity()) : expr(std::numeric_limits<float>::infinity());
1612*89c4ff92SAndroid Build Coastguard Worker 				if(arg < 0.0f)
1613*89c4ff92SAndroid Build Coastguard Worker 				{
1614*89c4ff92SAndroid Build Coastguard Worker 					float i, f = std::modf(-arg, &i);
1615*89c4ff92SAndroid Build Coastguard Worker 					if(f == 0.0f)
1616*89c4ff92SAndroid Build Coastguard Worker 						return expr(std::numeric_limits<float>::quiet_NaN());
1617*89c4ff92SAndroid Build Coastguard Worker 					double value = 3.1415926535897932384626433832795 / (std::sin(3.1415926535897932384626433832795*f)*std::exp(lgamma(1.0-arg)));
1618*89c4ff92SAndroid Build Coastguard Worker 					return expr(static_cast<float>((std::fmod(i, 2.0f)==0.0f) ? -value : value));
1619*89c4ff92SAndroid Build Coastguard Worker 				}
1620*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isinf(arg))
1621*89c4ff92SAndroid Build Coastguard Worker 					return expr(arg);
1622*89c4ff92SAndroid Build Coastguard Worker 				return expr(static_cast<float>(std::exp(lgamma(static_cast<double>(arg)))));
1623*89c4ff92SAndroid Build Coastguard Worker 			#endif
1624*89c4ff92SAndroid Build Coastguard Worker 			}
1625*89c4ff92SAndroid Build Coastguard Worker 
1626*89c4ff92SAndroid Build Coastguard Worker 			/// Floor implementation.
1627*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1628*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
floorhalf_float::detail::functions1629*89c4ff92SAndroid Build Coastguard Worker 			static half floor(half arg) { return half(binary, round_half<std::round_toward_neg_infinity>(arg.data_)); }
1630*89c4ff92SAndroid Build Coastguard Worker 
1631*89c4ff92SAndroid Build Coastguard Worker 			/// Ceiling implementation.
1632*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1633*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
ceilhalf_float::detail::functions1634*89c4ff92SAndroid Build Coastguard Worker 			static half ceil(half arg) { return half(binary, round_half<std::round_toward_infinity>(arg.data_)); }
1635*89c4ff92SAndroid Build Coastguard Worker 
1636*89c4ff92SAndroid Build Coastguard Worker 			/// Truncation implementation.
1637*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1638*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
trunchalf_float::detail::functions1639*89c4ff92SAndroid Build Coastguard Worker 			static half trunc(half arg) { return half(binary, round_half<std::round_toward_zero>(arg.data_)); }
1640*89c4ff92SAndroid Build Coastguard Worker 
1641*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1642*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1643*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
roundhalf_float::detail::functions1644*89c4ff92SAndroid Build Coastguard Worker 			static half round(half arg) { return half(binary, round_half_up(arg.data_)); }
1645*89c4ff92SAndroid Build Coastguard Worker 
1646*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1647*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1648*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
lroundhalf_float::detail::functions1649*89c4ff92SAndroid Build Coastguard Worker 			static long lround(half arg) { return detail::half2int_up<long>(arg.data_); }
1650*89c4ff92SAndroid Build Coastguard Worker 
1651*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1652*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1653*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
rinthalf_float::detail::functions1654*89c4ff92SAndroid Build Coastguard Worker 			static half rint(half arg) { return half(binary, round_half<half::round_style>(arg.data_)); }
1655*89c4ff92SAndroid Build Coastguard Worker 
1656*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1657*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1658*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
lrinthalf_float::detail::functions1659*89c4ff92SAndroid Build Coastguard Worker 			static long lrint(half arg) { return detail::half2int<half::round_style,long>(arg.data_); }
1660*89c4ff92SAndroid Build Coastguard Worker 
1661*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_LONG_LONG
1662*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1663*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1664*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
llroundhalf_float::detail::functions1665*89c4ff92SAndroid Build Coastguard Worker 			static long long llround(half arg) { return detail::half2int_up<long long>(arg.data_); }
1666*89c4ff92SAndroid Build Coastguard Worker 
1667*89c4ff92SAndroid Build Coastguard Worker 			/// Nearest integer implementation.
1668*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to round
1669*89c4ff92SAndroid Build Coastguard Worker 			/// \return rounded value
llrinthalf_float::detail::functions1670*89c4ff92SAndroid Build Coastguard Worker 			static long long llrint(half arg) { return detail::half2int<half::round_style,long long>(arg.data_); }
1671*89c4ff92SAndroid Build Coastguard Worker 		#endif
1672*89c4ff92SAndroid Build Coastguard Worker 
1673*89c4ff92SAndroid Build Coastguard Worker 			/// Decompression implementation.
1674*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg number to decompress
1675*89c4ff92SAndroid Build Coastguard Worker 			/// \param exp address to store exponent at
1676*89c4ff92SAndroid Build Coastguard Worker 			/// \return normalized significant
frexphalf_float::detail::functions1677*89c4ff92SAndroid Build Coastguard Worker 			static half frexp(half arg, int *exp)
1678*89c4ff92SAndroid Build Coastguard Worker 			{
1679*89c4ff92SAndroid Build Coastguard Worker 				int m = arg.data_ & 0x7FFF, e = -14;
1680*89c4ff92SAndroid Build Coastguard Worker 				if(m >= 0x7C00 || !m)
1681*89c4ff92SAndroid Build Coastguard Worker 					return *exp = 0, arg;
1682*89c4ff92SAndroid Build Coastguard Worker 				for(; m<0x400; m<<=1,--e) ;
1683*89c4ff92SAndroid Build Coastguard Worker 				return *exp = e+(m>>10), half(binary, (arg.data_&0x8000)|0x3800|(m&0x3FF));
1684*89c4ff92SAndroid Build Coastguard Worker 			}
1685*89c4ff92SAndroid Build Coastguard Worker 
1686*89c4ff92SAndroid Build Coastguard Worker 			/// Decompression implementation.
1687*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg number to decompress
1688*89c4ff92SAndroid Build Coastguard Worker 			/// \param iptr address to store integer part at
1689*89c4ff92SAndroid Build Coastguard Worker 			/// \return fractional part
modfhalf_float::detail::functions1690*89c4ff92SAndroid Build Coastguard Worker 			static half modf(half arg, half *iptr)
1691*89c4ff92SAndroid Build Coastguard Worker 			{
1692*89c4ff92SAndroid Build Coastguard Worker 				unsigned int e = arg.data_ & 0x7FFF;
1693*89c4ff92SAndroid Build Coastguard Worker 				if(e >= 0x6400)
1694*89c4ff92SAndroid Build Coastguard Worker 					return *iptr = arg, half(binary, arg.data_&(0x8000U|-(e>0x7C00)));
1695*89c4ff92SAndroid Build Coastguard Worker 				if(e < 0x3C00)
1696*89c4ff92SAndroid Build Coastguard Worker 					return iptr->data_ = arg.data_ & 0x8000, arg;
1697*89c4ff92SAndroid Build Coastguard Worker 				e >>= 10;
1698*89c4ff92SAndroid Build Coastguard Worker 				unsigned int mask = (1<<(25-e)) - 1, m = arg.data_ & mask;
1699*89c4ff92SAndroid Build Coastguard Worker 				iptr->data_ = arg.data_ & ~mask;
1700*89c4ff92SAndroid Build Coastguard Worker 				if(!m)
1701*89c4ff92SAndroid Build Coastguard Worker 					return half(binary, arg.data_&0x8000);
1702*89c4ff92SAndroid Build Coastguard Worker 				for(; m<0x400; m<<=1,--e) ;
1703*89c4ff92SAndroid Build Coastguard Worker 				return half(binary, static_cast<uint16>((arg.data_&0x8000)|(e<<10)|(m&0x3FF)));
1704*89c4ff92SAndroid Build Coastguard Worker 			}
1705*89c4ff92SAndroid Build Coastguard Worker 
1706*89c4ff92SAndroid Build Coastguard Worker 			/// Scaling implementation.
1707*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg number to scale
1708*89c4ff92SAndroid Build Coastguard Worker 			/// \param exp power of two to scale by
1709*89c4ff92SAndroid Build Coastguard Worker 			/// \return scaled number
scalblnhalf_float::detail::functions1710*89c4ff92SAndroid Build Coastguard Worker 			static half scalbln(half arg, long exp)
1711*89c4ff92SAndroid Build Coastguard Worker 			{
1712*89c4ff92SAndroid Build Coastguard Worker 				unsigned int m = arg.data_ & 0x7FFF;
1713*89c4ff92SAndroid Build Coastguard Worker 				if(m >= 0x7C00 || !m)
1714*89c4ff92SAndroid Build Coastguard Worker 					return arg;
1715*89c4ff92SAndroid Build Coastguard Worker 				for(; m<0x400; m<<=1,--exp) ;
1716*89c4ff92SAndroid Build Coastguard Worker 				exp += m >> 10;
1717*89c4ff92SAndroid Build Coastguard Worker 				uint16 value = arg.data_ & 0x8000;
1718*89c4ff92SAndroid Build Coastguard Worker 				if(exp > 30)
1719*89c4ff92SAndroid Build Coastguard Worker 				{
1720*89c4ff92SAndroid Build Coastguard Worker 					if(half::round_style == std::round_toward_zero)
1721*89c4ff92SAndroid Build Coastguard Worker 						value |= 0x7BFF;
1722*89c4ff92SAndroid Build Coastguard Worker 					else if(half::round_style == std::round_toward_infinity)
1723*89c4ff92SAndroid Build Coastguard Worker 						value |= 0x7C00 - (value>>15);
1724*89c4ff92SAndroid Build Coastguard Worker 					else if(half::round_style == std::round_toward_neg_infinity)
1725*89c4ff92SAndroid Build Coastguard Worker 						value |= 0x7BFF + (value>>15);
1726*89c4ff92SAndroid Build Coastguard Worker 					else
1727*89c4ff92SAndroid Build Coastguard Worker 						value |= 0x7C00;
1728*89c4ff92SAndroid Build Coastguard Worker 				}
1729*89c4ff92SAndroid Build Coastguard Worker 				else if(exp > 0)
1730*89c4ff92SAndroid Build Coastguard Worker 					value |= (exp<<10) | (m&0x3FF);
1731*89c4ff92SAndroid Build Coastguard Worker 				else if(exp > -11)
1732*89c4ff92SAndroid Build Coastguard Worker 				{
1733*89c4ff92SAndroid Build Coastguard Worker 					m = (m&0x3FF) | 0x400;
1734*89c4ff92SAndroid Build Coastguard Worker 					if(half::round_style == std::round_to_nearest)
1735*89c4ff92SAndroid Build Coastguard Worker 					{
1736*89c4ff92SAndroid Build Coastguard Worker 						m += 1 << -exp;
1737*89c4ff92SAndroid Build Coastguard Worker 					#if HALF_ROUND_TIES_TO_EVEN
1738*89c4ff92SAndroid Build Coastguard Worker 						m -= (m>>(1-exp)) & 1;
1739*89c4ff92SAndroid Build Coastguard Worker 					#endif
1740*89c4ff92SAndroid Build Coastguard Worker 					}
1741*89c4ff92SAndroid Build Coastguard Worker 					else if(half::round_style == std::round_toward_infinity)
1742*89c4ff92SAndroid Build Coastguard Worker 						m += ((value>>15)-1) & ((1<<(1-exp))-1U);
1743*89c4ff92SAndroid Build Coastguard Worker 					else if(half::round_style == std::round_toward_neg_infinity)
1744*89c4ff92SAndroid Build Coastguard Worker 						m += -(value>>15) & ((1<<(1-exp))-1U);
1745*89c4ff92SAndroid Build Coastguard Worker 					value |= m >> (1-exp);
1746*89c4ff92SAndroid Build Coastguard Worker 				}
1747*89c4ff92SAndroid Build Coastguard Worker 				else if(half::round_style == std::round_toward_infinity)
1748*89c4ff92SAndroid Build Coastguard Worker 					value -= (value>>15) - 1;
1749*89c4ff92SAndroid Build Coastguard Worker 				else if(half::round_style == std::round_toward_neg_infinity)
1750*89c4ff92SAndroid Build Coastguard Worker 					value += value >> 15;
1751*89c4ff92SAndroid Build Coastguard Worker 				return half(binary, value);
1752*89c4ff92SAndroid Build Coastguard Worker 			}
1753*89c4ff92SAndroid Build Coastguard Worker 
1754*89c4ff92SAndroid Build Coastguard Worker 			/// Exponent implementation.
1755*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg number to query
1756*89c4ff92SAndroid Build Coastguard Worker 			/// \return floating point exponent
ilogbhalf_float::detail::functions1757*89c4ff92SAndroid Build Coastguard Worker 			static int ilogb(half arg)
1758*89c4ff92SAndroid Build Coastguard Worker 			{
1759*89c4ff92SAndroid Build Coastguard Worker 				int abs = arg.data_ & 0x7FFF;
1760*89c4ff92SAndroid Build Coastguard Worker 				if(!abs)
1761*89c4ff92SAndroid Build Coastguard Worker 					return FP_ILOGB0;
1762*89c4ff92SAndroid Build Coastguard Worker 				if(abs < 0x7C00)
1763*89c4ff92SAndroid Build Coastguard Worker 				{
1764*89c4ff92SAndroid Build Coastguard Worker 					int exp = (abs>>10) - 15;
1765*89c4ff92SAndroid Build Coastguard Worker 					if(abs < 0x400)
1766*89c4ff92SAndroid Build Coastguard Worker 						for(; abs<0x200; abs<<=1,--exp) ;
1767*89c4ff92SAndroid Build Coastguard Worker 					return exp;
1768*89c4ff92SAndroid Build Coastguard Worker 				}
1769*89c4ff92SAndroid Build Coastguard Worker 				if(abs > 0x7C00)
1770*89c4ff92SAndroid Build Coastguard Worker 					return FP_ILOGBNAN;
1771*89c4ff92SAndroid Build Coastguard Worker 				return INT_MAX;
1772*89c4ff92SAndroid Build Coastguard Worker 			}
1773*89c4ff92SAndroid Build Coastguard Worker 
1774*89c4ff92SAndroid Build Coastguard Worker 			/// Exponent implementation.
1775*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg number to query
1776*89c4ff92SAndroid Build Coastguard Worker 			/// \return floating point exponent
logbhalf_float::detail::functions1777*89c4ff92SAndroid Build Coastguard Worker 			static half logb(half arg)
1778*89c4ff92SAndroid Build Coastguard Worker 			{
1779*89c4ff92SAndroid Build Coastguard Worker 				int abs = arg.data_ & 0x7FFF;
1780*89c4ff92SAndroid Build Coastguard Worker 				if(!abs)
1781*89c4ff92SAndroid Build Coastguard Worker 					return half(binary, 0xFC00);
1782*89c4ff92SAndroid Build Coastguard Worker 				if(abs < 0x7C00)
1783*89c4ff92SAndroid Build Coastguard Worker 				{
1784*89c4ff92SAndroid Build Coastguard Worker 					int exp = (abs>>10) - 15;
1785*89c4ff92SAndroid Build Coastguard Worker 					if(abs < 0x400)
1786*89c4ff92SAndroid Build Coastguard Worker 						for(; abs<0x200; abs<<=1,--exp) ;
1787*89c4ff92SAndroid Build Coastguard Worker 					uint16 bits = (exp<0) << 15;
1788*89c4ff92SAndroid Build Coastguard Worker 					if(exp)
1789*89c4ff92SAndroid Build Coastguard Worker 					{
1790*89c4ff92SAndroid Build Coastguard Worker 						unsigned int m = std::abs(exp) << 6, e = 18;
1791*89c4ff92SAndroid Build Coastguard Worker 						for(; m<0x400; m<<=1,--e) ;
1792*89c4ff92SAndroid Build Coastguard Worker 						bits |= (e<<10) + m;
1793*89c4ff92SAndroid Build Coastguard Worker 					}
1794*89c4ff92SAndroid Build Coastguard Worker 					return half(binary, bits);
1795*89c4ff92SAndroid Build Coastguard Worker 				}
1796*89c4ff92SAndroid Build Coastguard Worker 				if(abs > 0x7C00)
1797*89c4ff92SAndroid Build Coastguard Worker 					return arg;
1798*89c4ff92SAndroid Build Coastguard Worker 				return half(binary, 0x7C00);
1799*89c4ff92SAndroid Build Coastguard Worker 			}
1800*89c4ff92SAndroid Build Coastguard Worker 
1801*89c4ff92SAndroid Build Coastguard Worker 			/// Enumeration implementation.
1802*89c4ff92SAndroid Build Coastguard Worker 			/// \param from number to increase/decrease
1803*89c4ff92SAndroid Build Coastguard Worker 			/// \param to direction to enumerate into
1804*89c4ff92SAndroid Build Coastguard Worker 			/// \return next representable number
nextafterhalf_float::detail::functions1805*89c4ff92SAndroid Build Coastguard Worker 			static half nextafter(half from, half to)
1806*89c4ff92SAndroid Build Coastguard Worker 			{
1807*89c4ff92SAndroid Build Coastguard Worker 				uint16 fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;
1808*89c4ff92SAndroid Build Coastguard Worker 				if(fabs > 0x7C00)
1809*89c4ff92SAndroid Build Coastguard Worker 					return from;
1810*89c4ff92SAndroid Build Coastguard Worker 				if(tabs > 0x7C00 || from.data_ == to.data_ || !(fabs|tabs))
1811*89c4ff92SAndroid Build Coastguard Worker 					return to;
1812*89c4ff92SAndroid Build Coastguard Worker 				if(!fabs)
1813*89c4ff92SAndroid Build Coastguard Worker 					return half(binary, (to.data_&0x8000)+1);
1814*89c4ff92SAndroid Build Coastguard Worker 				bool lt = ((fabs==from.data_) ? static_cast<int>(fabs) : -static_cast<int>(fabs)) <
1815*89c4ff92SAndroid Build Coastguard Worker 					((tabs==to.data_) ? static_cast<int>(tabs) : -static_cast<int>(tabs));
1816*89c4ff92SAndroid Build Coastguard Worker 				return half(binary, from.data_+(((from.data_>>15)^static_cast<unsigned>(lt))<<1)-1);
1817*89c4ff92SAndroid Build Coastguard Worker 			}
1818*89c4ff92SAndroid Build Coastguard Worker 
1819*89c4ff92SAndroid Build Coastguard Worker 			/// Enumeration implementation.
1820*89c4ff92SAndroid Build Coastguard Worker 			/// \param from number to increase/decrease
1821*89c4ff92SAndroid Build Coastguard Worker 			/// \param to direction to enumerate into
1822*89c4ff92SAndroid Build Coastguard Worker 			/// \return next representable number
nexttowardhalf_float::detail::functions1823*89c4ff92SAndroid Build Coastguard Worker 			static half nexttoward(half from, long double to)
1824*89c4ff92SAndroid Build Coastguard Worker 			{
1825*89c4ff92SAndroid Build Coastguard Worker 				if(isnan(from))
1826*89c4ff92SAndroid Build Coastguard Worker 					return from;
1827*89c4ff92SAndroid Build Coastguard Worker 				long double lfrom = static_cast<long double>(from);
1828*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(to) || lfrom == to)
1829*89c4ff92SAndroid Build Coastguard Worker 					return half(static_cast<float>(to));
1830*89c4ff92SAndroid Build Coastguard Worker 				if(!(from.data_&0x7FFF))
1831*89c4ff92SAndroid Build Coastguard Worker 					return half(binary, (static_cast<detail::uint16>(builtin_signbit(to))<<15)+1);
1832*89c4ff92SAndroid Build Coastguard Worker 				return half(binary, from.data_+(((from.data_>>15)^static_cast<unsigned>(lfrom<to))<<1)-1);
1833*89c4ff92SAndroid Build Coastguard Worker 			}
1834*89c4ff92SAndroid Build Coastguard Worker 
1835*89c4ff92SAndroid Build Coastguard Worker 			/// Sign implementation
1836*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1837*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1838*89c4ff92SAndroid Build Coastguard Worker 			/// \return composed value
copysignhalf_float::detail::functions1839*89c4ff92SAndroid Build Coastguard Worker 			static half copysign(half x, half y) { return half(binary, x.data_^((x.data_^y.data_)&0x8000)); }
1840*89c4ff92SAndroid Build Coastguard Worker 
1841*89c4ff92SAndroid Build Coastguard Worker 			/// Classification implementation.
1842*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to classify
1843*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if infinite number
1844*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
fpclassifyhalf_float::detail::functions1845*89c4ff92SAndroid Build Coastguard Worker 			static int fpclassify(half arg)
1846*89c4ff92SAndroid Build Coastguard Worker 			{
1847*89c4ff92SAndroid Build Coastguard Worker 				unsigned int abs = arg.data_ & 0x7FFF;
1848*89c4ff92SAndroid Build Coastguard Worker 				return abs ? ((abs>0x3FF) ? ((abs>=0x7C00) ? ((abs>0x7C00) ? FP_NAN : FP_INFINITE) : FP_NORMAL) :FP_SUBNORMAL) : FP_ZERO;
1849*89c4ff92SAndroid Build Coastguard Worker 			}
1850*89c4ff92SAndroid Build Coastguard Worker 
1851*89c4ff92SAndroid Build Coastguard Worker 			/// Classification implementation.
1852*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to classify
1853*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if finite number
1854*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isfinitehalf_float::detail::functions1855*89c4ff92SAndroid Build Coastguard Worker 			static bool isfinite(half arg) { return (arg.data_&0x7C00) != 0x7C00; }
1856*89c4ff92SAndroid Build Coastguard Worker 
1857*89c4ff92SAndroid Build Coastguard Worker 			/// Classification implementation.
1858*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to classify
1859*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if infinite number
1860*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isinfhalf_float::detail::functions1861*89c4ff92SAndroid Build Coastguard Worker 			static bool isinf(half arg) { return (arg.data_&0x7FFF) == 0x7C00; }
1862*89c4ff92SAndroid Build Coastguard Worker 
1863*89c4ff92SAndroid Build Coastguard Worker 			/// Classification implementation.
1864*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to classify
1865*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if not a number
1866*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isnanhalf_float::detail::functions1867*89c4ff92SAndroid Build Coastguard Worker 			static bool isnan(half arg) { return (arg.data_&0x7FFF) > 0x7C00; }
1868*89c4ff92SAndroid Build Coastguard Worker 
1869*89c4ff92SAndroid Build Coastguard Worker 			/// Classification implementation.
1870*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to classify
1871*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if normal number
1872*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isnormalhalf_float::detail::functions1873*89c4ff92SAndroid Build Coastguard Worker 			static bool isnormal(half arg) { return ((arg.data_&0x7C00)!=0) & ((arg.data_&0x7C00)!=0x7C00); }
1874*89c4ff92SAndroid Build Coastguard Worker 
1875*89c4ff92SAndroid Build Coastguard Worker 			/// Sign bit implementation.
1876*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to check
1877*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if signed
1878*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false if unsigned
signbithalf_float::detail::functions1879*89c4ff92SAndroid Build Coastguard Worker 			static bool signbit(half arg) { return (arg.data_&0x8000) != 0; }
1880*89c4ff92SAndroid Build Coastguard Worker 
1881*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1882*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1883*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1884*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if operands equal
1885*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isequalhalf_float::detail::functions1886*89c4ff92SAndroid Build Coastguard Worker 			static bool isequal(half x, half y) { return (x.data_==y.data_ || !((x.data_|y.data_)&0x7FFF)) && !isnan(x); }
1887*89c4ff92SAndroid Build Coastguard Worker 
1888*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1889*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1890*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1891*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if operands not equal
1892*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isnotequalhalf_float::detail::functions1893*89c4ff92SAndroid Build Coastguard Worker 			static bool isnotequal(half x, half y) { return (x.data_!=y.data_ && ((x.data_|y.data_)&0x7FFF)) || isnan(x); }
1894*89c4ff92SAndroid Build Coastguard Worker 
1895*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1896*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1897*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1898*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if \a x > \a y
1899*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isgreaterhalf_float::detail::functions1900*89c4ff92SAndroid Build Coastguard Worker 			static bool isgreater(half x, half y)
1901*89c4ff92SAndroid Build Coastguard Worker 			{
1902*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
1903*89c4ff92SAndroid Build Coastguard Worker 				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) > ((yabs==y.data_) ? yabs : -yabs));
1904*89c4ff92SAndroid Build Coastguard Worker 			}
1905*89c4ff92SAndroid Build Coastguard Worker 
1906*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1907*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1908*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1909*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if \a x >= \a y
1910*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isgreaterequalhalf_float::detail::functions1911*89c4ff92SAndroid Build Coastguard Worker 			static bool isgreaterequal(half x, half y)
1912*89c4ff92SAndroid Build Coastguard Worker 			{
1913*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
1914*89c4ff92SAndroid Build Coastguard Worker 				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) >= ((yabs==y.data_) ? yabs : -yabs));
1915*89c4ff92SAndroid Build Coastguard Worker 			}
1916*89c4ff92SAndroid Build Coastguard Worker 
1917*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1918*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1919*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1920*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if \a x < \a y
1921*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
islesshalf_float::detail::functions1922*89c4ff92SAndroid Build Coastguard Worker 			static bool isless(half x, half y)
1923*89c4ff92SAndroid Build Coastguard Worker 			{
1924*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
1925*89c4ff92SAndroid Build Coastguard Worker 				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) < ((yabs==y.data_) ? yabs : -yabs));
1926*89c4ff92SAndroid Build Coastguard Worker 			}
1927*89c4ff92SAndroid Build Coastguard Worker 
1928*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1929*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1930*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1931*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if \a x <= \a y
1932*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
islessequalhalf_float::detail::functions1933*89c4ff92SAndroid Build Coastguard Worker 			static bool islessequal(half x, half y)
1934*89c4ff92SAndroid Build Coastguard Worker 			{
1935*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
1936*89c4ff92SAndroid Build Coastguard Worker 				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) <= ((yabs==y.data_) ? yabs : -yabs));
1937*89c4ff92SAndroid Build Coastguard Worker 			}
1938*89c4ff92SAndroid Build Coastguard Worker 
1939*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1940*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1941*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1942*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if either \a x > \a y nor \a x < \a y
1943*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
islessgreaterhalf_float::detail::functions1944*89c4ff92SAndroid Build Coastguard Worker 			static bool islessgreater(half x, half y)
1945*89c4ff92SAndroid Build Coastguard Worker 			{
1946*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
1947*89c4ff92SAndroid Build Coastguard Worker 				if(xabs > 0x7C00 || yabs > 0x7C00)
1948*89c4ff92SAndroid Build Coastguard Worker 					return false;
1949*89c4ff92SAndroid Build Coastguard Worker 				int a = (xabs==x.data_) ? xabs : -xabs, b = (yabs==y.data_) ? yabs : -yabs;
1950*89c4ff92SAndroid Build Coastguard Worker 				return a < b || a > b;
1951*89c4ff92SAndroid Build Coastguard Worker 			}
1952*89c4ff92SAndroid Build Coastguard Worker 
1953*89c4ff92SAndroid Build Coastguard Worker 			/// Comparison implementation.
1954*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
1955*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
1956*89c4ff92SAndroid Build Coastguard Worker 			/// \retval true if operand unordered
1957*89c4ff92SAndroid Build Coastguard Worker 			/// \retval false else
isunorderedhalf_float::detail::functions1958*89c4ff92SAndroid Build Coastguard Worker 			static bool isunordered(half x, half y) { return isnan(x) || isnan(y); }
1959*89c4ff92SAndroid Build Coastguard Worker 
1960*89c4ff92SAndroid Build Coastguard Worker 		private:
erfhalf_float::detail::functions1961*89c4ff92SAndroid Build Coastguard Worker 			static double erf(double arg)
1962*89c4ff92SAndroid Build Coastguard Worker 			{
1963*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isinf(arg))
1964*89c4ff92SAndroid Build Coastguard Worker 					return (arg<0.0) ? -1.0 : 1.0;
1965*89c4ff92SAndroid Build Coastguard Worker 				double x2 = arg * arg, ax2 = 0.147 * x2, value = std::sqrt(1.0-std::exp(-x2*(1.2732395447351626861510701069801+ax2)/(1.0+ax2)));
1966*89c4ff92SAndroid Build Coastguard Worker 				return builtin_signbit(arg) ? -value : value;
1967*89c4ff92SAndroid Build Coastguard Worker 			}
1968*89c4ff92SAndroid Build Coastguard Worker 
lgammahalf_float::detail::functions1969*89c4ff92SAndroid Build Coastguard Worker 			static double lgamma(double arg)
1970*89c4ff92SAndroid Build Coastguard Worker 			{
1971*89c4ff92SAndroid Build Coastguard Worker 				double v = 1.0;
1972*89c4ff92SAndroid Build Coastguard Worker 				for(; arg<8.0; ++arg) v *= arg;
1973*89c4ff92SAndroid Build Coastguard Worker 				double w = 1.0 / (arg*arg);
1974*89c4ff92SAndroid Build Coastguard Worker 				return (((((((-0.02955065359477124183006535947712*w+0.00641025641025641025641025641026)*w+
1975*89c4ff92SAndroid Build Coastguard Worker 					-0.00191752691752691752691752691753)*w+8.4175084175084175084175084175084e-4)*w+
1976*89c4ff92SAndroid Build Coastguard Worker 					-5.952380952380952380952380952381e-4)*w+7.9365079365079365079365079365079e-4)*w+
1977*89c4ff92SAndroid Build Coastguard Worker 					-0.00277777777777777777777777777778)*w+0.08333333333333333333333333333333)/arg +
1978*89c4ff92SAndroid Build Coastguard Worker 					0.91893853320467274178032973640562 - std::log(v) - arg + (arg-0.5) * std::log(arg);
1979*89c4ff92SAndroid Build Coastguard Worker 			}
1980*89c4ff92SAndroid Build Coastguard Worker 		};
1981*89c4ff92SAndroid Build Coastguard Worker 
1982*89c4ff92SAndroid Build Coastguard Worker 		/// Wrapper for unary half-precision functions needing specialization for individual argument types.
1983*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T argument type
1984*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> struct unary_specialized
1985*89c4ff92SAndroid Build Coastguard Worker 		{
1986*89c4ff92SAndroid Build Coastguard Worker 			/// Negation implementation.
1987*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg value to negate
1988*89c4ff92SAndroid Build Coastguard Worker 			/// \return negated value
negatehalf_float::detail::unary_specialized1989*89c4ff92SAndroid Build Coastguard Worker 			static HALF_CONSTEXPR half negate(half arg) { return half(binary, arg.data_^0x8000); }
1990*89c4ff92SAndroid Build Coastguard Worker 
1991*89c4ff92SAndroid Build Coastguard Worker 			/// Absolute value implementation.
1992*89c4ff92SAndroid Build Coastguard Worker 			/// \param arg function argument
1993*89c4ff92SAndroid Build Coastguard Worker 			/// \return absolute value
fabshalf_float::detail::unary_specialized1994*89c4ff92SAndroid Build Coastguard Worker 			static half fabs(half arg) { return half(binary, arg.data_&0x7FFF); }
1995*89c4ff92SAndroid Build Coastguard Worker 		};
1996*89c4ff92SAndroid Build Coastguard Worker 		template<> struct unary_specialized<expr>
1997*89c4ff92SAndroid Build Coastguard Worker 		{
negatehalf_float::detail::unary_specialized1998*89c4ff92SAndroid Build Coastguard Worker 			static HALF_CONSTEXPR expr negate(float arg) { return expr(-arg); }
fabshalf_float::detail::unary_specialized1999*89c4ff92SAndroid Build Coastguard Worker 			static expr fabs(float arg) { return expr(std::fabs(arg)); }
2000*89c4ff92SAndroid Build Coastguard Worker 		};
2001*89c4ff92SAndroid Build Coastguard Worker 
2002*89c4ff92SAndroid Build Coastguard Worker 		/// Wrapper for binary half-precision functions needing specialization for individual argument types.
2003*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T first argument type
2004*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam U first argument type
2005*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> struct binary_specialized
2006*89c4ff92SAndroid Build Coastguard Worker 		{
2007*89c4ff92SAndroid Build Coastguard Worker 			/// Minimum implementation.
2008*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
2009*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
2010*89c4ff92SAndroid Build Coastguard Worker 			/// \return minimum value
fminhalf_float::detail::binary_specialized2011*89c4ff92SAndroid Build Coastguard Worker 			static expr fmin(float x, float y)
2012*89c4ff92SAndroid Build Coastguard Worker 			{
2013*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
2014*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::fmin(x, y));
2015*89c4ff92SAndroid Build Coastguard Worker 			#else
2016*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(x))
2017*89c4ff92SAndroid Build Coastguard Worker 					return expr(y);
2018*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(y))
2019*89c4ff92SAndroid Build Coastguard Worker 					return expr(x);
2020*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::min(x, y));
2021*89c4ff92SAndroid Build Coastguard Worker 			#endif
2022*89c4ff92SAndroid Build Coastguard Worker 			}
2023*89c4ff92SAndroid Build Coastguard Worker 
2024*89c4ff92SAndroid Build Coastguard Worker 			/// Maximum implementation.
2025*89c4ff92SAndroid Build Coastguard Worker 			/// \param x first operand
2026*89c4ff92SAndroid Build Coastguard Worker 			/// \param y second operand
2027*89c4ff92SAndroid Build Coastguard Worker 			/// \return maximum value
fmaxhalf_float::detail::binary_specialized2028*89c4ff92SAndroid Build Coastguard Worker 			static expr fmax(float x, float y)
2029*89c4ff92SAndroid Build Coastguard Worker 			{
2030*89c4ff92SAndroid Build Coastguard Worker 			#if HALF_ENABLE_CPP11_CMATH
2031*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::fmax(x, y));
2032*89c4ff92SAndroid Build Coastguard Worker 			#else
2033*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(x))
2034*89c4ff92SAndroid Build Coastguard Worker 					return expr(y);
2035*89c4ff92SAndroid Build Coastguard Worker 				if(builtin_isnan(y))
2036*89c4ff92SAndroid Build Coastguard Worker 					return expr(x);
2037*89c4ff92SAndroid Build Coastguard Worker 				return expr(std::max(x, y));
2038*89c4ff92SAndroid Build Coastguard Worker 			#endif
2039*89c4ff92SAndroid Build Coastguard Worker 			}
2040*89c4ff92SAndroid Build Coastguard Worker 		};
2041*89c4ff92SAndroid Build Coastguard Worker 		template<> struct binary_specialized<half,half>
2042*89c4ff92SAndroid Build Coastguard Worker 		{
fminhalf_float::detail::binary_specialized2043*89c4ff92SAndroid Build Coastguard Worker 			static half fmin(half x, half y)
2044*89c4ff92SAndroid Build Coastguard Worker 			{
2045*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2046*89c4ff92SAndroid Build Coastguard Worker 				if(xabs > 0x7C00)
2047*89c4ff92SAndroid Build Coastguard Worker 					return y;
2048*89c4ff92SAndroid Build Coastguard Worker 				if(yabs > 0x7C00)
2049*89c4ff92SAndroid Build Coastguard Worker 					return x;
2050*89c4ff92SAndroid Build Coastguard Worker 				return (((xabs==x.data_) ? xabs : -xabs) > ((yabs==y.data_) ? yabs : -yabs)) ? y : x;
2051*89c4ff92SAndroid Build Coastguard Worker 			}
fmaxhalf_float::detail::binary_specialized2052*89c4ff92SAndroid Build Coastguard Worker 			static half fmax(half x, half y)
2053*89c4ff92SAndroid Build Coastguard Worker 			{
2054*89c4ff92SAndroid Build Coastguard Worker 				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2055*89c4ff92SAndroid Build Coastguard Worker 				if(xabs > 0x7C00)
2056*89c4ff92SAndroid Build Coastguard Worker 					return y;
2057*89c4ff92SAndroid Build Coastguard Worker 				if(yabs > 0x7C00)
2058*89c4ff92SAndroid Build Coastguard Worker 					return x;
2059*89c4ff92SAndroid Build Coastguard Worker 				return (((xabs==x.data_) ? xabs : -xabs) < ((yabs==y.data_) ? yabs : -yabs)) ? y : x;
2060*89c4ff92SAndroid Build Coastguard Worker 			}
2061*89c4ff92SAndroid Build Coastguard Worker 		};
2062*89c4ff92SAndroid Build Coastguard Worker 
2063*89c4ff92SAndroid Build Coastguard Worker 		/// Helper class for half casts.
2064*89c4ff92SAndroid Build Coastguard Worker 		/// This class template has to be specialized for all valid cast argument to define an appropriate static `cast` member
2065*89c4ff92SAndroid Build Coastguard Worker 		/// function and a corresponding `type` member denoting its return type.
2066*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T destination type
2067*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam U source type
2068*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use
2069*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U,std::float_round_style R=(std::float_round_style)(HALF_ROUND_STYLE)> struct half_caster {};
2070*89c4ff92SAndroid Build Coastguard Worker 		template<typename U,std::float_round_style R> struct half_caster<half,U,R>
2071*89c4ff92SAndroid Build Coastguard Worker 		{
2072*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2073*89c4ff92SAndroid Build Coastguard Worker 			static_assert(std::is_arithmetic<U>::value, "half_cast from non-arithmetic type unsupported");
2074*89c4ff92SAndroid Build Coastguard Worker 		#endif
2075*89c4ff92SAndroid Build Coastguard Worker 
casthalf_float::detail::half_caster2076*89c4ff92SAndroid Build Coastguard Worker 			static half cast(U arg) { return cast_impl(arg, is_float<U>()); };
2077*89c4ff92SAndroid Build Coastguard Worker 
2078*89c4ff92SAndroid Build Coastguard Worker 		private:
cast_implhalf_float::detail::half_caster2079*89c4ff92SAndroid Build Coastguard Worker 			static half cast_impl(U arg, true_type) { return half(binary, float2half<R>(arg)); }
cast_implhalf_float::detail::half_caster2080*89c4ff92SAndroid Build Coastguard Worker 			static half cast_impl(U arg, false_type) { return half(binary, int2half<R>(arg)); }
2081*89c4ff92SAndroid Build Coastguard Worker 		};
2082*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,std::float_round_style R> struct half_caster<T,half,R>
2083*89c4ff92SAndroid Build Coastguard Worker 		{
2084*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2085*89c4ff92SAndroid Build Coastguard Worker 			static_assert(std::is_arithmetic<T>::value, "half_cast to non-arithmetic type unsupported");
2086*89c4ff92SAndroid Build Coastguard Worker 		#endif
2087*89c4ff92SAndroid Build Coastguard Worker 
casthalf_float::detail::half_caster2088*89c4ff92SAndroid Build Coastguard Worker 			static T cast(half arg) { return cast_impl(arg, is_float<T>()); }
2089*89c4ff92SAndroid Build Coastguard Worker 
2090*89c4ff92SAndroid Build Coastguard Worker 		private:
cast_implhalf_float::detail::half_caster2091*89c4ff92SAndroid Build Coastguard Worker 			static T cast_impl(half arg, true_type) { return half2float<T>(arg.data_); }
cast_implhalf_float::detail::half_caster2092*89c4ff92SAndroid Build Coastguard Worker 			static T cast_impl(half arg, false_type) { return half2int<R,T>(arg.data_); }
2093*89c4ff92SAndroid Build Coastguard Worker 		};
2094*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,std::float_round_style R> struct half_caster<T,expr,R>
2095*89c4ff92SAndroid Build Coastguard Worker 		{
2096*89c4ff92SAndroid Build Coastguard Worker 		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2097*89c4ff92SAndroid Build Coastguard Worker 			static_assert(std::is_arithmetic<T>::value, "half_cast to non-arithmetic type unsupported");
2098*89c4ff92SAndroid Build Coastguard Worker 		#endif
2099*89c4ff92SAndroid Build Coastguard Worker 
casthalf_float::detail::half_caster2100*89c4ff92SAndroid Build Coastguard Worker 			static T cast(expr arg) { return cast_impl(arg, is_float<T>()); }
2101*89c4ff92SAndroid Build Coastguard Worker 
2102*89c4ff92SAndroid Build Coastguard Worker 		private:
cast_implhalf_float::detail::half_caster2103*89c4ff92SAndroid Build Coastguard Worker 			static T cast_impl(float arg, true_type) { return static_cast<T>(arg); }
cast_implhalf_float::detail::half_caster2104*89c4ff92SAndroid Build Coastguard Worker 			static T cast_impl(half arg, false_type) { return half2int<R,T>(arg.data_); }
2105*89c4ff92SAndroid Build Coastguard Worker 		};
2106*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R> struct half_caster<half,half,R>
2107*89c4ff92SAndroid Build Coastguard Worker 		{
casthalf_float::detail::half_caster2108*89c4ff92SAndroid Build Coastguard Worker 			static half cast(half arg) { return arg; }
2109*89c4ff92SAndroid Build Coastguard Worker 		};
2110*89c4ff92SAndroid Build Coastguard Worker 		template<std::float_round_style R> struct half_caster<half,expr,R> : half_caster<half,half,R> {};
2111*89c4ff92SAndroid Build Coastguard Worker 
2112*89c4ff92SAndroid Build Coastguard Worker 		/// \name Comparison operators
2113*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2114*89c4ff92SAndroid Build Coastguard Worker 
2115*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for equality.
2116*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2117*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2118*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if operands equal
2119*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator ==(T x,U y)2120*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator==(T x, U y) { return functions::isequal(x, y); }
2121*89c4ff92SAndroid Build Coastguard Worker 
2122*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for inequality.
2123*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2124*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2125*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if operands not equal
2126*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator !=(T x,U y)2127*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator!=(T x, U y) { return functions::isnotequal(x, y); }
2128*89c4ff92SAndroid Build Coastguard Worker 
2129*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for less than.
2130*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2131*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2132*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x less than \a y
2133*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator <(T x,U y)2134*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator<(T x, U y) { return functions::isless(x, y); }
2135*89c4ff92SAndroid Build Coastguard Worker 
2136*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for greater than.
2137*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2138*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2139*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x greater than \a y
2140*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator >(T x,U y)2141*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator>(T x, U y) { return functions::isgreater(x, y); }
2142*89c4ff92SAndroid Build Coastguard Worker 
2143*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for less equal.
2144*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2145*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2146*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x less equal \a y
2147*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator <=(T x,U y)2148*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator<=(T x, U y) { return functions::islessequal(x, y); }
2149*89c4ff92SAndroid Build Coastguard Worker 
2150*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for greater equal.
2151*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2152*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2153*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x greater equal \a y
2154*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
operator >=(T x,U y)2155*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<bool,T,U>::type operator>=(T x, U y) { return functions::isgreaterequal(x, y); }
2156*89c4ff92SAndroid Build Coastguard Worker 
2157*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2158*89c4ff92SAndroid Build Coastguard Worker 		/// \name Arithmetic operators
2159*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2160*89c4ff92SAndroid Build Coastguard Worker 
2161*89c4ff92SAndroid Build Coastguard Worker 		/// Add halfs.
2162*89c4ff92SAndroid Build Coastguard Worker 		/// \param x left operand
2163*89c4ff92SAndroid Build Coastguard Worker 		/// \param y right operand
2164*89c4ff92SAndroid Build Coastguard Worker 		/// \return sum of half expressions
operator +(T x,U y)2165*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<expr,T,U>::type operator+(T x, U y) { return functions::plus(x, y); }
2166*89c4ff92SAndroid Build Coastguard Worker 
2167*89c4ff92SAndroid Build Coastguard Worker 		/// Subtract halfs.
2168*89c4ff92SAndroid Build Coastguard Worker 		/// \param x left operand
2169*89c4ff92SAndroid Build Coastguard Worker 		/// \param y right operand
2170*89c4ff92SAndroid Build Coastguard Worker 		/// \return difference of half expressions
operator -(T x,U y)2171*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<expr,T,U>::type operator-(T x, U y) { return functions::minus(x, y); }
2172*89c4ff92SAndroid Build Coastguard Worker 
2173*89c4ff92SAndroid Build Coastguard Worker 		/// Multiply halfs.
2174*89c4ff92SAndroid Build Coastguard Worker 		/// \param x left operand
2175*89c4ff92SAndroid Build Coastguard Worker 		/// \param y right operand
2176*89c4ff92SAndroid Build Coastguard Worker 		/// \return product of half expressions
operator *(T x,U y)2177*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<expr,T,U>::type operator*(T x, U y) { return functions::multiplies(x, y); }
2178*89c4ff92SAndroid Build Coastguard Worker 
2179*89c4ff92SAndroid Build Coastguard Worker 		/// Divide halfs.
2180*89c4ff92SAndroid Build Coastguard Worker 		/// \param x left operand
2181*89c4ff92SAndroid Build Coastguard Worker 		/// \param y right operand
2182*89c4ff92SAndroid Build Coastguard Worker 		/// \return quotient of half expressions
operator /(T x,U y)2183*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> typename enable<expr,T,U>::type operator/(T x, U y) { return functions::divides(x, y); }
2184*89c4ff92SAndroid Build Coastguard Worker 
2185*89c4ff92SAndroid Build Coastguard Worker 		/// Identity.
2186*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg operand
2187*89c4ff92SAndroid Build Coastguard Worker 		/// \return uncahnged operand
operator +(T arg)2188*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator+(T arg) { return arg; }
2189*89c4ff92SAndroid Build Coastguard Worker 
2190*89c4ff92SAndroid Build Coastguard Worker 		/// Negation.
2191*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg operand
2192*89c4ff92SAndroid Build Coastguard Worker 		/// \return negated operand
operator -(T arg)2193*89c4ff92SAndroid Build Coastguard Worker 		template<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator-(T arg) { return unary_specialized<T>::negate(arg); }
2194*89c4ff92SAndroid Build Coastguard Worker 
2195*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2196*89c4ff92SAndroid Build Coastguard Worker 		/// \name Input and output
2197*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2198*89c4ff92SAndroid Build Coastguard Worker 
2199*89c4ff92SAndroid Build Coastguard Worker 		/// Output operator.
2200*89c4ff92SAndroid Build Coastguard Worker 		/// \param out output stream to write into
2201*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half expression to write
2202*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to output stream
2203*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename charT,typename traits> typename enable<std::basic_ostream<charT,traits>&,T>::type
operator <<(std::basic_ostream<charT,traits> & out,T arg)2204*89c4ff92SAndroid Build Coastguard Worker 			operator<<(std::basic_ostream<charT,traits> &out, T arg) { return functions::write(out, arg); }
2205*89c4ff92SAndroid Build Coastguard Worker 
2206*89c4ff92SAndroid Build Coastguard Worker 		/// Input operator.
2207*89c4ff92SAndroid Build Coastguard Worker 		/// \param in input stream to read from
2208*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to read into
2209*89c4ff92SAndroid Build Coastguard Worker 		/// \return reference to input stream
2210*89c4ff92SAndroid Build Coastguard Worker 		template<typename charT,typename traits> std::basic_istream<charT,traits>&
operator >>(std::basic_istream<charT,traits> & in,half & arg)2211*89c4ff92SAndroid Build Coastguard Worker 			operator>>(std::basic_istream<charT,traits> &in, half &arg) { return functions::read(in, arg); }
2212*89c4ff92SAndroid Build Coastguard Worker 
2213*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2214*89c4ff92SAndroid Build Coastguard Worker 		/// \name Basic mathematical operations
2215*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2216*89c4ff92SAndroid Build Coastguard Worker 
2217*89c4ff92SAndroid Build Coastguard Worker 		/// Absolute value.
2218*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg operand
2219*89c4ff92SAndroid Build Coastguard Worker 		/// \return absolute value of \a arg
2220*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<T,T>::type abs(T arg) { return unary_specialized<T>::fabs(arg); }
abs(half arg)2221*89c4ff92SAndroid Build Coastguard Worker 		inline half abs(half arg) { return unary_specialized<half>::fabs(arg); }
abs(expr arg)2222*89c4ff92SAndroid Build Coastguard Worker 		inline expr abs(expr arg) { return unary_specialized<expr>::fabs(arg); }
2223*89c4ff92SAndroid Build Coastguard Worker 
2224*89c4ff92SAndroid Build Coastguard Worker 		/// Absolute value.
2225*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg operand
2226*89c4ff92SAndroid Build Coastguard Worker 		/// \return absolute value of \a arg
2227*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<T,T>::type fabs(T arg) { return unary_specialized<T>::fabs(arg); }
fabs(half arg)2228*89c4ff92SAndroid Build Coastguard Worker 		inline half fabs(half arg) { return unary_specialized<half>::fabs(arg); }
fabs(expr arg)2229*89c4ff92SAndroid Build Coastguard Worker 		inline expr fabs(expr arg) { return unary_specialized<expr>::fabs(arg); }
2230*89c4ff92SAndroid Build Coastguard Worker 
2231*89c4ff92SAndroid Build Coastguard Worker 		/// Remainder of division.
2232*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2233*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2234*89c4ff92SAndroid Build Coastguard Worker 		/// \return remainder of floating point division.
2235*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type fmod(T x, U y) { return functions::fmod(x, y); }
fmod(half x,half y)2236*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmod(half x, half y) { return functions::fmod(x, y); }
fmod(half x,expr y)2237*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmod(half x, expr y) { return functions::fmod(x, y); }
fmod(expr x,half y)2238*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmod(expr x, half y) { return functions::fmod(x, y); }
fmod(expr x,expr y)2239*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmod(expr x, expr y) { return functions::fmod(x, y); }
2240*89c4ff92SAndroid Build Coastguard Worker 
2241*89c4ff92SAndroid Build Coastguard Worker 		/// Remainder of division.
2242*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2243*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2244*89c4ff92SAndroid Build Coastguard Worker 		/// \return remainder of floating point division.
2245*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type remainder(T x, U y) { return functions::remainder(x, y); }
remainder(half x,half y)2246*89c4ff92SAndroid Build Coastguard Worker 		inline expr remainder(half x, half y) { return functions::remainder(x, y); }
remainder(half x,expr y)2247*89c4ff92SAndroid Build Coastguard Worker 		inline expr remainder(half x, expr y) { return functions::remainder(x, y); }
remainder(expr x,half y)2248*89c4ff92SAndroid Build Coastguard Worker 		inline expr remainder(expr x, half y) { return functions::remainder(x, y); }
remainder(expr x,expr y)2249*89c4ff92SAndroid Build Coastguard Worker 		inline expr remainder(expr x, expr y) { return functions::remainder(x, y); }
2250*89c4ff92SAndroid Build Coastguard Worker 
2251*89c4ff92SAndroid Build Coastguard Worker 		/// Remainder of division.
2252*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2253*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2254*89c4ff92SAndroid Build Coastguard Worker 		/// \param quo address to store some bits of quotient at
2255*89c4ff92SAndroid Build Coastguard Worker 		/// \return remainder of floating point division.
2256*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type remquo(T x, U y, int *quo) { return functions::remquo(x, y, quo); }
remquo(half x,half y,int * quo)2257*89c4ff92SAndroid Build Coastguard Worker 		inline expr remquo(half x, half y, int *quo) { return functions::remquo(x, y, quo); }
remquo(half x,expr y,int * quo)2258*89c4ff92SAndroid Build Coastguard Worker 		inline expr remquo(half x, expr y, int *quo) { return functions::remquo(x, y, quo); }
remquo(expr x,half y,int * quo)2259*89c4ff92SAndroid Build Coastguard Worker 		inline expr remquo(expr x, half y, int *quo) { return functions::remquo(x, y, quo); }
remquo(expr x,expr y,int * quo)2260*89c4ff92SAndroid Build Coastguard Worker 		inline expr remquo(expr x, expr y, int *quo) { return functions::remquo(x, y, quo); }
2261*89c4ff92SAndroid Build Coastguard Worker 
2262*89c4ff92SAndroid Build Coastguard Worker 		/// Fused multiply add.
2263*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2264*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2265*89c4ff92SAndroid Build Coastguard Worker 		/// \param z third operand
2266*89c4ff92SAndroid Build Coastguard Worker 		/// \return ( \a x * \a y ) + \a z rounded as one operation.
2267*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U,typename V> typename enable<expr,T,U,V>::type fma(T x, U y, V z) { return functions::fma(x, y, z); }
fma(half x,half y,half z)2268*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(half x, half y, half z) { return functions::fma(x, y, z); }
fma(half x,half y,expr z)2269*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(half x, half y, expr z) { return functions::fma(x, y, z); }
fma(half x,expr y,half z)2270*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(half x, expr y, half z) { return functions::fma(x, y, z); }
fma(half x,expr y,expr z)2271*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(half x, expr y, expr z) { return functions::fma(x, y, z); }
fma(expr x,half y,half z)2272*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(expr x, half y, half z) { return functions::fma(x, y, z); }
fma(expr x,half y,expr z)2273*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(expr x, half y, expr z) { return functions::fma(x, y, z); }
fma(expr x,expr y,half z)2274*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(expr x, expr y, half z) { return functions::fma(x, y, z); }
fma(expr x,expr y,expr z)2275*89c4ff92SAndroid Build Coastguard Worker 		inline expr fma(expr x, expr y, expr z) { return functions::fma(x, y, z); }
2276*89c4ff92SAndroid Build Coastguard Worker 
2277*89c4ff92SAndroid Build Coastguard Worker 		/// Maximum of half expressions.
2278*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2279*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2280*89c4ff92SAndroid Build Coastguard Worker 		/// \return maximum of operands
2281*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename result<T,U>::type fmax(T x, U y) { return binary_specialized<T,U>::fmax(x, y); }
fmax(half x,half y)2282*89c4ff92SAndroid Build Coastguard Worker 		inline half fmax(half x, half y) { return binary_specialized<half,half>::fmax(x, y); }
fmax(half x,expr y)2283*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmax(half x, expr y) { return binary_specialized<half,expr>::fmax(x, y); }
fmax(expr x,half y)2284*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmax(expr x, half y) { return binary_specialized<expr,half>::fmax(x, y); }
fmax(expr x,expr y)2285*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmax(expr x, expr y) { return binary_specialized<expr,expr>::fmax(x, y); }
2286*89c4ff92SAndroid Build Coastguard Worker 
2287*89c4ff92SAndroid Build Coastguard Worker 		/// Minimum of half expressions.
2288*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2289*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2290*89c4ff92SAndroid Build Coastguard Worker 		/// \return minimum of operands
2291*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename result<T,U>::type fmin(T x, U y) { return binary_specialized<T,U>::fmin(x, y); }
fmin(half x,half y)2292*89c4ff92SAndroid Build Coastguard Worker 		inline half fmin(half x, half y) { return binary_specialized<half,half>::fmin(x, y); }
fmin(half x,expr y)2293*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmin(half x, expr y) { return binary_specialized<half,expr>::fmin(x, y); }
fmin(expr x,half y)2294*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmin(expr x, half y) { return binary_specialized<expr,half>::fmin(x, y); }
fmin(expr x,expr y)2295*89c4ff92SAndroid Build Coastguard Worker 		inline expr fmin(expr x, expr y) { return binary_specialized<expr,expr>::fmin(x, y); }
2296*89c4ff92SAndroid Build Coastguard Worker 
2297*89c4ff92SAndroid Build Coastguard Worker 		/// Positive difference.
2298*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2299*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2300*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a x - \a y or 0 if difference negative
2301*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type fdim(T x, U y) { return functions::fdim(x, y); }
fdim(half x,half y)2302*89c4ff92SAndroid Build Coastguard Worker 		inline expr fdim(half x, half y) { return functions::fdim(x, y); }
fdim(half x,expr y)2303*89c4ff92SAndroid Build Coastguard Worker 		inline expr fdim(half x, expr y) { return functions::fdim(x, y); }
fdim(expr x,half y)2304*89c4ff92SAndroid Build Coastguard Worker 		inline expr fdim(expr x, half y) { return functions::fdim(x, y); }
fdim(expr x,expr y)2305*89c4ff92SAndroid Build Coastguard Worker 		inline expr fdim(expr x, expr y) { return functions::fdim(x, y); }
2306*89c4ff92SAndroid Build Coastguard Worker 
2307*89c4ff92SAndroid Build Coastguard Worker 		/// Get NaN value.
2308*89c4ff92SAndroid Build Coastguard Worker 		/// \return quiet NaN
nanh(const char *)2309*89c4ff92SAndroid Build Coastguard Worker 		inline half nanh(const char*) { return functions::nanh(); }
2310*89c4ff92SAndroid Build Coastguard Worker 
2311*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2312*89c4ff92SAndroid Build Coastguard Worker 		/// \name Exponential functions
2313*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2314*89c4ff92SAndroid Build Coastguard Worker 
2315*89c4ff92SAndroid Build Coastguard Worker 		/// Exponential function.
2316*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2317*89c4ff92SAndroid Build Coastguard Worker 		/// \return e raised to \a arg
2318*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type exp(T arg) { return functions::exp(arg); }
exp(half arg)2319*89c4ff92SAndroid Build Coastguard Worker 		inline expr exp(half arg) { return functions::exp(arg); }
exp(expr arg)2320*89c4ff92SAndroid Build Coastguard Worker 		inline expr exp(expr arg) { return functions::exp(arg); }
2321*89c4ff92SAndroid Build Coastguard Worker 
2322*89c4ff92SAndroid Build Coastguard Worker 		/// Exponential minus one.
2323*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2324*89c4ff92SAndroid Build Coastguard Worker 		/// \return e raised to \a arg subtracted by 1
2325*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type expm1(T arg) { return functions::expm1(arg); }
expm1(half arg)2326*89c4ff92SAndroid Build Coastguard Worker 		inline expr expm1(half arg) { return functions::expm1(arg); }
expm1(expr arg)2327*89c4ff92SAndroid Build Coastguard Worker 		inline expr expm1(expr arg) { return functions::expm1(arg); }
2328*89c4ff92SAndroid Build Coastguard Worker 
2329*89c4ff92SAndroid Build Coastguard Worker 		/// Binary exponential.
2330*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2331*89c4ff92SAndroid Build Coastguard Worker 		/// \return 2 raised to \a arg
2332*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type exp2(T arg) { return functions::exp2(arg); }
exp2(half arg)2333*89c4ff92SAndroid Build Coastguard Worker 		inline expr exp2(half arg) { return functions::exp2(arg); }
exp2(expr arg)2334*89c4ff92SAndroid Build Coastguard Worker 		inline expr exp2(expr arg) { return functions::exp2(arg); }
2335*89c4ff92SAndroid Build Coastguard Worker 
2336*89c4ff92SAndroid Build Coastguard Worker 		/// Natural logorithm.
2337*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2338*89c4ff92SAndroid Build Coastguard Worker 		/// \return logarithm of \a arg to base e
2339*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type log(T arg) { return functions::log(arg); }
log(half arg)2340*89c4ff92SAndroid Build Coastguard Worker 		inline expr log(half arg) { return functions::log(arg); }
log(expr arg)2341*89c4ff92SAndroid Build Coastguard Worker 		inline expr log(expr arg) { return functions::log(arg); }
2342*89c4ff92SAndroid Build Coastguard Worker 
2343*89c4ff92SAndroid Build Coastguard Worker 		/// Common logorithm.
2344*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2345*89c4ff92SAndroid Build Coastguard Worker 		/// \return logarithm of \a arg to base 10
2346*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type log10(T arg) { return functions::log10(arg); }
log10(half arg)2347*89c4ff92SAndroid Build Coastguard Worker 		inline expr log10(half arg) { return functions::log10(arg); }
log10(expr arg)2348*89c4ff92SAndroid Build Coastguard Worker 		inline expr log10(expr arg) { return functions::log10(arg); }
2349*89c4ff92SAndroid Build Coastguard Worker 
2350*89c4ff92SAndroid Build Coastguard Worker 		/// Natural logorithm.
2351*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2352*89c4ff92SAndroid Build Coastguard Worker 		/// \return logarithm of \a arg plus 1 to base e
2353*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type log1p(T arg) { return functions::log1p(arg); }
log1p(half arg)2354*89c4ff92SAndroid Build Coastguard Worker 		inline expr log1p(half arg) { return functions::log1p(arg); }
log1p(expr arg)2355*89c4ff92SAndroid Build Coastguard Worker 		inline expr log1p(expr arg) { return functions::log1p(arg); }
2356*89c4ff92SAndroid Build Coastguard Worker 
2357*89c4ff92SAndroid Build Coastguard Worker 		/// Binary logorithm.
2358*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2359*89c4ff92SAndroid Build Coastguard Worker 		/// \return logarithm of \a arg to base 2
2360*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type log2(T arg) { return functions::log2(arg); }
log2(half arg)2361*89c4ff92SAndroid Build Coastguard Worker 		inline expr log2(half arg) { return functions::log2(arg); }
log2(expr arg)2362*89c4ff92SAndroid Build Coastguard Worker 		inline expr log2(expr arg) { return functions::log2(arg); }
2363*89c4ff92SAndroid Build Coastguard Worker 
2364*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2365*89c4ff92SAndroid Build Coastguard Worker 		/// \name Power functions
2366*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2367*89c4ff92SAndroid Build Coastguard Worker 
2368*89c4ff92SAndroid Build Coastguard Worker 		/// Square root.
2369*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2370*89c4ff92SAndroid Build Coastguard Worker 		/// \return square root of \a arg
2371*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type sqrt(T arg) { return functions::sqrt(arg); }
sqrt(half arg)2372*89c4ff92SAndroid Build Coastguard Worker 		inline expr sqrt(half arg) { return functions::sqrt(arg); }
sqrt(expr arg)2373*89c4ff92SAndroid Build Coastguard Worker 		inline expr sqrt(expr arg) { return functions::sqrt(arg); }
2374*89c4ff92SAndroid Build Coastguard Worker 
2375*89c4ff92SAndroid Build Coastguard Worker 		/// Cubic root.
2376*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2377*89c4ff92SAndroid Build Coastguard Worker 		/// \return cubic root of \a arg
2378*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type cbrt(T arg) { return functions::cbrt(arg); }
cbrt(half arg)2379*89c4ff92SAndroid Build Coastguard Worker 		inline expr cbrt(half arg) { return functions::cbrt(arg); }
cbrt(expr arg)2380*89c4ff92SAndroid Build Coastguard Worker 		inline expr cbrt(expr arg) { return functions::cbrt(arg); }
2381*89c4ff92SAndroid Build Coastguard Worker 
2382*89c4ff92SAndroid Build Coastguard Worker 		/// Hypotenuse function.
2383*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first argument
2384*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second argument
2385*89c4ff92SAndroid Build Coastguard Worker 		/// \return square root of sum of squares without internal over- or underflows
2386*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type hypot(T x, U y) { return functions::hypot(x, y); }
hypot(half x,half y)2387*89c4ff92SAndroid Build Coastguard Worker 		inline expr hypot(half x, half y) { return functions::hypot(x, y); }
hypot(half x,expr y)2388*89c4ff92SAndroid Build Coastguard Worker 		inline expr hypot(half x, expr y) { return functions::hypot(x, y); }
hypot(expr x,half y)2389*89c4ff92SAndroid Build Coastguard Worker 		inline expr hypot(expr x, half y) { return functions::hypot(x, y); }
hypot(expr x,expr y)2390*89c4ff92SAndroid Build Coastguard Worker 		inline expr hypot(expr x, expr y) { return functions::hypot(x, y); }
2391*89c4ff92SAndroid Build Coastguard Worker 
2392*89c4ff92SAndroid Build Coastguard Worker 		/// Power function.
2393*89c4ff92SAndroid Build Coastguard Worker 		/// \param base first argument
2394*89c4ff92SAndroid Build Coastguard Worker 		/// \param exp second argument
2395*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a base raised to \a exp
2396*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type pow(T base, U exp) { return functions::pow(base, exp); }
pow(half base,half exp)2397*89c4ff92SAndroid Build Coastguard Worker 		inline expr pow(half base, half exp) { return functions::pow(base, exp); }
pow(half base,expr exp)2398*89c4ff92SAndroid Build Coastguard Worker 		inline expr pow(half base, expr exp) { return functions::pow(base, exp); }
pow(expr base,half exp)2399*89c4ff92SAndroid Build Coastguard Worker 		inline expr pow(expr base, half exp) { return functions::pow(base, exp); }
pow(expr base,expr exp)2400*89c4ff92SAndroid Build Coastguard Worker 		inline expr pow(expr base, expr exp) { return functions::pow(base, exp); }
2401*89c4ff92SAndroid Build Coastguard Worker 
2402*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2403*89c4ff92SAndroid Build Coastguard Worker 		/// \name Trigonometric functions
2404*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2405*89c4ff92SAndroid Build Coastguard Worker 
2406*89c4ff92SAndroid Build Coastguard Worker 		/// Sine function.
2407*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2408*89c4ff92SAndroid Build Coastguard Worker 		/// \return sine value of \a arg
2409*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type sin(T arg) { return functions::sin(arg); }
sin(half arg)2410*89c4ff92SAndroid Build Coastguard Worker 		inline expr sin(half arg) { return functions::sin(arg); }
sin(expr arg)2411*89c4ff92SAndroid Build Coastguard Worker 		inline expr sin(expr arg) { return functions::sin(arg); }
2412*89c4ff92SAndroid Build Coastguard Worker 
2413*89c4ff92SAndroid Build Coastguard Worker 		/// Cosine function.
2414*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2415*89c4ff92SAndroid Build Coastguard Worker 		/// \return cosine value of \a arg
2416*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type cos(T arg) { return functions::cos(arg); }
cos(half arg)2417*89c4ff92SAndroid Build Coastguard Worker 		inline expr cos(half arg) { return functions::cos(arg); }
cos(expr arg)2418*89c4ff92SAndroid Build Coastguard Worker 		inline expr cos(expr arg) { return functions::cos(arg); }
2419*89c4ff92SAndroid Build Coastguard Worker 
2420*89c4ff92SAndroid Build Coastguard Worker 		/// Tangent function.
2421*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2422*89c4ff92SAndroid Build Coastguard Worker 		/// \return tangent value of \a arg
2423*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type tan(T arg) { return functions::tan(arg); }
tan(half arg)2424*89c4ff92SAndroid Build Coastguard Worker 		inline expr tan(half arg) { return functions::tan(arg); }
tan(expr arg)2425*89c4ff92SAndroid Build Coastguard Worker 		inline expr tan(expr arg) { return functions::tan(arg); }
2426*89c4ff92SAndroid Build Coastguard Worker 
2427*89c4ff92SAndroid Build Coastguard Worker 		/// Arc sine.
2428*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2429*89c4ff92SAndroid Build Coastguard Worker 		/// \return arc sine value of \a arg
2430*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type asin(T arg) { return functions::asin(arg); }
asin(half arg)2431*89c4ff92SAndroid Build Coastguard Worker 		inline expr asin(half arg) { return functions::asin(arg); }
asin(expr arg)2432*89c4ff92SAndroid Build Coastguard Worker 		inline expr asin(expr arg) { return functions::asin(arg); }
2433*89c4ff92SAndroid Build Coastguard Worker 
2434*89c4ff92SAndroid Build Coastguard Worker 		/// Arc cosine function.
2435*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2436*89c4ff92SAndroid Build Coastguard Worker 		/// \return arc cosine value of \a arg
2437*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type acos(T arg) { return functions::acos(arg); }
acos(half arg)2438*89c4ff92SAndroid Build Coastguard Worker 		inline expr acos(half arg) { return functions::acos(arg); }
acos(expr arg)2439*89c4ff92SAndroid Build Coastguard Worker 		inline expr acos(expr arg) { return functions::acos(arg); }
2440*89c4ff92SAndroid Build Coastguard Worker 
2441*89c4ff92SAndroid Build Coastguard Worker 		/// Arc tangent function.
2442*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2443*89c4ff92SAndroid Build Coastguard Worker 		/// \return arc tangent value of \a arg
2444*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type atan(T arg) { return functions::atan(arg); }
atan(half arg)2445*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan(half arg) { return functions::atan(arg); }
atan(expr arg)2446*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan(expr arg) { return functions::atan(arg); }
2447*89c4ff92SAndroid Build Coastguard Worker 
2448*89c4ff92SAndroid Build Coastguard Worker 		/// Arc tangent function.
2449*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first argument
2450*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second argument
2451*89c4ff92SAndroid Build Coastguard Worker 		/// \return arc tangent value
2452*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<expr,T,U>::type atan2(T x, U y) { return functions::atan2(x, y); }
atan2(half x,half y)2453*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan2(half x, half y) { return functions::atan2(x, y); }
atan2(half x,expr y)2454*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan2(half x, expr y) { return functions::atan2(x, y); }
atan2(expr x,half y)2455*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan2(expr x, half y) { return functions::atan2(x, y); }
atan2(expr x,expr y)2456*89c4ff92SAndroid Build Coastguard Worker 		inline expr atan2(expr x, expr y) { return functions::atan2(x, y); }
2457*89c4ff92SAndroid Build Coastguard Worker 
2458*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2459*89c4ff92SAndroid Build Coastguard Worker 		/// \name Hyperbolic functions
2460*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2461*89c4ff92SAndroid Build Coastguard Worker 
2462*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic sine.
2463*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2464*89c4ff92SAndroid Build Coastguard Worker 		/// \return hyperbolic sine value of \a arg
2465*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type sinh(T arg) { return functions::sinh(arg); }
sinh(half arg)2466*89c4ff92SAndroid Build Coastguard Worker 		inline expr sinh(half arg) { return functions::sinh(arg); }
sinh(expr arg)2467*89c4ff92SAndroid Build Coastguard Worker 		inline expr sinh(expr arg) { return functions::sinh(arg); }
2468*89c4ff92SAndroid Build Coastguard Worker 
2469*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic cosine.
2470*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2471*89c4ff92SAndroid Build Coastguard Worker 		/// \return hyperbolic cosine value of \a arg
2472*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type cosh(T arg) { return functions::cosh(arg); }
cosh(half arg)2473*89c4ff92SAndroid Build Coastguard Worker 		inline expr cosh(half arg) { return functions::cosh(arg); }
cosh(expr arg)2474*89c4ff92SAndroid Build Coastguard Worker 		inline expr cosh(expr arg) { return functions::cosh(arg); }
2475*89c4ff92SAndroid Build Coastguard Worker 
2476*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic tangent.
2477*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2478*89c4ff92SAndroid Build Coastguard Worker 		/// \return hyperbolic tangent value of \a arg
2479*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type tanh(T arg) { return functions::tanh(arg); }
tanh(half arg)2480*89c4ff92SAndroid Build Coastguard Worker 		inline expr tanh(half arg) { return functions::tanh(arg); }
tanh(expr arg)2481*89c4ff92SAndroid Build Coastguard Worker 		inline expr tanh(expr arg) { return functions::tanh(arg); }
2482*89c4ff92SAndroid Build Coastguard Worker 
2483*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic area sine.
2484*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2485*89c4ff92SAndroid Build Coastguard Worker 		/// \return area sine value of \a arg
2486*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type asinh(T arg) { return functions::asinh(arg); }
asinh(half arg)2487*89c4ff92SAndroid Build Coastguard Worker 		inline expr asinh(half arg) { return functions::asinh(arg); }
asinh(expr arg)2488*89c4ff92SAndroid Build Coastguard Worker 		inline expr asinh(expr arg) { return functions::asinh(arg); }
2489*89c4ff92SAndroid Build Coastguard Worker 
2490*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic area cosine.
2491*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2492*89c4ff92SAndroid Build Coastguard Worker 		/// \return area cosine value of \a arg
2493*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type acosh(T arg) { return functions::acosh(arg); }
acosh(half arg)2494*89c4ff92SAndroid Build Coastguard Worker 		inline expr acosh(half arg) { return functions::acosh(arg); }
acosh(expr arg)2495*89c4ff92SAndroid Build Coastguard Worker 		inline expr acosh(expr arg) { return functions::acosh(arg); }
2496*89c4ff92SAndroid Build Coastguard Worker 
2497*89c4ff92SAndroid Build Coastguard Worker 		/// Hyperbolic area tangent.
2498*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2499*89c4ff92SAndroid Build Coastguard Worker 		/// \return area tangent value of \a arg
2500*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type atanh(T arg) { return functions::atanh(arg); }
atanh(half arg)2501*89c4ff92SAndroid Build Coastguard Worker 		inline expr atanh(half arg) { return functions::atanh(arg); }
atanh(expr arg)2502*89c4ff92SAndroid Build Coastguard Worker 		inline expr atanh(expr arg) { return functions::atanh(arg); }
2503*89c4ff92SAndroid Build Coastguard Worker 
2504*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2505*89c4ff92SAndroid Build Coastguard Worker 		/// \name Error and gamma functions
2506*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2507*89c4ff92SAndroid Build Coastguard Worker 
2508*89c4ff92SAndroid Build Coastguard Worker 		/// Error function.
2509*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2510*89c4ff92SAndroid Build Coastguard Worker 		/// \return error function value of \a arg
2511*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type erf(T arg) { return functions::erf(arg); }
erf(half arg)2512*89c4ff92SAndroid Build Coastguard Worker 		inline expr erf(half arg) { return functions::erf(arg); }
erf(expr arg)2513*89c4ff92SAndroid Build Coastguard Worker 		inline expr erf(expr arg) { return functions::erf(arg); }
2514*89c4ff92SAndroid Build Coastguard Worker 
2515*89c4ff92SAndroid Build Coastguard Worker 		/// Complementary error function.
2516*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2517*89c4ff92SAndroid Build Coastguard Worker 		/// \return 1 minus error function value of \a arg
2518*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type erfc(T arg) { return functions::erfc(arg); }
erfc(half arg)2519*89c4ff92SAndroid Build Coastguard Worker 		inline expr erfc(half arg) { return functions::erfc(arg); }
erfc(expr arg)2520*89c4ff92SAndroid Build Coastguard Worker 		inline expr erfc(expr arg) { return functions::erfc(arg); }
2521*89c4ff92SAndroid Build Coastguard Worker 
2522*89c4ff92SAndroid Build Coastguard Worker 		/// Natural logarithm of gamma function.
2523*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2524*89c4ff92SAndroid Build Coastguard Worker 		/// \return natural logarith of gamma function for \a arg
2525*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type lgamma(T arg) { return functions::lgamma(arg); }
lgamma(half arg)2526*89c4ff92SAndroid Build Coastguard Worker 		inline expr lgamma(half arg) { return functions::lgamma(arg); }
lgamma(expr arg)2527*89c4ff92SAndroid Build Coastguard Worker 		inline expr lgamma(expr arg) { return functions::lgamma(arg); }
2528*89c4ff92SAndroid Build Coastguard Worker 
2529*89c4ff92SAndroid Build Coastguard Worker 		/// Gamma function.
2530*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg function argument
2531*89c4ff92SAndroid Build Coastguard Worker 		/// \return gamma function value of \a arg
2532*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<expr,T>::type tgamma(T arg) { return functions::tgamma(arg); }
tgamma(half arg)2533*89c4ff92SAndroid Build Coastguard Worker 		inline expr tgamma(half arg) { return functions::tgamma(arg); }
tgamma(expr arg)2534*89c4ff92SAndroid Build Coastguard Worker 		inline expr tgamma(expr arg) { return functions::tgamma(arg); }
2535*89c4ff92SAndroid Build Coastguard Worker 
2536*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2537*89c4ff92SAndroid Build Coastguard Worker 		/// \name Rounding
2538*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2539*89c4ff92SAndroid Build Coastguard Worker 
2540*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer not less than half value.
2541*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2542*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer not less than \a arg
2543*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type ceil(T arg) { return functions::ceil(arg); }
ceil(half arg)2544*89c4ff92SAndroid Build Coastguard Worker 		inline half ceil(half arg) { return functions::ceil(arg); }
ceil(expr arg)2545*89c4ff92SAndroid Build Coastguard Worker 		inline half ceil(expr arg) { return functions::ceil(arg); }
2546*89c4ff92SAndroid Build Coastguard Worker 
2547*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer not greater than half value.
2548*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2549*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer not greater than \a arg
2550*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type floor(T arg) { return functions::floor(arg); }
floor(half arg)2551*89c4ff92SAndroid Build Coastguard Worker 		inline half floor(half arg) { return functions::floor(arg); }
floor(expr arg)2552*89c4ff92SAndroid Build Coastguard Worker 		inline half floor(expr arg) { return functions::floor(arg); }
2553*89c4ff92SAndroid Build Coastguard Worker 
2554*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer not greater in magnitude than half value.
2555*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2556*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer not greater in magnitude than \a arg
2557*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type trunc(T arg) { return functions::trunc(arg); }
trunc(half arg)2558*89c4ff92SAndroid Build Coastguard Worker 		inline half trunc(half arg) { return functions::trunc(arg); }
trunc(expr arg)2559*89c4ff92SAndroid Build Coastguard Worker 		inline half trunc(expr arg) { return functions::trunc(arg); }
2560*89c4ff92SAndroid Build Coastguard Worker 
2561*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer.
2562*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2563*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer, rounded away from zero in half-way cases
2564*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type round(T arg) { return functions::round(arg); }
round(half arg)2565*89c4ff92SAndroid Build Coastguard Worker 		inline half round(half arg) { return functions::round(arg); }
round(expr arg)2566*89c4ff92SAndroid Build Coastguard Worker 		inline half round(expr arg) { return functions::round(arg); }
2567*89c4ff92SAndroid Build Coastguard Worker 
2568*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer.
2569*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2570*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer, rounded away from zero in half-way cases
2571*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<long,T>::type lround(T arg) { return functions::lround(arg); }
lround(half arg)2572*89c4ff92SAndroid Build Coastguard Worker 		inline long lround(half arg) { return functions::lround(arg); }
lround(expr arg)2573*89c4ff92SAndroid Build Coastguard Worker 		inline long lround(expr arg) { return functions::lround(arg); }
2574*89c4ff92SAndroid Build Coastguard Worker 
2575*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer using half's internal rounding mode.
2576*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half expression to round
2577*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer using default rounding mode
2578*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type nearbyint(T arg) { return functions::nearbyint(arg); }
nearbyint(half arg)2579*89c4ff92SAndroid Build Coastguard Worker 		inline half nearbyint(half arg) { return functions::rint(arg); }
nearbyint(expr arg)2580*89c4ff92SAndroid Build Coastguard Worker 		inline half nearbyint(expr arg) { return functions::rint(arg); }
2581*89c4ff92SAndroid Build Coastguard Worker 
2582*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer using half's internal rounding mode.
2583*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half expression to round
2584*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer using default rounding mode
2585*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type rint(T arg) { return functions::rint(arg); }
rint(half arg)2586*89c4ff92SAndroid Build Coastguard Worker 		inline half rint(half arg) { return functions::rint(arg); }
rint(expr arg)2587*89c4ff92SAndroid Build Coastguard Worker 		inline half rint(expr arg) { return functions::rint(arg); }
2588*89c4ff92SAndroid Build Coastguard Worker 
2589*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer using half's internal rounding mode.
2590*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half expression to round
2591*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer using default rounding mode
2592*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<long,T>::type lrint(T arg) { return functions::lrint(arg); }
lrint(half arg)2593*89c4ff92SAndroid Build Coastguard Worker 		inline long lrint(half arg) { return functions::lrint(arg); }
lrint(expr arg)2594*89c4ff92SAndroid Build Coastguard Worker 		inline long lrint(expr arg) { return functions::lrint(arg); }
2595*89c4ff92SAndroid Build Coastguard Worker 	#if HALF_ENABLE_CPP11_LONG_LONG
2596*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer.
2597*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to round
2598*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer, rounded away from zero in half-way cases
2599*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<long long,T>::type llround(T arg) { return functions::llround(arg); }
llround(half arg)2600*89c4ff92SAndroid Build Coastguard Worker 		inline long long llround(half arg) { return functions::llround(arg); }
llround(expr arg)2601*89c4ff92SAndroid Build Coastguard Worker 		inline long long llround(expr arg) { return functions::llround(arg); }
2602*89c4ff92SAndroid Build Coastguard Worker 
2603*89c4ff92SAndroid Build Coastguard Worker 		/// Nearest integer using half's internal rounding mode.
2604*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half expression to round
2605*89c4ff92SAndroid Build Coastguard Worker 		/// \return nearest integer using default rounding mode
2606*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<long long,T>::type llrint(T arg) { return functions::llrint(arg); }
llrint(half arg)2607*89c4ff92SAndroid Build Coastguard Worker 		inline long long llrint(half arg) { return functions::llrint(arg); }
llrint(expr arg)2608*89c4ff92SAndroid Build Coastguard Worker 		inline long long llrint(expr arg) { return functions::llrint(arg); }
2609*89c4ff92SAndroid Build Coastguard Worker 	#endif
2610*89c4ff92SAndroid Build Coastguard Worker 
2611*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2612*89c4ff92SAndroid Build Coastguard Worker 		/// \name Floating point manipulation
2613*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2614*89c4ff92SAndroid Build Coastguard Worker 
2615*89c4ff92SAndroid Build Coastguard Worker 		/// Decompress floating point number.
2616*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to decompress
2617*89c4ff92SAndroid Build Coastguard Worker 		/// \param exp address to store exponent at
2618*89c4ff92SAndroid Build Coastguard Worker 		/// \return significant in range [0.5, 1)
2619*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type frexp(T arg, int *exp) { return functions::frexp(arg, exp); }
frexp(half arg,int * exp)2620*89c4ff92SAndroid Build Coastguard Worker 		inline half frexp(half arg, int *exp) { return functions::frexp(arg, exp); }
frexp(expr arg,int * exp)2621*89c4ff92SAndroid Build Coastguard Worker 		inline half frexp(expr arg, int *exp) { return functions::frexp(arg, exp); }
2622*89c4ff92SAndroid Build Coastguard Worker 
2623*89c4ff92SAndroid Build Coastguard Worker 		/// Multiply by power of two.
2624*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to modify
2625*89c4ff92SAndroid Build Coastguard Worker 		/// \param exp power of two to multiply with
2626*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a arg multplied by 2 raised to \a exp
2627*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type ldexp(T arg, int exp) { return functions::scalbln(arg, exp); }
ldexp(half arg,int exp)2628*89c4ff92SAndroid Build Coastguard Worker 		inline half ldexp(half arg, int exp) { return functions::scalbln(arg, exp); }
ldexp(expr arg,int exp)2629*89c4ff92SAndroid Build Coastguard Worker 		inline half ldexp(expr arg, int exp) { return functions::scalbln(arg, exp); }
2630*89c4ff92SAndroid Build Coastguard Worker 
2631*89c4ff92SAndroid Build Coastguard Worker 		/// Extract integer and fractional parts.
2632*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to decompress
2633*89c4ff92SAndroid Build Coastguard Worker 		/// \param iptr address to store integer part at
2634*89c4ff92SAndroid Build Coastguard Worker 		/// \return fractional part
2635*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type modf(T arg, half *iptr) { return functions::modf(arg, iptr); }
modf(half arg,half * iptr)2636*89c4ff92SAndroid Build Coastguard Worker 		inline half modf(half arg, half *iptr) { return functions::modf(arg, iptr); }
modf(expr arg,half * iptr)2637*89c4ff92SAndroid Build Coastguard Worker 		inline half modf(expr arg, half *iptr) { return functions::modf(arg, iptr); }
2638*89c4ff92SAndroid Build Coastguard Worker 
2639*89c4ff92SAndroid Build Coastguard Worker 		/// Multiply by power of two.
2640*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to modify
2641*89c4ff92SAndroid Build Coastguard Worker 		/// \param exp power of two to multiply with
2642*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a arg multplied by 2 raised to \a exp
2643*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type scalbn(T arg, int exp) { return functions::scalbln(arg, exp); }
scalbn(half arg,int exp)2644*89c4ff92SAndroid Build Coastguard Worker 		inline half scalbn(half arg, int exp) { return functions::scalbln(arg, exp); }
scalbn(expr arg,int exp)2645*89c4ff92SAndroid Build Coastguard Worker 		inline half scalbn(expr arg, int exp) { return functions::scalbln(arg, exp); }
2646*89c4ff92SAndroid Build Coastguard Worker 
2647*89c4ff92SAndroid Build Coastguard Worker 		/// Multiply by power of two.
2648*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to modify
2649*89c4ff92SAndroid Build Coastguard Worker 		/// \param exp power of two to multiply with
2650*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a arg multplied by 2 raised to \a exp
2651*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type scalbln(T arg, long exp) { return functions::scalbln(arg, exp); }
scalbln(half arg,long exp)2652*89c4ff92SAndroid Build Coastguard Worker 		inline half scalbln(half arg, long exp) { return functions::scalbln(arg, exp); }
scalbln(expr arg,long exp)2653*89c4ff92SAndroid Build Coastguard Worker 		inline half scalbln(expr arg, long exp) { return functions::scalbln(arg, exp); }
2654*89c4ff92SAndroid Build Coastguard Worker 
2655*89c4ff92SAndroid Build Coastguard Worker 		/// Extract exponent.
2656*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to query
2657*89c4ff92SAndroid Build Coastguard Worker 		/// \return floating point exponent
2658*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_ILOGB0 for zero
2659*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_ILOGBNAN for NaN
2660*89c4ff92SAndroid Build Coastguard Worker 		/// \retval MAX_INT for infinity
2661*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<int,T>::type ilogb(T arg) { return functions::ilogb(arg); }
ilogb(half arg)2662*89c4ff92SAndroid Build Coastguard Worker 		inline int ilogb(half arg) { return functions::ilogb(arg); }
ilogb(expr arg)2663*89c4ff92SAndroid Build Coastguard Worker 		inline int ilogb(expr arg) { return functions::ilogb(arg); }
2664*89c4ff92SAndroid Build Coastguard Worker 
2665*89c4ff92SAndroid Build Coastguard Worker 		/// Extract exponent.
2666*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to query
2667*89c4ff92SAndroid Build Coastguard Worker 		/// \return floating point exponent
2668*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type logb(T arg) { return functions::logb(arg); }
logb(half arg)2669*89c4ff92SAndroid Build Coastguard Worker 		inline half logb(half arg) { return functions::logb(arg); }
logb(expr arg)2670*89c4ff92SAndroid Build Coastguard Worker 		inline half logb(expr arg) { return functions::logb(arg); }
2671*89c4ff92SAndroid Build Coastguard Worker 
2672*89c4ff92SAndroid Build Coastguard Worker 		/// Next representable value.
2673*89c4ff92SAndroid Build Coastguard Worker 		/// \param from value to compute next representable value for
2674*89c4ff92SAndroid Build Coastguard Worker 		/// \param to direction towards which to compute next value
2675*89c4ff92SAndroid Build Coastguard Worker 		/// \return next representable value after \a from in direction towards \a to
2676*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<half,T,U>::type nextafter(T from, U to) { return functions::nextafter(from, to); }
nextafter(half from,half to)2677*89c4ff92SAndroid Build Coastguard Worker 		inline half nextafter(half from, half to) { return functions::nextafter(from, to); }
nextafter(half from,expr to)2678*89c4ff92SAndroid Build Coastguard Worker 		inline half nextafter(half from, expr to) { return functions::nextafter(from, to); }
nextafter(expr from,half to)2679*89c4ff92SAndroid Build Coastguard Worker 		inline half nextafter(expr from, half to) { return functions::nextafter(from, to); }
nextafter(expr from,expr to)2680*89c4ff92SAndroid Build Coastguard Worker 		inline half nextafter(expr from, expr to) { return functions::nextafter(from, to); }
2681*89c4ff92SAndroid Build Coastguard Worker 
2682*89c4ff92SAndroid Build Coastguard Worker 		/// Next representable value.
2683*89c4ff92SAndroid Build Coastguard Worker 		/// \param from value to compute next representable value for
2684*89c4ff92SAndroid Build Coastguard Worker 		/// \param to direction towards which to compute next value
2685*89c4ff92SAndroid Build Coastguard Worker 		/// \return next representable value after \a from in direction towards \a to
2686*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<half,T>::type nexttoward(T from, long double to) { return functions::nexttoward(from, to); }
nexttoward(half from,long double to)2687*89c4ff92SAndroid Build Coastguard Worker 		inline half nexttoward(half from, long double to) { return functions::nexttoward(from, to); }
nexttoward(expr from,long double to)2688*89c4ff92SAndroid Build Coastguard Worker 		inline half nexttoward(expr from, long double to) { return functions::nexttoward(from, to); }
2689*89c4ff92SAndroid Build Coastguard Worker 
2690*89c4ff92SAndroid Build Coastguard Worker 		/// Take sign.
2691*89c4ff92SAndroid Build Coastguard Worker 		/// \param x value to change sign for
2692*89c4ff92SAndroid Build Coastguard Worker 		/// \param y value to take sign from
2693*89c4ff92SAndroid Build Coastguard Worker 		/// \return value equal to \a x in magnitude and to \a y in sign
2694*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<half,T,U>::type copysign(T x, U y) { return functions::copysign(x, y); }
copysign(half x,half y)2695*89c4ff92SAndroid Build Coastguard Worker 		inline half copysign(half x, half y) { return functions::copysign(x, y); }
copysign(half x,expr y)2696*89c4ff92SAndroid Build Coastguard Worker 		inline half copysign(half x, expr y) { return functions::copysign(x, y); }
copysign(expr x,half y)2697*89c4ff92SAndroid Build Coastguard Worker 		inline half copysign(expr x, half y) { return functions::copysign(x, y); }
copysign(expr x,expr y)2698*89c4ff92SAndroid Build Coastguard Worker 		inline half copysign(expr x, expr y) { return functions::copysign(x, y); }
2699*89c4ff92SAndroid Build Coastguard Worker 
2700*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2701*89c4ff92SAndroid Build Coastguard Worker 		/// \name Floating point classification
2702*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2703*89c4ff92SAndroid Build Coastguard Worker 
2704*89c4ff92SAndroid Build Coastguard Worker 
2705*89c4ff92SAndroid Build Coastguard Worker 		/// Classify floating point value.
2706*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to classify
2707*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_ZERO for positive and negative zero
2708*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_SUBNORMAL for subnormal numbers
2709*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_INFINITY for positive and negative infinity
2710*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_NAN for NaNs
2711*89c4ff92SAndroid Build Coastguard Worker 		/// \retval FP_NORMAL for all other (normal) values
2712*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<int,T>::type fpclassify(T arg) { return functions::fpclassify(arg); }
fpclassify(half arg)2713*89c4ff92SAndroid Build Coastguard Worker 		inline int fpclassify(half arg) { return functions::fpclassify(arg); }
fpclassify(expr arg)2714*89c4ff92SAndroid Build Coastguard Worker 		inline int fpclassify(expr arg) { return functions::fpclassify(arg); }
2715*89c4ff92SAndroid Build Coastguard Worker 
2716*89c4ff92SAndroid Build Coastguard Worker 		/// Check if finite number.
2717*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to check
2718*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if neither infinity nor NaN
2719*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2720*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<bool,T>::type isfinite(T arg) { return functions::isfinite(arg); }
isfinite(half arg)2721*89c4ff92SAndroid Build Coastguard Worker 		inline bool isfinite(half arg) { return functions::isfinite(arg); }
isfinite(expr arg)2722*89c4ff92SAndroid Build Coastguard Worker 		inline bool isfinite(expr arg) { return functions::isfinite(arg); }
2723*89c4ff92SAndroid Build Coastguard Worker 
2724*89c4ff92SAndroid Build Coastguard Worker 		/// Check for infinity.
2725*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to check
2726*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true for positive or negative infinity
2727*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2728*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<bool,T>::type isinf(T arg) { return functions::isinf(arg); }
isinf(half arg)2729*89c4ff92SAndroid Build Coastguard Worker 		inline bool isinf(half arg) { return functions::isinf(arg); }
isinf(expr arg)2730*89c4ff92SAndroid Build Coastguard Worker 		inline bool isinf(expr arg) { return functions::isinf(arg); }
2731*89c4ff92SAndroid Build Coastguard Worker 
2732*89c4ff92SAndroid Build Coastguard Worker 		/// Check for NaN.
2733*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to check
2734*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true for NaNs
2735*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2736*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<bool,T>::type isnan(T arg) { return functions::isnan(arg); }
isnan(half arg)2737*89c4ff92SAndroid Build Coastguard Worker 		inline bool isnan(half arg) { return functions::isnan(arg); }
isnan(expr arg)2738*89c4ff92SAndroid Build Coastguard Worker 		inline bool isnan(expr arg) { return functions::isnan(arg); }
2739*89c4ff92SAndroid Build Coastguard Worker 
2740*89c4ff92SAndroid Build Coastguard Worker 		/// Check if normal number.
2741*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to check
2742*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if normal number
2743*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false if either subnormal, zero, infinity or NaN
2744*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<bool,T>::type isnormal(T arg) { return functions::isnormal(arg); }
isnormal(half arg)2745*89c4ff92SAndroid Build Coastguard Worker 		inline bool isnormal(half arg) { return functions::isnormal(arg); }
isnormal(expr arg)2746*89c4ff92SAndroid Build Coastguard Worker 		inline bool isnormal(expr arg) { return functions::isnormal(arg); }
2747*89c4ff92SAndroid Build Coastguard Worker 
2748*89c4ff92SAndroid Build Coastguard Worker 		/// Check sign.
2749*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg number to check
2750*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true for negative number
2751*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false for positive number
2752*89c4ff92SAndroid Build Coastguard Worker //		template<typename T> typename enable<bool,T>::type signbit(T arg) { return functions::signbit(arg); }
signbit(half arg)2753*89c4ff92SAndroid Build Coastguard Worker 		inline bool signbit(half arg) { return functions::signbit(arg); }
signbit(expr arg)2754*89c4ff92SAndroid Build Coastguard Worker 		inline bool signbit(expr arg) { return functions::signbit(arg); }
2755*89c4ff92SAndroid Build Coastguard Worker 
2756*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2757*89c4ff92SAndroid Build Coastguard Worker 		/// \name Comparison
2758*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2759*89c4ff92SAndroid Build Coastguard Worker 
2760*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for greater than.
2761*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2762*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2763*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x greater than \a y
2764*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2765*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type isgreater(T x, U y) { return functions::isgreater(x, y); }
isgreater(half x,half y)2766*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreater(half x, half y) { return functions::isgreater(x, y); }
isgreater(half x,expr y)2767*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreater(half x, expr y) { return functions::isgreater(x, y); }
isgreater(expr x,half y)2768*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreater(expr x, half y) { return functions::isgreater(x, y); }
isgreater(expr x,expr y)2769*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreater(expr x, expr y) { return functions::isgreater(x, y); }
2770*89c4ff92SAndroid Build Coastguard Worker 
2771*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for greater equal.
2772*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2773*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2774*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x greater equal \a y
2775*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2776*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type isgreaterequal(T x, U y) { return functions::isgreaterequal(x, y); }
isgreaterequal(half x,half y)2777*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreaterequal(half x, half y) { return functions::isgreaterequal(x, y); }
isgreaterequal(half x,expr y)2778*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreaterequal(half x, expr y) { return functions::isgreaterequal(x, y); }
isgreaterequal(expr x,half y)2779*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreaterequal(expr x, half y) { return functions::isgreaterequal(x, y); }
isgreaterequal(expr x,expr y)2780*89c4ff92SAndroid Build Coastguard Worker 		inline bool isgreaterequal(expr x, expr y) { return functions::isgreaterequal(x, y); }
2781*89c4ff92SAndroid Build Coastguard Worker 
2782*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for less than.
2783*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2784*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2785*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x less than \a y
2786*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2787*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type isless(T x, U y) { return functions::isless(x, y); }
isless(half x,half y)2788*89c4ff92SAndroid Build Coastguard Worker 		inline bool isless(half x, half y) { return functions::isless(x, y); }
isless(half x,expr y)2789*89c4ff92SAndroid Build Coastguard Worker 		inline bool isless(half x, expr y) { return functions::isless(x, y); }
isless(expr x,half y)2790*89c4ff92SAndroid Build Coastguard Worker 		inline bool isless(expr x, half y) { return functions::isless(x, y); }
isless(expr x,expr y)2791*89c4ff92SAndroid Build Coastguard Worker 		inline bool isless(expr x, expr y) { return functions::isless(x, y); }
2792*89c4ff92SAndroid Build Coastguard Worker 
2793*89c4ff92SAndroid Build Coastguard Worker 		/// Comparison for less equal.
2794*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2795*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2796*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if \a x less equal \a y
2797*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2798*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type islessequal(T x, U y) { return functions::islessequal(x, y); }
islessequal(half x,half y)2799*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessequal(half x, half y) { return functions::islessequal(x, y); }
islessequal(half x,expr y)2800*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessequal(half x, expr y) { return functions::islessequal(x, y); }
islessequal(expr x,half y)2801*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessequal(expr x, half y) { return functions::islessequal(x, y); }
islessequal(expr x,expr y)2802*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessequal(expr x, expr y) { return functions::islessequal(x, y); }
2803*89c4ff92SAndroid Build Coastguard Worker 
2804*89c4ff92SAndroid Build Coastguard Worker 		/// Comarison for less or greater.
2805*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2806*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2807*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if either less or greater
2808*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2809*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type islessgreater(T x, U y) { return functions::islessgreater(x, y); }
islessgreater(half x,half y)2810*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessgreater(half x, half y) { return functions::islessgreater(x, y); }
islessgreater(half x,expr y)2811*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessgreater(half x, expr y) { return functions::islessgreater(x, y); }
islessgreater(expr x,half y)2812*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessgreater(expr x, half y) { return functions::islessgreater(x, y); }
islessgreater(expr x,expr y)2813*89c4ff92SAndroid Build Coastguard Worker 		inline bool islessgreater(expr x, expr y) { return functions::islessgreater(x, y); }
2814*89c4ff92SAndroid Build Coastguard Worker 
2815*89c4ff92SAndroid Build Coastguard Worker 		/// Check if unordered.
2816*89c4ff92SAndroid Build Coastguard Worker 		/// \param x first operand
2817*89c4ff92SAndroid Build Coastguard Worker 		/// \param y second operand
2818*89c4ff92SAndroid Build Coastguard Worker 		/// \retval true if unordered (one or two NaN operands)
2819*89c4ff92SAndroid Build Coastguard Worker 		/// \retval false else
2820*89c4ff92SAndroid Build Coastguard Worker //		template<typename T,typename U> typename enable<bool,T,U>::type isunordered(T x, U y) { return functions::isunordered(x, y); }
isunordered(half x,half y)2821*89c4ff92SAndroid Build Coastguard Worker 		inline bool isunordered(half x, half y) { return functions::isunordered(x, y); }
isunordered(half x,expr y)2822*89c4ff92SAndroid Build Coastguard Worker 		inline bool isunordered(half x, expr y) { return functions::isunordered(x, y); }
isunordered(expr x,half y)2823*89c4ff92SAndroid Build Coastguard Worker 		inline bool isunordered(expr x, half y) { return functions::isunordered(x, y); }
isunordered(expr x,expr y)2824*89c4ff92SAndroid Build Coastguard Worker 		inline bool isunordered(expr x, expr y) { return functions::isunordered(x, y); }
2825*89c4ff92SAndroid Build Coastguard Worker 
2826*89c4ff92SAndroid Build Coastguard Worker 		/// \name Casting
2827*89c4ff92SAndroid Build Coastguard Worker 		/// \{
2828*89c4ff92SAndroid Build Coastguard Worker 
2829*89c4ff92SAndroid Build Coastguard Worker 		/// Cast to or from half-precision floating point number.
2830*89c4ff92SAndroid Build Coastguard Worker 		/// This casts between [half](\ref half_float::half) and any built-in arithmetic type. The values are converted
2831*89c4ff92SAndroid Build Coastguard Worker 		/// directly using the given rounding mode, without any roundtrip over `float` that a `static_cast` would otherwise do.
2832*89c4ff92SAndroid Build Coastguard Worker 		/// It uses the default rounding mode.
2833*89c4ff92SAndroid Build Coastguard Worker 		///
2834*89c4ff92SAndroid Build Coastguard Worker 		/// Using this cast with neither of the two types being a [half](\ref half_float::half) or with any of the two types
2835*89c4ff92SAndroid Build Coastguard Worker 		/// not being a built-in arithmetic type (apart from [half](\ref half_float::half), of course) results in a compiler
2836*89c4ff92SAndroid Build Coastguard Worker 		/// error and casting between [half](\ref half_float::half)s is just a no-op.
2837*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T destination type (half or built-in arithmetic type)
2838*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam U source type (half or built-in arithmetic type)
2839*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg value to cast
2840*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a arg converted to destination type
half_cast(U arg)2841*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,typename U> T half_cast(U arg) { return half_caster<T,U>::cast(arg); }
2842*89c4ff92SAndroid Build Coastguard Worker 
2843*89c4ff92SAndroid Build Coastguard Worker 		/// Cast to or from half-precision floating point number.
2844*89c4ff92SAndroid Build Coastguard Worker 		/// This casts between [half](\ref half_float::half) and any built-in arithmetic type. The values are converted
2845*89c4ff92SAndroid Build Coastguard Worker 		/// directly using the given rounding mode, without any roundtrip over `float` that a `static_cast` would otherwise do.
2846*89c4ff92SAndroid Build Coastguard Worker 		///
2847*89c4ff92SAndroid Build Coastguard Worker 		/// Using this cast with neither of the two types being a [half](\ref half_float::half) or with any of the two types
2848*89c4ff92SAndroid Build Coastguard Worker 		/// not being a built-in arithmetic type (apart from [half](\ref half_float::half), of course) results in a compiler
2849*89c4ff92SAndroid Build Coastguard Worker 		/// error and casting between [half](\ref half_float::half)s is just a no-op.
2850*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam T destination type (half or built-in arithmetic type)
2851*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam R rounding mode to use.
2852*89c4ff92SAndroid Build Coastguard Worker 		/// \tparam U source type (half or built-in arithmetic type)
2853*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg value to cast
2854*89c4ff92SAndroid Build Coastguard Worker 		/// \return \a arg converted to destination type
half_cast(U arg)2855*89c4ff92SAndroid Build Coastguard Worker 		template<typename T,std::float_round_style R,typename U> T half_cast(U arg) { return half_caster<T,U,R>::cast(arg); }
2856*89c4ff92SAndroid Build Coastguard Worker 		/// \}
2857*89c4ff92SAndroid Build Coastguard Worker 	}
2858*89c4ff92SAndroid Build Coastguard Worker 
2859*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator==;
2860*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator!=;
2861*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator<;
2862*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator>;
2863*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator<=;
2864*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator>=;
2865*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator+;
2866*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator-;
2867*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator*;
2868*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator/;
2869*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator<<;
2870*89c4ff92SAndroid Build Coastguard Worker 	using detail::operator>>;
2871*89c4ff92SAndroid Build Coastguard Worker 
2872*89c4ff92SAndroid Build Coastguard Worker 	using detail::abs;
2873*89c4ff92SAndroid Build Coastguard Worker 	using detail::fabs;
2874*89c4ff92SAndroid Build Coastguard Worker 	using detail::fmod;
2875*89c4ff92SAndroid Build Coastguard Worker 	using detail::remainder;
2876*89c4ff92SAndroid Build Coastguard Worker 	using detail::remquo;
2877*89c4ff92SAndroid Build Coastguard Worker 	using detail::fma;
2878*89c4ff92SAndroid Build Coastguard Worker 	using detail::fmax;
2879*89c4ff92SAndroid Build Coastguard Worker 	using detail::fmin;
2880*89c4ff92SAndroid Build Coastguard Worker 	using detail::fdim;
2881*89c4ff92SAndroid Build Coastguard Worker 	using detail::nanh;
2882*89c4ff92SAndroid Build Coastguard Worker 	using detail::exp;
2883*89c4ff92SAndroid Build Coastguard Worker 	using detail::expm1;
2884*89c4ff92SAndroid Build Coastguard Worker 	using detail::exp2;
2885*89c4ff92SAndroid Build Coastguard Worker 	using detail::log;
2886*89c4ff92SAndroid Build Coastguard Worker 	using detail::log10;
2887*89c4ff92SAndroid Build Coastguard Worker 	using detail::log1p;
2888*89c4ff92SAndroid Build Coastguard Worker 	using detail::log2;
2889*89c4ff92SAndroid Build Coastguard Worker 	using detail::sqrt;
2890*89c4ff92SAndroid Build Coastguard Worker 	using detail::cbrt;
2891*89c4ff92SAndroid Build Coastguard Worker 	using detail::hypot;
2892*89c4ff92SAndroid Build Coastguard Worker 	using detail::pow;
2893*89c4ff92SAndroid Build Coastguard Worker 	using detail::sin;
2894*89c4ff92SAndroid Build Coastguard Worker 	using detail::cos;
2895*89c4ff92SAndroid Build Coastguard Worker 	using detail::tan;
2896*89c4ff92SAndroid Build Coastguard Worker 	using detail::asin;
2897*89c4ff92SAndroid Build Coastguard Worker 	using detail::acos;
2898*89c4ff92SAndroid Build Coastguard Worker 	using detail::atan;
2899*89c4ff92SAndroid Build Coastguard Worker 	using detail::atan2;
2900*89c4ff92SAndroid Build Coastguard Worker 	using detail::sinh;
2901*89c4ff92SAndroid Build Coastguard Worker 	using detail::cosh;
2902*89c4ff92SAndroid Build Coastguard Worker 	using detail::tanh;
2903*89c4ff92SAndroid Build Coastguard Worker 	using detail::asinh;
2904*89c4ff92SAndroid Build Coastguard Worker 	using detail::acosh;
2905*89c4ff92SAndroid Build Coastguard Worker 	using detail::atanh;
2906*89c4ff92SAndroid Build Coastguard Worker 	using detail::erf;
2907*89c4ff92SAndroid Build Coastguard Worker 	using detail::erfc;
2908*89c4ff92SAndroid Build Coastguard Worker 	using detail::lgamma;
2909*89c4ff92SAndroid Build Coastguard Worker 	using detail::tgamma;
2910*89c4ff92SAndroid Build Coastguard Worker 	using detail::ceil;
2911*89c4ff92SAndroid Build Coastguard Worker 	using detail::floor;
2912*89c4ff92SAndroid Build Coastguard Worker 	using detail::trunc;
2913*89c4ff92SAndroid Build Coastguard Worker 	using detail::round;
2914*89c4ff92SAndroid Build Coastguard Worker 	using detail::lround;
2915*89c4ff92SAndroid Build Coastguard Worker 	using detail::nearbyint;
2916*89c4ff92SAndroid Build Coastguard Worker 	using detail::rint;
2917*89c4ff92SAndroid Build Coastguard Worker 	using detail::lrint;
2918*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_LONG_LONG
2919*89c4ff92SAndroid Build Coastguard Worker 	using detail::llround;
2920*89c4ff92SAndroid Build Coastguard Worker 	using detail::llrint;
2921*89c4ff92SAndroid Build Coastguard Worker #endif
2922*89c4ff92SAndroid Build Coastguard Worker 	using detail::frexp;
2923*89c4ff92SAndroid Build Coastguard Worker 	using detail::ldexp;
2924*89c4ff92SAndroid Build Coastguard Worker 	using detail::modf;
2925*89c4ff92SAndroid Build Coastguard Worker 	using detail::scalbn;
2926*89c4ff92SAndroid Build Coastguard Worker 	using detail::scalbln;
2927*89c4ff92SAndroid Build Coastguard Worker 	using detail::ilogb;
2928*89c4ff92SAndroid Build Coastguard Worker 	using detail::logb;
2929*89c4ff92SAndroid Build Coastguard Worker 	using detail::nextafter;
2930*89c4ff92SAndroid Build Coastguard Worker 	using detail::nexttoward;
2931*89c4ff92SAndroid Build Coastguard Worker 	using detail::copysign;
2932*89c4ff92SAndroid Build Coastguard Worker 	using detail::fpclassify;
2933*89c4ff92SAndroid Build Coastguard Worker 	using detail::isfinite;
2934*89c4ff92SAndroid Build Coastguard Worker 	using detail::isinf;
2935*89c4ff92SAndroid Build Coastguard Worker 	using detail::isnan;
2936*89c4ff92SAndroid Build Coastguard Worker 	using detail::isnormal;
2937*89c4ff92SAndroid Build Coastguard Worker 	using detail::signbit;
2938*89c4ff92SAndroid Build Coastguard Worker 	using detail::isgreater;
2939*89c4ff92SAndroid Build Coastguard Worker 	using detail::isgreaterequal;
2940*89c4ff92SAndroid Build Coastguard Worker 	using detail::isless;
2941*89c4ff92SAndroid Build Coastguard Worker 	using detail::islessequal;
2942*89c4ff92SAndroid Build Coastguard Worker 	using detail::islessgreater;
2943*89c4ff92SAndroid Build Coastguard Worker 	using detail::isunordered;
2944*89c4ff92SAndroid Build Coastguard Worker 
2945*89c4ff92SAndroid Build Coastguard Worker 	using detail::half_cast;
2946*89c4ff92SAndroid Build Coastguard Worker }
2947*89c4ff92SAndroid Build Coastguard Worker 
2948*89c4ff92SAndroid Build Coastguard Worker 
2949*89c4ff92SAndroid Build Coastguard Worker /// Extensions to the C++ standard library.
2950*89c4ff92SAndroid Build Coastguard Worker namespace std
2951*89c4ff92SAndroid Build Coastguard Worker {
2952*89c4ff92SAndroid Build Coastguard Worker 	/// Numeric limits for half-precision floats.
2953*89c4ff92SAndroid Build Coastguard Worker 	/// Because of the underlying single-precision implementation of many operations, it inherits some properties from
2954*89c4ff92SAndroid Build Coastguard Worker 	/// `std::numeric_limits<float>`.
2955*89c4ff92SAndroid Build Coastguard Worker 	template<> class numeric_limits<half_float::half> : public numeric_limits<float>
2956*89c4ff92SAndroid Build Coastguard Worker 	{
2957*89c4ff92SAndroid Build Coastguard Worker 	public:
2958*89c4ff92SAndroid Build Coastguard Worker 		/// Supports signed values.
2959*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool is_signed = true;
2960*89c4ff92SAndroid Build Coastguard Worker 
2961*89c4ff92SAndroid Build Coastguard Worker 		/// Is not exact.
2962*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool is_exact = false;
2963*89c4ff92SAndroid Build Coastguard Worker 
2964*89c4ff92SAndroid Build Coastguard Worker 		/// Doesn't provide modulo arithmetic.
2965*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool is_modulo = false;
2966*89c4ff92SAndroid Build Coastguard Worker 
2967*89c4ff92SAndroid Build Coastguard Worker 		/// IEEE conformant.
2968*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool is_iec559 = true;
2969*89c4ff92SAndroid Build Coastguard Worker 
2970*89c4ff92SAndroid Build Coastguard Worker 		/// Supports infinity.
2971*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool has_infinity = true;
2972*89c4ff92SAndroid Build Coastguard Worker 
2973*89c4ff92SAndroid Build Coastguard Worker 		/// Supports quiet NaNs.
2974*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST bool has_quiet_NaN = true;
2975*89c4ff92SAndroid Build Coastguard Worker 
2976*89c4ff92SAndroid Build Coastguard Worker 		/// Supports subnormal values.
2977*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST float_denorm_style has_denorm = denorm_present;
2978*89c4ff92SAndroid Build Coastguard Worker 
2979*89c4ff92SAndroid Build Coastguard Worker 		/// Rounding mode.
2980*89c4ff92SAndroid Build Coastguard Worker 		/// Due to the mix of internal single-precision computations (using the rounding mode of the underlying
2981*89c4ff92SAndroid Build Coastguard Worker 		/// single-precision implementation) with the rounding mode of the single-to-half conversions, the actual rounding
2982*89c4ff92SAndroid Build Coastguard Worker 		/// mode might be `std::round_indeterminate` if the default half-precision rounding mode doesn't match the
2983*89c4ff92SAndroid Build Coastguard Worker 		/// single-precision rounding mode.
2984*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST float_round_style round_style = (std::numeric_limits<float>::round_style==
2985*89c4ff92SAndroid Build Coastguard Worker 			half_float::half::round_style) ? half_float::half::round_style : round_indeterminate;
2986*89c4ff92SAndroid Build Coastguard Worker 
2987*89c4ff92SAndroid Build Coastguard Worker 		/// Significant digits.
2988*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int digits = 11;
2989*89c4ff92SAndroid Build Coastguard Worker 
2990*89c4ff92SAndroid Build Coastguard Worker 		/// Significant decimal digits.
2991*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int digits10 = 3;
2992*89c4ff92SAndroid Build Coastguard Worker 
2993*89c4ff92SAndroid Build Coastguard Worker 		/// Required decimal digits to represent all possible values.
2994*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int max_digits10 = 5;
2995*89c4ff92SAndroid Build Coastguard Worker 
2996*89c4ff92SAndroid Build Coastguard Worker 		/// Number base.
2997*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int radix = 2;
2998*89c4ff92SAndroid Build Coastguard Worker 
2999*89c4ff92SAndroid Build Coastguard Worker 		/// One more than smallest exponent.
3000*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int min_exponent = -13;
3001*89c4ff92SAndroid Build Coastguard Worker 
3002*89c4ff92SAndroid Build Coastguard Worker 		/// Smallest normalized representable power of 10.
3003*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int min_exponent10 = -4;
3004*89c4ff92SAndroid Build Coastguard Worker 
3005*89c4ff92SAndroid Build Coastguard Worker 		/// One more than largest exponent
3006*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int max_exponent = 16;
3007*89c4ff92SAndroid Build Coastguard Worker 
3008*89c4ff92SAndroid Build Coastguard Worker 		/// Largest finitely representable power of 10.
3009*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR_CONST int max_exponent10 = 4;
3010*89c4ff92SAndroid Build Coastguard Worker 
3011*89c4ff92SAndroid Build Coastguard Worker 		/// Smallest positive normal value.
min()3012*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0400); }
3013*89c4ff92SAndroid Build Coastguard Worker 
3014*89c4ff92SAndroid Build Coastguard Worker 		/// Smallest finite value.
lowest()3015*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half lowest() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0xFBFF); }
3016*89c4ff92SAndroid Build Coastguard Worker 
3017*89c4ff92SAndroid Build Coastguard Worker 		/// Largest finite value.
max()3018*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half max() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7BFF); }
3019*89c4ff92SAndroid Build Coastguard Worker 
3020*89c4ff92SAndroid Build Coastguard Worker 		/// Difference between one and next representable value.
epsilon()3021*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half epsilon() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x1400); }
3022*89c4ff92SAndroid Build Coastguard Worker 
3023*89c4ff92SAndroid Build Coastguard Worker 		/// Maximum rounding error.
round_error()3024*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half round_error() HALF_NOTHROW
3025*89c4ff92SAndroid Build Coastguard Worker 			{ return half_float::half(half_float::detail::binary, (round_style==std::round_to_nearest) ? 0x3800 : 0x3C00); }
3026*89c4ff92SAndroid Build Coastguard Worker 
3027*89c4ff92SAndroid Build Coastguard Worker 		/// Positive infinity.
infinity()3028*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half infinity() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7C00); }
3029*89c4ff92SAndroid Build Coastguard Worker 
3030*89c4ff92SAndroid Build Coastguard Worker 		/// Quiet NaN.
quiet_NaN()3031*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half quiet_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7FFF); }
3032*89c4ff92SAndroid Build Coastguard Worker 
3033*89c4ff92SAndroid Build Coastguard Worker 		/// Signalling NaN.
signaling_NaN()3034*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half signaling_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7DFF); }
3035*89c4ff92SAndroid Build Coastguard Worker 
3036*89c4ff92SAndroid Build Coastguard Worker 		/// Smallest positive subnormal value.
denorm_min()3037*89c4ff92SAndroid Build Coastguard Worker 		static HALF_CONSTEXPR half_float::half denorm_min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0001); }
3038*89c4ff92SAndroid Build Coastguard Worker 	};
3039*89c4ff92SAndroid Build Coastguard Worker 
3040*89c4ff92SAndroid Build Coastguard Worker #if HALF_ENABLE_CPP11_HASH
3041*89c4ff92SAndroid Build Coastguard Worker 	/// Hash function for half-precision floats.
3042*89c4ff92SAndroid Build Coastguard Worker 	/// This is only defined if C++11 `std::hash` is supported and enabled.
3043*89c4ff92SAndroid Build Coastguard Worker 	template<> struct hash<half_float::half> //: unary_function<half_float::half,size_t>
3044*89c4ff92SAndroid Build Coastguard Worker 	{
3045*89c4ff92SAndroid Build Coastguard Worker 		/// Type of function argument.
3046*89c4ff92SAndroid Build Coastguard Worker 		typedef half_float::half argument_type;
3047*89c4ff92SAndroid Build Coastguard Worker 
3048*89c4ff92SAndroid Build Coastguard Worker 		/// Function return type.
3049*89c4ff92SAndroid Build Coastguard Worker 		typedef size_t result_type;
3050*89c4ff92SAndroid Build Coastguard Worker 
3051*89c4ff92SAndroid Build Coastguard Worker 		/// Compute hash function.
3052*89c4ff92SAndroid Build Coastguard Worker 		/// \param arg half to hash
3053*89c4ff92SAndroid Build Coastguard Worker 		/// \return hash value
operator ()std::hash3054*89c4ff92SAndroid Build Coastguard Worker 		result_type operator()(argument_type arg) const
3055*89c4ff92SAndroid Build Coastguard Worker 			{ return hash<half_float::detail::uint16>()(static_cast<unsigned>(arg.data_)&-(arg.data_!=0x8000)); }
3056*89c4ff92SAndroid Build Coastguard Worker 	};
3057*89c4ff92SAndroid Build Coastguard Worker #endif
3058*89c4ff92SAndroid Build Coastguard Worker }
3059*89c4ff92SAndroid Build Coastguard Worker 
3060*89c4ff92SAndroid Build Coastguard Worker 
3061*89c4ff92SAndroid Build Coastguard Worker #undef HALF_CONSTEXPR
3062*89c4ff92SAndroid Build Coastguard Worker #undef HALF_CONSTEXPR_CONST
3063*89c4ff92SAndroid Build Coastguard Worker #undef HALF_NOEXCEPT
3064*89c4ff92SAndroid Build Coastguard Worker #undef HALF_NOTHROW
3065*89c4ff92SAndroid Build Coastguard Worker #ifdef HALF_POP_WARNINGS
3066*89c4ff92SAndroid Build Coastguard Worker 	#pragma warning(pop)
3067*89c4ff92SAndroid Build Coastguard Worker 	#undef HALF_POP_WARNINGS
3068*89c4ff92SAndroid Build Coastguard Worker #endif
3069*89c4ff92SAndroid Build Coastguard Worker 
3070*89c4ff92SAndroid Build Coastguard Worker #endif
3071