mirror of
https://github.com/NGSolve/netgen.git
synced 2024-11-14 18:08:33 +05:00
85e8c09ff6
Neither GCC nor Clang define an __arm64__ preprocessor macro, but use __aarch64__ (MSVC uses _MARM_64). Add a "64" suffix to the define, i.e. NETGEN_ARCH_ARM64 to make it more obvious in only refers to aarch64, and to be in line with NETGEN_ARCH_AMD64. Replace the (Clang specific) __builtin_readcyclecounter with inline asm: - The function return cycles (i.e. varies with CPU frequency), not time - It may return 0, depending on the PMU settings - It may cause an illegal instruction, in case it is not trapped by the kernel, e.g. on FreeBSD. Reading the generic timer/counter CNTVCT_EL0 instead of PMCCNTR_EL0 avoids these pitfalls. The inline asm works on GCC and Clang, instead of Clang only for the builtin.
142 lines
3.7 KiB
C++
142 lines
3.7 KiB
C++
#ifndef NETGEN_CORE_NGCORE_API_HPP
|
|
#define NETGEN_CORE_NGCORE_API_HPP
|
|
|
|
#ifdef WIN32
|
|
|
|
// This function or variable may be unsafe. Consider using _ftime64_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
|
|
#pragma warning(disable:4244)
|
|
#pragma warning(disable:4996)
|
|
|
|
// multiple inheritance via dominance
|
|
#pragma warning(disable:4250)
|
|
|
|
// needs to have dll-interface to be used by clients of class
|
|
#pragma warning(disable:4251)
|
|
|
|
// size_t to int conversion:
|
|
#pragma warning(disable:4267)
|
|
|
|
// non dll-interface class 'std::exception' used as base for dll-interface class
|
|
#pragma warning(disable:4275)
|
|
|
|
// C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
|
|
#pragma warning(disable:4290)
|
|
|
|
// no suitable definition provided for explicit template instantiation request
|
|
#pragma warning(disable:4661)
|
|
|
|
// bool-int conversion
|
|
#pragma warning(disable:4800)
|
|
|
|
// '__declspec(dllexport)' and 'extern' are incompatible on an explicit instantiation
|
|
#pragma warning(disable:4910)
|
|
|
|
#endif // WIN32
|
|
|
|
|
|
#ifdef WIN32
|
|
#define NGCORE_API_EXPORT __declspec(dllexport)
|
|
#define NGCORE_API_IMPORT __declspec(dllimport)
|
|
#else
|
|
#define NGCORE_API_EXPORT __attribute__((visibility("default")))
|
|
#define NGCORE_API_IMPORT __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
#ifdef NGCORE_EXPORTS
|
|
#define NGCORE_API NGCORE_API_EXPORT
|
|
#else
|
|
#define NGCORE_API NGCORE_API_IMPORT
|
|
#endif
|
|
|
|
#ifdef __INTEL_COMPILER
|
|
#ifdef WIN32
|
|
#define NETGEN_INLINE __forceinline inline
|
|
#define NETGEN_LAMBDA_INLINE
|
|
#else
|
|
#define NETGEN_INLINE __forceinline inline
|
|
#define NETGEN_LAMBDA_INLINE __attribute__ ((__always_inline__))
|
|
#endif
|
|
#else
|
|
#ifdef __GNUC__
|
|
#define NETGEN_INLINE __attribute__ ((__always_inline__)) inline
|
|
#define NETGEN_LAMBDA_INLINE __attribute__ ((__always_inline__))
|
|
#define NETGEN_VLA
|
|
#else
|
|
#define NETGEN_INLINE inline
|
|
#define NETGEN_LAMBDA_INLINE
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(__amd64__) || defined(_M_AMD64)
|
|
#define NETGEN_ARCH_AMD64
|
|
#endif
|
|
|
|
#if defined(__aarch64__) || defined(_M_ARM64)
|
|
#define NETGEN_ARCH_ARM64
|
|
#endif
|
|
|
|
#if defined(__arm__) || defined(_M_ARM)
|
|
#define NETGEN_ARCH_ARM
|
|
#endif
|
|
|
|
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
|
|
#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101400
|
|
// The c++ standard library on MacOS 10.13 and earlier has no aligned new operator,
|
|
// thus implement it here globally
|
|
#include <mm_malloc.h>
|
|
#ifdef __clang__
|
|
#pragma clang diagnostic ignored "-Winline-new-delete"
|
|
#endif
|
|
inline void * operator new (size_t s, std::align_val_t al)
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
return _mm_malloc(s, int(al));
|
|
else
|
|
return new char[s];
|
|
}
|
|
|
|
inline void * operator new[] (size_t s, std::align_val_t al)
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
return _mm_malloc(s, int(al));
|
|
else
|
|
return new char[s];
|
|
}
|
|
|
|
inline void operator delete ( void* ptr, std::align_val_t al ) noexcept
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
_mm_free(ptr);
|
|
else
|
|
delete (char*)ptr;
|
|
}
|
|
|
|
inline void operator delete[]( void* ptr, std::align_val_t al ) noexcept
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
_mm_free(ptr);
|
|
else
|
|
delete[] (char*)ptr;
|
|
}
|
|
|
|
inline void operator delete ( void* ptr, std::size_t sz, std::align_val_t al ) noexcept
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
_mm_free(ptr);
|
|
else
|
|
delete (char*)ptr;
|
|
}
|
|
|
|
inline void operator delete[]( void* ptr, std::size_t sz, std::align_val_t al ) noexcept
|
|
{
|
|
if (int(al) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
|
|
_mm_free(ptr);
|
|
else
|
|
delete[] (char*)ptr;
|
|
}
|
|
|
|
#endif // __MAC_OS_X_VERSION_MIN_REQUIRED
|
|
#endif // __MAC_OS_X_VERSION_MIN_REQUIRED < 101300
|
|
|
|
#endif // NETGEN_CORE_NGCORE_API_HPP
|