mirror of
https://github.com/nlohmann/json.git
synced 2026-10-08 15:37:13 +00:00
Fix GCC module build and MSVC C4127 in the json_view SIMD code
GCC ignores the target attribute in modules, so the SSSE3 dispatch is disabled for the module interface (the check stays portable, SSE2 is kept). Make the 8-vs-16 byte unrolling condition in scan_string_run a preprocessor/template split to avoid a constant condition (C4127). Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
5 files changed
+20
-4
No files matched your search
Binary file not shown.
@@ -85,7 +85,9 @@ NLOHMANN_VIEW_ALWAYS_INLINE const unsigned char* scan_string_run(const unsigned
|
|||||||
#define NLOHMANN_VIEW_STEP(i) if (NLOHMANN_VIEW_LIKELY(plain[p[i]] != 0)) {} else { p += (i); goto stop; }
|
#define NLOHMANN_VIEW_STEP(i) if (NLOHMANN_VIEW_LIKELY(plain[p[i]] != 0)) {} else { p += (i); goto stop; }
|
||||||
NLOHMANN_VIEW_STEP(0) NLOHMANN_VIEW_STEP(1) NLOHMANN_VIEW_STEP(2) NLOHMANN_VIEW_STEP(3)
|
NLOHMANN_VIEW_STEP(0) NLOHMANN_VIEW_STEP(1) NLOHMANN_VIEW_STEP(2) NLOHMANN_VIEW_STEP(3)
|
||||||
NLOHMANN_VIEW_STEP(4) NLOHMANN_VIEW_STEP(5) NLOHMANN_VIEW_STEP(6) NLOHMANN_VIEW_STEP(7)
|
NLOHMANN_VIEW_STEP(4) NLOHMANN_VIEW_STEP(5) NLOHMANN_VIEW_STEP(6) NLOHMANN_VIEW_STEP(7)
|
||||||
if (!Value || !NLOHMANN_VIEW_VECTOR)
|
#if NLOHMANN_VIEW_VECTOR
|
||||||
|
if (!Value) // (a plain `!Value || !NLOHMANN_VIEW_VECTOR` is a constant condition for MSVC, C4127)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
NLOHMANN_VIEW_STEP(8) NLOHMANN_VIEW_STEP(9) NLOHMANN_VIEW_STEP(10) NLOHMANN_VIEW_STEP(11)
|
NLOHMANN_VIEW_STEP(8) NLOHMANN_VIEW_STEP(9) NLOHMANN_VIEW_STEP(10) NLOHMANN_VIEW_STEP(11)
|
||||||
NLOHMANN_VIEW_STEP(12) NLOHMANN_VIEW_STEP(13) NLOHMANN_VIEW_STEP(14) NLOHMANN_VIEW_STEP(15)
|
NLOHMANN_VIEW_STEP(12) NLOHMANN_VIEW_STEP(13) NLOHMANN_VIEW_STEP(14) NLOHMANN_VIEW_STEP(15)
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
// used where the CPU has SSSE3 (all x86-64 CPUs since about 2011), else the
|
// used where the CPU has SSSE3 (all x86-64 CPUs since about 2011), else the
|
||||||
// portable check. JSON_VIEW_USE_SSSE3 skips the CPU check (for code compiled
|
// portable check. JSON_VIEW_USE_SSSE3 skips the CPU check (for code compiled
|
||||||
// for SSSE3 anyway); JSON_VIEW_NO_SIMD selects the portable code.
|
// for SSSE3 anyway); JSON_VIEW_NO_SIMD selects the portable code.
|
||||||
|
// NLOHMANN_VIEW_NO_TARGET_ATTRIBUTE (set by the GCC module interface, where GCC
|
||||||
|
// ignores the target attribute and then rejects the SSSE3 intrinsics) keeps the
|
||||||
|
// check portable without disabling the SSE2 code.
|
||||||
#if !defined(JSON_VIEW_NO_SIMD) && defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) && NLOHMANN_VIEW_LITTLE_ENDIAN
|
#if !defined(JSON_VIEW_NO_SIMD) && defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) && NLOHMANN_VIEW_LITTLE_ENDIAN
|
||||||
#include <arm_neon.h>
|
#include <arm_neon.h>
|
||||||
#define NLOHMANN_VIEW_NEON 1
|
#define NLOHMANN_VIEW_NEON 1
|
||||||
@@ -44,7 +47,7 @@
|
|||||||
#else
|
#else
|
||||||
#define NLOHMANN_VIEW_SSSE3 0 // NOLINT(cppcoreguidelines-macro-to-enum,modernize-macro-to-enum)
|
#define NLOHMANN_VIEW_SSSE3 0 // NOLINT(cppcoreguidelines-macro-to-enum,modernize-macro-to-enum)
|
||||||
#endif
|
#endif
|
||||||
#if NLOHMANN_VIEW_SSE2 && !NLOHMANN_VIEW_SSSE3 && ((defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))))
|
#if NLOHMANN_VIEW_SSE2 && !NLOHMANN_VIEW_SSSE3 && !defined(NLOHMANN_VIEW_NO_TARGET_ATTRIBUTE) && ((defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))))
|
||||||
// (GCC before 4.9 has no SSSE3 intrinsics without -mssse3)
|
// (GCC before 4.9 has no SSSE3 intrinsics without -mssse3)
|
||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
#include <tmmintrin.h>
|
#include <tmmintrin.h>
|
||||||
|
|||||||
@@ -439,6 +439,9 @@ NLOHMANN_JSON_NAMESPACE_END
|
|||||||
// used where the CPU has SSSE3 (all x86-64 CPUs since about 2011), else the
|
// used where the CPU has SSSE3 (all x86-64 CPUs since about 2011), else the
|
||||||
// portable check. JSON_VIEW_USE_SSSE3 skips the CPU check (for code compiled
|
// portable check. JSON_VIEW_USE_SSSE3 skips the CPU check (for code compiled
|
||||||
// for SSSE3 anyway); JSON_VIEW_NO_SIMD selects the portable code.
|
// for SSSE3 anyway); JSON_VIEW_NO_SIMD selects the portable code.
|
||||||
|
// NLOHMANN_VIEW_NO_TARGET_ATTRIBUTE (set by the GCC module interface, where GCC
|
||||||
|
// ignores the target attribute and then rejects the SSSE3 intrinsics) keeps the
|
||||||
|
// check portable without disabling the SSE2 code.
|
||||||
#if !defined(JSON_VIEW_NO_SIMD) && defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) && NLOHMANN_VIEW_LITTLE_ENDIAN
|
#if !defined(JSON_VIEW_NO_SIMD) && defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) && NLOHMANN_VIEW_LITTLE_ENDIAN
|
||||||
#include <arm_neon.h>
|
#include <arm_neon.h>
|
||||||
#define NLOHMANN_VIEW_NEON 1
|
#define NLOHMANN_VIEW_NEON 1
|
||||||
@@ -457,7 +460,7 @@ NLOHMANN_JSON_NAMESPACE_END
|
|||||||
#else
|
#else
|
||||||
#define NLOHMANN_VIEW_SSSE3 0 // NOLINT(cppcoreguidelines-macro-to-enum,modernize-macro-to-enum)
|
#define NLOHMANN_VIEW_SSSE3 0 // NOLINT(cppcoreguidelines-macro-to-enum,modernize-macro-to-enum)
|
||||||
#endif
|
#endif
|
||||||
#if NLOHMANN_VIEW_SSE2 && !NLOHMANN_VIEW_SSSE3 && ((defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))))
|
#if NLOHMANN_VIEW_SSE2 && !NLOHMANN_VIEW_SSSE3 && !defined(NLOHMANN_VIEW_NO_TARGET_ATTRIBUTE) && ((defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && !defined(__clang__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))))
|
||||||
// (GCC before 4.9 has no SSSE3 intrinsics without -mssse3)
|
// (GCC before 4.9 has no SSSE3 intrinsics without -mssse3)
|
||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
#include <tmmintrin.h>
|
#include <tmmintrin.h>
|
||||||
@@ -815,7 +818,9 @@ NLOHMANN_VIEW_ALWAYS_INLINE const unsigned char* scan_string_run(const unsigned
|
|||||||
#define NLOHMANN_VIEW_STEP(i) if (NLOHMANN_VIEW_LIKELY(plain[p[i]] != 0)) {} else { p += (i); goto stop; }
|
#define NLOHMANN_VIEW_STEP(i) if (NLOHMANN_VIEW_LIKELY(plain[p[i]] != 0)) {} else { p += (i); goto stop; }
|
||||||
NLOHMANN_VIEW_STEP(0) NLOHMANN_VIEW_STEP(1) NLOHMANN_VIEW_STEP(2) NLOHMANN_VIEW_STEP(3)
|
NLOHMANN_VIEW_STEP(0) NLOHMANN_VIEW_STEP(1) NLOHMANN_VIEW_STEP(2) NLOHMANN_VIEW_STEP(3)
|
||||||
NLOHMANN_VIEW_STEP(4) NLOHMANN_VIEW_STEP(5) NLOHMANN_VIEW_STEP(6) NLOHMANN_VIEW_STEP(7)
|
NLOHMANN_VIEW_STEP(4) NLOHMANN_VIEW_STEP(5) NLOHMANN_VIEW_STEP(6) NLOHMANN_VIEW_STEP(7)
|
||||||
if (!Value || !NLOHMANN_VIEW_VECTOR)
|
#if NLOHMANN_VIEW_VECTOR
|
||||||
|
if (!Value) // (a plain `!Value || !NLOHMANN_VIEW_VECTOR` is a constant condition for MSVC, C4127)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
NLOHMANN_VIEW_STEP(8) NLOHMANN_VIEW_STEP(9) NLOHMANN_VIEW_STEP(10) NLOHMANN_VIEW_STEP(11)
|
NLOHMANN_VIEW_STEP(8) NLOHMANN_VIEW_STEP(9) NLOHMANN_VIEW_STEP(10) NLOHMANN_VIEW_STEP(11)
|
||||||
NLOHMANN_VIEW_STEP(12) NLOHMANN_VIEW_STEP(13) NLOHMANN_VIEW_STEP(14) NLOHMANN_VIEW_STEP(15)
|
NLOHMANN_VIEW_STEP(12) NLOHMANN_VIEW_STEP(13) NLOHMANN_VIEW_STEP(14) NLOHMANN_VIEW_STEP(15)
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ module;
|
|||||||
// 3. Or upgrade to a newer GCC version with better modules support.
|
// 3. Or upgrade to a newer GCC version with better modules support.
|
||||||
// See: https://github.com/nlohmann/json/issues/5103
|
// See: https://github.com/nlohmann/json/issues/5103
|
||||||
|
|
||||||
|
// GCC ignores the target attribute in modules ("'target' attribute currently
|
||||||
|
// unsupported in modules") and then rejects the SSSE3 intrinsics of json_view.
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
#define NLOHMANN_VIEW_NO_TARGET_ATTRIBUTE
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include <nlohmann/json_literals.hpp>
|
#include <nlohmann/json_literals.hpp>
|
||||||
#include <nlohmann/json_view.hpp>
|
#include <nlohmann/json_view.hpp>
|
||||||
|
|||||||
Reference in new issue
Block a user