summaryrefslogtreecommitdiff
path: root/thirdparty/embree-aarch64/common/math/constants.h
blob: e80abec80f536ddf652ebce36152d543fb782ab4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
// Copyright 2009-2020 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "../sys/platform.h"

#include <limits>

#define _USE_MATH_DEFINES
#include <math.h> // using cmath causes issues under Windows
#include <cfloat>
#include <climits>

// Math constants may not be defined in libcxx + mingw + strict C++ standard
#if defined(__MINGW32__)

// TODO(LTE): use constexpr
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#ifndef M_1_PI
#define M_1_PI 0.31830988618379067154
#endif

#endif // __MINGW32__

namespace embree
{
  static MAYBE_UNUSED const float one_over_255 = 1.0f/255.0f;
  static MAYBE_UNUSED const float min_rcp_input = 1E-18f;  // for abs(x) >= min_rcp_input the newton raphson rcp calculation does not fail

  /* we consider floating point numbers in that range as valid input numbers */
  static MAYBE_UNUSED float FLT_LARGE = 1.844E18f;

  struct TrueTy {
    __forceinline operator bool( ) const { return true; }
  };

  extern MAYBE_UNUSED TrueTy True;

  struct FalseTy {
    __forceinline operator bool( ) const { return false; }
  };

  extern MAYBE_UNUSED FalseTy False;
  
  struct ZeroTy
  {
    __forceinline operator          double   ( ) const { return 0; }
    __forceinline operator          float    ( ) const { return 0; }
    __forceinline operator          long long( ) const { return 0; }
    __forceinline operator unsigned long long( ) const { return 0; }
    __forceinline operator          long     ( ) const { return 0; }
    __forceinline operator unsigned long     ( ) const { return 0; }
    __forceinline operator          int      ( ) const { return 0; }
    __forceinline operator unsigned int      ( ) const { return 0; }
    __forceinline operator          short    ( ) const { return 0; }
    __forceinline operator unsigned short    ( ) const { return 0; }
    __forceinline operator          int8_t     ( ) const { return 0; }
    __forceinline operator uint8_t     ( ) const { return 0; }
  }; 

  extern MAYBE_UNUSED ZeroTy zero;

  struct OneTy
  {
    __forceinline operator          double   ( ) const { return 1; }
    __forceinline operator          float    ( ) const { return 1; }
    __forceinline operator          long long( ) const { return 1; }
    __forceinline operator unsigned long long( ) const { return 1; }
    __forceinline operator          long     ( ) const { return 1; }
    __forceinline operator unsigned long     ( ) const { return 1; }
    __forceinline operator          int      ( ) const { return 1; }
    __forceinline operator unsigned int      ( ) const { return 1; }
    __forceinline operator          short    ( ) const { return 1; }
    __forceinline operator unsigned short    ( ) const { return 1; }
    __forceinline operator          int8_t     ( ) const { return 1; }
    __forceinline operator uint8_t     ( ) const { return 1; }
  };

  extern MAYBE_UNUSED OneTy one;

  struct NegInfTy
  {
    __forceinline operator          double   ( ) const { return -std::numeric_limits<double>::infinity(); }
    __forceinline operator          float    ( ) const { return -std::numeric_limits<float>::infinity(); }
    __forceinline operator          long long( ) const { return std::numeric_limits<long long>::min(); }
    __forceinline operator unsigned long long( ) const { return std::numeric_limits<unsigned long long>::min(); }
    __forceinline operator          long     ( ) const { return std::numeric_limits<long>::min(); }
    __forceinline operator unsigned long     ( ) const { return std::numeric_limits<unsigned long>::min(); }
    __forceinline operator          int      ( ) const { return std::numeric_limits<int>::min(); }
    __forceinline operator unsigned int      ( ) const { return std::numeric_limits<unsigned int>::min(); }
    __forceinline operator          short    ( ) const { return std::numeric_limits<short>::min(); }
    __forceinline operator unsigned short    ( ) const { return std::numeric_limits<unsigned short>::min(); }
    __forceinline operator          int8_t     ( ) const { return std::numeric_limits<int8_t>::min(); }
    __forceinline operator uint8_t     ( ) const { return std::numeric_limits<uint8_t>::min(); }

  };

  extern MAYBE_UNUSED NegInfTy neg_inf;

