mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-04-30 11:24:10 -04:00
libobs,cmake: Replace vendored SIMD Everywhere by prefix/system install
SIMD Everywhere finder needs to be installed alongside libobs CMake package since its headers depends on it. C++ cmath header is included on Windows on ARM to ensure that all math functions are correctly defined when included in C++ code. https://github.com/simd-everywhere/simde/issues/1304 macOS intrinsics is included to make sure that no redefinition error happens.
This commit is contained in:
1
.github/scripts/utils.zsh/setup_ubuntu
vendored
1
.github/scripts/utils.zsh/setup_ubuntu
vendored
@@ -75,6 +75,7 @@ sudo apt-get install -y --no-install-recommends \
|
||||
libgl1-mesa-dev \
|
||||
libjansson-dev \
|
||||
uthash-dev \
|
||||
libsimde-dev \
|
||||
libluajit-5.1-dev python3-dev \
|
||||
libx11-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-xinerama0-dev \
|
||||
libxcb-composite0-dev libxinerama-dev libxcb1-dev libx11-xcb-dev libxcb-xfixes0-dev \
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
"modules/50-vpl-gpu-rt.json",
|
||||
"modules/90-asio.json",
|
||||
"modules/90-nlohmann-json.json",
|
||||
"modules/90-simde.json",
|
||||
"modules/90-uthash.json",
|
||||
"modules/90-websocketpp.json",
|
||||
"modules/99-cef.json",
|
||||
|
||||
16
build-aux/modules/90-simde.json
Normal file
16
build-aux/modules/90-simde.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "simde",
|
||||
"buildsystem": "meson",
|
||||
"builddir": true,
|
||||
"config-opts": [
|
||||
"-Dtests=false"
|
||||
],
|
||||
"sources": [
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/simd-everywhere/simde.git",
|
||||
"tag": "v0.8.2",
|
||||
"commit": "71fd833d9666141edcd1d3c109a80e228303d8d7"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -404,6 +404,15 @@ function(target_export target)
|
||||
COMPONENT Development
|
||||
${exclude_variant}
|
||||
)
|
||||
|
||||
if(target STREQUAL libobs)
|
||||
install(
|
||||
FILES "${CMAKE_SOURCE_DIR}/cmake/finders/FindSIMDe.cmake"
|
||||
DESTINATION "${package_destination}/finders"
|
||||
COMPONENT Development
|
||||
${exclude_variant}
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# check_uuid: Helper function to check for valid UUID
|
||||
|
||||
@@ -7,6 +7,7 @@ if(OS_WINDOWS AND NOT OBS_PARENT_ARCHITECTURE STREQUAL CMAKE_VS_PLATFORM_NAME)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_package(SIMDe REQUIRED)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
find_package(FFmpeg 6.1 REQUIRED avformat avutil swscale swresample OPTIONAL_COMPONENTS avcodec)
|
||||
@@ -135,25 +136,6 @@ target_sources(
|
||||
util/util_uint64.h
|
||||
)
|
||||
|
||||
target_sources(
|
||||
libobs
|
||||
PRIVATE
|
||||
util/simde/check.h
|
||||
util/simde/debug-trap.h
|
||||
util/simde/hedley.h
|
||||
util/simde/simde-align.h
|
||||
util/simde/simde-arch.h
|
||||
util/simde/simde-common.h
|
||||
util/simde/simde-constify.h
|
||||
util/simde/simde-detect-clang.h
|
||||
util/simde/simde-diagnostic.h
|
||||
util/simde/simde-features.h
|
||||
util/simde/simde-math.h
|
||||
util/simde/x86/mmx.h
|
||||
util/simde/x86/sse.h
|
||||
util/simde/x86/sse2.h
|
||||
)
|
||||
|
||||
target_sources(
|
||||
libobs
|
||||
PRIVATE
|
||||
@@ -260,7 +242,7 @@ target_link_libraries(
|
||||
jansson::jansson
|
||||
Uthash::Uthash
|
||||
ZLIB::ZLIB
|
||||
PUBLIC Threads::Threads
|
||||
PUBLIC SIMDe::SIMDe Threads::Threads
|
||||
)
|
||||
|
||||
if(OS_WINDOWS)
|
||||
@@ -354,21 +336,6 @@ set(
|
||||
util/profiler.h
|
||||
util/profiler.hpp
|
||||
util/serializer.h
|
||||
util/simde/check.h
|
||||
util/simde/debug-trap.h
|
||||
util/simde/hedley.h
|
||||
util/simde/simde-align.h
|
||||
util/simde/simde-arch.h
|
||||
util/simde/simde-common.h
|
||||
util/simde/simde-constify.h
|
||||
util/simde/simde-detect-clang.h
|
||||
util/simde/simde-diagnostic.h
|
||||
util/simde/simde-features.h
|
||||
util/simde/simde-math.h
|
||||
util/simde/x86/mmx.h
|
||||
util/simde/x86/sse.h
|
||||
util/simde/x86/sse2.h
|
||||
util/source-profiler.h
|
||||
util/sse-intrin.h
|
||||
util/task.h
|
||||
util/text-lookup.h
|
||||
|
||||
@@ -2,9 +2,12 @@
|
||||
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/finders")
|
||||
|
||||
if(MSVC)
|
||||
find_dependency(w32-pthreads REQUIRED)
|
||||
endif()
|
||||
find_dependency(SIMDe REQUIRED)
|
||||
find_dependency(Threads REQUIRED)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
Language: Cpp
|
||||
SortIncludes: false
|
||||
DisableFormat: true
|
||||
@@ -1,40 +0,0 @@
|
||||
simde is licensed as a combination of MIT and CC0 code.
|
||||
|
||||
License notices for both are reproduced below:
|
||||
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2017-2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
/* Portable Snippets - https://gitub.com/nemequ/portable-snippets
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the authors have waived all
|
||||
* copyright and related or neighboring rights to this code. For
|
||||
* details, see the Creative Commons Zero 1.0 Universal license at
|
||||
* https://creativecommons.org/publicdomain/zero/1.0/
|
||||
*
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*/
|
||||
@@ -1,6 +0,0 @@
|
||||
This is a slightly modified version of the simde directory in
|
||||
https://github.com/simd-everywhere/simde/commit/c3d7abfaba6729a8b11d09a314b34a4db628911d
|
||||
|
||||
Modifications:
|
||||
1. Unused files have removed.
|
||||
2. The code was reformatted using the "formatcode.sh" script in the root of this repository.
|
||||
@@ -1,285 +0,0 @@
|
||||
/* Check (assertions)
|
||||
* Portable Snippets - https://gitub.com/nemequ/portable-snippets
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the authors have waived all
|
||||
* copyright and related or neighboring rights to this code. For
|
||||
* details, see the Creative Commons Zero 1.0 Universal license at
|
||||
* https://creativecommons.org/publicdomain/zero/1.0/
|
||||
*
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_CHECK_H)
|
||||
#define SIMDE_CHECK_H
|
||||
|
||||
#if !defined(SIMDE_NDEBUG) && !defined(SIMDE_DEBUG)
|
||||
#define SIMDE_NDEBUG 1
|
||||
#endif
|
||||
|
||||
#include "hedley.h"
|
||||
#include "simde-diagnostic.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#if !defined(_WIN32)
|
||||
#define SIMDE_SIZE_MODIFIER "z"
|
||||
#define SIMDE_CHAR_MODIFIER "hh"
|
||||
#define SIMDE_SHORT_MODIFIER "h"
|
||||
#else
|
||||
#if defined(_M_X64) || defined(__amd64__)
|
||||
#define SIMDE_SIZE_MODIFIER "I64"
|
||||
#else
|
||||
#define SIMDE_SIZE_MODIFIER ""
|
||||
#endif
|
||||
#define SIMDE_CHAR_MODIFIER ""
|
||||
#define SIMDE_SHORT_MODIFIER ""
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
|
||||
#define SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
__pragma(warning(push)) __pragma(warning(disable : 4127))
|
||||
#define SIMDE_POP_DISABLE_MSVC_C4127_ __pragma(warning(pop))
|
||||
#else
|
||||
#define SIMDE_PUSH_DISABLE_MSVC_C4127_
|
||||
#define SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
#endif
|
||||
|
||||
#if !defined(simde_errorf)
|
||||
#if defined(__has_include)
|
||||
#if __has_include(<stdio.h>)
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#elif defined(SIMDE_STDC_HOSTED)
|
||||
#if SIMDE_STDC_HOSTED == 1
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#elif defined(__STDC_HOSTED__)
|
||||
#if __STDC_HOSTETD__ == 1
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "debug-trap.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_
|
||||
#if defined(EOF)
|
||||
#define simde_errorf(format, ...) \
|
||||
(fprintf(stderr, format, __VA_ARGS__), abort())
|
||||
#else
|
||||
#define simde_errorf(format, ...) (simde_trap())
|
||||
#endif
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#endif
|
||||
|
||||
#define simde_error(msg) simde_errorf("%s", msg)
|
||||
|
||||
#if defined(SIMDE_NDEBUG) || \
|
||||
(defined(__cplusplus) && (__cplusplus < 201103L)) || \
|
||||
(defined(__STDC__) && (__STDC__ < 199901L))
|
||||
#if defined(SIMDE_CHECK_FAIL_DEFINED)
|
||||
#define simde_assert(expr)
|
||||
#else
|
||||
#if defined(HEDLEY_ASSUME)
|
||||
#define simde_assert(expr) HEDLEY_ASSUME(expr)
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 5, 0)
|
||||
#define simde_assert(expr) ((void)(!!(expr) ? 1 : (__builtin_unreachable(), 1)))
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0)
|
||||
#define simde_assert(expr) __assume(expr)
|
||||
#else
|
||||
#define simde_assert(expr)
|
||||
#endif
|
||||
#endif
|
||||
#define simde_assert_true(expr) simde_assert(expr)
|
||||
#define simde_assert_false(expr) simde_assert(!(expr))
|
||||
#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \
|
||||
simde_assert(((a)op(b)))
|
||||
#define simde_assert_double_equal(a, b, precision)
|
||||
#define simde_assert_string_equal(a, b)
|
||||
#define simde_assert_string_not_equal(a, b)
|
||||
#define simde_assert_memory_equal(size, a, b)
|
||||
#define simde_assert_memory_not_equal(size, a, b)
|
||||
#else
|
||||
#define simde_assert(expr) \
|
||||
do { \
|
||||
if (!HEDLEY_LIKELY(expr)) { \
|
||||
simde_error("assertion failed: " #expr "\n"); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_true(expr) \
|
||||
do { \
|
||||
if (!HEDLEY_LIKELY(expr)) { \
|
||||
simde_error("assertion failed: " #expr \
|
||||
" is not true\n"); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_false(expr) \
|
||||
do { \
|
||||
if (!HEDLEY_LIKELY(!(expr))) { \
|
||||
simde_error("assertion failed: " #expr \
|
||||
" is not false\n"); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \
|
||||
do { \
|
||||
T simde_tmp_a_ = (a); \
|
||||
T simde_tmp_b_ = (b); \
|
||||
if (!(simde_tmp_a_ op simde_tmp_b_)) { \
|
||||
simde_errorf("assertion failed: %s %s %s (" prefix \
|
||||
"%" fmt suffix " %s " prefix \
|
||||
"%" fmt suffix ")\n", \
|
||||
#a, #op, #b, simde_tmp_a_, #op, \
|
||||
simde_tmp_b_); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_double_equal(a, b, precision) \
|
||||
do { \
|
||||
const double simde_tmp_a_ = (a); \
|
||||
const double simde_tmp_b_ = (b); \
|
||||
const double simde_tmp_diff_ = \
|
||||
((simde_tmp_a_ - simde_tmp_b_) < 0) \
|
||||
? -(simde_tmp_a_ - simde_tmp_b_) \
|
||||
: (simde_tmp_a_ - simde_tmp_b_); \
|
||||
if (HEDLEY_UNLIKELY(simde_tmp_diff_ > 1e-##precision)) { \
|
||||
simde_errorf( \
|
||||
"assertion failed: %s == %s (%0." #precision \
|
||||
"g == %0." #precision "g)\n", \
|
||||
#a, #b, simde_tmp_a_, simde_tmp_b_); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#include <string.h>
|
||||
#define simde_assert_string_equal(a, b) \
|
||||
do { \
|
||||
const char *simde_tmp_a_ = a; \
|
||||
const char *simde_tmp_b_ = b; \
|
||||
if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) != \
|
||||
0)) { \
|
||||
simde_errorf( \
|
||||
"assertion failed: string %s == %s (\"%s\" == \"%s\")\n", \
|
||||
#a, #b, simde_tmp_a_, simde_tmp_b_); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_string_not_equal(a, b) \
|
||||
do { \
|
||||
const char *simde_tmp_a_ = a; \
|
||||
const char *simde_tmp_b_ = b; \
|
||||
if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) == \
|
||||
0)) { \
|
||||
simde_errorf( \
|
||||
"assertion failed: string %s != %s (\"%s\" == \"%s\")\n", \
|
||||
#a, #b, simde_tmp_a_, simde_tmp_b_); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_memory_equal(size, a, b) \
|
||||
do { \
|
||||
const unsigned char *simde_tmp_a_ = \
|
||||
(const unsigned char *)(a); \
|
||||
const unsigned char *simde_tmp_b_ = \
|
||||
(const unsigned char *)(b); \
|
||||
const size_t simde_tmp_size_ = (size); \
|
||||
if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \
|
||||
simde_tmp_size_)) != 0) { \
|
||||
size_t simde_tmp_pos_; \
|
||||
for (simde_tmp_pos_ = 0; \
|
||||
simde_tmp_pos_ < simde_tmp_size_; \
|
||||
simde_tmp_pos_++) { \
|
||||
if (simde_tmp_a_[simde_tmp_pos_] != \
|
||||
simde_tmp_b_[simde_tmp_pos_]) { \
|
||||
simde_errorf( \
|
||||
"assertion failed: memory %s == %s, at offset %" SIMDE_SIZE_MODIFIER \
|
||||
"u\n", \
|
||||
#a, #b, simde_tmp_pos_); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
|
||||
#define simde_assert_memory_not_equal(size, a, b) \
|
||||
do { \
|
||||
const unsigned char *simde_tmp_a_ = \
|
||||
(const unsigned char *)(a); \
|
||||
const unsigned char *simde_tmp_b_ = \
|
||||
(const unsigned char *)(b); \
|
||||
const size_t simde_tmp_size_ = (size); \
|
||||
if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \
|
||||
simde_tmp_size_)) == 0) { \
|
||||
simde_errorf( \
|
||||
"assertion failed: memory %s != %s (%" SIMDE_SIZE_MODIFIER \
|
||||
"u bytes)\n", \
|
||||
#a, #b, simde_tmp_size_); \
|
||||
} \
|
||||
SIMDE_PUSH_DISABLE_MSVC_C4127_ \
|
||||
} while (0) SIMDE_POP_DISABLE_MSVC_C4127_
|
||||
#endif
|
||||
|
||||
#define simde_assert_type(T, fmt, a, op, b) \
|
||||
simde_assert_type_full("", "", T, fmt, a, op, b)
|
||||
|
||||
#define simde_assert_char(a, op, b) \
|
||||
simde_assert_type_full("'\\x", "'", char, \
|
||||
"02" SIMDE_CHAR_MODIFIER "x", a, op, b)
|
||||
#define simde_assert_uchar(a, op, b) \
|
||||
simde_assert_type_full("'\\x", "'", unsigned char, \
|
||||
"02" SIMDE_CHAR_MODIFIER "x", a, op, b)
|
||||
#define simde_assert_short(a, op, b) \
|
||||
simde_assert_type(short, SIMDE_SHORT_MODIFIER "d", a, op, b)
|
||||
#define simde_assert_ushort(a, op, b) \
|
||||
simde_assert_type(unsigned short, SIMDE_SHORT_MODIFIER "u", a, op, b)
|
||||
#define simde_assert_int(a, op, b) simde_assert_type(int, "d", a, op, b)
|
||||
#define simde_assert_uint(a, op, b) \
|
||||
simde_assert_type(unsigned int, "u", a, op, b)
|
||||
#define simde_assert_long(a, op, b) simde_assert_type(long int, "ld", a, op, b)
|
||||
#define simde_assert_ulong(a, op, b) \
|
||||
simde_assert_type(unsigned long int, "lu", a, op, b)
|
||||
#define simde_assert_llong(a, op, b) \
|
||||
simde_assert_type(long long int, "lld", a, op, b)
|
||||
#define simde_assert_ullong(a, op, b) \
|
||||
simde_assert_type(unsigned long long int, "llu", a, op, b)
|
||||
|
||||
#define simde_assert_size(a, op, b) \
|
||||
simde_assert_type(size_t, SIMDE_SIZE_MODIFIER "u", a, op, b)
|
||||
|
||||
#define simde_assert_float(a, op, b) simde_assert_type(float, "f", a, op, b)
|
||||
#define simde_assert_double(a, op, b) simde_assert_type(double, "g", a, op, b)
|
||||
#define simde_assert_ptr(a, op, b) \
|
||||
simde_assert_type(const void *, "p", a, op, b)
|
||||
|
||||
#define simde_assert_int8(a, op, b) simde_assert_type(int8_t, PRIi8, a, op, b)
|
||||
#define simde_assert_uint8(a, op, b) simde_assert_type(uint8_t, PRIu8, a, op, b)
|
||||
#define simde_assert_int16(a, op, b) \
|
||||
simde_assert_type(int16_t, PRIi16, a, op, b)
|
||||
#define simde_assert_uint16(a, op, b) \
|
||||
simde_assert_type(uint16_t, PRIu16, a, op, b)
|
||||
#define simde_assert_int32(a, op, b) \
|
||||
simde_assert_type(int32_t, PRIi32, a, op, b)
|
||||
#define simde_assert_uint32(a, op, b) \
|
||||
simde_assert_type(uint32_t, PRIu32, a, op, b)
|
||||
#define simde_assert_int64(a, op, b) \
|
||||
simde_assert_type(int64_t, PRIi64, a, op, b)
|
||||
#define simde_assert_uint64(a, op, b) \
|
||||
simde_assert_type(uint64_t, PRIu64, a, op, b)
|
||||
|
||||
#define simde_assert_ptr_equal(a, b) simde_assert_ptr(a, ==, b)
|
||||
#define simde_assert_ptr_not_equal(a, b) simde_assert_ptr(a, !=, b)
|
||||
#define simde_assert_null(ptr) simde_assert_ptr(ptr, ==, NULL)
|
||||
#define simde_assert_not_null(ptr) simde_assert_ptr(ptr, !=, NULL)
|
||||
#define simde_assert_ptr_null(ptr) simde_assert_ptr(ptr, ==, NULL)
|
||||
#define simde_assert_ptr_not_null(ptr) simde_assert_ptr(ptr, !=, NULL)
|
||||
|
||||
#endif /* !defined(SIMDE_CHECK_H) */
|
||||
@@ -1,117 +0,0 @@
|
||||
/* Debugging assertions and traps
|
||||
* Portable Snippets - https://gitub.com/nemequ/portable-snippets
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the authors have waived all
|
||||
* copyright and related or neighboring rights to this code. For
|
||||
* details, see the Creative Commons Zero 1.0 Universal license at
|
||||
* https://creativecommons.org/publicdomain/zero/1.0/
|
||||
*
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_DEBUG_TRAP_H)
|
||||
#define SIMDE_DEBUG_TRAP_H
|
||||
|
||||
#if !defined(SIMDE_NDEBUG) && defined(NDEBUG) && !defined(SIMDE_DEBUG)
|
||||
#define SIMDE_NDEBUG 1
|
||||
#endif
|
||||
|
||||
#if defined(__has_builtin) && !defined(__ibmxl__)
|
||||
#if __has_builtin(__builtin_debugtrap)
|
||||
#define simde_trap() __builtin_debugtrap()
|
||||
#elif __has_builtin(__debugbreak)
|
||||
#define simde_trap() __debugbreak()
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(simde_trap)
|
||||
#if defined(_MSC_VER) || defined(__INTEL_COMPILER)
|
||||
#define simde_trap() __debugbreak()
|
||||
#elif defined(__ARMCC_VERSION)
|
||||
#define simde_trap() __breakpoint(42)
|
||||
#elif defined(__ibmxl__) || defined(__xlC__)
|
||||
#include <builtins.h>
|
||||
#define simde_trap() __trap(42)
|
||||
#elif defined(__DMC__) && defined(_M_IX86)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm int 3h;
|
||||
}
|
||||
#elif defined(__i386__) || defined(__x86_64__)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__("int $03");
|
||||
}
|
||||
#elif defined(__thumb__)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__(".inst 0xde01");
|
||||
}
|
||||
#elif defined(__aarch64__)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__(".inst 0xd4200000");
|
||||
}
|
||||
#elif defined(__arm__)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__(".inst 0xe7f001f0");
|
||||
}
|
||||
#elif defined(__alpha__) && !defined(__osf__)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__("bpt");
|
||||
}
|
||||
#elif defined(_54_)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__("ESTOP");
|
||||
}
|
||||
#elif defined(_55_)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
";\n .if (.MNEMONIC)\n ESTOP_1\n .else\n ESTOP_1()\n .endif\n NOP");
|
||||
}
|
||||
#elif defined(_64P_)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__("SWBP 0");
|
||||
}
|
||||
#elif defined(_6x_)
|
||||
static inline void simde_trap(void)
|
||||
{
|
||||
__asm__ __volatile__("NOP\n .word 0x10000000");
|
||||
}
|
||||
#elif defined(__STDC_HOSTED__) && (__STDC_HOSTED__ == 0) && defined(__GNUC__)
|
||||
#define simde_trap() __builtin_trap()
|
||||
#else
|
||||
#include <signal.h>
|
||||
#if defined(SIGTRAP)
|
||||
#define simde_trap() raise(SIGTRAP)
|
||||
#else
|
||||
#define simde_trap() raise(SIGABRT)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HEDLEY_LIKELY)
|
||||
#define SIMDE_DBG_LIKELY(expr) HEDLEY_LIKELY(expr)
|
||||
#elif defined(__GNUC__) && (__GNUC__ >= 3)
|
||||
#define SIMDE_DBG_LIKELY(expr) __builtin_expect(!!(expr), 1)
|
||||
#else
|
||||
#define SIMDE_DBG_LIKELY(expr) (!!(expr))
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_NDEBUG) || (SIMDE_NDEBUG == 0)
|
||||
#define simde_dbg_assert(expr) \
|
||||
do { \
|
||||
if (!SIMDE_DBG_LIKELY(expr)) { \
|
||||
simde_trap(); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define simde_dbg_assert(expr)
|
||||
#endif
|
||||
|
||||
#endif /* !defined(SIMDE_DEBUG_TRAP_H) */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,481 +0,0 @@
|
||||
/* Alignment
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the authors have waived all
|
||||
* copyright and related or neighboring rights to this code. For
|
||||
* details, see the Creative Commons Zero 1.0 Universal license at
|
||||
* <https://creativecommons.org/publicdomain/zero/1.0/>
|
||||
*
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*
|
||||
**********************************************************************
|
||||
*
|
||||
* This is portability layer which should help iron out some
|
||||
* differences across various compilers, as well as various verisons of
|
||||
* C and C++.
|
||||
*
|
||||
* It was originally developed for SIMD Everywhere
|
||||
* (<https://github.com/simd-everywhere/simde>), but since its only
|
||||
* dependency is Hedley (<https://nemequ.github.io/hedley>, also CC0)
|
||||
* it can easily be used in other projects, so please feel free to do
|
||||
* so.
|
||||
*
|
||||
* If you do use this in your project, please keep a link to SIMDe in
|
||||
* your code to remind you where to report any bugs and/or check for
|
||||
* updated versions.
|
||||
*
|
||||
* # API Overview
|
||||
*
|
||||
* The API has several parts, and most macros have a few variations.
|
||||
* There are APIs for declaring aligned fields/variables, optimization
|
||||
* hints, and run-time alignment checks.
|
||||
*
|
||||
* Briefly, macros ending with "_TO" take numeric values and are great
|
||||
* when you know the value you would like to use. Macros ending with
|
||||
* "_LIKE", on the other hand, accept a type and are used when you want
|
||||
* to use the alignment of a type instead of hardcoding a value.
|
||||
*
|
||||
* Documentation for each section of the API is inline.
|
||||
*
|
||||
* True to form, MSVC is the main problem and imposes several
|
||||
* limitations on the effectiveness of the APIs. Detailed descriptions
|
||||
* of the limitations of each macro are inline, but in general:
|
||||
*
|
||||
* * On C11+ or C++11+ code written using this API will work. The
|
||||
* ASSUME macros may or may not generate a hint to the compiler, but
|
||||
* that is only an optimization issue and will not actually cause
|
||||
* failures.
|
||||
* * If you're using pretty much any compiler other than MSVC,
|
||||
* everything should basically work as well as in C11/C++11.
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_ALIGN_H)
|
||||
#define SIMDE_ALIGN_H
|
||||
|
||||
#include "hedley.h"
|
||||
|
||||
/* I know this seems a little silly, but some non-hosted compilers
|
||||
* don't have stddef.h, so we try to accomodate them. */
|
||||
#if !defined(SIMDE_ALIGN_SIZE_T_)
|
||||
#if defined(__SIZE_TYPE__)
|
||||
#define SIMDE_ALIGN_SIZE_T_ __SIZE_TYPE__
|
||||
#elif defined(__SIZE_T_TYPE__)
|
||||
#define SIMDE_ALIGN_SIZE_T_ __SIZE_TYPE__
|
||||
#elif defined(__cplusplus)
|
||||
#include <cstddef>
|
||||
#define SIMDE_ALIGN_SIZE_T_ size_t
|
||||
#else
|
||||
#include <stddef.h>
|
||||
#define SIMDE_ALIGN_SIZE_T_ size_t
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ALIGN_INTPTR_T_)
|
||||
#if defined(__INTPTR_TYPE__)
|
||||
#define SIMDE_ALIGN_INTPTR_T_ __INTPTR_TYPE__
|
||||
#elif defined(__PTRDIFF_TYPE__)
|
||||
#define SIMDE_ALIGN_INTPTR_T_ __PTRDIFF_TYPE__
|
||||
#elif defined(__PTRDIFF_T_TYPE__)
|
||||
#define SIMDE_ALIGN_INTPTR_T_ __PTRDIFF_T_TYPE__
|
||||
#elif defined(__cplusplus)
|
||||
#include <cstddef>
|
||||
#define SIMDE_ALIGN_INTPTR_T_ ptrdiff_t
|
||||
#else
|
||||
#include <stddef.h>
|
||||
#define SIMDE_ALIGN_INTPTR_T_ ptrdiff_t
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_ALIGN_DEBUG)
|
||||
#if defined(__cplusplus)
|
||||
#include <cstdio>
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_OF(Type)
|
||||
*
|
||||
* The SIMDE_ALIGN_OF macro works like alignof, or _Alignof, or
|
||||
* __alignof, or __alignof__, or __ALIGNOF__, depending on the compiler.
|
||||
* It isn't defined everywhere (only when the compiler has some alignof-
|
||||
* like feature we can use to implement it), but it should work in most
|
||||
* modern compilers, as well as C11 and C++11.
|
||||
*
|
||||
* If we can't find an implementation for SIMDE_ALIGN_OF then the macro
|
||||
* will not be defined, so if you can handle that situation sensibly
|
||||
* you may need to sprinkle some ifdefs into your code.
|
||||
*/
|
||||
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
|
||||
(0 && HEDLEY_HAS_FEATURE(c_alignof))
|
||||
#define SIMDE_ALIGN_OF(Type) _Alignof(Type)
|
||||
#elif (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
|
||||
(0 && HEDLEY_HAS_FEATURE(cxx_alignof))
|
||||
#define SIMDE_ALIGN_OF(Type) alignof(Type)
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(2, 95, 0) || \
|
||||
HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
|
||||
HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) || \
|
||||
HEDLEY_TINYC_VERSION_CHECK(0, 9, 24) || \
|
||||
HEDLEY_PGI_VERSION_CHECK(19, 10, 0) || \
|
||||
HEDLEY_CRAY_VERSION_CHECK(10, 0, 0) || \
|
||||
HEDLEY_TI_ARMCL_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CL2000_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0) || \
|
||||
HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
|
||||
HEDLEY_TI_CL430_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 2) || defined(__IBM__ALIGNOF__) || \
|
||||
defined(__clang__)
|
||||
#define SIMDE_ALIGN_OF(Type) __alignof__(Type)
|
||||
#elif HEDLEY_IAR_VERSION_CHECK(8, 40, 0)
|
||||
#define SIMDE_ALIGN_OF(Type) __ALIGNOF__(Type)
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(19, 0, 0)
|
||||
/* Probably goes back much further, but MS takes down their old docs.
|
||||
* If you can verify that this works in earlier versions please let
|
||||
* me know! */
|
||||
#define SIMDE_ALIGN_OF(Type) __alignof(Type)
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_MAXIMUM:
|
||||
*
|
||||
* This is the maximum alignment that the compiler supports. You can
|
||||
* define the value prior to including SIMDe if necessary, but in that
|
||||
* case *please* submit an issue so we can add the platform to the
|
||||
* detection code.
|
||||
*
|
||||
* Most compilers are okay with types which are aligned beyond what
|
||||
* they think is the maximum, as long as the alignment is a power
|
||||
* of two. MSVC is the exception (of course), so we need to cap the
|
||||
* alignment requests at values that the implementation supports.
|
||||
*
|
||||
* XL C/C++ will accept values larger than 16 (which is the alignment
|
||||
* of an AltiVec vector), but will not reliably align to the larger
|
||||
* value, so so we cap the value at 16 there.
|
||||
*
|
||||
* If the compiler accepts any power-of-two value within reason then
|
||||
* this macro should be left undefined, and the SIMDE_ALIGN_CAP
|
||||
* macro will just return the value passed to it. */
|
||||
#if !defined(SIMDE_ALIGN_MAXIMUM)
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#if defined(_M_IX86) || defined(_M_AMD64)
|
||||
#if HEDLEY_MSVC_VERSION_CHECK(19, 14, 0)
|
||||
#define SIMDE_ALIGN_PLATFORM_MAXIMUM 64
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(16, 0, 0)
|
||||
/* VS 2010 is really a guess based on Wikipedia; if anyone can
|
||||
* test with old VS versions I'd really appreciate it. */
|
||||
#define SIMDE_ALIGN_PLATFORM_MAXIMUM 32
|
||||
#else
|
||||
#define SIMDE_ALIGN_PLATFORM_MAXIMUM 16
|
||||
#endif
|
||||
#elif defined(_M_ARM) || defined(_M_ARM64)
|
||||
#define SIMDE_ALIGN_PLATFORM_MAXIMUM 8
|
||||
#endif
|
||||
#elif defined(HEDLEY_IBM_VERSION)
|
||||
#define SIMDE_ALIGN_PLATFORM_MAXIMUM 16
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* You can mostly ignore these; they're intended for internal use.
|
||||
* If you do need to use them please let me know; if they fulfill
|
||||
* a common use case I'll probably drop the trailing underscore
|
||||
* and make them part of the public API. */
|
||||
#if defined(SIMDE_ALIGN_PLATFORM_MAXIMUM)
|
||||
#if SIMDE_ALIGN_PLATFORM_MAXIMUM >= 64
|
||||
#define SIMDE_ALIGN_64_ 64
|
||||
#define SIMDE_ALIGN_32_ 32
|
||||
#define SIMDE_ALIGN_16_ 16
|
||||
#define SIMDE_ALIGN_8_ 8
|
||||
#elif SIMDE_ALIGN_PLATFORM_MAXIMUM >= 32
|
||||
#define SIMDE_ALIGN_64_ 32
|
||||
#define SIMDE_ALIGN_32_ 32
|
||||
#define SIMDE_ALIGN_16_ 16
|
||||
#define SIMDE_ALIGN_8_ 8
|
||||
#elif SIMDE_ALIGN_PLATFORM_MAXIMUM >= 16
|
||||
#define SIMDE_ALIGN_64_ 16
|
||||
#define SIMDE_ALIGN_32_ 16
|
||||
#define SIMDE_ALIGN_16_ 16
|
||||
#define SIMDE_ALIGN_8_ 8
|
||||
#elif SIMDE_ALIGN_PLATFORM_MAXIMUM >= 8
|
||||
#define SIMDE_ALIGN_64_ 8
|
||||
#define SIMDE_ALIGN_32_ 8
|
||||
#define SIMDE_ALIGN_16_ 8
|
||||
#define SIMDE_ALIGN_8_ 8
|
||||
#else
|
||||
#error Max alignment expected to be >= 8
|
||||
#endif
|
||||
#else
|
||||
#define SIMDE_ALIGN_64_ 64
|
||||
#define SIMDE_ALIGN_32_ 32
|
||||
#define SIMDE_ALIGN_16_ 16
|
||||
#define SIMDE_ALIGN_8_ 8
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SIMDE_ALIGN_CAP(Alignment)
|
||||
*
|
||||
* Returns the minimum of Alignment or SIMDE_ALIGN_MAXIMUM.
|
||||
*/
|
||||
#if defined(SIMDE_ALIGN_MAXIMUM)
|
||||
#define SIMDE_ALIGN_CAP(Alignment) \
|
||||
(((Alignment) < (SIMDE_ALIGN_PLATFORM_MAXIMUM)) \
|
||||
? (Alignment) \
|
||||
: (SIMDE_ALIGN_PLATFORM_MAXIMUM))
|
||||
#else
|
||||
#define SIMDE_ALIGN_CAP(Alignment) (Alignment)
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_TO(Alignment)
|
||||
*
|
||||
* SIMDE_ALIGN_TO is used to declare types or variables. It basically
|
||||
* maps to the align attribute in most compilers, the align declspec
|
||||
* in MSVC, or _Alignas/alignas in C11/C++11.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* struct i32x4 {
|
||||
* SIMDE_ALIGN_TO(16) int32_t values[4];
|
||||
* }
|
||||
*
|
||||
* Limitations:
|
||||
*
|
||||
* MSVC requires that the Alignment parameter be numeric; you can't do
|
||||
* something like `SIMDE_ALIGN_TO(SIMDE_ALIGN_OF(int))`. This is
|
||||
* unfortunate because that's really how the LIKE macros are
|
||||
* implemented, and I am not aware of a way to get anything like this
|
||||
* to work without using the C11/C++11 keywords.
|
||||
*
|
||||
* It also means that we can't use SIMDE_ALIGN_CAP to limit the
|
||||
* alignment to the value specified, which MSVC also requires, so on
|
||||
* MSVC you should use the `SIMDE_ALIGN_TO_8/16/32/64` macros instead.
|
||||
* They work like `SIMDE_ALIGN_TO(SIMDE_ALIGN_CAP(Alignment))` would,
|
||||
* but should be safe to use on MSVC.
|
||||
*
|
||||
* All this is to say that, if you want your code to work on MSVC, you
|
||||
* should use the SIMDE_ALIGN_TO_8/16/32/64 macros below instead of
|
||||
* SIMDE_ALIGN_TO(8/16/32/64).
|
||||
*/
|
||||
#if HEDLEY_HAS_ATTRIBUTE(aligned) || HEDLEY_GCC_VERSION_CHECK(2, 95, 0) || \
|
||||
HEDLEY_CRAY_VERSION_CHECK(8, 4, 0) || \
|
||||
HEDLEY_IBM_VERSION_CHECK(11, 1, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
|
||||
HEDLEY_PGI_VERSION_CHECK(19, 4, 0) || \
|
||||
HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
|
||||
HEDLEY_TINYC_VERSION_CHECK(0, 9, 24) || \
|
||||
HEDLEY_TI_ARMCL_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CL2000_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0) || \
|
||||
HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
|
||||
HEDLEY_TI_CL430_VERSION_CHECK(16, 9, 0) || \
|
||||
HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 2)
|
||||
#define SIMDE_ALIGN_TO(Alignment) \
|
||||
__attribute__((__aligned__(SIMDE_ALIGN_CAP(Alignment))))
|
||||
#elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L))
|
||||
#define SIMDE_ALIGN_TO(Alignment) _Alignas(SIMDE_ALIGN_CAP(Alignment))
|
||||
#elif (defined(__cplusplus) && (__cplusplus >= 201103L))
|
||||
#define SIMDE_ALIGN_TO(Alignment) alignas(SIMDE_ALIGN_CAP(Alignment))
|
||||
#elif defined(HEDLEY_MSVC_VERSION)
|
||||
#define SIMDE_ALIGN_TO(Alignment) __declspec(align(Alignment))
|
||||
/* Unfortunately MSVC can't handle __declspec(align(__alignof(Type)));
|
||||
* the alignment passed to the declspec has to be an integer. */
|
||||
#define SIMDE_ALIGN_OF_UNUSABLE_FOR_LIKE
|
||||
#endif
|
||||
#define SIMDE_ALIGN_TO_64 SIMDE_ALIGN_TO(SIMDE_ALIGN_64_)
|
||||
#define SIMDE_ALIGN_TO_32 SIMDE_ALIGN_TO(SIMDE_ALIGN_32_)
|
||||
#define SIMDE_ALIGN_TO_16 SIMDE_ALIGN_TO(SIMDE_ALIGN_16_)
|
||||
#define SIMDE_ALIGN_TO_8 SIMDE_ALIGN_TO(SIMDE_ALIGN_8_)
|
||||
|
||||
/* SIMDE_ALIGN_ASSUME_TO(Pointer, Alignment)
|
||||
*
|
||||
* SIMDE_ALIGN_ASSUME_TO is semantically similar to C++20's
|
||||
* std::assume_aligned, or __builtin_assume_aligned. It tells the
|
||||
* compiler to assume that the provided pointer is aligned to an
|
||||
* `Alignment`-byte boundary.
|
||||
*
|
||||
* If you define SIMDE_ALIGN_DEBUG prior to including this header then
|
||||
* SIMDE_ALIGN_ASSUME_TO will turn into a runtime check. We don't
|
||||
* integrate with NDEBUG in this header, but it may be a good idea to
|
||||
* put something like this in your code:
|
||||
*
|
||||
* #if !defined(NDEBUG)
|
||||
* #define SIMDE_ALIGN_DEBUG
|
||||
* #endif
|
||||
* #include <.../simde-align.h>
|
||||
*/
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_assume_aligned) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(4, 7, 0)
|
||||
#define SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment) \
|
||||
HEDLEY_REINTERPRET_CAST( \
|
||||
__typeof__(Pointer), \
|
||||
__builtin_assume_aligned( \
|
||||
HEDLEY_CONST_CAST( \
|
||||
void *, HEDLEY_REINTERPRET_CAST(const void *, \
|
||||
Pointer)), \
|
||||
Alignment))
|
||||
#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
|
||||
#define SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment) \
|
||||
(__extension__({ \
|
||||
__typeof__(v) simde_assume_aligned_t_ = (Pointer); \
|
||||
__assume_aligned(simde_assume_aligned_t_, Alignment); \
|
||||
simde_assume_aligned_t_; \
|
||||
}))
|
||||
#elif defined(__cplusplus) && (__cplusplus > 201703L)
|
||||
#include <memory>
|
||||
#define SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment) \
|
||||
std::assume_aligned<Alignment>(Pointer)
|
||||
#else
|
||||
#if defined(__cplusplus)
|
||||
template<typename T>
|
||||
HEDLEY_ALWAYS_INLINE static T *
|
||||
simde_align_assume_to_unchecked(T *ptr, const size_t alignment)
|
||||
#else
|
||||
HEDLEY_ALWAYS_INLINE static void *
|
||||
simde_align_assume_to_unchecked(void *ptr, const size_t alignment)
|
||||
#endif
|
||||
{
|
||||
HEDLEY_ASSUME((HEDLEY_REINTERPRET_CAST(size_t, (ptr)) %
|
||||
SIMDE_ALIGN_CAP(alignment)) == 0);
|
||||
return ptr;
|
||||
}
|
||||
#if defined(__cplusplus)
|
||||
#define SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment) \
|
||||
simde_align_assume_to_unchecked((Pointer), (Alignment))
|
||||
#else
|
||||
#define SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment) \
|
||||
simde_align_assume_to_unchecked( \
|
||||
HEDLEY_CONST_CAST(void *, HEDLEY_REINTERPRET_CAST( \
|
||||
const void *, Pointer)), \
|
||||
(Alignment))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ALIGN_DEBUG)
|
||||
#define SIMDE_ALIGN_ASSUME_TO(Pointer, Alignment) \
|
||||
SIMDE_ALIGN_ASSUME_TO_UNCHECKED(Pointer, Alignment)
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#if defined(__cplusplus)
|
||||
template<typename T>
|
||||
static HEDLEY_ALWAYS_INLINE T *
|
||||
simde_align_assume_to_checked_uncapped(T *ptr, const size_t alignment,
|
||||
const char *file, int line,
|
||||
const char *ptrname)
|
||||
#else
|
||||
static HEDLEY_ALWAYS_INLINE void *
|
||||
simde_align_assume_to_checked_uncapped(void *ptr, const size_t alignment,
|
||||
const char *file, int line,
|
||||
const char *ptrname)
|
||||
#endif
|
||||
{
|
||||
if (HEDLEY_UNLIKELY(
|
||||
(HEDLEY_REINTERPRET_CAST(SIMDE_ALIGN_INTPTR_T_, (ptr)) %
|
||||
HEDLEY_STATIC_CAST(SIMDE_ALIGN_INTPTR_T_,
|
||||
SIMDE_ALIGN_CAP(alignment))) != 0)) {
|
||||
fprintf(stderr,
|
||||
"%s:%d: alignment check failed for `%s' (%p %% %u == %u)\n",
|
||||
file, line, ptrname,
|
||||
HEDLEY_REINTERPRET_CAST(const void *, ptr),
|
||||
HEDLEY_STATIC_CAST(unsigned int,
|
||||
SIMDE_ALIGN_CAP(alignment)),
|
||||
HEDLEY_STATIC_CAST(
|
||||
unsigned int,
|
||||
HEDLEY_REINTERPRET_CAST(SIMDE_ALIGN_INTPTR_T_,
|
||||
(ptr)) %
|
||||
HEDLEY_STATIC_CAST(
|
||||
SIMDE_ALIGN_INTPTR_T_,
|
||||
SIMDE_ALIGN_CAP(alignment))));
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#define SIMDE_ALIGN_ASSUME_TO(Pointer, Alignment) \
|
||||
simde_align_assume_to_checked_uncapped((Pointer), (Alignment), \
|
||||
__FILE__, __LINE__, #Pointer)
|
||||
#else
|
||||
#define SIMDE_ALIGN_ASSUME_TO(Pointer, Alignment) \
|
||||
simde_align_assume_to_checked_uncapped( \
|
||||
HEDLEY_CONST_CAST(void *, HEDLEY_REINTERPRET_CAST( \
|
||||
const void *, Pointer)), \
|
||||
(Alignment), __FILE__, __LINE__, #Pointer)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_LIKE(Type)
|
||||
* SIMDE_ALIGN_LIKE_#(Type)
|
||||
*
|
||||
* The SIMDE_ALIGN_LIKE macros are similar to the SIMDE_ALIGN_TO macros
|
||||
* except instead of an integer they take a type; basically, it's just
|
||||
* a more convenient way to do something like:
|
||||
*
|
||||
* SIMDE_ALIGN_TO(SIMDE_ALIGN_OF(Type))
|
||||
*
|
||||
* The versions with a numeric suffix will fall back on using a numeric
|
||||
* value in the event we can't use SIMDE_ALIGN_OF(Type). This is
|
||||
* mainly for MSVC, where __declspec(align()) can't handle anything
|
||||
* other than hard-coded numeric values.
|
||||
*/
|
||||
#if defined(SIMDE_ALIGN_OF) && defined(SIMDE_ALIGN_TO) && \
|
||||
!defined(SIMDE_ALIGN_OF_UNUSABLE_FOR_LIKE)
|
||||
#define SIMDE_ALIGN_LIKE(Type) SIMDE_ALIGN_TO(SIMDE_ALIGN_OF(Type))
|
||||
#define SIMDE_ALIGN_LIKE_64(Type) SIMDE_ALIGN_LIKE(Type)
|
||||
#define SIMDE_ALIGN_LIKE_32(Type) SIMDE_ALIGN_LIKE(Type)
|
||||
#define SIMDE_ALIGN_LIKE_16(Type) SIMDE_ALIGN_LIKE(Type)
|
||||
#define SIMDE_ALIGN_LIKE_8(Type) SIMDE_ALIGN_LIKE(Type)
|
||||
#else
|
||||
#define SIMDE_ALIGN_LIKE_64(Type) SIMDE_ALIGN_TO_64
|
||||
#define SIMDE_ALIGN_LIKE_32(Type) SIMDE_ALIGN_TO_32
|
||||
#define SIMDE_ALIGN_LIKE_16(Type) SIMDE_ALIGN_TO_16
|
||||
#define SIMDE_ALIGN_LIKE_8(Type) SIMDE_ALIGN_TO_8
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_ASSUME_LIKE(Pointer, Type)
|
||||
*
|
||||
* Tihs is similar to SIMDE_ALIGN_ASSUME_TO, except that it takes a
|
||||
* type instead of a numeric value. */
|
||||
#if defined(SIMDE_ALIGN_OF) && defined(SIMDE_ALIGN_ASSUME_TO)
|
||||
#define SIMDE_ALIGN_ASSUME_LIKE(Pointer, Type) \
|
||||
SIMDE_ALIGN_ASSUME_TO(Pointer, SIMDE_ALIGN_OF(Type))
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_CAST(Type, Pointer)
|
||||
*
|
||||
* SIMDE_ALIGN_CAST is like C++'s reinterpret_cast, but it will try
|
||||
* to silence warnings that some compilers may produce if you try
|
||||
* to assign to a type with increased alignment requirements.
|
||||
*
|
||||
* Note that it does *not* actually attempt to tell the compiler that
|
||||
* the pointer is aligned like the destination should be; that's the
|
||||
* job of the next macro. This macro is necessary for stupid APIs
|
||||
* like _mm_loadu_si128 where the input is a __m128i* but the function
|
||||
* is specifically for data which isn't necessarily aligned to
|
||||
* _Alignof(__m128i).
|
||||
*/
|
||||
#if HEDLEY_HAS_WARNING("-Wcast-align") || defined(__clang__) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(3, 4, 0)
|
||||
#define SIMDE_ALIGN_CAST(Type, Pointer) \
|
||||
(__extension__({ \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
_Pragma("GCC diagnostic ignored \"-Wcast-align\"") \
|
||||
Type simde_r_ = \
|
||||
HEDLEY_REINTERPRET_CAST(Type, Pointer); \
|
||||
HEDLEY_DIAGNOSTIC_POP \
|
||||
simde_r_; \
|
||||
}))
|
||||
#else
|
||||
#define SIMDE_ALIGN_CAST(Type, Pointer) HEDLEY_REINTERPRET_CAST(Type, Pointer)
|
||||
#endif
|
||||
|
||||
/* SIMDE_ALIGN_ASSUME_CAST(Type, Pointer)
|
||||
*
|
||||
* This is sort of like a combination of a reinterpret_cast and a
|
||||
* SIMDE_ALIGN_ASSUME_LIKE. It uses SIMDE_ALIGN_ASSUME_LIKE to tell
|
||||
* the compiler that the pointer is aligned like the specified type
|
||||
* and casts the pointer to the specified type while suppressing any
|
||||
* warnings from the compiler about casting to a type with greater
|
||||
* alignment requirements.
|
||||
*/
|
||||
#define SIMDE_ALIGN_ASSUME_CAST(Type, Pointer) \
|
||||
SIMDE_ALIGN_ASSUME_LIKE(SIMDE_ALIGN_CAST(Type, Pointer), Type)
|
||||
|
||||
#endif /* !defined(SIMDE_ALIGN_H) */
|
||||
@@ -1,537 +0,0 @@
|
||||
/* Architecture detection
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the authors have waived all
|
||||
* copyright and related or neighboring rights to this code. For
|
||||
* details, see the Creative Commons Zero 1.0 Universal license at
|
||||
* <https://creativecommons.org/publicdomain/zero/1.0/>
|
||||
*
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*
|
||||
* Different compilers define different preprocessor macros for the
|
||||
* same architecture. This is an attempt to provide a single
|
||||
* interface which is usable on any compiler.
|
||||
*
|
||||
* In general, a macro named SIMDE_ARCH_* is defined for each
|
||||
* architecture the CPU supports. When there are multiple possible
|
||||
* versions, we try to define the macro to the target version. For
|
||||
* example, if you want to check for i586+, you could do something
|
||||
* like:
|
||||
*
|
||||
* #if defined(SIMDE_ARCH_X86) && (SIMDE_ARCH_X86 >= 5)
|
||||
* ...
|
||||
* #endif
|
||||
*
|
||||
* You could also just check that SIMDE_ARCH_X86 >= 5 without checking
|
||||
* if it's defined first, but some compilers may emit a warning about
|
||||
* an undefined macro being used (e.g., GCC with -Wundef).
|
||||
*
|
||||
* This was originally created for SIMDe
|
||||
* <https://github.com/simd-everywhere/simde> (hence the prefix), but this
|
||||
* header has no dependencies and may be used anywhere. It is
|
||||
* originally based on information from
|
||||
* <https://sourceforge.net/p/predef/wiki/Architectures/>, though it
|
||||
* has been enhanced with additional information.
|
||||
*
|
||||
* If you improve this file, or find a bug, please file the issue at
|
||||
* <https://github.com/simd-everywhere/simde/issues>. If you copy this into
|
||||
* your project, even if you change the prefix, please keep the links
|
||||
* to SIMDe intact so others know where to report issues, submit
|
||||
* enhancements, and find the latest version. */
|
||||
|
||||
#if !defined(SIMDE_ARCH_H)
|
||||
#define SIMDE_ARCH_H
|
||||
|
||||
/* Alpha
|
||||
<https://en.wikipedia.org/wiki/DEC_Alpha> */
|
||||
#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
|
||||
#if defined(__alpha_ev6__)
|
||||
#define SIMDE_ARCH_ALPHA 6
|
||||
#elif defined(__alpha_ev5__)
|
||||
#define SIMDE_ARCH_ALPHA 5
|
||||
#elif defined(__alpha_ev4__)
|
||||
#define SIMDE_ARCH_ALPHA 4
|
||||
#else
|
||||
#define SIMDE_ARCH_ALPHA 1
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_ALPHA)
|
||||
#define SIMDE_ARCH_ALPHA_CHECK(version) ((version) <= SIMDE_ARCH_ALPHA)
|
||||
#else
|
||||
#define SIMDE_ARCH_ALPHA_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* Atmel AVR
|
||||
<https://en.wikipedia.org/wiki/Atmel_AVR> */
|
||||
#if defined(__AVR_ARCH__)
|
||||
#define SIMDE_ARCH_AVR __AVR_ARCH__
|
||||
#endif
|
||||
|
||||
/* AMD64 / x86_64
|
||||
<https://en.wikipedia.org/wiki/X86-64> */
|
||||
#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || \
|
||||
defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
|
||||
#define SIMDE_ARCH_AMD64 1000
|
||||
#endif
|
||||
|
||||
/* ARM
|
||||
<https://en.wikipedia.org/wiki/ARM_architecture> */
|
||||
#if defined(__ARM_ARCH_8A__)
|
||||
#define SIMDE_ARCH_ARM 82
|
||||
#elif defined(__ARM_ARCH_8R__)
|
||||
#define SIMDE_ARCH_ARM 81
|
||||
#elif defined(__ARM_ARCH_8__)
|
||||
#define SIMDE_ARCH_ARM 80
|
||||
#elif defined(__ARM_ARCH_7S__)
|
||||
#define SIMDE_ARCH_ARM 74
|
||||
#elif defined(__ARM_ARCH_7M__)
|
||||
#define SIMDE_ARCH_ARM 73
|
||||
#elif defined(__ARM_ARCH_7R__)
|
||||
#define SIMDE_ARCH_ARM 72
|
||||
#elif defined(__ARM_ARCH_7A__)
|
||||
#define SIMDE_ARCH_ARM 71
|
||||
#elif defined(__ARM_ARCH_7__)
|
||||
#define SIMDE_ARCH_ARM 70
|
||||
#elif defined(__ARM_ARCH)
|
||||
#define SIMDE_ARCH_ARM (__ARM_ARCH * 10)
|
||||
#elif defined(_M_ARM)
|
||||
#define SIMDE_ARCH_ARM (_M_ARM * 10)
|
||||
#elif defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) || \
|
||||
defined(_ARM) || defined(_M_ARM) || defined(_M_ARM)
|
||||
#define SIMDE_ARCH_ARM 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_ARM)
|
||||
#define SIMDE_ARCH_ARM_CHECK(version) ((version) <= SIMDE_ARCH_ARM)
|
||||
#else
|
||||
#define SIMDE_ARCH_ARM_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* AArch64
|
||||
<https://en.wikipedia.org/wiki/ARM_architecture> */
|
||||
#if defined(__aarch64__) || defined(_M_ARM64)
|
||||
#define SIMDE_ARCH_AARCH64 1000
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_AARCH64)
|
||||
#define SIMDE_ARCH_AARCH64_CHECK(version) ((version) <= SIMDE_ARCH_AARCH64)
|
||||
#else
|
||||
#define SIMDE_ARCH_AARCH64_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* ARM SIMD ISA extensions */
|
||||
#if defined(__ARM_NEON)
|
||||
#if defined(SIMDE_ARCH_AARCH64)
|
||||
#define SIMDE_ARCH_ARM_NEON SIMDE_ARCH_AARCH64
|
||||
#elif defined(SIMDE_ARCH_ARM)
|
||||
#define SIMDE_ARCH_ARM_NEON SIMDE_ARCH_ARM
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__ARM_FEATURE_SVE)
|
||||
#define SIMDE_ARCH_ARM_SVE
|
||||
#endif
|
||||
|
||||
/* Blackfin
|
||||
<https://en.wikipedia.org/wiki/Blackfin> */
|
||||
#if defined(__bfin) || defined(__BFIN__) || defined(__bfin__)
|
||||
#define SIMDE_ARCH_BLACKFIN 1
|
||||
#endif
|
||||
|
||||
/* CRIS
|
||||
<https://en.wikipedia.org/wiki/ETRAX_CRIS> */
|
||||
#if defined(__CRIS_arch_version)
|
||||
#define SIMDE_ARCH_CRIS __CRIS_arch_version
|
||||
#elif defined(__cris__) || defined(__cris) || defined(__CRIS) || \
|
||||
defined(__CRIS__)
|
||||
#define SIMDE_ARCH_CRIS 1
|
||||
#endif
|
||||
|
||||
/* Convex
|
||||
<https://en.wikipedia.org/wiki/Convex_Computer> */
|
||||
#if defined(__convex_c38__)
|
||||
#define SIMDE_ARCH_CONVEX 38
|
||||
#elif defined(__convex_c34__)
|
||||
#define SIMDE_ARCH_CONVEX 34
|
||||
#elif defined(__convex_c32__)
|
||||
#define SIMDE_ARCH_CONVEX 32
|
||||
#elif defined(__convex_c2__)
|
||||
#define SIMDE_ARCH_CONVEX 2
|
||||
#elif defined(__convex__)
|
||||
#define SIMDE_ARCH_CONVEX 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_CONVEX)
|
||||
#define SIMDE_ARCH_CONVEX_CHECK(version) ((version) <= SIMDE_ARCH_CONVEX)
|
||||
#else
|
||||
#define SIMDE_ARCH_CONVEX_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* Adapteva Epiphany
|
||||
<https://en.wikipedia.org/wiki/Adapteva_Epiphany> */
|
||||
#if defined(__epiphany__)
|
||||
#define SIMDE_ARCH_EPIPHANY 1
|
||||
#endif
|
||||
|
||||
/* Fujitsu FR-V
|
||||
<https://en.wikipedia.org/wiki/FR-V_(microprocessor)> */
|
||||
#if defined(__frv__)
|
||||
#define SIMDE_ARCH_FRV 1
|
||||
#endif
|
||||
|
||||
/* H8/300
|
||||
<https://en.wikipedia.org/wiki/H8_Family> */
|
||||
#if defined(__H8300__)
|
||||
#define SIMDE_ARCH_H8300
|
||||
#endif
|
||||
|
||||
/* HP/PA / PA-RISC
|
||||
<https://en.wikipedia.org/wiki/PA-RISC> */
|
||||
#if defined(__PA8000__) || defined(__HPPA20__) || defined(__RISC2_0__) || \
|
||||
defined(_PA_RISC2_0)
|
||||
#define SIMDE_ARCH_HPPA 20
|
||||
#elif defined(__PA7100__) || defined(__HPPA11__) || defined(_PA_RISC1_1)
|
||||
#define SIMDE_ARCH_HPPA 11
|
||||
#elif defined(_PA_RISC1_0)
|
||||
#define SIMDE_ARCH_HPPA 10
|
||||
#elif defined(__hppa__) || defined(__HPPA__) || defined(__hppa)
|
||||
#define SIMDE_ARCH_HPPA 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_HPPA)
|
||||
#define SIMDE_ARCH_HPPA_CHECK(version) ((version) <= SIMDE_ARCH_HPPA)
|
||||
#else
|
||||
#define SIMDE_ARCH_HPPA_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* x86
|
||||
<https://en.wikipedia.org/wiki/X86> */
|
||||
#if defined(_M_IX86)
|
||||
#define SIMDE_ARCH_X86 (_M_IX86 / 100)
|
||||
#elif defined(__I86__)
|
||||
#define SIMDE_ARCH_X86 __I86__
|
||||
#elif defined(i686) || defined(__i686) || defined(__i686__)
|
||||
#define SIMDE_ARCH_X86 6
|
||||
#elif defined(i586) || defined(__i586) || defined(__i586__)
|
||||
#define SIMDE_ARCH_X86 5
|
||||
#elif defined(i486) || defined(__i486) || defined(__i486__)
|
||||
#define SIMDE_ARCH_X86 4
|
||||
#elif defined(i386) || defined(__i386) || defined(__i386__)
|
||||
#define SIMDE_ARCH_X86 3
|
||||
#elif defined(_X86_) || defined(__X86__) || defined(__THW_INTEL__)
|
||||
#define SIMDE_ARCH_X86 3
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_X86)
|
||||
#define SIMDE_ARCH_X86_CHECK(version) ((version) <= SIMDE_ARCH_X86)
|
||||
#else
|
||||
#define SIMDE_ARCH_X86_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* SIMD ISA extensions for x86/x86_64 */
|
||||
#if defined(SIMDE_ARCH_X86) || defined(SIMDE_ARCH_AMD64)
|
||||
#if defined(_M_IX86_FP)
|
||||
#define SIMDE_ARCH_X86_MMX
|
||||
#if (_M_IX86_FP >= 1)
|
||||
#define SIMDE_ARCH_X86_SSE 1
|
||||
#endif
|
||||
#if (_M_IX86_FP >= 2)
|
||||
#define SIMDE_ARCH_X86_SSE2 1
|
||||
#endif
|
||||
#elif defined(_M_X64)
|
||||
#define SIMDE_ARCH_X86_SSE 1
|
||||
#define SIMDE_ARCH_X86_SSE2 1
|
||||
#else
|
||||
#if defined(__MMX__)
|
||||
#define SIMDE_ARCH_X86_MMX 1
|
||||
#endif
|
||||
#if defined(__SSE__)
|
||||
#define SIMDE_ARCH_X86_SSE 1
|
||||
#endif
|
||||
#if defined(__SSE2__)
|
||||
#define SIMDE_ARCH_X86_SSE2 1
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__SSE3__)
|
||||
#define SIMDE_ARCH_X86_SSE3 1
|
||||
#endif
|
||||
#if defined(__SSSE3__)
|
||||
#define SIMDE_ARCH_X86_SSSE3 1
|
||||
#endif
|
||||
#if defined(__SSE4_1__)
|
||||
#define SIMDE_ARCH_X86_SSE4_1 1
|
||||
#endif
|
||||
#if defined(__SSE4_2__)
|
||||
#define SIMDE_ARCH_X86_SSE4_2 1
|
||||
#endif
|
||||
#if defined(__AVX__)
|
||||
#define SIMDE_ARCH_X86_AVX 1
|
||||
#if !defined(SIMDE_ARCH_X86_SSE3)
|
||||
#define SIMDE_ARCH_X86_SSE3 1
|
||||
#endif
|
||||
#if !defined(SIMDE_ARCH_X86_SSE4_1)
|
||||
#define SIMDE_ARCH_X86_SSE4_1 1
|
||||
#endif
|
||||
#if !defined(SIMDE_ARCH_X86_SSE4_1)
|
||||
#define SIMDE_ARCH_X86_SSE4_2 1
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__AVX2__)
|
||||
#define SIMDE_ARCH_X86_AVX2 1
|
||||
#endif
|
||||
#if defined(__FMA__)
|
||||
#define SIMDE_ARCH_X86_FMA 1
|
||||
#if !defined(SIMDE_ARCH_X86_AVX)
|
||||
#define SIMDE_ARCH_X86_AVX 1
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__AVX512VP2INTERSECT__)
|
||||
#define SIMDE_ARCH_X86_AVX512VP2INTERSECT 1
|
||||
#endif
|
||||
#if defined(__AVX512VBMI__)
|
||||
#define SIMDE_ARCH_X86_AVX512VBMI 1
|
||||
#endif
|
||||
#if defined(__AVX512BW__)
|
||||
#define SIMDE_ARCH_X86_AVX512BW 1
|
||||
#endif
|
||||
#if defined(__AVX512CD__)
|
||||
#define SIMDE_ARCH_X86_AVX512CD 1
|
||||
#endif
|
||||
#if defined(__AVX512DQ__)
|
||||
#define SIMDE_ARCH_X86_AVX512DQ 1
|
||||
#endif
|
||||
#if defined(__AVX512F__)
|
||||
#define SIMDE_ARCH_X86_AVX512F 1
|
||||
#endif
|
||||
#if defined(__AVX512VL__)
|
||||
#define SIMDE_ARCH_X86_AVX512VL 1
|
||||
#endif
|
||||
#if defined(__GFNI__)
|
||||
#define SIMDE_ARCH_X86_GFNI 1
|
||||
#endif
|
||||
#if defined(__PCLMUL__)
|
||||
#define SIMDE_ARCH_X86_PCLMUL 1
|
||||
#endif
|
||||
#if defined(__VPCLMULQDQ__)
|
||||
#define SIMDE_ARCH_X86_VPCLMULQDQ 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Itanium
|
||||
<https://en.wikipedia.org/wiki/Itanium> */
|
||||
#if defined(__ia64__) || defined(_IA64) || defined(__IA64__) || \
|
||||
defined(__ia64) || defined(_M_IA64) || defined(__itanium__)
|
||||
#define SIMDE_ARCH_IA64 1
|
||||
#endif
|
||||
|
||||
/* Renesas M32R
|
||||
<https://en.wikipedia.org/wiki/M32R> */
|
||||
#if defined(__m32r__) || defined(__M32R__)
|
||||
#define SIMDE_ARCH_M32R
|
||||
#endif
|
||||
|
||||
/* Motorola 68000
|
||||
<https://en.wikipedia.org/wiki/Motorola_68000> */
|
||||
#if defined(__mc68060__) || defined(__MC68060__)
|
||||
#define SIMDE_ARCH_M68K 68060
|
||||
#elif defined(__mc68040__) || defined(__MC68040__)
|
||||
#define SIMDE_ARCH_M68K 68040
|
||||
#elif defined(__mc68030__) || defined(__MC68030__)
|
||||
#define SIMDE_ARCH_M68K 68030
|
||||
#elif defined(__mc68020__) || defined(__MC68020__)
|
||||
#define SIMDE_ARCH_M68K 68020
|
||||
#elif defined(__mc68010__) || defined(__MC68010__)
|
||||
#define SIMDE_ARCH_M68K 68010
|
||||
#elif defined(__mc68000__) || defined(__MC68000__)
|
||||
#define SIMDE_ARCH_M68K 68000
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_M68K)
|
||||
#define SIMDE_ARCH_M68K_CHECK(version) ((version) <= SIMDE_ARCH_M68K)
|
||||
#else
|
||||
#define SIMDE_ARCH_M68K_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* Xilinx MicroBlaze
|
||||
<https://en.wikipedia.org/wiki/MicroBlaze> */
|
||||
#if defined(__MICROBLAZE__) || defined(__microblaze__)
|
||||
#define SIMDE_ARCH_MICROBLAZE
|
||||
#endif
|
||||
|
||||
/* MIPS
|
||||
<https://en.wikipedia.org/wiki/MIPS_architecture> */
|
||||
#if defined(_MIPS_ISA_MIPS64R2)
|
||||
#define SIMDE_ARCH_MIPS 642
|
||||
#elif defined(_MIPS_ISA_MIPS64)
|
||||
#define SIMDE_ARCH_MIPS 640
|
||||
#elif defined(_MIPS_ISA_MIPS32R2)
|
||||
#define SIMDE_ARCH_MIPS 322
|
||||
#elif defined(_MIPS_ISA_MIPS32)
|
||||
#define SIMDE_ARCH_MIPS 320
|
||||
#elif defined(_MIPS_ISA_MIPS4)
|
||||
#define SIMDE_ARCH_MIPS 4
|
||||
#elif defined(_MIPS_ISA_MIPS3)
|
||||
#define SIMDE_ARCH_MIPS 3
|
||||
#elif defined(_MIPS_ISA_MIPS2)
|
||||
#define SIMDE_ARCH_MIPS 2
|
||||
#elif defined(_MIPS_ISA_MIPS1)
|
||||
#define SIMDE_ARCH_MIPS 1
|
||||
#elif defined(_MIPS_ISA_MIPS) || defined(__mips) || defined(__MIPS__)
|
||||
#define SIMDE_ARCH_MIPS 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_MIPS)
|
||||
#define SIMDE_ARCH_MIPS_CHECK(version) ((version) <= SIMDE_ARCH_MIPS)
|
||||
#else
|
||||
#define SIMDE_ARCH_MIPS_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
#if defined(__mips_loongson_mmi)
|
||||
#define SIMDE_ARCH_MIPS_LOONGSON_MMI 1
|
||||
#endif
|
||||
|
||||
/* Matsushita MN10300
|
||||
<https://en.wikipedia.org/wiki/MN103> */
|
||||
#if defined(__MN10300__) || defined(__mn10300__)
|
||||
#define SIMDE_ARCH_MN10300 1
|
||||
#endif
|
||||
|
||||
/* POWER
|
||||
<https://en.wikipedia.org/wiki/IBM_POWER_Instruction_Set_Architecture> */
|
||||
#if defined(_M_PPC)
|
||||
#define SIMDE_ARCH_POWER _M_PPC
|
||||
#elif defined(_ARCH_PWR9)
|
||||
#define SIMDE_ARCH_POWER 900
|
||||
#elif defined(_ARCH_PWR8)
|
||||
#define SIMDE_ARCH_POWER 800
|
||||
#elif defined(_ARCH_PWR7)
|
||||
#define SIMDE_ARCH_POWER 700
|
||||
#elif defined(_ARCH_PWR6)
|
||||
#define SIMDE_ARCH_POWER 600
|
||||
#elif defined(_ARCH_PWR5)
|
||||
#define SIMDE_ARCH_POWER 500
|
||||
#elif defined(_ARCH_PWR4)
|
||||
#define SIMDE_ARCH_POWER 400
|
||||
#elif defined(_ARCH_440) || defined(__ppc440__)
|
||||
#define SIMDE_ARCH_POWER 440
|
||||
#elif defined(_ARCH_450) || defined(__ppc450__)
|
||||
#define SIMDE_ARCH_POWER 450
|
||||
#elif defined(_ARCH_601) || defined(__ppc601__)
|
||||
#define SIMDE_ARCH_POWER 601
|
||||
#elif defined(_ARCH_603) || defined(__ppc603__)
|
||||
#define SIMDE_ARCH_POWER 603
|
||||
#elif defined(_ARCH_604) || defined(__ppc604__)
|
||||
#define SIMDE_ARCH_POWER 604
|
||||
#elif defined(_ARCH_605) || defined(__ppc605__)
|
||||
#define SIMDE_ARCH_POWER 605
|
||||
#elif defined(_ARCH_620) || defined(__ppc620__)
|
||||
#define SIMDE_ARCH_POWER 620
|
||||
#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || \
|
||||
defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) || \
|
||||
defined(__ppc)
|
||||
#define SIMDE_ARCH_POWER 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_POWER)
|
||||
#define SIMDE_ARCH_POWER_CHECK(version) ((version) <= SIMDE_ARCH_POWER)
|
||||
#else
|
||||
#define SIMDE_ARCH_POWER_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
#if defined(__ALTIVEC__)
|
||||
#define SIMDE_ARCH_POWER_ALTIVEC SIMDE_ARCH_POWER
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_POWER)
|
||||
#define SIMDE_ARCH_POWER_ALTIVEC_CHECK(version) ((version) <= SIMDE_ARCH_POWER)
|
||||
#else
|
||||
#define SIMDE_ARCH_POWER_ALTIVEC_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* SPARC
|
||||
<https://en.wikipedia.org/wiki/SPARC> */
|
||||
#if defined(__sparc_v9__) || defined(__sparcv9)
|
||||
#define SIMDE_ARCH_SPARC 9
|
||||
#elif defined(__sparc_v8__) || defined(__sparcv8)
|
||||
#define SIMDE_ARCH_SPARC 8
|
||||
#elif defined(__sparc_v7__) || defined(__sparcv7)
|
||||
#define SIMDE_ARCH_SPARC 7
|
||||
#elif defined(__sparc_v6__) || defined(__sparcv6)
|
||||
#define SIMDE_ARCH_SPARC 6
|
||||
#elif defined(__sparc_v5__) || defined(__sparcv5)
|
||||
#define SIMDE_ARCH_SPARC 5
|
||||
#elif defined(__sparc_v4__) || defined(__sparcv4)
|
||||
#define SIMDE_ARCH_SPARC 4
|
||||
#elif defined(__sparc_v3__) || defined(__sparcv3)
|
||||
#define SIMDE_ARCH_SPARC 3
|
||||
#elif defined(__sparc_v2__) || defined(__sparcv2)
|
||||
#define SIMDE_ARCH_SPARC 2
|
||||
#elif defined(__sparc_v1__) || defined(__sparcv1)
|
||||
#define SIMDE_ARCH_SPARC 1
|
||||
#elif defined(__sparc__) || defined(__sparc)
|
||||
#define SIMDE_ARCH_SPARC 1
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_SPARC)
|
||||
#define SIMDE_ARCH_SPARC_CHECK(version) ((version) <= SIMDE_ARCH_SPARC)
|
||||
#else
|
||||
#define SIMDE_ARCH_SPARC_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* SuperH
|
||||
<https://en.wikipedia.org/wiki/SuperH> */
|
||||
#if defined(__sh5__) || defined(__SH5__)
|
||||
#define SIMDE_ARCH_SUPERH 5
|
||||
#elif defined(__sh4__) || defined(__SH4__)
|
||||
#define SIMDE_ARCH_SUPERH 4
|
||||
#elif defined(__sh3__) || defined(__SH3__)
|
||||
#define SIMDE_ARCH_SUPERH 3
|
||||
#elif defined(__sh2__) || defined(__SH2__)
|
||||
#define SIMDE_ARCH_SUPERH 2
|
||||
#elif defined(__sh1__) || defined(__SH1__)
|
||||
#define SIMDE_ARCH_SUPERH 1
|
||||
#elif defined(__sh__) || defined(__SH__)
|
||||
#define SIMDE_ARCH_SUPERH 1
|
||||
#endif
|
||||
|
||||
/* IBM System z
|
||||
<https://en.wikipedia.org/wiki/IBM_System_z> */
|
||||
#if defined(__370__) || defined(__THW_370__) || defined(__s390__) || \
|
||||
defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH__)
|
||||
#define SIMDE_ARCH_SYSTEMZ
|
||||
#endif
|
||||
|
||||
/* TMS320 DSP
|
||||
<https://en.wikipedia.org/wiki/Texas_Instruments_TMS320> */
|
||||
#if defined(_TMS320C6740) || defined(__TMS320C6740__)
|
||||
#define SIMDE_ARCH_TMS320 6740
|
||||
#elif defined(_TMS320C6700_PLUS) || defined(__TMS320C6700_PLUS__)
|
||||
#define SIMDE_ARCH_TMS320 6701
|
||||
#elif defined(_TMS320C6700) || defined(__TMS320C6700__)
|
||||
#define SIMDE_ARCH_TMS320 6700
|
||||
#elif defined(_TMS320C6600) || defined(__TMS320C6600__)
|
||||
#define SIMDE_ARCH_TMS320 6600
|
||||
#elif defined(_TMS320C6400_PLUS) || defined(__TMS320C6400_PLUS__)
|
||||
#define SIMDE_ARCH_TMS320 6401
|
||||
#elif defined(_TMS320C6400) || defined(__TMS320C6400__)
|
||||
#define SIMDE_ARCH_TMS320 6400
|
||||
#elif defined(_TMS320C6200) || defined(__TMS320C6200__)
|
||||
#define SIMDE_ARCH_TMS320 6200
|
||||
#elif defined(_TMS320C55X) || defined(__TMS320C55X__)
|
||||
#define SIMDE_ARCH_TMS320 550
|
||||
#elif defined(_TMS320C54X) || defined(__TMS320C54X__)
|
||||
#define SIMDE_ARCH_TMS320 540
|
||||
#elif defined(_TMS320C28X) || defined(__TMS320C28X__)
|
||||
#define SIMDE_ARCH_TMS320 280
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_TMS320)
|
||||
#define SIMDE_ARCH_TMS320_CHECK(version) ((version) <= SIMDE_ARCH_TMS320)
|
||||
#else
|
||||
#define SIMDE_ARCH_TMS320_CHECK(version) (0)
|
||||
#endif
|
||||
|
||||
/* WebAssembly */
|
||||
#if defined(__wasm__)
|
||||
#define SIMDE_ARCH_WASM 1
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_ARCH_WASM) && defined(__wasm_simd128__)
|
||||
#define SIMDE_ARCH_WASM_SIMD128
|
||||
#endif
|
||||
|
||||
/* Xtensa
|
||||
<https://en.wikipedia.org/wiki/> */
|
||||
#if defined(__xtensa__) || defined(__XTENSA__)
|
||||
#define SIMDE_ARCH_XTENSA 1
|
||||
#endif
|
||||
|
||||
#endif /* !defined(SIMDE_ARCH_H) */
|
||||
@@ -1,918 +0,0 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2017-2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_COMMON_H)
|
||||
#define SIMDE_COMMON_H
|
||||
|
||||
#include "hedley.h"
|
||||
|
||||
#define SIMDE_VERSION_MAJOR 0
|
||||
#define SIMDE_VERSION_MINOR 7
|
||||
#define SIMDE_VERSION_MICRO 1
|
||||
#define SIMDE_VERSION \
|
||||
HEDLEY_VERSION_ENCODE(SIMDE_VERSION_MAJOR, SIMDE_VERSION_MINOR, \
|
||||
SIMDE_VERSION_MICRO)
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "simde-detect-clang.h"
|
||||
#include "simde-arch.h"
|
||||
#include "simde-features.h"
|
||||
#include "simde-diagnostic.h"
|
||||
#include "simde-math.h"
|
||||
#include "simde-constify.h"
|
||||
#include "simde-align.h"
|
||||
|
||||
/* In some situations, SIMDe has to make large performance sacrifices
|
||||
* for small increases in how faithfully it reproduces an API, but
|
||||
* only a relatively small number of users will actually need the API
|
||||
* to be completely accurate. The SIMDE_FAST_* options can be used to
|
||||
* disable these trade-offs.
|
||||
*
|
||||
* They can be enabled by passing -DSIMDE_FAST_MATH to the compiler, or
|
||||
* the individual defines (e.g., -DSIMDE_FAST_NANS) if you only want to
|
||||
* enable some optimizations. Using -ffast-math and/or
|
||||
* -ffinite-math-only will also enable the relevant options. If you
|
||||
* don't want that you can pass -DSIMDE_NO_FAST_* to disable them. */
|
||||
|
||||
/* Most programs avoid NaNs by never passing values which can result in
|
||||
* a NaN; for example, if you only pass non-negative values to the sqrt
|
||||
* functions, it won't generate a NaN. On some platforms, similar
|
||||
* functions handle NaNs differently; for example, the _mm_min_ps SSE
|
||||
* function will return 0.0 if you pass it (0.0, NaN), but the NEON
|
||||
* vminq_f32 function will return NaN. Making them behave like one
|
||||
* another is expensive; it requires generating a mask of all lanes
|
||||
* with NaNs, then performing the operation (e.g., vminq_f32), then
|
||||
* blending together the result with another vector using the mask.
|
||||
*
|
||||
* If you don't want SIMDe to worry about the differences between how
|
||||
* NaNs are handled on the two platforms, define this (or pass
|
||||
* -ffinite-math-only) */
|
||||
#if !defined(SIMDE_FAST_MATH) && !defined(SIMDE_NO_FAST_MATH) && \
|
||||
defined(__FAST_MATH__)
|
||||
#define SIMDE_FAST_MATH
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_FAST_NANS) && !defined(SIMDE_NO_FAST_NANS)
|
||||
#if defined(SIMDE_FAST_MATH)
|
||||
#define SIMDE_FAST_NANS
|
||||
#elif defined(__FINITE_MATH_ONLY__)
|
||||
#if __FINITE_MATH_ONLY__
|
||||
#define SIMDE_FAST_NANS
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Many functions are defined as using the current rounding mode
|
||||
* (i.e., the SIMD version of fegetround()) when converting to
|
||||
* an integer. For example, _mm_cvtpd_epi32. Unfortunately,
|
||||
* on some platforms (such as ARMv8+ where round-to-nearest is
|
||||
* always used, regardless of the FPSCR register) this means we
|
||||
* have to first query the current rounding mode, then choose
|
||||
* the proper function (rounnd
|
||||
, ceil, floor, etc.) */
|
||||
#if !defined(SIMDE_FAST_ROUND_MODE) && !defined(SIMDE_NO_FAST_ROUND_MODE) && \
|
||||
defined(SIMDE_FAST_MATH)
|
||||
#define SIMDE_FAST_ROUND_MODE
|
||||
#endif
|
||||
|
||||
/* This controls how ties are rounded. For example, does 10.5 round to
|
||||
* 10 or 11? IEEE 754 specifies round-towards-even, but ARMv7 (for
|
||||
* example) doesn't support it and it must be emulated (which is rather
|
||||
* slow). If you're okay with just using the default for whatever arch
|
||||
* you're on, you should definitely define this.
|
||||
*
|
||||
* Note that we don't use this macro to avoid correct implementations
|
||||
* in functions which are explicitly about rounding (such as vrnd* on
|
||||
* NEON, _mm_round_* on x86, etc.); it is only used for code where
|
||||
* rounding is a component in another function, and even then it isn't
|
||||
* usually a problem since such functions will use the current rounding
|
||||
* mode. */
|
||||
#if !defined(SIMDE_FAST_ROUND_TIES) && !defined(SIMDE_NO_FAST_ROUND_TIES) && \
|
||||
defined(SIMDE_FAST_MATH)
|
||||
#define SIMDE_FAST_ROUND_TIES
|
||||
#endif
|
||||
|
||||
/* For functions which convert from one type to another (mostly from
|
||||
* floating point to integer types), sometimes we need to do a range
|
||||
* check and potentially return a different result if the value
|
||||
* falls outside that range. Skipping this check can provide a
|
||||
* performance boost, at the expense of faithfulness to the API we're
|
||||
* emulating. */
|
||||
#if !defined(SIMDE_FAST_CONVERSION_RANGE) && \
|
||||
!defined(SIMDE_NO_FAST_CONVERSION_RANGE) && defined(SIMDE_FAST_MATH)
|
||||
#define SIMDE_FAST_CONVERSION_RANGE
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
|
||||
HEDLEY_TINYC_VERSION_CHECK(0, 9, 19) || \
|
||||
HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
|
||||
HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \
|
||||
HEDLEY_TI_CL6X_VERSION_CHECK(6, 1, 0) || \
|
||||
(HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) && !defined(__cplusplus)) || \
|
||||
HEDLEY_CRAY_VERSION_CHECK(8, 1, 0)
|
||||
#define SIMDE_CHECK_CONSTANT_(expr) (__builtin_constant_p(expr))
|
||||
#elif defined(__cplusplus) && (__cplusplus > 201703L)
|
||||
#include <type_traits>
|
||||
#define SIMDE_CHECK_CONSTANT_(expr) (std::is_constant_evaluated())
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_NO_CHECK_IMMEDIATE_CONSTANT)
|
||||
#if defined(SIMDE_CHECK_CONSTANT_) && \
|
||||
SIMDE_DETECT_CLANG_VERSION_CHECK(9, 0, 0) && \
|
||||
(!defined(__apple_build_version__) || \
|
||||
((__apple_build_version__ < 11000000) || \
|
||||
(__apple_build_version__ >= 12000000)))
|
||||
#define SIMDE_REQUIRE_CONSTANT(arg) \
|
||||
HEDLEY_REQUIRE_MSG(SIMDE_CHECK_CONSTANT_(arg), \
|
||||
"`" #arg "' must be constant")
|
||||
#else
|
||||
#define SIMDE_REQUIRE_CONSTANT(arg)
|
||||
#endif
|
||||
#else
|
||||
#define SIMDE_REQUIRE_CONSTANT(arg)
|
||||
#endif
|
||||
|
||||
#define SIMDE_REQUIRE_RANGE(arg, min, max) \
|
||||
HEDLEY_REQUIRE_MSG((((arg) >= (min)) && ((arg) <= (max))), \
|
||||
"'" #arg "' must be in [" #min ", " #max "]")
|
||||
|
||||
#define SIMDE_REQUIRE_CONSTANT_RANGE(arg, min, max) \
|
||||
SIMDE_REQUIRE_CONSTANT(arg) \
|
||||
SIMDE_REQUIRE_RANGE(arg, min, max)
|
||||
|
||||
/* A copy of HEDLEY_STATIC_ASSERT, except we don't define an empty
|
||||
* fallback if we can't find an implementation; instead we have to
|
||||
* check if SIMDE_STATIC_ASSERT is defined before using it. */
|
||||
#if !defined(__cplusplus) && \
|
||||
((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
|
||||
HEDLEY_HAS_FEATURE(c_static_assert) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(6, 0, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || defined(_Static_assert))
|
||||
#define SIMDE_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
|
||||
#elif (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
|
||||
HEDLEY_MSVC_VERSION_CHECK(16, 0, 0)
|
||||
#define SIMDE_STATIC_ASSERT(expr, message) \
|
||||
HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_( \
|
||||
static_assert(expr, message))
|
||||
#endif
|
||||
|
||||
#if (HEDLEY_HAS_ATTRIBUTE(may_alias) && !defined(HEDLEY_SUNPRO_VERSION)) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
|
||||
HEDLEY_IBM_VERSION_CHECK(13, 1, 0)
|
||||
#define SIMDE_MAY_ALIAS __attribute__((__may_alias__))
|
||||
#else
|
||||
#define SIMDE_MAY_ALIAS
|
||||
#endif
|
||||
|
||||
/* Lots of compilers support GCC-style vector extensions, but many
|
||||
don't support all the features. Define different macros depending
|
||||
on support for
|
||||
|
||||
* SIMDE_VECTOR - Declaring a vector.
|
||||
* SIMDE_VECTOR_OPS - basic operations (binary and unary).
|
||||
* SIMDE_VECTOR_NEGATE - negating a vector
|
||||
* SIMDE_VECTOR_SCALAR - For binary operators, the second argument
|
||||
can be a scalar, in which case the result is as if that scalar
|
||||
had been broadcast to all lanes of a vector.
|
||||
* SIMDE_VECTOR_SUBSCRIPT - Supports array subscript notation for
|
||||
extracting/inserting a single element.=
|
||||
|
||||
SIMDE_VECTOR can be assumed if any others are defined, the
|
||||
others are independent. */
|
||||
#if !defined(SIMDE_NO_VECTOR)
|
||||
#if HEDLEY_GCC_VERSION_CHECK(4, 8, 0)
|
||||
#define SIMDE_VECTOR(size) __attribute__((__vector_size__(size)))
|
||||
#define SIMDE_VECTOR_OPS
|
||||
#define SIMDE_VECTOR_NEGATE
|
||||
#define SIMDE_VECTOR_SCALAR
|
||||
#define SIMDE_VECTOR_SUBSCRIPT
|
||||
#elif HEDLEY_INTEL_VERSION_CHECK(16, 0, 0)
|
||||
#define SIMDE_VECTOR(size) __attribute__((__vector_size__(size)))
|
||||
#define SIMDE_VECTOR_OPS
|
||||
#define SIMDE_VECTOR_NEGATE
|
||||
/* ICC only supports SIMDE_VECTOR_SCALAR for constants */
|
||||
#define SIMDE_VECTOR_SUBSCRIPT
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 1, 0) || HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
|
||||
#define SIMDE_VECTOR(size) __attribute__((__vector_size__(size)))
|
||||
#define SIMDE_VECTOR_OPS
|
||||
#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 12, 0)
|
||||
#define SIMDE_VECTOR(size) __attribute__((__vector_size__(size)))
|
||||
#elif HEDLEY_HAS_ATTRIBUTE(vector_size)
|
||||
#define SIMDE_VECTOR(size) __attribute__((__vector_size__(size)))
|
||||
#define SIMDE_VECTOR_OPS
|
||||
#define SIMDE_VECTOR_NEGATE
|
||||
#define SIMDE_VECTOR_SUBSCRIPT
|
||||
#if SIMDE_DETECT_CLANG_VERSION_CHECK(5, 0, 0)
|
||||
#define SIMDE_VECTOR_SCALAR
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* GCC and clang have built-in functions to handle shuffling and
|
||||
converting of vectors, but the implementations are slightly
|
||||
different. This macro is just an abstraction over them. Note that
|
||||
elem_size is in bits but vec_size is in bytes. */
|
||||
#if !defined(SIMDE_NO_SHUFFLE_VECTOR) && defined(SIMDE_VECTOR_SUBSCRIPT)
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
/* We don't care about -Wvariadic-macros; all compilers that support
|
||||
* shufflevector/shuffle support them. */
|
||||
#if HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic")
|
||||
#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
|
||||
#endif
|
||||
#if HEDLEY_HAS_WARNING("-Wvariadic-macros") || HEDLEY_GCC_VERSION_CHECK(4, 0, 0)
|
||||
#pragma GCC diagnostic ignored "-Wvariadic-macros"
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
|
||||
#define SIMDE_SHUFFLE_VECTOR_(elem_size, vec_size, a, b, ...) \
|
||||
__builtin_shufflevector(a, b, __VA_ARGS__)
|
||||
#elif HEDLEY_GCC_HAS_BUILTIN(__builtin_shuffle, 4, 7, 0) && \
|
||||
!defined(__INTEL_COMPILER)
|
||||
#define SIMDE_SHUFFLE_VECTOR_(elem_size, vec_size, a, b, ...) \
|
||||
(__extension__({ \
|
||||
int##elem_size##_t SIMDE_VECTOR(vec_size) \
|
||||
simde_shuffle_ = {__VA_ARGS__}; \
|
||||
__builtin_shuffle(a, b, simde_shuffle_); \
|
||||
}))
|
||||
#endif
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#endif
|
||||
|
||||
/* TODO: this actually works on XL C/C++ without SIMDE_VECTOR_SUBSCRIPT
|
||||
but the code needs to be refactored a bit to take advantage. */
|
||||
#if !defined(SIMDE_NO_CONVERT_VECTOR) && defined(SIMDE_VECTOR_SUBSCRIPT)
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_convertvector) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(9, 0, 0)
|
||||
#if HEDLEY_GCC_VERSION_CHECK(9, 0, 0) && !HEDLEY_GCC_VERSION_CHECK(9, 3, 0)
|
||||
/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93557 */
|
||||
#define SIMDE_CONVERT_VECTOR_(to, from) \
|
||||
((to) = (__extension__({ \
|
||||
__typeof__(from) from_ = (from); \
|
||||
((void)from_); \
|
||||
__builtin_convertvector(from_, __typeof__(to)); \
|
||||
})))
|
||||
#else
|
||||
#define SIMDE_CONVERT_VECTOR_(to, from) \
|
||||
((to) = __builtin_convertvector((from), __typeof__(to)))
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Since we currently require SUBSCRIPT before using a vector in a
|
||||
union, we define these as dependencies of SUBSCRIPT. They are
|
||||
likely to disappear in the future, once SIMDe learns how to make
|
||||
use of vectors without using the union members. Do not use them
|
||||
in your code unless you're okay with it breaking when SIMDe
|
||||
changes. */
|
||||
#if defined(SIMDE_VECTOR_SUBSCRIPT)
|
||||
#if defined(SIMDE_VECTOR_OPS)
|
||||
#define SIMDE_VECTOR_SUBSCRIPT_OPS
|
||||
#endif
|
||||
#if defined(SIMDE_VECTOR_SCALAR)
|
||||
#define SIMDE_VECTOR_SUBSCRIPT_SCALAR
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ENABLE_OPENMP) && \
|
||||
((defined(_OPENMP) && (_OPENMP >= 201307L)) || \
|
||||
(defined(_OPENMP_SIMD) && (_OPENMP_SIMD >= 201307L)))
|
||||
#define SIMDE_ENABLE_OPENMP
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ENABLE_CILKPLUS) && \
|
||||
(defined(__cilk) || defined(HEDLEY_INTEL_VERSION))
|
||||
#define SIMDE_ENABLE_CILKPLUS
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_ENABLE_OPENMP)
|
||||
#define SIMDE_VECTORIZE HEDLEY_PRAGMA(omp simd)
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(omp simd safelen(l))
|
||||
#if defined(__clang__)
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
_Pragma("clang diagnostic ignored \"-Wsign-conversion\"") \
|
||||
HEDLEY_PRAGMA(omp simd reduction(r)) HEDLEY_DIAGNOSTIC_POP
|
||||
#else
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) HEDLEY_PRAGMA(omp simd reduction(r))
|
||||
#endif
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a) HEDLEY_PRAGMA(omp simd aligned(a))
|
||||
#elif defined(SIMDE_ENABLE_CILKPLUS)
|
||||
#define SIMDE_VECTORIZE HEDLEY_PRAGMA(simd)
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(simd vectorlength(l))
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) HEDLEY_PRAGMA(simd reduction(r))
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a) HEDLEY_PRAGMA(simd aligned(a))
|
||||
#elif defined(__clang__) && !defined(HEDLEY_IBM_VERSION)
|
||||
#define SIMDE_VECTORIZE HEDLEY_PRAGMA(clang loop vectorize(enable))
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(clang loop vectorize_width(l))
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a)
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 9, 0)
|
||||
#define SIMDE_VECTORIZE HEDLEY_PRAGMA(GCC ivdep)
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l) SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a)
|
||||
#elif HEDLEY_CRAY_VERSION_CHECK(5, 0, 0)
|
||||
#define SIMDE_VECTORIZE HEDLEY_PRAGMA(_CRI ivdep)
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l) SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r) SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a)
|
||||
#else
|
||||
#define SIMDE_VECTORIZE
|
||||
#define SIMDE_VECTORIZE_SAFELEN(l)
|
||||
#define SIMDE_VECTORIZE_REDUCTION(r)
|
||||
#define SIMDE_VECTORIZE_ALIGNED(a)
|
||||
#endif
|
||||
|
||||
#define SIMDE_MASK_NZ_(v, mask) (((v) & (mask)) | !((v) & (mask)))
|
||||
|
||||
/* Intended for checking coverage, you should never use this in
|
||||
production. */
|
||||
#if defined(SIMDE_NO_INLINE)
|
||||
#define SIMDE_FUNCTION_ATTRIBUTES HEDLEY_NEVER_INLINE static
|
||||
#else
|
||||
#define SIMDE_FUNCTION_ATTRIBUTES HEDLEY_ALWAYS_INLINE static
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_ATTRIBUTE(unused) || HEDLEY_GCC_VERSION_CHECK(2, 95, 0)
|
||||
#define SIMDE_FUNCTION_POSSIBLY_UNUSED_ __attribute__((__unused__))
|
||||
#else
|
||||
#define SIMDE_FUNCTION_POSSIBLY_UNUSED_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wused-but-marked-unused")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED \
|
||||
_Pragma("clang diagnostic ignored \"-Wused-but-marked-unused\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#define SIMDE_BEGIN_DECLS_ \
|
||||
HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(disable : 4996 4204)) \
|
||||
HEDLEY_BEGIN_C_DECLS
|
||||
#define SIMDE_END_DECLS_ HEDLEY_DIAGNOSTIC_POP HEDLEY_END_C_DECLS
|
||||
#else
|
||||
#define SIMDE_BEGIN_DECLS_ \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED \
|
||||
HEDLEY_BEGIN_C_DECLS
|
||||
#define SIMDE_END_DECLS_ \
|
||||
HEDLEY_END_C_DECLS \
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#endif
|
||||
|
||||
#if defined(__SIZEOF_INT128__)
|
||||
#define SIMDE_HAVE_INT128_
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_PEDANTIC_
|
||||
typedef __int128 simde_int128;
|
||||
typedef unsigned __int128 simde_uint128;
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ENDIAN_LITTLE)
|
||||
#define SIMDE_ENDIAN_LITTLE 1234
|
||||
#endif
|
||||
#if !defined(SIMDE_ENDIAN_BIG)
|
||||
#define SIMDE_ENDIAN_BIG 4321
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ENDIAN_ORDER)
|
||||
/* GCC (and compilers masquerading as GCC) define __BYTE_ORDER__. */
|
||||
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
|
||||
(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
|
||||
(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
/* TI defines _BIG_ENDIAN or _LITTLE_ENDIAN */
|
||||
#elif defined(_BIG_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
#elif defined(_LITTLE_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
/* We know the endianness of some common architectures. Common
|
||||
* architectures not listed (ARM, POWER, MIPS, etc.) here are
|
||||
* bi-endian. */
|
||||
#elif defined(__amd64) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(__s390x__) || defined(__zarch__)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
/* Looks like we'll have to rely on the platform. If we're missing a
|
||||
* platform, please let us know. */
|
||||
#elif defined(_WIN32)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(sun) || defined(__sun) /* Solaris */
|
||||
#include <sys/byteorder.h>
|
||||
#if defined(_LITTLE_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(_BIG_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
#endif
|
||||
#elif defined(__APPLE__)
|
||||
#include <libkern/OSByteOrder.h>
|
||||
#if defined(__LITTLE_ENDIAN__)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(__BIG_ENDIAN__)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
#endif
|
||||
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
|
||||
defined(__bsdi__) || defined(__DragonFly__) || defined(BSD)
|
||||
#include <machine/endian.h>
|
||||
#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
#endif
|
||||
#elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__)
|
||||
#include <endian.h>
|
||||
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
|
||||
(__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_LITTLE
|
||||
#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
|
||||
(__BYTE_ORDER == __BIG_ENDIAN)
|
||||
#define SIMDE_ENDIAN_ORDER SIMDE_ENDIAN_BIG
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_bswap64) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(4, 3, 0) || \
|
||||
HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \
|
||||
HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
|
||||
#define simde_bswap64(v) __builtin_bswap64(v)
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0)
|
||||
#define simde_bswap64(v) _byteswap_uint64(v)
|
||||
#else
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
uint64_t simde_bswap64(uint64_t v)
|
||||
{
|
||||
return ((v & (((uint64_t)0xff) << 56)) >> 56) |
|
||||
((v & (((uint64_t)0xff) << 48)) >> 40) |
|
||||
((v & (((uint64_t)0xff) << 40)) >> 24) |
|
||||
((v & (((uint64_t)0xff) << 32)) >> 8) |
|
||||
((v & (((uint64_t)0xff) << 24)) << 8) |
|
||||
((v & (((uint64_t)0xff) << 16)) << 24) |
|
||||
((v & (((uint64_t)0xff) << 8)) << 40) |
|
||||
((v & (((uint64_t)0xff))) << 56);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ENDIAN_ORDER)
|
||||
#error Unknown byte order; please file a bug
|
||||
#else
|
||||
#if SIMDE_ENDIAN_ORDER == SIMDE_ENDIAN_LITTLE
|
||||
#define simde_endian_bswap64_be(value) simde_bswap64(value)
|
||||
#define simde_endian_bswap64_le(value) (value)
|
||||
#elif SIMDE_ENDIAN_ORDER == SIMDE_ENDIAN_BIG
|
||||
#define simde_endian_bswap64_be(value) (value)
|
||||
#define simde_endian_bswap64_le(value) simde_bswap64(value)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* TODO: we should at least make an attempt to detect the correct
|
||||
types for simde_float32/float64 instead of just assuming float and
|
||||
double. */
|
||||
|
||||
#if !defined(SIMDE_FLOAT32_TYPE)
|
||||
#define SIMDE_FLOAT32_TYPE float
|
||||
#define SIMDE_FLOAT32_C(value) value##f
|
||||
#else
|
||||
#define SIMDE_FLOAT32_C(value) ((SIMDE_FLOAT32_TYPE)value)
|
||||
#endif
|
||||
typedef SIMDE_FLOAT32_TYPE simde_float32;
|
||||
|
||||
#if !defined(SIMDE_FLOAT64_TYPE)
|
||||
#define SIMDE_FLOAT64_TYPE double
|
||||
#define SIMDE_FLOAT64_C(value) value
|
||||
#else
|
||||
#define SIMDE_FLOAT32_C(value) ((SIMDE_FLOAT64_TYPE)value)
|
||||
#endif
|
||||
typedef SIMDE_FLOAT64_TYPE simde_float64;
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wbad-function-cast")
|
||||
#define SIMDE_CONVERT_FTOI(T, v) \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
_Pragma("clang diagnostic ignored \"-Wbad-function-cast\"") \
|
||||
HEDLEY_STATIC_CAST(T, (v)) HEDLEY_DIAGNOSTIC_POP
|
||||
#else
|
||||
#define SIMDE_CONVERT_FTOI(T, v) ((T)(v))
|
||||
#endif
|
||||
|
||||
/* TODO: detect compilers which support this outside of C11 mode */
|
||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
||||
#define SIMDE_CHECKED_REINTERPRET_CAST(to, from, value) \
|
||||
_Generic((value), to \
|
||||
: (value), default \
|
||||
: (_Generic((value), from \
|
||||
: ((to)(value)))))
|
||||
#define SIMDE_CHECKED_STATIC_CAST(to, from, value) \
|
||||
_Generic((value), to \
|
||||
: (value), default \
|
||||
: (_Generic((value), from \
|
||||
: ((to)(value)))))
|
||||
#else
|
||||
#define SIMDE_CHECKED_REINTERPRET_CAST(to, from, value) \
|
||||
HEDLEY_REINTERPRET_CAST(to, value)
|
||||
#define SIMDE_CHECKED_STATIC_CAST(to, from, value) HEDLEY_STATIC_CAST(to, value)
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wfloat-equal")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL \
|
||||
_Pragma("clang diagnostic ignored \"-Wfloat-equal\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(3, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL \
|
||||
_Pragma("GCC diagnostic ignored \"-Wfloat-equal\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL
|
||||
#endif
|
||||
|
||||
/* Some functions can trade accuracy for speed. For those functions
|
||||
you can control the trade-off using this macro. Possible values:
|
||||
|
||||
0: prefer speed
|
||||
1: reasonable trade-offs
|
||||
2: prefer accuracy */
|
||||
#if !defined(SIMDE_ACCURACY_PREFERENCE)
|
||||
#define SIMDE_ACCURACY_PREFERENCE 1
|
||||
#endif
|
||||
|
||||
#if defined(__STDC_HOSTED__)
|
||||
#define SIMDE_STDC_HOSTED __STDC_HOSTED__
|
||||
#else
|
||||
#if defined(HEDLEY_PGI_VERSION) || defined(HEDLEY_MSVC_VERSION)
|
||||
#define SIMDE_STDC_HOSTED 1
|
||||
#else
|
||||
#define SIMDE_STDC_HOSTED 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Try to deal with environments without a standard library. */
|
||||
#if !defined(simde_memcpy)
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_memcpy)
|
||||
#define simde_memcpy(dest, src, n) __builtin_memcpy(dest, src, n)
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(simde_memset)
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_memset)
|
||||
#define simde_memset(s, c, n) __builtin_memset(s, c, n)
|
||||
#endif
|
||||
#endif
|
||||
#if !defined(simde_memcmp)
|
||||
#if HEDLEY_HAS_BUILTIN(__builtin_memcmp)
|
||||
#define simde_memcmp(s1, s2, n) __builtin_memcmp(s1, s2, n)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(simde_memcpy) || !defined(simde_memset) || !defined(simde_memcmp)
|
||||
#if !defined(SIMDE_NO_STRING_H)
|
||||
#if defined(__has_include)
|
||||
#if !__has_include(<string.h>)
|
||||
#define SIMDE_NO_STRING_H
|
||||
#endif
|
||||
#elif (SIMDE_STDC_HOSTED == 0)
|
||||
#define SIMDE_NO_STRING_H
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_NO_STRING_H)
|
||||
#include <string.h>
|
||||
#if !defined(simde_memcpy)
|
||||
#define simde_memcpy(dest, src, n) memcpy(dest, src, n)
|
||||
#endif
|
||||
#if !defined(simde_memset)
|
||||
#define simde_memset(s, c, n) memset(s, c, n)
|
||||
#endif
|
||||
#if !defined(simde_memcmp)
|
||||
#define simde_memcmp(s1, s2, n) memcmp(s1, s2, n)
|
||||
#endif
|
||||
#else
|
||||
/* These are meant to be portable, not fast. If you're hitting them you
|
||||
* should think about providing your own (by defining the simde_memcpy
|
||||
* macro prior to including any SIMDe files) or submitting a patch to
|
||||
* SIMDe so we can detect your system-provided memcpy/memset, like by
|
||||
* adding your compiler to the checks for __builtin_memcpy and/or
|
||||
* __builtin_memset. */
|
||||
#if !defined(simde_memcpy)
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void simde_memcpy_(void *dest, const void *src, size_t len)
|
||||
{
|
||||
char *dest_ = HEDLEY_STATIC_CAST(char *, dest);
|
||||
char *src_ = HEDLEY_STATIC_CAST(const char *, src);
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
dest_[i] = src_[i];
|
||||
}
|
||||
}
|
||||
#define simde_memcpy(dest, src, n) simde_memcpy_(dest, src, n)
|
||||
#endif
|
||||
|
||||
#if !defined(simde_memset)
|
||||
SIMDE_FUNCTION_ATTRIBUTES
|
||||
void simde_memset_(void *s, int c, size_t len)
|
||||
{
|
||||
char *s_ = HEDLEY_STATIC_CAST(char *, s);
|
||||
char c_ = HEDLEY_STATIC_CAST(char, c);
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
s_[i] = c_[i];
|
||||
}
|
||||
}
|
||||
#define simde_memset(s, c, n) simde_memset_(s, c, n)
|
||||
#endif
|
||||
|
||||
#if !defined(simde_memcmp)
|
||||
SIMDE_FUCTION_ATTRIBUTES
|
||||
int simde_memcmp_(const void *s1, const void *s2, size_t n)
|
||||
{
|
||||
unsigned char *s1_ = HEDLEY_STATIC_CAST(unsigned char *, s1);
|
||||
unsigned char *s2_ = HEDLEY_STATIC_CAST(unsigned char *, s2);
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if (s1_[i] != s2_[i]) {
|
||||
return (int)(s1_[i] - s2_[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#define simde_memcmp(s1, s2, n) simde_memcmp_(s1, s2, n)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(FE_ALL_EXCEPT)
|
||||
#define SIMDE_HAVE_FENV_H
|
||||
#elif defined(__has_include)
|
||||
#if __has_include(<fenv.h>)
|
||||
#include <fenv.h>
|
||||
#define SIMDE_HAVE_FENV_H
|
||||
#endif
|
||||
#elif SIMDE_STDC_HOSTED == 1
|
||||
#include <fenv.h>
|
||||
#define SIMDE_HAVE_FENV_H
|
||||
#endif
|
||||
|
||||
#if defined(EXIT_FAILURE)
|
||||
#define SIMDE_HAVE_STDLIB_H
|
||||
#elif defined(__has_include)
|
||||
#if __has_include(<stdlib.h>)
|
||||
#include <stdlib.h>
|
||||
#define SIMDE_HAVE_STDLIB_H
|
||||
#endif
|
||||
#elif SIMDE_STDC_HOSTED == 1
|
||||
#include <stdlib.h>
|
||||
#define SIMDE_HAVE_STDLIB_H
|
||||
#endif
|
||||
|
||||
#if defined(__has_include)
|
||||
#if defined(__cplusplus) && (__cplusplus >= 201103L) && __has_include(<cfenv>)
|
||||
#include <cfenv>
|
||||
#elif __has_include(<fenv.h>)
|
||||
#include <fenv.h>
|
||||
#endif
|
||||
#if __has_include(<stdlib.h>)
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#elif SIMDE_STDC_HOSTED == 1
|
||||
#include <stdlib.h>
|
||||
#include <fenv.h>
|
||||
#endif
|
||||
|
||||
#include "check.h"
|
||||
|
||||
/* GCC/clang have a bunch of functionality in builtins which we would
|
||||
* like to access, but the suffixes indicate whether the operate on
|
||||
* int, long, or long long, not fixed width types (e.g., int32_t).
|
||||
* we use these macros to attempt to map from fixed-width to the
|
||||
* names GCC uses. Note that you should still cast the input(s) and
|
||||
* return values (to/from SIMDE_BUILTIN_TYPE_*_) since often even if
|
||||
* types are the same size they may not be compatible according to the
|
||||
* compiler. For example, on x86 long and long lonsg are generally
|
||||
* both 64 bits, but platforms vary on whether an int64_t is mapped
|
||||
* to a long or long long. */
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_
|
||||
|
||||
#if (INT8_MAX == INT_MAX) && (INT8_MIN == INT_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_8_
|
||||
#define SIMDE_BUILTIN_TYPE_8_ int
|
||||
#elif (INT8_MAX == LONG_MAX) && (INT8_MIN == LONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_8_ l
|
||||
#define SIMDE_BUILTIN_TYPE_8_ long
|
||||
#elif (INT8_MAX == LLONG_MAX) && (INT8_MIN == LLONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_8_ ll
|
||||
#define SIMDE_BUILTIN_TYPE_8_ long long
|
||||
#endif
|
||||
|
||||
#if (INT16_MAX == INT_MAX) && (INT16_MIN == INT_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_16_
|
||||
#define SIMDE_BUILTIN_TYPE_16_ int
|
||||
#elif (INT16_MAX == LONG_MAX) && (INT16_MIN == LONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_16_ l
|
||||
#define SIMDE_BUILTIN_TYPE_16_ long
|
||||
#elif (INT16_MAX == LLONG_MAX) && (INT16_MIN == LLONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_16_ ll
|
||||
#define SIMDE_BUILTIN_TYPE_16_ long long
|
||||
#endif
|
||||
|
||||
#if (INT32_MAX == INT_MAX) && (INT32_MIN == INT_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_32_
|
||||
#define SIMDE_BUILTIN_TYPE_32_ int
|
||||
#elif (INT32_MAX == LONG_MAX) && (INT32_MIN == LONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_32_ l
|
||||
#define SIMDE_BUILTIN_TYPE_32_ long
|
||||
#elif (INT32_MAX == LLONG_MAX) && (INT32_MIN == LLONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_32_ ll
|
||||
#define SIMDE_BUILTIN_TYPE_32_ long long
|
||||
#endif
|
||||
|
||||
#if (INT64_MAX == INT_MAX) && (INT64_MIN == INT_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_64_
|
||||
#define SIMDE_BUILTIN_TYPE_64_ int
|
||||
#elif (INT64_MAX == LONG_MAX) && (INT64_MIN == LONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_64_ l
|
||||
#define SIMDE_BUILTIN_TYPE_64_ long
|
||||
#elif (INT64_MAX == LLONG_MAX) && (INT64_MIN == LLONG_MIN)
|
||||
#define SIMDE_BUILTIN_SUFFIX_64_ ll
|
||||
#define SIMDE_BUILTIN_TYPE_64_ long long
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_BUILTIN_SUFFIX_8_)
|
||||
#define SIMDE_BUILTIN_8_(name) \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_8_)
|
||||
#define SIMDE_BUILTIN_HAS_8_(name) \
|
||||
HEDLEY_HAS_BUILTIN( \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_8_))
|
||||
#else
|
||||
#define SIMDE_BUILTIN_HAS_8_(name) 0
|
||||
#endif
|
||||
#if defined(SIMDE_BUILTIN_SUFFIX_16_)
|
||||
#define SIMDE_BUILTIN_16_(name) \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_16_)
|
||||
#define SIMDE_BUILTIN_HAS_16_(name) \
|
||||
HEDLEY_HAS_BUILTIN( \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_16_))
|
||||
#else
|
||||
#define SIMDE_BUILTIN_HAS_16_(name) 0
|
||||
#endif
|
||||
#if defined(SIMDE_BUILTIN_SUFFIX_32_)
|
||||
#define SIMDE_BUILTIN_32_(name) \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_32_)
|
||||
#define SIMDE_BUILTIN_HAS_32_(name) \
|
||||
HEDLEY_HAS_BUILTIN( \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_32_))
|
||||
#else
|
||||
#define SIMDE_BUILTIN_HAS_32_(name) 0
|
||||
#endif
|
||||
#if defined(SIMDE_BUILTIN_SUFFIX_64_)
|
||||
#define SIMDE_BUILTIN_64_(name) \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_64_)
|
||||
#define SIMDE_BUILTIN_HAS_64_(name) \
|
||||
HEDLEY_HAS_BUILTIN( \
|
||||
HEDLEY_CONCAT3(__builtin_, name, SIMDE_BUILTIN_SUFFIX_64_))
|
||||
#else
|
||||
#define SIMDE_BUILTIN_HAS_64_(name) 0
|
||||
#endif
|
||||
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
/* Sometimes we run into problems with specific versions of compilers
|
||||
which make the native versions unusable for us. Often this is due
|
||||
to missing functions, sometimes buggy implementations, etc. These
|
||||
macros are how we check for specific bugs. As they are fixed we'll
|
||||
start only defining them for problematic compiler versions. */
|
||||
|
||||
#if !defined(SIMDE_IGNORE_COMPILER_BUGS)
|
||||
#if defined(HEDLEY_GCC_VERSION)
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(4, 9, 0)
|
||||
#define SIMDE_BUG_GCC_REV_208793
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(5, 0, 0)
|
||||
#define SIMDE_BUG_GCC_BAD_MM_SRA_EPI32 /* TODO: find relevant bug or commit */
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(4, 6, 0)
|
||||
#define SIMDE_BUG_GCC_BAD_MM_EXTRACT_EPI8 /* TODO: find relevant bug or commit */
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(8, 0, 0)
|
||||
#define SIMDE_BUG_GCC_REV_247851
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(10, 0, 0)
|
||||
#define SIMDE_BUG_GCC_REV_274313
|
||||
#define SIMDE_BUG_GCC_91341
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(9, 0, 0) && defined(SIMDE_ARCH_AARCH64)
|
||||
#define SIMDE_BUG_GCC_ARM_SHIFT_SCALAR
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_X86) && !defined(SIMDE_ARCH_AMD64)
|
||||
#define SIMDE_BUG_GCC_94482
|
||||
#endif
|
||||
#if (defined(SIMDE_ARCH_X86) && !defined(SIMDE_ARCH_AMD64)) || \
|
||||
defined(SIMDE_ARCH_SYSTEMZ)
|
||||
#define SIMDE_BUG_GCC_53784
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_X86) || defined(SIMDE_ARCH_AMD64)
|
||||
#if HEDLEY_GCC_VERSION_CHECK(4, 3, 0) /* -Wsign-conversion */
|
||||
#define SIMDE_BUG_GCC_95144
|
||||
#endif
|
||||
#endif
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(9, 4, 0) && defined(SIMDE_ARCH_AARCH64)
|
||||
#define SIMDE_BUG_GCC_94488
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_ARM)
|
||||
#define SIMDE_BUG_GCC_95399
|
||||
#define SIMDE_BUG_GCC_95471
|
||||
#elif defined(SIMDE_ARCH_POWER)
|
||||
#define SIMDE_BUG_GCC_95227
|
||||
#define SIMDE_BUG_GCC_95782
|
||||
#elif defined(SIMDE_ARCH_X86) || defined(SIMDE_ARCH_AMD64)
|
||||
#if !HEDLEY_GCC_VERSION_CHECK(10, 2, 0) && !defined(__OPTIMIZE__)
|
||||
#define SIMDE_BUG_GCC_96174
|
||||
#endif
|
||||
#endif
|
||||
#define SIMDE_BUG_GCC_95399
|
||||
#elif defined(__clang__)
|
||||
#if defined(SIMDE_ARCH_AARCH64)
|
||||
#define SIMDE_BUG_CLANG_45541
|
||||
#define SIMDE_BUG_CLANG_46844
|
||||
#define SIMDE_BUG_CLANG_48257
|
||||
#if SIMDE_DETECT_CLANG_VERSION_CHECK(10, 0, 0) && \
|
||||
SIMDE_DETECT_CLANG_VERSION_NOT(11, 0, 0)
|
||||
#define SIMDE_BUG_CLANG_BAD_VI64_OPS
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_POWER)
|
||||
#define SIMDE_BUG_CLANG_46770
|
||||
#endif
|
||||
#if defined(_ARCH_PWR9) && !SIMDE_DETECT_CLANG_VERSION_CHECK(12, 0, 0) && \
|
||||
!defined(__OPTIMIZE__)
|
||||
#define SIMDE_BUG_CLANG_POWER9_16x4_BAD_SHIFT
|
||||
#endif
|
||||
#if defined(SIMDE_ARCH_X86) || defined(SIMDE_ARCH_AMD64)
|
||||
#if HEDLEY_HAS_WARNING("-Wsign-conversion") && \
|
||||
SIMDE_DETECT_CLANG_VERSION_NOT(11, 0, 0)
|
||||
#define SIMDE_BUG_CLANG_45931
|
||||
#endif
|
||||
#if HEDLEY_HAS_WARNING("-Wvector-conversion") && \
|
||||
SIMDE_DETECT_CLANG_VERSION_NOT(11, 0, 0)
|
||||
#define SIMDE_BUG_CLANG_44589
|
||||
#endif
|
||||
#endif
|
||||
#define SIMDE_BUG_CLANG_45959
|
||||
#elif defined(HEDLEY_MSVC_VERSION)
|
||||
#if defined(SIMDE_ARCH_X86)
|
||||
#define SIMDE_BUG_MSVC_ROUND_EXTRACT
|
||||
#endif
|
||||
#elif defined(HEDLEY_INTEL_VERSION)
|
||||
#define SIMDE_BUG_INTEL_857088
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* GCC and Clang both have the same issue:
|
||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95144
|
||||
* https://bugs.llvm.org/show_bug.cgi?id=45931
|
||||
* This is just an easy way to work around it.
|
||||
*/
|
||||
#if (HEDLEY_HAS_WARNING("-Wsign-conversion") && \
|
||||
SIMDE_DETECT_CLANG_VERSION_NOT(11, 0, 0)) || \
|
||||
HEDLEY_GCC_VERSION_CHECK(4, 3, 0)
|
||||
#define SIMDE_BUG_IGNORE_SIGN_CONVERSION(expr) \
|
||||
(__extension__({ \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
HEDLEY_DIAGNOSTIC_POP \
|
||||
_Pragma("GCC diagnostic ignored \"-Wsign-conversion\"") __typeof__(expr) \
|
||||
simde_bug_ignore_sign_conversion_v_ = (expr); \
|
||||
HEDLEY_DIAGNOSTIC_PUSH \
|
||||
simde_bug_ignore_sign_conversion_v_; \
|
||||
}))
|
||||
#else
|
||||
#define SIMDE_BUG_IGNORE_SIGN_CONVERSION(expr) (expr)
|
||||
#endif
|
||||
|
||||
#endif /* !defined(SIMDE_COMMON_H) */
|
||||
@@ -1,925 +0,0 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
/* Constify macros. For internal use only.
|
||||
*
|
||||
* These are used to make it possible to call a function which takes
|
||||
* an Integer Constant Expression (ICE) using a compile time constant.
|
||||
* Technically it would also be possible to use a value not trivially
|
||||
* known by the compiler, but there would be a siginficant performance
|
||||
* hit (a switch switch is used).
|
||||
*
|
||||
* The basic idea is pretty simple; we just emit a do while loop which
|
||||
* contains a switch with a case for every possible value of the
|
||||
* constant.
|
||||
*
|
||||
* As long as the value you pass to the function in constant, pretty
|
||||
* much any copmiler shouldn't have a problem generating exactly the
|
||||
* same code as if you had used an ICE.
|
||||
*
|
||||
* This is intended to be used in the SIMDe implementations of
|
||||
* functions the compilers require to be an ICE, but the other benefit
|
||||
* is that if we also disable the warnings from
|
||||
* SIMDE_REQUIRE_CONSTANT_RANGE we can actually just allow the tests
|
||||
* to use non-ICE parameters
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_CONSTIFY_H)
|
||||
#define SIMDE_CONSTIFY_H
|
||||
|
||||
#include "simde-diagnostic.h"
|
||||
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_
|
||||
SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_
|
||||
|
||||
#define SIMDE_CONSTIFY_2_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_4_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
result = func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
result = func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_8_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
result = func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
result = func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
result = func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
result = func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
result = func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
result = func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_16_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
result = func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
result = func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
result = func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
result = func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
result = func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
result = func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
result = func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
result = func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
result = func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
result = func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
result = func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
result = func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
result = func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
result = func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_32_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
result = func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
result = func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
result = func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
result = func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
result = func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
result = func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
result = func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
result = func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
result = func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
result = func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
result = func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
result = func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
result = func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
result = func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
result = func_name(__VA_ARGS__, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
result = func_name(__VA_ARGS__, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
result = func_name(__VA_ARGS__, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
result = func_name(__VA_ARGS__, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
result = func_name(__VA_ARGS__, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
result = func_name(__VA_ARGS__, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
result = func_name(__VA_ARGS__, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
result = func_name(__VA_ARGS__, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
result = func_name(__VA_ARGS__, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
result = func_name(__VA_ARGS__, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
result = func_name(__VA_ARGS__, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
result = func_name(__VA_ARGS__, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
result = func_name(__VA_ARGS__, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
result = func_name(__VA_ARGS__, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
result = func_name(__VA_ARGS__, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
result = func_name(__VA_ARGS__, 31); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_64_(func_name, result, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
result = func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
result = func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
result = func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
result = func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
result = func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
result = func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
result = func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
result = func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
result = func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
result = func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
result = func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
result = func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
result = func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
result = func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
result = func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
result = func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
result = func_name(__VA_ARGS__, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
result = func_name(__VA_ARGS__, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
result = func_name(__VA_ARGS__, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
result = func_name(__VA_ARGS__, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
result = func_name(__VA_ARGS__, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
result = func_name(__VA_ARGS__, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
result = func_name(__VA_ARGS__, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
result = func_name(__VA_ARGS__, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
result = func_name(__VA_ARGS__, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
result = func_name(__VA_ARGS__, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
result = func_name(__VA_ARGS__, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
result = func_name(__VA_ARGS__, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
result = func_name(__VA_ARGS__, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
result = func_name(__VA_ARGS__, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
result = func_name(__VA_ARGS__, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
result = func_name(__VA_ARGS__, 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
result = func_name(__VA_ARGS__, 32); \
|
||||
break; \
|
||||
case 33: \
|
||||
result = func_name(__VA_ARGS__, 33); \
|
||||
break; \
|
||||
case 34: \
|
||||
result = func_name(__VA_ARGS__, 34); \
|
||||
break; \
|
||||
case 35: \
|
||||
result = func_name(__VA_ARGS__, 35); \
|
||||
break; \
|
||||
case 36: \
|
||||
result = func_name(__VA_ARGS__, 36); \
|
||||
break; \
|
||||
case 37: \
|
||||
result = func_name(__VA_ARGS__, 37); \
|
||||
break; \
|
||||
case 38: \
|
||||
result = func_name(__VA_ARGS__, 38); \
|
||||
break; \
|
||||
case 39: \
|
||||
result = func_name(__VA_ARGS__, 39); \
|
||||
break; \
|
||||
case 40: \
|
||||
result = func_name(__VA_ARGS__, 40); \
|
||||
break; \
|
||||
case 41: \
|
||||
result = func_name(__VA_ARGS__, 41); \
|
||||
break; \
|
||||
case 42: \
|
||||
result = func_name(__VA_ARGS__, 42); \
|
||||
break; \
|
||||
case 43: \
|
||||
result = func_name(__VA_ARGS__, 43); \
|
||||
break; \
|
||||
case 44: \
|
||||
result = func_name(__VA_ARGS__, 44); \
|
||||
break; \
|
||||
case 45: \
|
||||
result = func_name(__VA_ARGS__, 45); \
|
||||
break; \
|
||||
case 46: \
|
||||
result = func_name(__VA_ARGS__, 46); \
|
||||
break; \
|
||||
case 47: \
|
||||
result = func_name(__VA_ARGS__, 47); \
|
||||
break; \
|
||||
case 48: \
|
||||
result = func_name(__VA_ARGS__, 48); \
|
||||
break; \
|
||||
case 49: \
|
||||
result = func_name(__VA_ARGS__, 49); \
|
||||
break; \
|
||||
case 50: \
|
||||
result = func_name(__VA_ARGS__, 50); \
|
||||
break; \
|
||||
case 51: \
|
||||
result = func_name(__VA_ARGS__, 51); \
|
||||
break; \
|
||||
case 52: \
|
||||
result = func_name(__VA_ARGS__, 52); \
|
||||
break; \
|
||||
case 53: \
|
||||
result = func_name(__VA_ARGS__, 53); \
|
||||
break; \
|
||||
case 54: \
|
||||
result = func_name(__VA_ARGS__, 54); \
|
||||
break; \
|
||||
case 55: \
|
||||
result = func_name(__VA_ARGS__, 55); \
|
||||
break; \
|
||||
case 56: \
|
||||
result = func_name(__VA_ARGS__, 56); \
|
||||
break; \
|
||||
case 57: \
|
||||
result = func_name(__VA_ARGS__, 57); \
|
||||
break; \
|
||||
case 58: \
|
||||
result = func_name(__VA_ARGS__, 58); \
|
||||
break; \
|
||||
case 59: \
|
||||
result = func_name(__VA_ARGS__, 59); \
|
||||
break; \
|
||||
case 60: \
|
||||
result = func_name(__VA_ARGS__, 60); \
|
||||
break; \
|
||||
case 61: \
|
||||
result = func_name(__VA_ARGS__, 61); \
|
||||
break; \
|
||||
case 62: \
|
||||
result = func_name(__VA_ARGS__, 62); \
|
||||
break; \
|
||||
case 63: \
|
||||
result = func_name(__VA_ARGS__, 63); \
|
||||
break; \
|
||||
default: \
|
||||
result = default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_2_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_4_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_8_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_16_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_32_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
func_name(__VA_ARGS__, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
func_name(__VA_ARGS__, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
func_name(__VA_ARGS__, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
func_name(__VA_ARGS__, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
func_name(__VA_ARGS__, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
func_name(__VA_ARGS__, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
func_name(__VA_ARGS__, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
func_name(__VA_ARGS__, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
func_name(__VA_ARGS__, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
func_name(__VA_ARGS__, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
func_name(__VA_ARGS__, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
func_name(__VA_ARGS__, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
func_name(__VA_ARGS__, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
func_name(__VA_ARGS__, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
func_name(__VA_ARGS__, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
func_name(__VA_ARGS__, 31); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SIMDE_CONSTIFY_64_NO_RESULT_(func_name, default_case, imm, ...) \
|
||||
do { \
|
||||
switch (imm) { \
|
||||
case 0: \
|
||||
func_name(__VA_ARGS__, 0); \
|
||||
break; \
|
||||
case 1: \
|
||||
func_name(__VA_ARGS__, 1); \
|
||||
break; \
|
||||
case 2: \
|
||||
func_name(__VA_ARGS__, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
func_name(__VA_ARGS__, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
func_name(__VA_ARGS__, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
func_name(__VA_ARGS__, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
func_name(__VA_ARGS__, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
func_name(__VA_ARGS__, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
func_name(__VA_ARGS__, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
func_name(__VA_ARGS__, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
func_name(__VA_ARGS__, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
func_name(__VA_ARGS__, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
func_name(__VA_ARGS__, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
func_name(__VA_ARGS__, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
func_name(__VA_ARGS__, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
func_name(__VA_ARGS__, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
func_name(__VA_ARGS__, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
func_name(__VA_ARGS__, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
func_name(__VA_ARGS__, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
func_name(__VA_ARGS__, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
func_name(__VA_ARGS__, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
func_name(__VA_ARGS__, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
func_name(__VA_ARGS__, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
func_name(__VA_ARGS__, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
func_name(__VA_ARGS__, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
func_name(__VA_ARGS__, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
func_name(__VA_ARGS__, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
func_name(__VA_ARGS__, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
func_name(__VA_ARGS__, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
func_name(__VA_ARGS__, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
func_name(__VA_ARGS__, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
func_name(__VA_ARGS__, 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
func_name(__VA_ARGS__, 32); \
|
||||
break; \
|
||||
case 33: \
|
||||
func_name(__VA_ARGS__, 33); \
|
||||
break; \
|
||||
case 34: \
|
||||
func_name(__VA_ARGS__, 34); \
|
||||
break; \
|
||||
case 35: \
|
||||
func_name(__VA_ARGS__, 35); \
|
||||
break; \
|
||||
case 36: \
|
||||
func_name(__VA_ARGS__, 36); \
|
||||
break; \
|
||||
case 37: \
|
||||
func_name(__VA_ARGS__, 37); \
|
||||
break; \
|
||||
case 38: \
|
||||
func_name(__VA_ARGS__, 38); \
|
||||
break; \
|
||||
case 39: \
|
||||
func_name(__VA_ARGS__, 39); \
|
||||
break; \
|
||||
case 40: \
|
||||
func_name(__VA_ARGS__, 40); \
|
||||
break; \
|
||||
case 41: \
|
||||
func_name(__VA_ARGS__, 41); \
|
||||
break; \
|
||||
case 42: \
|
||||
func_name(__VA_ARGS__, 42); \
|
||||
break; \
|
||||
case 43: \
|
||||
func_name(__VA_ARGS__, 43); \
|
||||
break; \
|
||||
case 44: \
|
||||
func_name(__VA_ARGS__, 44); \
|
||||
break; \
|
||||
case 45: \
|
||||
func_name(__VA_ARGS__, 45); \
|
||||
break; \
|
||||
case 46: \
|
||||
func_name(__VA_ARGS__, 46); \
|
||||
break; \
|
||||
case 47: \
|
||||
func_name(__VA_ARGS__, 47); \
|
||||
break; \
|
||||
case 48: \
|
||||
func_name(__VA_ARGS__, 48); \
|
||||
break; \
|
||||
case 49: \
|
||||
func_name(__VA_ARGS__, 49); \
|
||||
break; \
|
||||
case 50: \
|
||||
func_name(__VA_ARGS__, 50); \
|
||||
break; \
|
||||
case 51: \
|
||||
func_name(__VA_ARGS__, 51); \
|
||||
break; \
|
||||
case 52: \
|
||||
func_name(__VA_ARGS__, 52); \
|
||||
break; \
|
||||
case 53: \
|
||||
func_name(__VA_ARGS__, 53); \
|
||||
break; \
|
||||
case 54: \
|
||||
func_name(__VA_ARGS__, 54); \
|
||||
break; \
|
||||
case 55: \
|
||||
func_name(__VA_ARGS__, 55); \
|
||||
break; \
|
||||
case 56: \
|
||||
func_name(__VA_ARGS__, 56); \
|
||||
break; \
|
||||
case 57: \
|
||||
func_name(__VA_ARGS__, 57); \
|
||||
break; \
|
||||
case 58: \
|
||||
func_name(__VA_ARGS__, 58); \
|
||||
break; \
|
||||
case 59: \
|
||||
func_name(__VA_ARGS__, 59); \
|
||||
break; \
|
||||
case 60: \
|
||||
func_name(__VA_ARGS__, 60); \
|
||||
break; \
|
||||
case 61: \
|
||||
func_name(__VA_ARGS__, 61); \
|
||||
break; \
|
||||
case 62: \
|
||||
func_name(__VA_ARGS__, 62); \
|
||||
break; \
|
||||
case 63: \
|
||||
func_name(__VA_ARGS__, 63); \
|
||||
break; \
|
||||
default: \
|
||||
default_case; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
|
||||
#endif
|
||||
@@ -1,114 +0,0 @@
|
||||
/* Detect Clang Version
|
||||
* Created by Evan Nemerson <evan@nemerson.com>
|
||||
*
|
||||
* To the extent possible under law, the author(s) have dedicated all
|
||||
* copyright and related and neighboring rights to this software to
|
||||
* the public domain worldwide. This software is distributed without
|
||||
* any warranty.
|
||||
*
|
||||
* For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
* SPDX-License-Identifier: CC0-1.0
|
||||
*/
|
||||
|
||||
/* This file was originally part of SIMDe
|
||||
* (<https://github.com/simd-everywhere/simde>). You're free to do with it as
|
||||
* you please, but I do have a few small requests:
|
||||
*
|
||||
* * If you make improvements, please submit them back to SIMDe
|
||||
* (at <https://github.com/simd-everywhere/simde/issues>) so others can
|
||||
* benefit from them.
|
||||
* * Please keep a link to SIMDe intact so people know where to submit
|
||||
* improvements.
|
||||
* * If you expose it publicly, please change the SIMDE_ prefix to
|
||||
* something specific to your project.
|
||||
*
|
||||
* The version numbers clang exposes (in the ___clang_major__,
|
||||
* __clang_minor__, and __clang_patchlevel__ macros) are unreliable.
|
||||
* Vendors such as Apple will define these values to their version
|
||||
* numbers; for example, "Apple Clang 4.0" is really clang 3.1, but
|
||||
* __clang_major__ and __clang_minor__ are defined to 4 and 0
|
||||
* respectively, instead of 3 and 1.
|
||||
*
|
||||
* The solution is *usually* to use clang's feature detection macros
|
||||
* (<https://clang.llvm.org/docs/LanguageExtensions.html#feature-checking-macros>)
|
||||
* to determine if the feature you're interested in is available. This
|
||||
* generally works well, and it should probably be the first thing you
|
||||
* try. Unfortunately, it's not possible to check for everything. In
|
||||
* particular, compiler bugs.
|
||||
*
|
||||
* This file just uses the feature checking macros to detect features
|
||||
* added in specific versions of clang to identify which version of
|
||||
* clang the compiler is based on.
|
||||
*
|
||||
* Right now it only goes back to 3.6, but I'm happy to accept patches
|
||||
* to go back further. And, of course, newer versions are welcome if
|
||||
* they're not already present, and if you find a way to detect a point
|
||||
* release that would be great, too!
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_DETECT_CLANG_H)
|
||||
#define SIMDE_DETECT_CLANG_H 1
|
||||
|
||||
/* Attempt to detect the upstream clang version number. I usually only
|
||||
* worry about major version numbers (at least for 4.0+), but if you
|
||||
* need more resolution I'm happy to accept patches that are able to
|
||||
* detect minor versions as well. That said, you'll probably have a
|
||||
* hard time with detection since AFAIK most minor releases don't add
|
||||
* anything we can detect. */
|
||||
|
||||
#if defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION)
|
||||
#if __has_warning("-Wformat-insufficient-args")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 120000
|
||||
#elif __has_warning("-Wimplicit-const-int-float-conversion")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 110000
|
||||
#elif __has_warning("-Wmisleading-indentation")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 100000
|
||||
#elif defined(__FILE_NAME__)
|
||||
#define SIMDE_DETECT_CLANG_VERSION 90000
|
||||
#elif __has_warning("-Wextra-semi-stmt") || \
|
||||
__has_builtin(__builtin_rotateleft32)
|
||||
#define SIMDE_DETECT_CLANG_VERSION 80000
|
||||
#elif __has_warning("-Wc++98-compat-extra-semi")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 70000
|
||||
#elif __has_warning("-Wpragma-pack")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 60000
|
||||
#elif __has_warning("-Wbitfield-enum-conversion")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 50000
|
||||
#elif __has_attribute(diagnose_if)
|
||||
#define SIMDE_DETECT_CLANG_VERSION 40000
|
||||
#elif __has_warning("-Wcast-calling-convention")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 30900
|
||||
#elif __has_warning("-WCL4")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 30800
|
||||
#elif __has_warning("-WIndependentClass-attribute")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 30700
|
||||
#elif __has_warning("-Wambiguous-ellipsis")
|
||||
#define SIMDE_DETECT_CLANG_VERSION 30600
|
||||
#else
|
||||
#define SIMDE_DETECT_CLANG_VERSION 1
|
||||
#endif
|
||||
#endif /* defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION) */
|
||||
|
||||
/* The SIMDE_DETECT_CLANG_VERSION_CHECK macro is pretty
|
||||
* straightforward; it returns true if the compiler is a derivative
|
||||
* of clang >= the specified version.
|
||||
*
|
||||
* Since this file is often (primarily?) useful for working around bugs
|
||||
* it is also helpful to have a macro which returns true if only if the
|
||||
* compiler is a version of clang *older* than the specified version to
|
||||
* make it a bit easier to ifdef regions to add code for older versions,
|
||||
* such as pragmas to disable a specific warning. */
|
||||
|
||||
#if defined(SIMDE_DETECT_CLANG_VERSION)
|
||||
#define SIMDE_DETECT_CLANG_VERSION_CHECK(major, minor, revision) \
|
||||
(SIMDE_DETECT_CLANG_VERSION >= \
|
||||
((major * 10000) + (minor * 1000) + (revision)))
|
||||
#define SIMDE_DETECT_CLANG_VERSION_NOT(major, minor, revision) \
|
||||
(SIMDE_DETECT_CLANG_VERSION < \
|
||||
((major * 10000) + (minor * 1000) + (revision)))
|
||||
#else
|
||||
#define SIMDE_DETECT_CLANG_VERSION_CHECK(major, minor, revision) (0)
|
||||
#define SIMDE_DETECT_CLANG_VERSION_NOT(major, minor, revision) (1)
|
||||
#endif
|
||||
|
||||
#endif /* !defined(SIMDE_DETECT_CLANG_H) */
|
||||
@@ -1,447 +0,0 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2017-2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
/* SIMDe targets a very wide range of standards and compilers, and our
|
||||
* goal is to compile cleanly even with extremely aggressive warnings
|
||||
* (i.e., -Weverything in clang, -Wextra in GCC, /W4 for MSVC, etc.)
|
||||
* treated as errors.
|
||||
*
|
||||
* While our preference is to resolve the underlying issue a given
|
||||
* diagnostic is warning us about, sometimes that's not possible.
|
||||
* Fixing a warning in one compiler may cause problems in another.
|
||||
* Sometimes a warning doesn't really apply to us (false positives),
|
||||
* and sometimes adhering to a warning would mean dropping a feature
|
||||
* we *know* the compiler supports since we have tested specifically
|
||||
* for the compiler or feature.
|
||||
*
|
||||
* When practical, warnings are only disabled for specific code. For
|
||||
* a list of warnings which are enabled by default in all SIMDe code,
|
||||
* see SIMDE_DISABLE_UNWANTED_DIAGNOSTICS. Note that we restore the
|
||||
* warning stack when SIMDe is done parsing, so code which includes
|
||||
* SIMDe is not deprived of these warnings.
|
||||
*/
|
||||
|
||||
#if !defined(SIMDE_DIAGNOSTIC_H)
|
||||
#define SIMDE_DIAGNOSTIC_H
|
||||
|
||||
#include "hedley.h"
|
||||
#include "simde-detect-clang.h"
|
||||
|
||||
/* This is only to help us implement functions like _mm_undefined_ps. */
|
||||
#if defined(SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_)
|
||||
#undef SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_
|
||||
#endif
|
||||
#if HEDLEY_HAS_WARNING("-Wuninitialized")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wuninitialized\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 2, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")
|
||||
#elif HEDLEY_PGI_VERSION_CHECK(19, 10, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ _Pragma("diag_suppress 549")
|
||||
#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
_Pragma("error_messages(off,SEC_UNINITIALIZED_MEM_READ,SEC_UNDEFINED_RETURN_VALUE,unassigned)")
|
||||
#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 14, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
_Pragma("error_messages(off,SEC_UNINITIALIZED_MEM_READ,SEC_UNDEFINED_RETURN_VALUE)")
|
||||
#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 12, 0) && defined(__cplusplus)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
_Pragma("error_messages(off,unassigned)")
|
||||
#elif HEDLEY_TI_VERSION_CHECK(16, 9, 9) || \
|
||||
HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0) || \
|
||||
HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
|
||||
HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 2)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ _Pragma("diag_suppress 551")
|
||||
#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ _Pragma("warning(disable:592)")
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(19, 0, 0) && !defined(__MSVC_RUNTIME_CHECKS)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNINITIALIZED_ \
|
||||
__pragma(warning(disable : 4700))
|
||||
#endif
|
||||
|
||||
/* GCC emits a lot of "notes" about the ABI being different for things
|
||||
* in newer versions of GCC. We don't really care because all our
|
||||
* functions are inlined and don't generate ABI. */
|
||||
#if HEDLEY_GCC_VERSION_CHECK(7, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PSABI_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wpsabi\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PSABI_
|
||||
#endif
|
||||
|
||||
/* Since MMX uses x87 FP registers, you're supposed to call _mm_empty()
|
||||
* after each MMX function before any floating point instructions.
|
||||
* Some compilers warn about functions which use MMX functions but
|
||||
* don't call _mm_empty(). However, since SIMDe is implementyng the
|
||||
* MMX API we shouldn't be calling _mm_empty(); we leave it to the
|
||||
* caller to invoke simde_mm_empty(). */
|
||||
#if HEDLEY_INTEL_VERSION_CHECK(19, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_NO_EMMS_INSTRUCTION_ \
|
||||
_Pragma("warning(disable:13200 13203)")
|
||||
#elif defined(HEDLEY_MSVC_VERSION)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_NO_EMMS_INSTRUCTION_ \
|
||||
__pragma(warning(disable : 4799))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_NO_EMMS_INSTRUCTION_
|
||||
#endif
|
||||
|
||||
/* Intel is pushing people to use OpenMP SIMD instead of Cilk+, so they
|
||||
* emit a diagnostic if you use #pragma simd instead of
|
||||
* #pragma omp simd. SIMDe supports OpenMP SIMD, you just need to
|
||||
* compile with -qopenmp or -qopenmp-simd and define
|
||||
* SIMDE_ENABLE_OPENMP. Cilk+ is just a fallback. */
|
||||
#if HEDLEY_INTEL_VERSION_CHECK(18, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_SIMD_PRAGMA_DEPRECATED_ \
|
||||
_Pragma("warning(disable:3948)")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_SIMD_PRAGMA_DEPRECATED_
|
||||
#endif
|
||||
|
||||
/* MSVC emits a diagnostic when we call a function (like
|
||||
* simde_mm_set_epi32) while initializing a struct. We currently do
|
||||
* this a *lot* in the tests. */
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_NON_CONSTANT_AGGREGATE_INITIALIZER_ \
|
||||
__pragma(warning(disable : 4204))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_NON_CONSTANT_AGGREGATE_INITIALIZER_
|
||||
#endif
|
||||
|
||||
/* This warning needs a lot of work. It is triggered if all you do is
|
||||
* pass the value to memcpy/__builtin_memcpy, or if you initialize a
|
||||
* member of the union, even if that member takes up the entire union.
|
||||
* Last tested with clang-10, hopefully things will improve in the
|
||||
* future; if clang fixes this I'd love to enable it. */
|
||||
#if HEDLEY_HAS_WARNING("-Wconditional-uninitialized")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CONDITIONAL_UNINITIALIZED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wconditional-uninitialized\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CONDITIONAL_UNINITIALIZED_
|
||||
#endif
|
||||
|
||||
/* This warning is meant to catch things like `0.3 + 0.4 == 0.7`, which
|
||||
* will is false. However, SIMDe uses these operations exclusively
|
||||
* for things like _mm_cmpeq_ps, for which we really do want to check
|
||||
* for equality (or inequality).
|
||||
*
|
||||
* If someone wants to put together a SIMDE_FLOAT_EQUAL(a, op, b) macro
|
||||
* which just wraps a check in some code do disable this diagnostic I'd
|
||||
* be happy to accept it. */
|
||||
#if HEDLEY_HAS_WARNING("-Wfloat-equal") || HEDLEY_GCC_VERSION_CHECK(3, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wfloat-equal\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_
|
||||
#endif
|
||||
|
||||
/* This is because we use HEDLEY_STATIC_ASSERT for static assertions.
|
||||
* If Hedley can't find an implementation it will preprocess to
|
||||
* nothing, which means there will be a trailing semi-colon. */
|
||||
#if HEDLEY_HAS_WARNING("-Wextra-semi")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_EXTRA_SEMI_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wextra-semi\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(8, 1, 0) && defined(__cplusplus)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_EXTRA_SEMI_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wextra-semi\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_EXTRA_SEMI_
|
||||
#endif
|
||||
|
||||
/* We do use a few variadic macros, which technically aren't available
|
||||
* until C99 and C++11, but every compiler I'm aware of has supported
|
||||
* them for much longer. That said, usage is isolated to the test
|
||||
* suite and compilers known to support them. */
|
||||
#if HEDLEY_HAS_WARNING("-Wvariadic-macros") || HEDLEY_GCC_VERSION_CHECK(4, 0, 0)
|
||||
#if HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wvariadic-macros\"") _Pragma( \
|
||||
"clang diagnostic ignored \"-Wc++98-compat-pedantic\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wvariadic-macros\"")
|
||||
#endif
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VARIADIC_MACROS_
|
||||
#endif
|
||||
|
||||
/* emscripten requires us to use a __wasm_unimplemented_simd128__ macro
|
||||
* before we can access certain SIMD intrinsics, but this diagnostic
|
||||
* warns about it being a reserved name. It is a reserved name, but
|
||||
* it's reserved for the compiler and we are using it to convey
|
||||
* information to the compiler.
|
||||
*
|
||||
* This is also used when enabling native aliases since we don't get to
|
||||
* choose the macro names. */
|
||||
#if HEDLEY_HAS_WARNING("-Wdouble-promotion")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_MACRO_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wreserved-id-macro\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_MACRO_
|
||||
#endif
|
||||
|
||||
/* clang 3.8 warns about the packed attribute being unnecessary when
|
||||
* used in the _mm_loadu_* functions. That *may* be true for version
|
||||
* 3.8, but for later versions it is crucial in order to make unaligned
|
||||
* access safe. */
|
||||
#if HEDLEY_HAS_WARNING("-Wpacked")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PACKED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wpacked\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PACKED_
|
||||
#endif
|
||||
|
||||
/* Triggered when assigning a float to a double implicitly. We use
|
||||
* explicit casts in SIMDe, this is only used in the test suite. */
|
||||
#if HEDLEY_HAS_WARNING("-Wdouble-promotion")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_DOUBLE_PROMOTION_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wdouble-promotion\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_DOUBLE_PROMOTION_
|
||||
#endif
|
||||
|
||||
/* Several compilers treat conformant array parameters as VLAs. We
|
||||
* test to make sure we're in C mode (C++ doesn't support CAPs), and
|
||||
* that the version of the standard supports CAPs. We also reject
|
||||
* some buggy compilers like MSVC (the logic is in Hedley if you want
|
||||
* to take a look), but with certain warnings enabled some compilers
|
||||
* still like to emit a diagnostic. */
|
||||
#if HEDLEY_HAS_WARNING("-Wvla")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VLA_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wvla\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VLA_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wvla\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VLA_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wused-but-marked-unused")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wused-but-marked-unused\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wunused-function")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wunused-function\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(3, 4, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wunused-function\"")
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(19, 0, 0) /* Likely goes back further */
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION_ \
|
||||
__pragma(warning(disable : 4505))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wpass-failed")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PASS_FAILED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wpass-failed\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PASS_FAILED_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wpadded")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PADDED_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wpadded\"")
|
||||
#elif HEDLEY_MSVC_VERSION_CHECK(19, 0, 0) /* Likely goes back further */
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PADDED_ __pragma(warning(disable : 4324))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PADDED_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wzero-as-null-pointer-constant")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_ZERO_AS_NULL_POINTER_CONSTANT_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_ZERO_AS_NULL_POINTER_CONSTANT_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wold-style-cast")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_OLD_STYLE_CAST_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wold-style-cast\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_OLD_STYLE_CAST_
|
||||
#endif
|
||||
|
||||
#if HEDLEY_HAS_WARNING("-Wcast-function-type") || \
|
||||
HEDLEY_GCC_VERSION_CHECK(8, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CAST_FUNCTION_TYPE_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wcast-function-type\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CAST_FUNCTION_TYPE_
|
||||
#endif
|
||||
|
||||
/* clang will emit this warning when we use C99 extensions whan not in
|
||||
* C99 mode, even though it does support this. In such cases we check
|
||||
* the compiler and version first, so we know it's not a problem. */
|
||||
#if HEDLEY_HAS_WARNING("-Wc99-extensions")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wc99-extensions\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_C99_EXTENSIONS_
|
||||
#endif
|
||||
|
||||
/* https://github.com/simd-everywhere/simde/issues/277 */
|
||||
#if defined(HEDLEY_GCC_VERSION) && HEDLEY_GCC_VERSION_CHECK(4, 6, 0) && \
|
||||
!HEDLEY_GCC_VERSION_CHECK(6, 4, 0) && defined(__cplusplus)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_BUGGY_UNUSED_BUT_SET_VARIBALE_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wunused-but-set-variable\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_BUGGY_UNUSED_BUT_SET_VARIBALE_
|
||||
#endif
|
||||
|
||||
/* This is the warning that you normally define _CRT_SECURE_NO_WARNINGS
|
||||
* to silence, but you have to do that before including anything and
|
||||
* that would require reordering includes. */
|
||||
#if defined(_MSC_VER)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_ANNEX_K_ __pragma(warning(disable : 4996))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_ANNEX_K_
|
||||
#endif
|
||||
|
||||
/* Some compilers, such as clang, may use `long long` for 64-bit
|
||||
* integers, but `long long` triggers a diagnostic with
|
||||
* -Wc++98-compat-pedantic which says 'long long' is incompatible with
|
||||
* C++98. */
|
||||
#if HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wc++98-compat-pedantic\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_
|
||||
#endif
|
||||
|
||||
/* Some problem as above */
|
||||
#if HEDLEY_HAS_WARNING("-Wc++11-long-long")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CPP11_LONG_LONG_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wc++11-long-long\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_CPP11_LONG_LONG_
|
||||
#endif
|
||||
|
||||
/* emscripten emits this whenever stdin/stdout/stderr is used in a
|
||||
* macro. */
|
||||
#if HEDLEY_HAS_WARNING("-Wdisabled-macro-expansion")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_DISABLED_MACRO_EXPANSION_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wdisabled-macro-expansion\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_DISABLED_MACRO_EXPANSION_
|
||||
#endif
|
||||
|
||||
/* Clang uses C11 generic selections to implement some AltiVec
|
||||
* functions, which triggers this diagnostic when not compiling
|
||||
* in C11 mode */
|
||||
#if HEDLEY_HAS_WARNING("-Wc11-extensions")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_C11_EXTENSIONS_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wc11-extensions\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_C11_EXTENSIONS_
|
||||
#endif
|
||||
|
||||
/* Clang sometimes triggers this warning in macros in the AltiVec and
|
||||
* NEON headers, or due to missing functions. */
|
||||
#if HEDLEY_HAS_WARNING("-Wvector-conversion")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VECTOR_CONVERSION_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wvector-conversion\"")
|
||||
/* For NEON, the situation with -Wvector-conversion in clang < 10 is
|
||||
* bad enough that we just disable the warning altogether. */
|
||||
#if defined(SIMDE_ARCH_ARM) && SIMDE_DETECT_CLANG_VERSION_NOT(10, 0, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_BUGGY_VECTOR_CONVERSION_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_VECTOR_CONVERSION_
|
||||
#endif
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_VECTOR_CONVERSION_
|
||||
#endif
|
||||
#if !defined(SIMDE_DIAGNOSTIC_DISABLE_BUGGY_VECTOR_CONVERSION_)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_BUGGY_VECTOR_CONVERSION_
|
||||
#endif
|
||||
|
||||
/* SLEEF triggers this a *lot* in their headers */
|
||||
#if HEDLEY_HAS_WARNING("-Wignored-qualifiers")
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_IGNORED_QUALIFIERS_ \
|
||||
_Pragma("clang diagnostic ignored \"-Wignored-qualifiers\"")
|
||||
#elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_IGNORED_QUALIFIERS_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wignored-qualifiers\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_IGNORED_QUALIFIERS_
|
||||
#endif
|
||||
|
||||
/* GCC emits this under some circumstances when using __int128 */
|
||||
#if HEDLEY_GCC_VERSION_CHECK(4, 8, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PEDANTIC_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wpedantic\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_PEDANTIC_
|
||||
#endif
|
||||
|
||||
/* MSVC doesn't like (__assume(0), code) and will warn about code being
|
||||
* unreachable, but we want it there because not all compilers
|
||||
* understand the unreachable macro and will complain if it is missing.
|
||||
* I'm planning on adding a new macro to Hedley to handle this a bit
|
||||
* more elegantly, but until then... */
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_ __pragma(warning(disable : 4702))
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_UNREACHABLE_
|
||||
#endif
|
||||
|
||||
/* This is a false positive from GCC in a few places. */
|
||||
#if HEDLEY_GCC_VERSION_CHECK(4, 7, 0)
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_MAYBE_UNINITIAZILED_ \
|
||||
_Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
|
||||
#else
|
||||
#define SIMDE_DIAGNOSTIC_DISABLE_MAYBE_UNINITIAZILED_
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_ENABLE_NATIVE_ALIASES)
|
||||
#define SIMDE_DISABLE_UNWANTED_DIAGNOSTICS_NATIVE_ALIASES_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_MACRO_
|
||||
#else
|
||||
#define SIMDE_DISABLE_UNWANTED_DIAGNOSTICS_NATIVE_ALIASES_
|
||||
#endif
|
||||
|
||||
#define SIMDE_DISABLE_UNWANTED_DIAGNOSTICS \
|
||||
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS_NATIVE_ALIASES_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_PSABI_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_NO_EMMS_INSTRUCTION_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_SIMD_PRAGMA_DEPRECATED_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_CONDITIONAL_UNINITIALIZED_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_NON_CONSTANT_AGGREGATE_INITIALIZER_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_EXTRA_SEMI_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_VLA_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_USED_BUT_MARKED_UNUSED_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_PASS_FAILED_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_CPP98_COMPAT_PEDANTIC_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_CPP11_LONG_LONG_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_BUGGY_UNUSED_BUT_SET_VARIBALE_ \
|
||||
SIMDE_DIAGNOSTIC_DISABLE_BUGGY_VECTOR_CONVERSION_
|
||||
|
||||
#endif /* !defined(SIMDE_DIAGNOSTIC_H) */
|
||||
@@ -1,550 +0,0 @@
|
||||
/* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Copyright:
|
||||
* 2020 Evan Nemerson <evan@nemerson.com>
|
||||
*/
|
||||
|
||||
/* simde-arch.h is used to determine which features are available according
|
||||
to the compiler. However, we want to make it possible to forcibly enable
|
||||
or disable APIs */
|
||||
|
||||
#if !defined(SIMDE_FEATURES_H)
|
||||
#define SIMDE_FEATURES_H
|
||||
|
||||
#include "simde-arch.h"
|
||||
#include "simde-diagnostic.h"
|
||||
|
||||
#if !defined(SIMDE_X86_SVML_NATIVE) && !defined(SIMDE_X86_SVML_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SVML)
|
||||
#define SIMDE_X86_SVML_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SVML_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512VP2INTERSECT_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512VP2INTERSECT)
|
||||
#define SIMDE_X86_AVX512VP2INTERSECT_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VP2INTERSECT_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512VBMI_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512VBMI_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512VBMI)
|
||||
#define SIMDE_X86_AVX512VBMI_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VBMI_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512CD_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512CD_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512CD)
|
||||
#define SIMDE_X86_AVX512CD_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512CD_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512DQ_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512DQ_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512DQ)
|
||||
#define SIMDE_X86_AVX512DQ_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512DQ_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512VL_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512VL_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512VL)
|
||||
#define SIMDE_X86_AVX512VL_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512VL_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512BW_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512BW_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512BW)
|
||||
#define SIMDE_X86_AVX512BW_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512BW_NATIVE) && !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX512F_NATIVE) && \
|
||||
!defined(SIMDE_X86_AVX512F_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX512F)
|
||||
#define SIMDE_X86_AVX512F_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE) && !defined(SIMDE_X86_AVX2_NATIVE)
|
||||
#define SIMDE_X86_AVX2_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_FMA_NATIVE) && !defined(SIMDE_X86_FMA_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_FMA)
|
||||
#define SIMDE_X86_FMA_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_FMA_NATIVE) && !defined(SIMDE_X86_AVX_NATIVE)
|
||||
#define SIMDE_X86_AVX_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_X86_AVX2_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX2)
|
||||
#define SIMDE_X86_AVX2_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX2_NATIVE) && !defined(SIMDE_X86_AVX_NATIVE)
|
||||
#define SIMDE_X86_AVX_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_AVX_NATIVE) && !defined(SIMDE_X86_AVX_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_AVX)
|
||||
#define SIMDE_X86_AVX_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_AVX_NATIVE) && !defined(SIMDE_X86_SSE4_1_NATIVE)
|
||||
#define SIMDE_X86_SSE4_2_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSE4_2_NATIVE) && \
|
||||
!defined(SIMDE_X86_SSE4_2_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSE4_2)
|
||||
#define SIMDE_X86_SSE4_2_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SSE4_2_NATIVE) && !defined(SIMDE_X86_SSE4_1_NATIVE)
|
||||
#define SIMDE_X86_SSE4_1_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSE4_1_NATIVE) && \
|
||||
!defined(SIMDE_X86_SSE4_1_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSE4_1)
|
||||
#define SIMDE_X86_SSE4_1_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SSE4_1_NATIVE) && !defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
#define SIMDE_X86_SSSE3_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSSE3_NATIVE) && !defined(SIMDE_X86_SSSE3_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSSE3)
|
||||
#define SIMDE_X86_SSSE3_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SSSE3_NATIVE) && !defined(SIMDE_X86_SSE3_NATIVE)
|
||||
#define SIMDE_X86_SSE3_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSE3_NATIVE) && !defined(SIMDE_X86_SSE3_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSE3)
|
||||
#define SIMDE_X86_SSE3_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SSE3_NATIVE) && !defined(SIMDE_X86_SSE2_NATIVE)
|
||||
#define SIMDE_X86_SSE2_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSE2_NATIVE) && !defined(SIMDE_X86_SSE2_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSE2)
|
||||
#define SIMDE_X86_SSE2_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_X86_SSE2_NATIVE) && !defined(SIMDE_X86_SSE_NATIVE)
|
||||
#define SIMDE_X86_SSE_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_SSE_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_SSE)
|
||||
#define SIMDE_X86_SSE_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_MMX_NATIVE) && !defined(SIMDE_X86_MMX_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_MMX)
|
||||
#define SIMDE_X86_MMX_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_GFNI_NATIVE) && !defined(SIMDE_X86_GFNI_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_GFNI)
|
||||
#define SIMDE_X86_GFNI_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_PCLMUL_NATIVE) && \
|
||||
!defined(SIMDE_X86_PCLMUL_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_PCLMUL)
|
||||
#define SIMDE_X86_PCLMUL_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_VPCLMULQDQ_NATIVE) && \
|
||||
!defined(SIMDE_X86_VPCLMULQDQ_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_X86_VPCLMULQDQ)
|
||||
#define SIMDE_X86_VPCLMULQDQ_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_X86_SVML_NATIVE) && !defined(SIMDE_X86_SVML_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(__INTEL_COMPILER)
|
||||
#define SIMDE_X86_SVML_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4799)
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_X86_AVX_NATIVE) || defined(SIMDE_X86_GFNI_NATIVE)
|
||||
#include <immintrin.h>
|
||||
#elif defined(SIMDE_X86_SSE4_2_NATIVE)
|
||||
#include <nmmintrin.h>
|
||||
#elif defined(SIMDE_X86_SSE4_1_NATIVE)
|
||||
#include <smmintrin.h>
|
||||
#elif defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
#include <tmmintrin.h>
|
||||
#elif defined(SIMDE_X86_SSE3_NATIVE)
|
||||
#include <pmmintrin.h>
|
||||
#elif defined(SIMDE_X86_SSE2_NATIVE)
|
||||
#include <emmintrin.h>
|
||||
#elif defined(SIMDE_X86_SSE_NATIVE)
|
||||
#include <xmmintrin.h>
|
||||
#elif defined(SIMDE_X86_MMX_NATIVE)
|
||||
#include <mmintrin.h>
|
||||
#endif
|
||||
|
||||
#if defined(HEDLEY_MSVC_VERSION)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ARM_NEON_A64V8_NATIVE) && \
|
||||
!defined(SIMDE_ARM_NEON_A64V8_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_ARM_NEON) && defined(SIMDE_ARCH_AARCH64) && \
|
||||
SIMDE_ARCH_ARM_CHECK(80)
|
||||
#define SIMDE_ARM_NEON_A64V8_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && \
|
||||
!defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
#define SIMDE_ARM_NEON_A32V8_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ARM_NEON_A32V8_NATIVE) && \
|
||||
!defined(SIMDE_ARM_NEON_A32V8_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_ARM_NEON) && SIMDE_ARCH_ARM_CHECK(80) && \
|
||||
(__ARM_NEON_FP & 0x02)
|
||||
#define SIMDE_ARM_NEON_A32V8_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && \
|
||||
!defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
#define SIMDE_ARM_NEON_A32V7_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ARM_NEON_A32V7_NATIVE) && \
|
||||
!defined(SIMDE_ARM_NEON_A32V7_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_ARM_NEON) && SIMDE_ARCH_ARM_CHECK(70)
|
||||
#define SIMDE_ARM_NEON_A32V7_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ARM_SVE_NATIVE) && !defined(SIMDE_ARM_SVE_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_ARM_SVE)
|
||||
#define SIMDE_ARM_SVE_NATIVE
|
||||
#include <arm_sve.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_WASM_SIMD128_NATIVE) && \
|
||||
!defined(SIMDE_WASM_SIMD128_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_WASM_SIMD128)
|
||||
#define SIMDE_WASM_SIMD128_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_WASM_SIMD128_NATIVE)
|
||||
#if !defined(__wasm_unimplemented_simd128__)
|
||||
HEDLEY_DIAGNOSTIC_PUSH
|
||||
SIMDE_DIAGNOSTIC_DISABLE_RESERVED_ID_MACRO_
|
||||
#define __wasm_unimplemented_simd128__
|
||||
HEDLEY_DIAGNOSTIC_POP
|
||||
#endif
|
||||
#include <wasm_simd128.h>
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_P9_NATIVE) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_P9_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if SIMDE_ARCH_POWER_ALTIVEC_CHECK(900)
|
||||
#define SIMDE_POWER_ALTIVEC_P9_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P9_NATIVE) && !defined(SIMDE_POWER_ALTIVEC_P8)
|
||||
#define SIMDE_POWER_ALTIVEC_P8_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_P8_NATIVE) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_P8_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if SIMDE_ARCH_POWER_ALTIVEC_CHECK(800)
|
||||
#define SIMDE_POWER_ALTIVEC_P8_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P8_NATIVE) && !defined(SIMDE_POWER_ALTIVEC_P7)
|
||||
#define SIMDE_POWER_ALTIVEC_P7_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_P7_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if SIMDE_ARCH_POWER_ALTIVEC_CHECK(700)
|
||||
#define SIMDE_POWER_ALTIVEC_P7_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P7_NATIVE) && !defined(SIMDE_POWER_ALTIVEC_P6)
|
||||
#define SIMDE_POWER_ALTIVEC_P6_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_P6_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if SIMDE_ARCH_POWER_ALTIVEC_CHECK(600)
|
||||
#define SIMDE_POWER_ALTIVEC_P6_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE) && !defined(SIMDE_POWER_ALTIVEC_P5)
|
||||
#define SIMDE_POWER_ALTIVEC_P5_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_P5_NATIVE) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_P5_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if SIMDE_ARCH_POWER_ALTIVEC_CHECK(500)
|
||||
#define SIMDE_POWER_ALTIVEC_P5_NATIVE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SIMDE_POWER_ALTIVEC_P6_NATIVE)
|
||||
/* AltiVec conflicts with lots of stuff. The bool keyword conflicts
|
||||
* with the bool keyword in C++ and the bool macro in C99+ (defined
|
||||
* in stdbool.h). The vector keyword conflicts with std::vector in
|
||||
* C++ if you are `using std;`.
|
||||
*
|
||||
* Luckily AltiVec allows you to use `__vector`/`__bool`/`__pixel`
|
||||
* instead, but altivec.h will unconditionally define
|
||||
* `vector`/`bool`/`pixel` so we need to work around that.
|
||||
*
|
||||
* Unfortunately this means that if your code uses AltiVec directly
|
||||
* it may break. If this is the case you'll want to define
|
||||
* `SIMDE_POWER_ALTIVEC_NO_UNDEF` before including SIMDe. Or, even
|
||||
* better, port your code to use the double-underscore versions. */
|
||||
#if defined(bool)
|
||||
#undef bool
|
||||
#endif
|
||||
|
||||
#include <altivec.h>
|
||||
|
||||
#if !defined(SIMDE_POWER_ALTIVEC_NO_UNDEF)
|
||||
#if defined(vector)
|
||||
#undef vector
|
||||
#endif
|
||||
#if defined(pixel)
|
||||
#undef pixel
|
||||
#endif
|
||||
#if defined(bool)
|
||||
#undef bool
|
||||
#endif
|
||||
#endif /* !defined(SIMDE_POWER_ALTIVEC_NO_UNDEF) */
|
||||
|
||||
/* Use these intsead of vector/pixel/bool in SIMDe. */
|
||||
#define SIMDE_POWER_ALTIVEC_VECTOR(T) __vector T
|
||||
#define SIMDE_POWER_ALTIVEC_PIXEL __pixel
|
||||
#define SIMDE_POWER_ALTIVEC_BOOL __bool
|
||||
|
||||
/* Re-define bool if we're using stdbool.h */
|
||||
#if !defined(__cplusplus) && defined(__bool_true_false_are_defined) && \
|
||||
!defined(SIMDE_POWER_ALTIVEC_NO_UNDEF)
|
||||
#define bool _Bool
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_MIPS_LOONGSON_MMI_NATIVE) && \
|
||||
!defined(SIMDE_MIPS_LOONGSON_MMI_NO_NATIVE) && \
|
||||
!defined(SIMDE_NO_NATIVE)
|
||||
#if defined(SIMDE_ARCH_MIPS_LOONGSON_MMI)
|
||||
#define SIMDE_MIPS_LOONGSON_MMI_NATIVE 1
|
||||
#endif
|
||||
#endif
|
||||
#if defined(SIMDE_MIPS_LOONGSON_MMI_NATIVE)
|
||||
#include <loongson-mmiintrin.h>
|
||||
#endif
|
||||
|
||||
/* This is used to determine whether or not to fall back on a vector
|
||||
* function in an earlier ISA extensions, as well as whether
|
||||
* we expected any attempts at vectorization to be fruitful or if we
|
||||
* expect to always be running serial code. */
|
||||
|
||||
#if !defined(SIMDE_NATURAL_VECTOR_SIZE)
|
||||
#if defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE (512)
|
||||
#elif defined(SIMDE_X86_AVX_NATIVE)
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE (256)
|
||||
#elif defined(SIMDE_X86_SSE_NATIVE) || defined(SIMDE_ARM_NEON_A32V7_NATIVE) || \
|
||||
defined(SIMDE_WASM_SIMD128_NATIVE) || \
|
||||
defined(SIMDE_POWER_ALTIVEC_P5_NATIVE)
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE (128)
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_NATURAL_VECTOR_SIZE)
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE (0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE_LE(x) \
|
||||
((SIMDE_NATURAL_VECTOR_SIZE > 0) && (SIMDE_NATURAL_VECTOR_SIZE <= (x)))
|
||||
#define SIMDE_NATURAL_VECTOR_SIZE_GE(x) \
|
||||
((SIMDE_NATURAL_VECTOR_SIZE > 0) && (SIMDE_NATURAL_VECTOR_SIZE >= (x)))
|
||||
|
||||
/* Native aliases */
|
||||
#if defined(SIMDE_ENABLE_NATIVE_ALIASES)
|
||||
#if !defined(SIMDE_X86_MMX_NATIVE)
|
||||
#define SIMDE_X86_MMX_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSE_NATIVE)
|
||||
#define SIMDE_X86_SSE_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSE2_NATIVE)
|
||||
#define SIMDE_X86_SSE2_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSE3_NATIVE)
|
||||
#define SIMDE_X86_SSE3_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSSE3_NATIVE)
|
||||
#define SIMDE_X86_SSSE3_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSE4_1_NATIVE)
|
||||
#define SIMDE_X86_SSE4_1_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_SSE4_2_NATIVE)
|
||||
#define SIMDE_X86_SSE4_2_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX_NATIVE)
|
||||
#define SIMDE_X86_AVX_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX2_NATIVE)
|
||||
#define SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_FMA_NATIVE)
|
||||
#define SIMDE_X86_FMA_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX512F_NATIVE)
|
||||
#define SIMDE_X86_AVX512F_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX512VL_NATIVE)
|
||||
#define SIMDE_X86_AVX512VL_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX512BW_NATIVE)
|
||||
#define SIMDE_X86_AVX512BW_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX512DQ_NATIVE)
|
||||
#define SIMDE_X86_AVX512DQ_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_AVX512CD_NATIVE)
|
||||
#define SIMDE_X86_AVX512CD_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_GFNI_NATIVE)
|
||||
#define SIMDE_X86_GFNI_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_PCLMUL_NATIVE)
|
||||
#define SIMDE_X86_PCLMUL_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_X86_VPCLMULQDQ_NATIVE)
|
||||
#define SIMDE_X86_VPCLMULQDQ_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
|
||||
#if !defined(SIMDE_ARM_NEON_A32V7_NATIVE)
|
||||
#define SIMDE_ARM_NEON_A32V7_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_ARM_NEON_A32V8_NATIVE)
|
||||
#define SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#if !defined(SIMDE_ARM_NEON_A64V8_NATIVE)
|
||||
#define SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Are floating point values stored using IEEE 754? Knowing
|
||||
* this at during preprocessing is a bit tricky, mostly because what
|
||||
* we're curious about is how values are stored and not whether the
|
||||
* implementation is fully conformant in terms of rounding, NaN
|
||||
* handling, etc.
|
||||
*
|
||||
* For example, if you use -ffast-math or -Ofast on
|
||||
* GCC or clang IEEE 754 isn't strictly followed, therefore IEE 754
|
||||
* support is not advertised (by defining __STDC_IEC_559__).
|
||||
*
|
||||
* However, what we care about is whether it is safe to assume that
|
||||
* floating point values are stored in IEEE 754 format, in which case
|
||||
* we can provide faster implementations of some functions.
|
||||
*
|
||||
* Luckily every vaugely modern architecture I'm aware of uses IEEE 754-
|
||||
* so we just assume IEEE 754 for now. There is a test which verifies
|
||||
* this, if that test fails sowewhere please let us know and we'll add
|
||||
* an exception for that platform. Meanwhile, you can define
|
||||
* SIMDE_NO_IEEE754_STORAGE. */
|
||||
#if !defined(SIMDE_IEEE754_STORAGE) && !defined(SIMDE_NO_IEE754_STORAGE)
|
||||
#define SIMDE_IEEE754_STORAGE
|
||||
#endif
|
||||
|
||||
#endif /* !defined(SIMDE_FEATURES_H) */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -25,8 +25,17 @@
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && defined(__cplusplus)
|
||||
#include <cmath>
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <simd/base.h>
|
||||
#endif
|
||||
|
||||
#define SIMDE_ENABLE_NATIVE_ALIASES
|
||||
PRAGMA_WARN_PUSH
|
||||
#include "simde/x86/sse2.h"
|
||||
#include <simde/x86/sse2.h>
|
||||
PRAGMA_WARN_POP
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user