diff options
Diffstat (limited to 'plugins/Dbx_mdbx/src/libmdbx/test/utils.cc')
-rw-r--r-- | plugins/Dbx_mdbx/src/libmdbx/test/utils.cc | 134 |
1 files changed, 83 insertions, 51 deletions
diff --git a/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc b/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc index 96866f61b7..0855c7eef3 100644 --- a/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc +++ b/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc @@ -14,44 +14,10 @@ #include "test.h" #include <float.h> -#ifdef HAVE_IEEE754_H +#if defined(HAVE_IEEE754_H) || __has_include(<ieee754.h>) #include <ieee754.h> #endif -/* Compiler's includes for builtins/intrinsics */ -#if defined(_MSC_VER) || defined(__INTEL_COMPILER) -#include <intrin.h> -#elif __GNUC_PREREQ(4, 4) || defined(__clang__) -#if defined(__ia32__) || defined(__e2k__) -#include <x86intrin.h> -#endif /* __ia32__ */ -#if defined(__ia32__) -#include <cpuid.h> -#endif /* __ia32__ */ -#elif defined(__SUNPRO_C) || defined(__sun) || defined(sun) -#include <mbarrier.h> -#elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC)) && \ - (defined(HP_IA64) || defined(__ia64)) -#include <machine/sys/inline.h> -#elif defined(__IBMC__) && defined(__powerpc) -#include <atomic.h> -#elif defined(_AIX) -#include <builtins.h> -#include <sys/atomic_op.h> -#elif (defined(__osf__) && defined(__DECC)) || defined(__alpha) -#include <c_asm.h> -#include <machine/builtins.h> -#elif defined(__MWERKS__) -/* CodeWarrior - troubles ? */ -#pragma gcc_extensions -#elif defined(__SNC__) -/* Sony PS3 - troubles ? */ -#elif defined(__hppa__) || defined(__hppa) -#include <machine/inline.h> -#else -#error Unsupported C compiler, please use GNU C 4.4 or newer -#endif /* Compiler */ - std::string format(const char *fmt, ...) { va_list ap, ones; va_start(ap, fmt); @@ -127,8 +93,22 @@ bool hex2data(const char *hex_begin, const char *hex_end, void *ptr, //----------------------------------------------------------------------------- +/* TODO: replace my 'libmera' fomr t1ha. */ uint64_t entropy_ticks(void) { +#if defined(EMSCRIPTEN) + return (uint64_t)emscripten_get_now(); +#endif /* EMSCRIPTEN */ + +#if defined(__APPLE__) || defined(__MACH__) + return mach_absolute_time(); +#endif /* defined(__APPLE__) || defined(__MACH__) */ + +#if defined(__sun__) || defined(__sun) + return gethrtime(); +#endif /* __sun__ */ + #if defined(__GNUC__) || defined(__clang__) + #if defined(__ia64__) uint64_t ticks; __asm __volatile("mov %0=ar.itc" : "=r"(ticks)); @@ -145,29 +125,81 @@ uint64_t entropy_ticks(void) { uint64_t ticks; __asm __volatile("rpcc %0" : "=r"(ticks)); return ticks; -#elif defined(__sparc_v9__) - uint64_t ticks; - __asm __volatile("rd %%tick, %0" : "=r"(ticks)); - return ticks; -#elif defined(__powerpc64__) || defined(__ppc64__) +#elif defined(__sparc__) || defined(__sparc) || defined(__sparc64__) || \ + defined(__sparc64) || defined(__sparc_v8plus__) || \ + defined(__sparc_v8plus) || defined(__sparc_v8plusa__) || \ + defined(__sparc_v8plusa) || defined(__sparc_v9__) || defined(__sparc_v9) + + union { + uint64_t u64; + struct { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + uint32_t h, l; +#else + uint32_t l, h; +#endif + } u32; + } cycles; + +#if defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || \ + defined(__sparc_v9__) || defined(__sparc_v8plus) || \ + defined(__sparc_v8plusa) || defined(__sparc_v9) + +#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul || \ + defined(__sparc64__) || defined(__sparc64) + __asm __volatile("rd %%tick, %0" : "=r"(cycles.u64)); +#else + __asm __volatile("rd %%tick, %1; srlx %1, 32, %0" + : "=r"(cycles.u32.h), "=r"(cycles.u32.l)); +#endif /* __sparc64__ */ + +#else + __asm __volatile(".byte 0x83, 0x41, 0x00, 0x00; mov %%g1, %0" + : "=r"(cycles.u64) + : + : "%g1"); +#endif /* __sparc8plus__ || __sparc_v9__ */ + return cycles.u64; + +#elif (defined(__powerpc64__) || defined(__ppc64__) || defined(__ppc64) || \ + defined(__powerpc64)) uint64_t ticks; __asm __volatile("mfspr %0, 268" : "=r"(ticks)); return ticks; -#elif defined(__ppc__) || defined(__powerpc__) - unsigned tbl, tbu; - - /* LY: Here not a problem if a high-part (tbu) - * would been updated during reading. */ - __asm __volatile("mftb %0" : "=r"(tbl)); - __asm __volatile("mftbu %0" : "=r"(tbu)); - - return (((uin64_t)tbu0) << 32) | tbl; +#elif (defined(__powerpc__) || defined(__ppc__) || defined(__powerpc) || \ + defined(__ppc)) +#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul + uint64_t ticks; + __asm __volatile("mftb %0" : "=r"(ticks)); + *now = ticks; +#else + uint64_t ticks; + uint32_t low, high_before, high_after; + __asm __volatile("mftbu %0; mftb %1; mftbu %2" + : "=r"(high_before), "=r"(low), "=r"(high_after)); + ticks = (uint64_t)high_after << 32; + ticks |= low & /* zeroes if high part has changed */ + ~(high_before - high_after); +#endif +#elif defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH > 7) + uint64_t virtual_timer; + __asm __volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer)); + return virtual_timer; +#elif defined(__ARM_ARCH) && __ARM_ARCH > 5 && __ARM_ARCH < 8 + unsigned long pmccntr; + __asm __volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); + return pmccntr; +#elif defined(__mips__) || defined(__mips) || defined(_R4000) + unsigned count; + __asm __volatile("rdhwr %0, $2" : "=r"(count)); + return count; #endif /* arch selector */ #endif /* __GNUC__ || __clang__ */ -#if defined(__e2k__) || defined(__elbrus__) || defined(_M_IX86) || \ - defined(_M_X64) || defined(__x86_64__) || defined(__i386__) +#if defined(__e2k__) || defined(__ia32__) return __rdtsc(); +#elif defined(_M_ARM) + return __rdpmccntr64(); #elif defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS) LARGE_INTEGER PerformanceCount; if (QueryPerformanceCounter(&PerformanceCount)) |