  struct PosInfTy
  {
    __forceinline operator          double   ( ) const { return std::numeric_limits<double>::infinity(); }
    __forceinline operator          float    ( ) const { return std::numeric_limits<float>::infinity(); }
    __forceinline operator          long long( ) const { return std::numeric_limits<long long>::max(); }
    __forceinline operator unsigned long long( ) const { return std::numeric_limits<unsigned long long>::max(); }
    __forceinline operator          long     ( ) const { return std::numeric_limits<long>::max(); }
    __forceinline operator unsigned long     ( ) const { return std::numeric_limits<unsigned long>::max(); }
    __forceinline operator          int      ( ) const { return std::numeric_limits<int>::max(); }
    __forceinline operator unsigned int      ( ) const { return std::numeric_limits<unsigned int>::max(); }
    __forceinline operator          short    ( ) const { return std::numeric_limits<short>::max(); }
    __forceinline operator unsigned short    ( ) const { return std::numeric_limits<unsigned short>::max(); }
    __forceinline operator          int8_t     ( ) const { return std::numeric_limits<int8_t>::max(); }
    __forceinline operator uint8_t     ( ) const { return std::numeric_limits<uint8_t>::max(); }
  };

  extern MAYBE_UNUSED PosInfTy inf;
  extern MAYBE_UNUSED PosInfTy pos_inf;

  struct NaNTy
  {
    __forceinline operator double( ) const { return std::numeric_limits<double>::quiet_NaN(); }
    __forceinline operator float ( ) const { return std::numeric_limits<float>::quiet_NaN(); }
  };

  extern MAYBE_UNUSED NaNTy nan;

  struct UlpTy
  {
    __forceinline operator double( ) const { return std::numeric_limits<double>::epsilon(); }
    __forceinline operator float ( ) const { return std::numeric_limits<float>::epsilon(); }
  };

  extern MAYBE_UNUSED UlpTy ulp;

  struct PiTy
  {
    __forceinline operator double( ) const { return double(M_PI); }
    __forceinline operator float ( ) const { return float(M_PI); }
  };

  extern MAYBE_UNUSED PiTy pi;

  struct OneOverPiTy
  {
    __forceinline operator double( ) const { return double(M_1_PI); }
    __forceinline operator float ( ) const { return float(M_1_PI); }
  };

  extern MAYBE_UNUSED OneOverPiTy one_over_pi;

  struct TwoPiTy
  {
    __forceinline operator double( ) const { return double(2.0*M_PI); }
    __forceinline operator float ( ) const { return float(2.0*M_PI); }
  };

  extern MAYBE_UNUSED TwoPiTy two_pi;

  struct OneOverTwoPiTy
  {
    __forceinline operator double( ) const { return double(0.5*M_1_PI); }
    __forceinline operator float ( ) const { return float(0.5*M_1_PI); }
  };

  extern MAYBE_UNUSED OneOverTwoPiTy one_over_two_pi;

  struct FourPiTy
  {
    __forceinline operator double( ) const { return double(4.0*M_PI); } 
    __forceinline operator float ( ) const { return float(4.0*M_PI); }
  };

  extern MAYBE_UNUSED FourPiTy four_pi;

  struct OneOverFourPiTy
  {
    __forceinline operator double( ) const { return double(0.25*M_1_PI); }
    __forceinline operator float ( ) const { return float(0.25*M_1_PI); }
  };

  extern MAYBE_UNUSED OneOverFourPiTy one_over_four_pi;

  struct StepTy {
  };

  extern MAYBE_UNUSED StepTy step;

  struct ReverseStepTy {
  };

  extern MAYBE_UNUSED ReverseStepTy reverse_step;

  struct EmptyTy {
  };

  extern MAYBE_UNUSED EmptyTy empty;

  struct FullTy {
  };

  extern MAYBE_UNUSED FullTy full;

  struct UndefinedTy {
  };

  extern MAYBE_UNUSED UndefinedTy undefined;
    
#if defined(__aarch64__)
  extern const uint32x4_t movemask_mask;
  extern const uint32x4_t vzero;
  extern const uint32x4_t v0x80000000;
  extern const uint32x4_t v0x7fffffff;
  extern const uint32x4_t v000F;
  extern const uint32x4_t v00F0;
  extern const uint32x4_t v00FF;
  extern const uint32x4_t v0F00;
  extern const uint32x4_t v0F0F;
  extern const uint32x4_t v0FF0;
  extern const uint32x4_t v0FFF;
  extern const uint32x4_t vF000;
  extern const uint32x4_t vF00F;
  extern const uint32x4_t vF0F0;
  extern const uint32x4_t vF0FF;
  extern const uint32x4_t vFF00;
  extern const uint32x4_t vFF0F;
  extern const uint32x4_t vFFF0;
  extern const uint32x4_t vFFFF;
  extern const uint8x16_t v0022;
  extern const uint8x16_t v1133;
  extern const uint8x16_t v0101;
  extern const float32x4_t vOne;
  extern const float32x4_t vmOne;
  extern const float32x4_t vInf;
  extern const float32x4_t vmInf;
#endif
}