55#if defined(__posix) || defined(__posix__) || defined(__USE_POSIX) || defined(_POSIX_VERSION) || defined(__MACH__) || \
56 defined(__linux) || defined(__linux__) || defined(__gnu_linux__) || defined(__unix) || defined(__unix__) || \
57 defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__)
58# if defined(__linux__)
59# if !defined(_DEFAULT_SOURCE)
60# define _DEFAULT_SOURCE
62# if !defined(_XOPEN_SOURCE)
63# define _XOPEN_SOURCE 700
65# if !defined(_GNU_SOURCE)
68# elif defined(__APPLE__) && defined(__MACH__)
69# if !defined(_DARWIN_C_SOURCE)
70# define _DARWIN_C_SOURCE
72# elif defined(__sun) && defined(__SVR4)
73# if !defined(__EXTENSIONS__)
74# define __EXTENSIONS__
76# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
77# if !defined(_BSD_SOURCE)
82# if !defined(_POSIX_C_SOURCE)
83# define _POSIX_C_SOURCE 200809L
94#if defined(__cplusplus)
95# define QSC_CPLUSPLUS_ENABLED_START extern "C" {
96# define QSC_CPLUSPLUS_ENABLED_END }
98# define QSC_CPLUSPLUS_ENABLED_START
99# define QSC_CPLUSPLUS_ENABLED_END
102QSC_CPLUSPLUS_ENABLED_START
123# define QSC_SYSTEM_COMPILER_MSC
126#if defined(__MINGW32__)
131# define QSC_SYSTEM_COMPILER_MINGW
136# define QSC_SYSTEM_COMPILER_GCC
144# define QSC_SYSTEM_COMPILER_ARM
147#if defined(__BORLANDC__)
152# define QSC_SYSTEM_COMPILER_BORLAND
155#if defined(__GNUC__) && !defined(__MINGW32__)
160# define QSC_SYSTEM_COMPILER_GCC
163#if defined(__clang__)
168# define QSC_SYSTEM_COMPILER_CLANG
171#if defined(__IBMC__) || defined(__IBMCPP__)
176# define QSC_SYSTEM_COMPILER_IBM
179#if defined(__INTEL_COMPILER) || defined(__ICL)
184# define QSC_SYSTEM_COMPILER_INTEL
187#if defined(__MWERKS__)
192# define QSC_SYSTEM_COMPILER_MWERKS
195#if defined(__OPEN64__)
200# define QSC_SYSTEM_COMPILER_OPEN64
203#if defined(__SUNPRO_C)
208# define QSC_SYSTEM_COMPILER_SUNPRO
211#if defined(__TURBOC__)
216# define QSC_SYSTEM_COMPILER_TURBO
223#if defined(_WIN64) || defined(_WIN32) || defined(__WIN64__) || defined(__WIN32__)
228# if !defined(QSC_SYSTEM_OS_WINDOWS)
229# define QSC_SYSTEM_OS_WINDOWS
236# define QSC_SYSTEM_ISWIN64
237# elif defined(_WIN32)
242# define QSC_SYSTEM_ISWIN32
248#if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
249# define QSC_HAS_CPUID
252#if defined(__ANDROID__)
257# define QSC_SYSTEM_OS_ANDROID
260#if defined(__APPLE__) || defined(__MACH__)
261# if defined(__MACH__)
266# define QSC_SYSTEM_OS_MAC
272# define QSC_SYSTEM_OS_BSD
274# if defined(TARGET_OS_IPHONE) && defined(TARGET_IPHONE_SIMULATOR)
279# define QSC_SYSTEM_ISIPHONESIM
280# elif defined(TARGET_OS_IPHONE)
285# define QSC_SYSTEM_ISIPHONE
291# define QSC_SYSTEM_ISOSX
295#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || defined(QSC_SYSTEM_ISOSX)
300# define QSC_SYSTEM_OS_BSD
303#if defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
308# define QSC_SYSTEM_OS_LINUX
311#if defined(__unix) || defined(__unix__)
316# define QSC_SYSTEM_OS_UNIX
317# if defined(__hpux) || defined(hpux)
322# define QSC_SYSTEM_OS_HPUX
324# if defined(__sun__) || defined(__sun) || defined(sun)
329# define QSC_SYSTEM_OS_SUNUX
333#if defined(__posix) || defined(__posix__) || defined(__USE_POSIX) || defined(_POSIX_VERSION) || defined(QSC_SYSTEM_OS_UNIX) || defined(QSC_SYSTEM_OS_LINUX) || defined(QSC_SYSTEM_OS_BSD)
338# define QSC_SYSTEM_OS_POSIX
342#if defined(QSC_SYSTEM_OS_WINDOWS) && defined(QSC_SYSTEM_COMPILER_MSC)
347# define QSC_WINDOWS_VSTUDIO_BUILD
355# define QSC_SYSTEM_OPENMP
358#if defined(DEBUG) || defined(_DEBUG) || defined(__DEBUG__) || (defined(__GNUC__) && !defined(__OPTIMIZE__))
363# define QSC_DEBUG_MODE
371# define QSC_ASSERT(expr) assert(expr)
373# define QSC_ASSERT(expr) ((void)0)
380#if defined(__OpenBSD__) || defined(__FreeBSD__) || \
381 defined(__NetBSD__) || defined(__APPLE__) || \
382 (defined(__GLIBC__) && (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 25))
383# define QSC_HAVE_EXPLICIT_BZERO 1
386#if defined(QSC_SYSTEM_COMPILER_MSC)
387# if defined(_M_X64) || defined(_M_AMD64)
392# define QSC_SYSTEM_ARCH_IX86_64
397# define QSC_SYSTEM_ARCH_IX86
398# if defined(_M_AMD64)
403# define QSC_SYSTEM_ARCH_AMD64
405# elif defined(_M_IX86) || defined(_X86_)
410# define QSC_SYSTEM_ARCH_IX86_32
415# define QSC_SYSTEM_ARCH_IX86
416# elif defined(_M_ARM)
421# define QSC_SYSTEM_ARCH_ARM
422# if defined(_M_ARM_ARMV7VE)
427# define QSC_SYSTEM_ARCH_ARMV7VE
428# elif defined(_M_ARM_FP)
433# define QSC_SYSTEM_ARCH_ARMFP
434# elif defined(_M_ARM64)
439# define QSC_SYSTEM_ARCH_ARM64
441# elif defined(_M_IA64)
446# define QSC_SYSTEM_ARCH_IA64
448#elif defined(QSC_SYSTEM_COMPILER_GCC)
449# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
454# define QSC_SYSTEM_ARCH_IX86_64
459# define QSC_SYSTEM_ARCH_IX86
460# if defined(__amd64__) || defined(__amd64)
465# define QSC_SYSTEM_ARCH_AMD64
467# elif defined(i386) || defined(__i386) || defined(__i386__)
472# define QSC_SYSTEM_ARCH_IX86_32
477# define QSC_SYSTEM_ARCH_IX86
478# elif defined(__arm__) || defined(__aarch64__)
483# define QSC_SYSTEM_ARCH_ARM
484# if defined(__aarch64__)
489# define QSC_SYSTEM_ARCH_ARM64
491# elif defined(__ia64) || defined(__ia64__) || defined(__itanium__)
496# define QSC_SYSTEM_ARCH_IA64
497# elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || defined(__64BIT__) || defined(_LP64) || defined(__LP64__)
502# define QSC_SYSTEM_ARCH_PPC
503# elif defined(__sparc) || defined(__sparc__)
508# define QSC_SYSTEM_ARCH_SPARC
509# if defined(__sparc64__)
514# define QSC_SYSTEM_ARCH_SPARC64
519#if (defined(__x86_64__) || defined(_M_X64))
520# define QSC_SYSTEM_X86
531#define QSC_PRAGMA_STR(x) _Pragma(#x)
538# define QSC_NO_INLINE __declspec(noinline)
539#elif defined(__GNUC__) || defined(__clang__)
540# define QSC_NO_INLINE __attribute__((noinline))
542# define QSC_NO_INLINE
545#if defined(_WIN64) || defined(_WIN32) || defined(__CYGWIN__)
550# define QSC_SYSTEM_SOCKETS_WINDOWS
556# define QSC_SYSTEM_SOCKETS_BERKELEY
559#if defined(__GNUC__) || defined(__clang__)
560# define QSC_ATTRIBUTE __attribute__
562# define QSC_ATTRIBUTE(a)
577#if defined(QSC_DLL_API)
579#if defined(QSC_SYSTEM_COMPILER_MSC)
580# if defined(QSC_DLL_IMPORT)
581# define QSC_EXPORT_API __declspec(dllimport)
583# define QSC_EXPORT_API __declspec(dllexport)
585#elif defined(QSC_SYSTEM_COMPILER_GCC)
586# if defined(QSC_DLL_IMPORT)
587# define QSC_EXPORT_API QSC_ATTRIBUTE((dllimport))
589# define QSC_EXPORT_API QSC_ATTRIBUTE((dllexport))
592# if defined(__SUNPRO_C)
593# if !defined(__GNU_C__)
594# define QSC_EXPORT_API QSC_ATTRIBUTE (visibility(__global))
596# define QSC_EXPORT_API QSC_ATTRIBUTE __global
598# elif defined(_MSC_VER)
599# define QSC_EXPORT_API extern __declspec(dllexport)
601# define QSC_EXPORT_API QSC_ATTRIBUTE ((visibility ("default")))
605# define QSC_EXPORT_API
613# define QSC_CACHE_ALIGNED QSC_ATTRIBUTE((aligned(64)))
614#elif defined(_MSC_VER)
615# define QSC_CACHE_ALIGNED __declspec(align(64U))
618#if defined(QSC_SYSTEM_ARCH_IX86_64) || defined(QSC_SYSTEM_ARCH_ARM64) || defined(QSC_SYSTEM_ARCH_IA64) || defined(QSC_SYSTEM_ARCH_AMD64) || defined(QSC_SYSTEM_ARCH_SPARC64)
623# define QSC_SYSTEM_IS_X64
629# define QSC_SYSTEM_IS_X86
632#if defined(QSC_SYSTEM_IS_X64)
637# define QSC_SIZE_MAX UINT64_MAX
643# define QSC_SIZE_MAX UINT32_MAX
650#if !defined(__BIG_ENDIAN__)
651# if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
652# define QSC_SYSTEM_IS_LITTLE_ENDIAN 1U
653# elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
654# define QSC_SYSTEM_IS_LITTLE_ENDIAN 0U
655# elif defined(_WIN32) || defined(__LITTLE_ENDIAN__)
656# define QSC_SYSTEM_IS_LITTLE_ENDIAN 1U
660#if (!defined(QSC_SYSTEM_IS_LITTLE_ENDIAN))
661# if defined(__sparc) || defined(__sparc__) || defined(__hppa__) || defined(__PPC__) || defined(__mips__) || (defined(__MWERKS__) && !defined(__INTEL__))
666# define QSC_SYSTEM_IS_BIG_ENDIAN
672# define QSC_SYSTEM_IS_LITTLE_ENDIAN
676#if defined(__SIZEOF_INT128__) && defined(QSC_SYSTEM_IS_X64) && !defined(__xlc__) && !defined(uint128_t)
681# define QSC_SYSTEM_NATIVE_UINT128
682# if defined(__GNUC__)
687 typedef unsigned int uint128_t QSC_ATTRIBUTE((mode(TI)));
689 typedef __int128 uint128_t;
697#if defined(QSC_SYSTEM_NATIVE_UINT128)
698# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
700 const uint128_t r = (uint128_t)(X) * (Y); \
701 *(High) = (r >> 64) & 0xFFFFFFFFFFFFFFFFULL; \
702 *(Low) = (r) & 0xFFFFFFFFFFFFFFFFULL; \
704#elif defined(QSC_SYSTEM_COMPILER_MSC) && defined(QSC_SYSTEM_IS_X64)
706# pragma intrinsic(_umul128)
707# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
709 *(Low) = _umul128((X), (Y), (High)); \
711#elif defined(QSC_SYSTEM_COMPILER_GCC)
712# if defined(QSC_SYSTEM_ARCH_IX86)
713# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
715 asm("mulq %3" : "=d" (*(High)), "=a" (*(Low)) : "a" (X), "rm" (Y) : "cc"); \
717# elif defined(QSC_SYSTEM_ARCH_ALPHA)
718# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
720 asm("umulh %1,%2,%0" : "=r" (*(High)) : "r" (X), "r" (Y)); \
721 *(Low) = (X) * (Y); \
723# elif defined(QSC_SYSTEM_ARCH_IA64)
724# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
726 asm("xmpy.hu %0=%1,%2" : "=f" (*(High)) : "f" (X), "f" (Y)); \
727 *(Low) = (X) * (Y); \
729# elif defined(QSC_SYSTEM_ARCH_PPC)
730# define QSC_SYSTEM_FAST_64X64_MUL(X,Y,Low,High) \
732 asm("mulhdu %0,%1,%2" : "=r" (*(High)) : "r" (X), "r" (Y) : "cc"); \
733 *(Low) = (X) * (Y); \
742#define QSC_SYSTEM_MAX_NAME 260ULL
748#define QSC_SYSTEM_MAX_PATH 260ULL
754#define QSC_SYSTEM_SECMEMALLOC_DEFAULT 4096ULL
760#define QSC_SYSTEM_SECMEMALLOC_MIN 16ULL
766#define QSC_SYSTEM_SECMEMALLOC_MAX 131072ULL
772#define QSC_SYSTEM_SECMEMALLOC_MAXKB 512ULL
779# define QSC_SYSTEM_VIRTUAL_LOCK
785# define QSC_RTL_SECURE_MEMORY
788#if defined(_POSIX_MEMLOCK_RANGE)
793# define QSC_SYSTEM_POSIX_MLOCK
796#if defined(QSC_SYSTEM_VIRTUAL_LOCK) || defined(QSC_SYSTEM_POSIX_MLOCK)
801# define QSC_SYSTEM_SECURE_ALLOCATOR
808#if defined(QSC_SYSTEM_COMPILER_MSC)
809# define QSC_SYSTEM_OPTIMIZE_IGNORE __pragma(optimize("", off))
810#elif defined(QSC_SYSTEM_COMPILER_GCC) || defined(QSC_SYSTEM_COMPILER_MINGW)
811# if defined(__clang__)
812# define QSC_SYSTEM_OPTIMIZE_IGNORE QSC_ATTRIBUTE((optnone))
814# define QSC_SYSTEM_OPTIMIZE_IGNORE QSC_ATTRIBUTE((optimize("O0")))
816#elif defined(QSC_SYSTEM_COMPILER_INTEL)
817# define QSC_SYSTEM_OPTIMIZE_IGNORE _Pragma("optimize(\"\", off)")
819# define QSC_SYSTEM_OPTIMIZE_IGNORE
826#if defined(QSC_SYSTEM_COMPILER_MSC)
827# define QSC_SYSTEM_OPTIMIZE_RESUME __pragma(optimize("", on))
828#elif defined(QSC_SYSTEM_COMPILER_GCC) || defined(QSC_SYSTEM_COMPILER_MINGW)
829# if defined(__clang__)
830# define QSC_SYSTEM_OPTIMIZE_RESUME
832# define QSC_SYSTEM_OPTIMIZE_RESUME
834#elif defined(QSC_SYSTEM_COMPILER_INTEL)
835# define QSC_SYSTEM_OPTIMIZE_RESUME _Pragma("optimize(\"\", on)")
837# define QSC_SYSTEM_OPTIMIZE_RESUME
844#if defined(QSC_SYSTEM_COMPILER_MSC)
845# define QSC_SYSTEM_CONDITION_IGNORE(x) __pragma(warning(disable : x))
846#elif defined(QSC_SYSTEM_COMPILER_GCC) || defined(QSC_SYSTEM_COMPILER_MINGW)
847# define QSC_SYSTEM_CONDITION_IGNORE(x)
848#elif defined(QSC_SYSTEM_COMPILER_INTEL)
849# define QSC_SYSTEM_CONDITION_IGNORE(x)
851# define QSC_SYSTEM_CONDITION_IGNORE(x)
858#if defined(QSC_SYSTEM_COMPILER_MSC)
859# define QSC_SYSTEM_CONDITION_RESUME(x) __pragma(warning(default : x))
860#elif defined(QSC_SYSTEM_COMPILER_GCC) || defined(QSC_SYSTEM_COMPILER_MINGW)
861# define QSC_SYSTEM_CONDITION_RESUME(x)
862#elif defined(QSC_SYSTEM_COMPILER_INTEL)
863# define QSC_SYSTEM_CONDITION_RESUME(x)
865# define QSC_SYSTEM_CONDITION_RESUME(x)
868#if defined(_MSC_VER) && (_MSC_VER >= 1600)
873# define QSC_WMMINTRIN_H 1
876#if defined(_MSC_VER) && (_MSC_VER >= 1700) && defined(_M_X64)
881# define QSC_HAVE_AVX2INTRIN_H 1
888#if defined(QSC_SYSTEM_X86)
890# if defined(__AVX512F__) && (__AVX512F__ == 1)
895# include <immintrin.h>
896# if (!defined(__AVX512__))
901# if defined(__SSE2__)
906# define QSC_SYSTEM_HAS_SSE2
909# if defined(__SSE3__)
914# define QSC_SYSTEM_HAS_SSE3
917# if defined(__SSSE3__)
922# define QSC_SYSTEM_HAS_SSSE3
925# if defined(__SSE4_1__)
930# define QSC_SYSTEM_HAS_SSE41
933# if defined(__SSE4_2__)
938# define QSC_SYSTEM_HAS_SSE42
941# if defined(__ARM_NEON) || defined(__ARM_NEON__)
946# define QSC_SYSTEM_HAS_ARM_NEON
954# if defined(__ARM_FEATURE_SVE)
955# define QSC_SYSTEM_HAS_ARM_SVE
963# if defined(__riscv_vector)
964# define QSC_SYSTEM_HAS_RVV
972# define QSC_SYSTEM_HAS_AVX
975# if defined(__AVX2__)
980# define QSC_SYSTEM_HAS_AVX2
983# if defined(__AVX512__)
988# define QSC_SYSTEM_HAS_AVX512
996# define QSC_SYSTEM_HAS_XOP
999# if defined(QSC_SYSTEM_HAS_AVX) || defined(QSC_SYSTEM_HAS_AVX2) || defined(QSC_SYSTEM_HAS_AVX512)
1004# define QSC_SYSTEM_AVX_INTRINSICS
1024#if defined(QSC_SYSTEM_AVX_INTRINSICS) && defined(QSC_SYSTEM_COMPILER_GCC) && defined(QSC_ASM_ENABLED)
1032#if !defined(QSC_ALIGN)
1034 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
1035 #define QSC_ALIGN(x) alignas(x)
1036# elif defined(_MSC_VER)
1037# define QSC_ALIGN(x) __declspec(align(x))
1038# elif defined(__GNUC__) || defined(__clang__)
1039# define QSC_ALIGN(x) __attribute__((aligned(x)))
1041# define QSC_ALIGN(x)
1049#if defined(QSC_SYSTEM_HAS_AVX512)
1050# define QSC_SIMD_ALIGNMENT 64
1051#elif defined(QSC_SYSTEM_HAS_AVX2)
1052# define QSC_SIMD_ALIGNMENT 32
1053#elif defined(QSC_SYSTEM_HAS_AVX)
1054# define QSC_SIMD_ALIGNMENT 16
1056# define QSC_SIMD_ALIGNMENT 8
1063#if defined(_MSC_VER)
1064# define QSC_SIMD_ALIGN __declspec(align(QSC_SIMD_ALIGNMENT))
1065#elif defined(__GNUC__) || defined(__clang__)
1066# define QSC_SIMD_ALIGN _Alignas(QSC_SIMD_ALIGNMENT)
1068# define QSC_SIMD_ALIGN
1071#if defined(QSC_SYSTEM_AVX_INTRINSICS)
1076# define QSC_RDRAND_COMPATIBLE
1083#define QSC_STATUS_SUCCESS 0LL
1089#define QSC_STATUS_FAILURE -1LL
1095#if !defined(QSC_SYSTEM_AESNI_ENABLED)
1096# if defined(QSC_SYSTEM_AVX_INTRINSICS)
1101# define QSC_SYSTEM_AESNI_ENABLED
1109#if defined(__SHA__) || defined(__SHA256__) || defined(__SHA512__) || defined(__ISA_AVAILABLE_SHA)
1110# define QSC_SHA2_SHANI_ENABLED
1150#define QSC_EDDH_RFC_7748_COMPLIANT
1156#define QSC_EDDH_S1EC25519
1176#define QSC_KYBER_S5K4P1024
1202#define QSC_HQC_S5N7333
1222#define QSC_MCELIECE_S5N6688T128
1254#define QSC_DILITHIUM_S5P87
1274#define QSC_ECDSA_S5P521
1282#define QSC_EDDSA_S1EC25519
1296#define QSC_FALCON_S5SHAKE256F1024
1316#define QSC_SPHINCSPLUS_S5S256SHAKERS
1324QSC_CPLUSPLUS_ENABLED_END