master
1/*! @header
2 * This header defines macros used in the implementation of <simd/simd.h>
3 * types and functions. Even though they are exposed in a public header,
4 * the macros defined in this header are implementation details, and you
5 * should not use or rely on them. They may be changed or removed entirely
6 * in a future release.
7 *
8 * @copyright 2016-2017 Apple, Inc. All rights reserved.
9 * @unsorted */
10
11#ifndef SIMD_BASE
12#define SIMD_BASE
13
14/* Define __has_attribute and __has_include if they aren't available */
15# ifndef __has_attribute
16# define __has_attribute(__x) 0
17# endif
18# ifndef __has_include
19# define __has_include(__x) 0
20# endif
21# ifndef __has_feature
22# define __has_feature(__x) 0
23# endif
24
25# if __has_attribute(__ext_vector_type__) && __has_attribute(__overloadable__)
26# define SIMD_COMPILER_HAS_REQUIRED_FEATURES 1
27# else
28/* Your compiler is missing one or more features that are hard requirements
29 * for any <simd/simd.h> support. None of the types or functions defined by
30 * the simd headers will be available. */
31# define SIMD_COMPILER_HAS_REQUIRED_FEATURES 0
32# endif
33
34# if SIMD_COMPILER_HAS_REQUIRED_FEATURES
35# define SIMD_CURRENT_LIBRARY_VERSION 6
36# if __has_include(<TargetConditionals.h>) && __has_include(<Availability.h>)
37# include <TargetConditionals.h>
38# include <Availability.h>
39/* A number of new features are added in newer releases; most of these are
40 * inline in the header, which makes them available even when targeting older
41 * OS versions. Those that make external calls, however, are only available
42 * when targeting the release in which they became available. Because of the
43 * way in which simd functions are overloaded, the usual weak-linking tricks
44 * do not work; these functions are simply unavailable when targeting older
45 * versions of the library. */
46# if TARGET_OS_RTKIT
47# define SIMD_LIBRARY_VERSION SIMD_CURRENT_LIBRARY_VERSION
48# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_15_0 || \
49 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_18_0 || \
50 __WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_11_0 || \
51 __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_18_0 || \
52 __XR_OS_VERSION_MIN_REQUIRED >= __XROS_2_0 || \
53 __BRIDGE_OS_VERSION_MIN_REQUIRED >= __BRIDGEOS_9_0 || \
54 __DRIVERKIT_VERSION_MIN_REQUIRED >= __DRIVERKIT_24_0
55# define SIMD_LIBRARY_VERSION 6
56# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_13_0 || \
57 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_16_0 || \
58 __WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_9_0 || \
59 __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_16_0 || \
60 __BRIDGE_OS_VERSION_MIN_REQUIRED >= __BRIDGEOS_7_0 || \
61 __DRIVERKIT_VERSION_MIN_REQUIRED >= __DRIVERKIT_22_0
62# define SIMD_LIBRARY_VERSION 5
63# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_12_0 || \
64 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_15_0 || \
65 __WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_8_0 || \
66 __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_15_0 || \
67 __BRIDGE_OS_VERSION_MIN_REQUIRED >= __BRIDGEOS_6_0 || \
68 __DRIVERKIT_VERSION_MIN_REQUIRED >= __DRIVERKIT_21_0
69# define SIMD_LIBRARY_VERSION 4
70# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 || \
71 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_11_0 || \
72 __WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_4_0 || \
73 __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_11_0 || \
74 __DRIVERKIT_VERSION_MIN_REQUIRED >= __DRIVERKIT_19_0
75# define SIMD_LIBRARY_VERSION 3
76# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12 || \
77 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0 || \
78 __WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_3_0 || \
79 __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0
80# define SIMD_LIBRARY_VERSION 2
81# elif __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10 || \
82 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
83# define SIMD_LIBRARY_VERSION 1
84# else
85# define SIMD_LIBRARY_VERSION 0
86# endif
87# else /* !__has_include(<TargetContidionals.h>) && __has_include(<Availability.h>) */
88# define SIMD_LIBRARY_VERSION SIMD_CURRENT_LIBRARY_VERSION
89# define __API_AVAILABLE(...) /* Nothing */
90# endif
91
92/* The simd types interoperate with the native simd intrinsic types for each
93 * architecture; the headers that define those types and operations are
94 * automatically included with simd.h */
95# if defined __ARM_NEON
96# include <arm_neon.h>
97# elif defined __i386__ || defined __x86_64__
98# include <immintrin.h>
99# endif
100
101/* Define a number of function attributes used by the simd functions. */
102# if __has_attribute(__always_inline__)
103# define SIMD_INLINE __attribute__((__always_inline__))
104# else
105# define SIMD_INLINE inline
106# endif
107
108# if __has_attribute(__const__)
109# define SIMD_CONST __attribute__((__const__))
110# else
111# define SIMD_CONST /* nothing */
112# endif
113
114# if __has_attribute(__nodebug__)
115# define SIMD_NODEBUG __attribute__((__nodebug__))
116# else
117# define SIMD_NODEBUG /* nothing */
118# endif
119
120# if __has_attribute(__deprecated__)
121# define SIMD_DEPRECATED(message) __attribute__((__deprecated__(message)))
122# else
123# define SIMD_DEPRECATED(message) /* nothing */
124# endif
125
126#define SIMD_OVERLOAD __attribute__((__overloadable__))
127#define SIMD_CPPFUNC SIMD_INLINE SIMD_CONST SIMD_NODEBUG
128#define SIMD_CFUNC SIMD_CPPFUNC SIMD_OVERLOAD
129#define SIMD_NOINLINE SIMD_CONST SIMD_NODEBUG SIMD_OVERLOAD
130#define SIMD_NONCONST SIMD_INLINE SIMD_NODEBUG SIMD_OVERLOAD
131#define __SIMD_INLINE__ SIMD_CPPFUNC
132#define __SIMD_ATTRIBUTES__ SIMD_CFUNC
133#define __SIMD_OVERLOAD__ SIMD_OVERLOAD
134
135# if __has_feature(cxx_constexpr)
136# define SIMD_CONSTEXPR constexpr
137# else
138# define SIMD_CONSTEXPR /* nothing */
139# endif
140
141# if __has_feature(cxx_noexcept)
142# define SIMD_NOEXCEPT noexcept
143# else
144# define SIMD_NOEXCEPT /* nothing */
145# endif
146
147#if defined __cplusplus
148/*! @abstract A boolean scalar. */
149typedef bool simd_bool;
150#else
151/*! @abstract A boolean scalar. */
152typedef _Bool simd_bool;
153#endif
154/*! @abstract A boolean scalar.
155 * @discussion This type is deprecated; In C or Objective-C sources, use
156 * `_Bool` instead. In C++ sources, use `bool`. */
157typedef simd_bool __SIMD_BOOLEAN_TYPE__;
158
159# endif /* SIMD_COMPILER_HAS_REQUIRED_FEATURES */
160#endif /* defined SIMD_BASE */