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 */