vSMC
vSMC: Scalable Monte Carlo
compiler.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/internal/compiler.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_INTERNAL_COMPILER_HPP
33 #define VSMC_INTERNAL_COMPILER_HPP
34 
35 // Compiler feature check macros
36 
37 #ifndef __has_attribute
38 #define __has_attribute(x) 0
39 #endif
40 
41 #ifndef __has_builtin
42 #define __has_builtin(x) 0
43 #endif
44 
45 #ifndef __has_cpp_attribute
46 #define __has_cpp_attribute(x) 0
47 #endif
48 
49 #ifndef __has_extension
50 #define __has_extension(x) 0
51 #endif
52 
53 #ifndef __has_feature
54 #define __has_feature(x) 0
55 #endif
56 
57 #include <cstddef>
58 
59 #if defined(__APPLE__) || defined(__MACOSX)
60 #define VSMC_MACOSX
61 #include <Availability.h>
62 #define VSMC_MAC_10_0 __MAC_10_0
63 #define VSMC_MAC_10_1 __MAC_10_1
64 #define VSMC_MAC_10_2 __MAC_10_2
65 #define VSMC_MAC_10_3 __MAC_10_3
66 #define VSMC_MAC_10_4 __MAC_10_4
67 #define VSMC_MAC_10_5 __MAC_10_5
68 #define VSMC_MAC_10_6 __MAC_10_6
69 #define VSMC_MAC_10_7 __MAC_10_7
70 #define VSMC_MAC_10_8 __MAC_10_8
71 #define VSMC_MAC_10_9 __MAC_10_9
72 #define VSMC_MAC_10_10 __MAC_10_10
73 #define VSMC_MAC_VERSION __MAC_OS_X_VERSION_MIN_REQUIRED
74 #define VSMC_MAC_VERSION_MIN_REQUIRED(ver) VSMC_MAC_VERSION >= ver
75 #else
76 #define VSMC_MAC_VERSION_MIN_REQUIRED(ver) 0
77 #endif
78 
79 #ifdef VSMC_MACOSX
80 #if VSMC_MAC_VERSION_MIN_REQUIRED(VSMC_MAC_10_5)
81 #ifndef VSMC_HAS_POSIX
82 #define VSMC_HAS_POSIX 1
83 #endif
84 #endif
85 #else // VSMC_MACOSX
86 #include <stdlib.h>
87 #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L
88 #ifndef VSMC_HAS_POSIX
89 #define VSMC_HAS_POSIX 1
90 #endif
91 #endif // _POSIX_C_SOURCE >= 200112L
92 #if defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600
93 #ifndef VSMC_HAS_POSIX
94 #define VSMC_HAS_POSIX 1
95 #endif
96 #endif // _XOPEN_SOURCE >= 600
97 #endif // VSMC_MACOSX
98 
99 #ifndef VSMC_HAS_POSIX
100 #define VSMC_HAS_POSIX 0
101 #endif
102 
103 #if defined(__INTEL_COMPILER)
104 #define VSMC_INTEL
106 #elif defined(__clang__)
107 #define VSMC_CLANG
109 #elif defined(__GNUC__)
110 #define VSMC_GCC
112 #elif defined(_MSC_VER)
113 #define VSMC_MSVC
115 #endif
116 
117 // C++11 language features
118 
119 #ifndef VSMC_HAS_CXX11_LONG_LONG
120 #define VSMC_HAS_CXX11_LONG_LONG 0
121 #endif
122 
123 #ifndef VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE
124 #define VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE 0
125 #endif
126 
127 #ifndef VSMC_HAS_CXX11_ALIAS_TEMPLATES
128 #define VSMC_HAS_CXX11_ALIAS_TEMPLATES 0
129 #endif
130 
131 #ifndef VSMC_HAS_CXX11_ALIGNAS
132 #define VSMC_HAS_CXX11_ALIGNAS 0
133 #endif
134 
135 #ifndef VSMC_HAS_CXX11_ATTRIBUTES
136 #define VSMC_HAS_CXX11_ATTRIBUTES 0
137 #endif
138 
139 #ifndef VSMC_HAS_CXX11_AUTO_TYPE
140 #define VSMC_HAS_CXX11_AUTO_TYPE 0
141 #endif
142 
143 #ifndef VSMC_HAS_CXX11_CONSTEXPR
144 #define VSMC_HAS_CXX11_CONSTEXPR 0
145 #endif
146 
147 #ifndef VSMC_HAS_CXX11_DECLTYPE
148 #define VSMC_HAS_CXX11_DECLTYPE 0
149 #endif
150 
151 #ifndef VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
152 #define VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS 0
153 #endif
154 
155 #ifndef VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS
156 #define VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS 0
157 #endif
158 
159 #ifndef VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS
160 #define VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS 0
161 #endif
162 
163 #ifndef VSMC_HAS_CXX11_DELETED_FUNCTIONS
164 #define VSMC_HAS_CXX11_DELETED_FUNCTIONS 0
165 #endif
166 
167 #ifndef VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS
168 #define VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS 0
169 #endif
170 
171 #ifndef VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS
172 #define VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS 0
173 #endif
174 
175 #ifndef VSMC_HAS_CXX11_IMPLICIT_MOVES
176 #define VSMC_HAS_CXX11_IMPLICIT_MOVES 0
177 #endif
178 
179 #ifndef VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS
180 #define VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS 0
181 #endif
182 
183 #ifndef VSMC_HAS_CXX11_INLINE_NAMESPACES
184 #define VSMC_HAS_CXX11_INLINE_NAMESPACES 0
185 #endif
186 
187 #ifndef VSMC_HAS_CXX11_LAMBDAS
188 #define VSMC_HAS_CXX11_LAMBDAS 0
189 #endif
190 
191 #ifndef VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
192 #define VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS 0
193 #endif
194 
195 #ifndef VSMC_HAS_CXX11_NOEXCEPT
196 #define VSMC_HAS_CXX11_NOEXCEPT 0
197 #endif
198 
199 #ifndef VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT
200 #define VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT 0
201 #endif
202 
203 #ifndef VSMC_HAS_CXX11_NULLPTR
204 #define VSMC_HAS_CXX11_NULLPTR 0
205 #endif
206 
207 #ifndef VSMC_HAS_CXX11_OVERRIDE_CONTROL
208 #define VSMC_HAS_CXX11_OVERRIDE_CONTROL 0
209 #endif
210 
211 #ifndef VSMC_HAS_CXX11_RANGE_FOR
212 #define VSMC_HAS_CXX11_RANGE_FOR 0
213 #endif
214 
215 #ifndef VSMC_HAS_CXX11_RAW_STRING_LITERALS
216 #define VSMC_HAS_CXX11_RAW_STRING_LITERALS 0
217 #endif
218 
219 #ifndef VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
220 #define VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS 0
221 #endif
222 
223 #ifndef VSMC_HAS_CXX11_RVALUE_REFERENCES
224 #define VSMC_HAS_CXX11_RVALUE_REFERENCES 0
225 #endif
226 
227 #ifndef VSMC_HAS_CXX11_STATIC_ASSERT
228 #define VSMC_HAS_CXX11_STATIC_ASSERT 0
229 #endif
230 
231 #ifndef VSMC_HAS_CXX11_STRONG_ENUMS
232 #define VSMC_HAS_CXX11_STRONG_ENUMS 0
233 #endif
234 
235 #ifndef VSMC_HAS_CXX11_THREAD_LOCAL
236 #define VSMC_HAS_CXX11_THREAD_LOCAL 0
237 #endif
238 
239 #ifndef VSMC_HAS_CXX11_TRAILING_RETURN
240 #define VSMC_HAS_CXX11_TRAILING_RETURN 0
241 #endif
242 
243 #ifndef VSMC_HAS_CXX11_UNICODE_LITERALS
244 #define VSMC_HAS_CXX11_UNICODE_LITERALS 0
245 #endif
246 
247 #ifndef VSMC_HAS_CXX11_UNRESTRICTED_UNIONS
248 #define VSMC_HAS_CXX11_UNRESTRICTED_UNIONS 0
249 #endif
250 
251 #ifndef VSMC_HAS_CXX11_USER_LITERALS
252 #define VSMC_HAS_CXX11_USER_LITERALS 0
253 #endif
254 
255 #ifndef VSMC_HAS_CXX11_VARIADIC_TEMPLATES
256 #define VSMC_HAS_CXX11_VARIADIC_TEMPLATES 0
257 #endif
258 
259 // C++11 library features
260 
261 #ifndef VSMC_HAS_CXX11LIB_ALGORITHM
262 #define VSMC_HAS_CXX11LIB_ALGORITHM 0
263 #endif
264 
265 #ifndef VSMC_HAS_CXX11LIB_CHRONO
266 #define VSMC_HAS_CXX11LIB_CHRONO 0
267 #endif
268 
269 #ifndef VSMC_HAS_CXX11LIB_CMATH
270 #define VSMC_HAS_CXX11LIB_CMATH 0
271 #endif
272 
273 #ifndef VSMC_HAS_CXX11LIB_FUNCTIONAL
274 #define VSMC_HAS_CXX11LIB_FUNCTIONAL 0
275 #endif
276 
277 #ifndef VSMC_HAS_CXX11LIB_FUTURE
278 #define VSMC_HAS_CXX11LIB_FUTURE 0
279 #endif
280 
281 #ifndef VSMC_HAS_CXX11LIB_INITIALIZER_LIST
282 #define VSMC_HAS_CXX11LIB_INITIALIZER_LIST 0
283 #endif
284 
285 #ifndef VSMC_HAS_CXX11LIB_MUTEX
286 #define VSMC_HAS_CXX11LIB_MUTEX 0
287 #endif
288 
289 #ifndef VSMC_HAS_CXX11LIB_RANDOM
290 #define VSMC_HAS_CXX11LIB_RANDOM 0
291 #endif
292 
293 #ifndef VSMC_HAS_CXX11LIB_THREAD
294 #define VSMC_HAS_CXX11LIB_THREAD 0
295 #endif
296 
297 #ifndef VSMC_HAS_CXX11LIB_TUPLE
298 #define VSMC_HAS_CXX11LIB_TUPLE 0
299 #endif
300 
301 // C++14 language features
302 
303 #ifndef VSMC_HAS_CXX14_AGGREGATE_NSDMI
304 #define VSMC_HAS_CXX14_AGGREGATE_NSDMI 0
305 #endif
306 
307 #ifndef VSMC_HAS_CXX14_BINARY_LITERALS
308 #define VSMC_HAS_CXX14_BINARY_LITERALS 0
309 #endif
310 
311 #ifndef VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS
312 #define VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS 0
313 #endif
314 
315 #ifndef VSMC_HAS_CXX14_DECLTYPE_AUTO
316 #define VSMC_HAS_CXX14_DECLTYPE_AUTO 0
317 #endif
318 
319 #ifndef VSMC_HAS_CXX14_DIGIT_SEPERATORS
320 #define VSMC_HAS_CXX14_DIGIT_SEPERATORS 0
321 #endif
322 
323 #ifndef VSMC_HAS_CXX14_GENERIC_LAMBDAS
324 #define VSMC_HAS_CXX14_GENERIC_LAMBDAS 0
325 #endif
326 
327 #ifndef VSMC_HAS_CXX14_INIT_CAPTURES
328 #define VSMC_HAS_CXX14_INIT_CAPTURES 0
329 #endif
330 
331 #ifndef VSMC_HAS_CXX14_RELAXED_CONSTEXPR
332 #define VSMC_HAS_CXX14_RELAXED_CONSTEXPR 0
333 #endif
334 
335 #ifndef VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION
336 #define VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION 0
337 #endif
338 
339 #ifndef VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS
340 #define VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS 0
341 #endif
342 
343 #ifndef VSMC_HAS_CXX14_VARIABLE_TEMPLATES
344 #define VSMC_HAS_CXX14_VARIABLE_TEMPLATES 0
345 #endif
346 
347 // C99 library features
348 
349 #ifndef VSMC_HAS_C99LIB_MATH
350 #define VSMC_HAS_C99LIB_MATH 0
351 #endif
352 
353 // Compiler features
354 
355 #ifndef VSMC_INT64
356 #define VSMC_INT64 long long
357 #endif
358 
359 #ifndef VSMC_HAS_INT128
360 #define VSMC_HAS_INT128 0
361 #endif
362 
363 #ifndef VSMC_HAS_WARNING
364 #define VSMC_HAS_WARNING 0
365 #endif
366 
367 #ifndef VSMC_STRONG_INLINE
368 #define VSMC_STRONG_INLINE inline
369 #endif
370 
371 // Target features
372 
373 #ifndef VSMC_HAS_AES_NI
374 #define VSMC_HAS_AES_NI 0
375 #endif
376 
377 #ifndef VSMC_HAS_RDRAND
378 #define VSMC_HAS_RDRAND 0
379 #endif
380 
381 #ifndef VSMC_HAS_AVX2
382 #ifdef __AVX2__
383 #define VSMC_HAS_AVX2 1
384 #else
385 #define VSMC_HAS_AVX2 0
386 #endif
387 #endif
388 
389 #ifndef VSMC_HAS_AVX
390 #ifdef __AVX__
391 #define VSMC_HAS_AVX 1
392 #else
393 #define VSMC_HAS_AVX VSMC_HAS_AVX2
394 #endif
395 #endif
396 
397 #ifndef VSMC_HAS_SSE4_2
398 #ifdef __SSE4_2__
399 #define VSMC_HAS_SSE4_2 1
400 #else
401 #define VSMC_HAS_SSE4_2 VSMC_HAS_AVX
402 #endif
403 #endif
404 
405 #ifndef VSMC_HAS_SSE4_1
406 #ifdef __SSE4_1__
407 #define VSMC_HAS_SSE4_1 1
408 #else
409 #define VSMC_HAS_SSE4_1 AVX_HAS_SSE4_2
410 #endif
411 #endif
412 
413 #ifndef VSMC_HAS_SSSE3
414 #ifdef __SSSE3__
415 #define VSMC_HAS_SSSE3 1
416 #else
417 #define VSMC_HAS_SSSE3 VSMC_HAS_SSE4_1
418 #endif
419 #endif
420 
421 #ifndef VSMC_HAS_SSE3
422 #ifdef __SSE3__
423 #define VSMC_HAS_SSE3 1
424 #else
425 #define VSMC_HAS_SSE3 VSMC_HAS_SSSE3
426 #endif
427 #endif
428 
429 #ifndef VSMC_HAS_SSE2
430 #ifdef __SSE2__
431 #define VSMC_HAS_SSE2 1
432 #else
433 #define VSMC_HAS_SSE2 VSMC_HAS_SSE3
434 #endif
435 #endif
436 
437 #ifndef VSMC_HAS_X86
438 #if defined(__x86__) || (__x86_64__)
439 #define VSMC_HAS_X86 1
440 #else
441 #define VSMC_HAS_X86 VSMC_HAS_SSE2
442 #endif
443 #endif
444 
445 // OS features
446 
447 #if VSMC_MAC_VERSION_MIN_REQUIRED(VSMC_MAC_10_7)
448 #ifndef VSMC_HAS_GCD_LION
449 #define VSMC_HAS_GCD_LION 1
450 #endif
451 #endif
452 
453 #endif // VSMC_INTERNAL_COMPILER_HPP