From e0ee615183b6e89f7ffc755dbe8492d1e598d52c Mon Sep 17 00:00:00 2001 From: theAsmodai Date: Sat, 24 Dec 2016 15:09:50 +0300 Subject: [PATCH] Added Agner's asmlib (#87) --- regamedll/build.gradle | 5 +- regamedll/common/mathlib.h | 55 ++++++-- regamedll/lib/libacof32.lib | Bin 0 -> 83000 bytes regamedll/lib/linux32/libaelf32.a | Bin 0 -> 87492 bytes regamedll/msvc/ReGameDLL.vcxproj | 1 + regamedll/msvc/ReGameDLL.vcxproj.filters | 3 + regamedll/public/asmlib.h | 123 ++++++++++++++++++ regamedll/public/regamedll/regamedll_common.h | 60 ++++++++- regamedll/regamedll/precompiled.h | 1 + 9 files changed, 231 insertions(+), 17 deletions(-) create mode 100644 regamedll/lib/libacof32.lib create mode 100644 regamedll/lib/linux32/libaelf32.a create mode 100644 regamedll/public/asmlib.h diff --git a/regamedll/build.gradle b/regamedll/build.gradle index 46296bd2..a0f24d3f 100644 --- a/regamedll/build.gradle +++ b/regamedll/build.gradle @@ -130,6 +130,8 @@ void setupToolchain(NativeBinarySpec b) cfg.linkerOptions.randomizedBaseAddress = false cfg.linkerOptions.baseAddress = '0x4970000' } + cfg.projectLibpath(project, '/lib') + cfg.extraLibs 'libacof32.lib' } else if (cfg instanceof GccToolchainConfig) { @@ -153,7 +155,8 @@ void setupToolchain(NativeBinarySpec b) cfg.linkerOptions.args '-no-opt-class-analysis' cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-g0', '-fno-rtti' - cfg.extraLibs 'dl', 'm', 'stdc++' + cfg.projectLibpath(project, '/lib/linux32') + cfg.extraLibs 'dl', 'm', 'stdc++', 'aelf32' } if (mpLib && GradleCppUtils.windows && !unitTestExecutable) { diff --git a/regamedll/common/mathlib.h b/regamedll/common/mathlib.h index 88bb0568..b363490c 100644 --- a/regamedll/common/mathlib.h +++ b/regamedll/common/mathlib.h @@ -106,24 +106,61 @@ inline T& operator&= (T& a, T b) { return (T&)((type&)a &= (type)b); } template::type> inline T& operator^= (T& a, T b) { return (T&)((type&)a ^= (type)b); } -inline double M_sqrt(int value) { - return sqrt(value); -} - inline float M_sqrt(float value) { return _mm_cvtss_f32(_mm_sqrt_ss(_mm_load_ss(&value))); } inline double M_sqrt(double value) { - double ret; auto v = _mm_load_sd(&value); - _mm_store_sd(&ret, _mm_sqrt_sd(v, v)); - return ret; + return _mm_cvtsd_f64(_mm_sqrt_sd(v, v)); +} + +template +inline double M_sqrt(T value) { + return sqrt(value); +} + +inline float M_min(float a, float b) { + return _mm_cvtss_f32(_mm_min_ss(_mm_load_ss(&a), _mm_load_ss(&b))); +} + +inline double M_min(double a, double b) { + return _mm_cvtsd_f64(_mm_min_sd(_mm_load_sd(&a), _mm_load_sd(&b))); +} + +template +inline T M_min(T a, T b) { + return min(a, b); +} + +inline float M_max(float a, float b) { + return _mm_cvtss_f32(_mm_max_ss(_mm_load_ss(&a), _mm_load_ss(&b))); +} + +inline double M_max(double a, double b) { + return _mm_cvtsd_f64(_mm_max_sd(_mm_load_sd(&a), _mm_load_sd(&b))); +} + +template +inline T M_max(T a, T b) { + return max(a, b); +} + +inline float M_clamp(float a, float min, float max) { + return _mm_cvtss_f32(_mm_min_ss(_mm_max_ss(_mm_load_ss(&a), _mm_load_ss(&min)), _mm_load_ss(&max))); +} + +inline double M_clamp(double a, double min, double max) { + return _mm_cvtsd_f64(_mm_min_sd(_mm_max_sd(_mm_load_sd(&a), _mm_load_sd(&min)), _mm_load_sd(&max))); +} + +template +inline T M_clamp(T a, T min, T max) { + return clamp(a, min, max); } template -inline void SWAP(T &first, T &second) -{ +inline void SWAP(T &first, T &second) { T temp = first; first = second; second = temp; diff --git a/regamedll/lib/libacof32.lib b/regamedll/lib/libacof32.lib new file mode 100644 index 0000000000000000000000000000000000000000..9709278063280b8402f096b19e4e0d6c1c16d7ff GIT binary patch literal 83000 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 z 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 literal 0 HcmV?d00001 diff --git a/regamedll/msvc/ReGameDLL.vcxproj b/regamedll/msvc/ReGameDLL.vcxproj index 2436287e..88d29529 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj +++ b/regamedll/msvc/ReGameDLL.vcxproj @@ -1075,6 +1075,7 @@ + diff --git a/regamedll/msvc/ReGameDLL.vcxproj.filters b/regamedll/msvc/ReGameDLL.vcxproj.filters index e9c239ad..5521be91 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj.filters +++ b/regamedll/msvc/ReGameDLL.vcxproj.filters @@ -1127,6 +1127,9 @@ dlls + + public + diff --git a/regamedll/public/asmlib.h b/regamedll/public/asmlib.h new file mode 100644 index 00000000..c1bc9af8 --- /dev/null +++ b/regamedll/public/asmlib.h @@ -0,0 +1,123 @@ +/*************************** asmlib.h *************************************** +* Author: Agner Fog +* Date created: 2003-12-12 +* Last modified: 2013-10-04 +* Project: asmlib.zip +* Source URL: www.agner.org/optimize +* +* Description: +* Header file for the asmlib function library. +* This library is available in many versions for different platforms. +* See asmlib-instructions.pdf for details. +* +* (c) Copyright 2003 - 2013 by Agner Fog. +* GNU General Public License http://www.gnu.org/licenses/gpl.html +*****************************************************************************/ + + +#ifndef ASMLIB_H +#define ASMLIB_H + + +/*********************************************************************** +Define compiler-specific types and directives +***********************************************************************/ + +// Define type size_t +#ifndef _SIZE_T_DEFINED +#include "stddef.h" +#endif + +// Define integer types with known size: int32_t, uint32_t, int64_t, uint64_t. +// If this doesn't work then insert compiler-specific definitions here: +#if defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1600) + // Compilers supporting C99 or C++0x have stdint.h defining these integer types + #include + #define INT64_SUPPORTED // Remove this if the compiler doesn't support 64-bit integers +#elif defined(_MSC_VER) + // Older Microsoft compilers have their own definition + typedef signed __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef signed __int32 int32_t; + typedef unsigned __int32 uint32_t; + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; + #define INT64_SUPPORTED // Remove this if the compiler doesn't support 64-bit integers +#else + // This works with most compilers + typedef signed short int int16_t; + typedef unsigned short int uint16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + typedef long long int64_t; + typedef unsigned long long uint64_t; + #define INT64_SUPPORTED // Remove this if the compiler doesn't support 64-bit integers +#endif + + +// Turn off name mangling +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************************** +Function prototypes, memory and string functions +***********************************************************************/ +void * A_memcpy (void * dest, const void * src, size_t count); // Copy count bytes from src to dest +void * A_memmove(void * dest, const void * src, size_t count); // Same as memcpy, allows overlap between src and dest +void * A_memset (void * dest, int c, size_t count); // Set count bytes in dest to (char)c +int A_memcmp (const void * buf1, const void * buf2, size_t num); // Compares two blocks of memory +size_t GetMemcpyCacheLimit(void); // Data blocks bigger than this will be copied uncached by memcpy and memmove +void SetMemcpyCacheLimit(size_t); // Change limit in GetMemcpyCacheLimit +size_t GetMemsetCacheLimit(void); // Data blocks bigger than this will be stored uncached by memset +void SetMemsetCacheLimit(size_t); // Change limit in GetMemsetCacheLimit +char * A_strcat (char * dest, const char * src); // Concatenate strings dest and src. Store result in dest +char * A_strcpy (char * dest, const char * src); // Copy string src to dest +size_t A_strlen (const char * str); // Get length of zero-terminated string +int A_strcmp (const char * a, const char * b); // Compare strings. Case sensitive +int A_stricmp (const char *string1, const char *string2); // Compare strings. Case insensitive for A-Z only +char * A_strstr (char * haystack, const char * needle); // Search for substring in string +void A_strtolower(char * string); // Convert string to lower case for A-Z only +void A_strtoupper(char * string); // Convert string to upper case for a-z only +size_t A_substring(char * dest, const char * source, size_t pos, size_t len); // Copy a substring for source into dest +size_t A_strspn (const char * str, const char * set); // Find span of characters that belong to set +size_t A_strcspn(const char * str, const char * set); // Find span of characters that don't belong to set +size_t strCountInSet(const char * str, const char * set); // Count characters that belong to set +size_t strcount_UTF8(const char * str); // Counts the number of characters in a UTF-8 encoded string + + +/*********************************************************************** +Function prototypes, miscellaneous functions +***********************************************************************/ +uint32_t A_popcount(uint32_t x); // Count 1-bits in 32-bit integer +int RoundD (double x); // Round to nearest or even +int RoundF (float x); // Round to nearest or even +int InstructionSet(void); // Tell which instruction set is supported +char * ProcessorName(void); // ASCIIZ text describing microprocessor +void CpuType(int * vendor, int * family, int * model); // Get CPU vendor, family and model +size_t DataCacheSize(int level); // Get size of data cache +void A_DebugBreak(void); // Makes a debug breakpoint +#ifdef INT64_SUPPORTED + uint64_t ReadTSC(void); // Read microprocessor internal clock (64 bits) +#else + uint32_t ReadTSC(void); // Read microprocessor internal clock (only 32 bits supported by compiler) +#endif +void cpuid_ex (int abcd[4], int eax, int ecx); // call CPUID instruction +static inline void cpuid_abcd (int abcd[4], int eax) { + cpuid_ex(abcd, eax, 0);} + +#ifdef __cplusplus +} // end of extern "C" + +// Define overloaded versions if compiling as C++ + +static inline int Round (double x) { // Overload name Round + return RoundD(x);} +static inline int Round (float x) { // Overload name Round + return RoundF(x);} +static inline const char * A_strstr(const char * haystack, const char * needle) { + return A_strstr((char*)haystack, needle);} // Overload A_strstr with const char * version + +#endif // __cplusplus + +#endif // ASMLIB_H diff --git a/regamedll/public/regamedll/regamedll_common.h b/regamedll/public/regamedll/regamedll_common.h index 826b6ded..04ad3383 100644 --- a/regamedll/public/regamedll/regamedll_common.h +++ b/regamedll/public/regamedll/regamedll_common.h @@ -41,6 +41,57 @@ #define Q_alloca alloca #define Q_free free +#ifdef REGAMEDLL_FIXES +#define Q_sqrt M_sqrt +#define Q_min M_min +#define Q_max M_max +#define Q_clamp M_clamp +#define Q_access _access +#define Q_close _close +#define Q_write _write +#define Q_memset A_memset +#define Q_memcpy A_memcpy +#define Q_memcmp A_memcmp +#define Q_memmove A_memmove +#define Q_strlen A_strlen +#define Q_strcpy A_strcpy +#define Q_strncpy strncpy +#define Q_strrchr A_strrchr +#define Q_strcat A_strcat +#define Q_strncat strncat +#define Q_strcmp A_strcmp +#define Q_strncmp strncmp +#define Q_sscanf sscanf +#define Q_strdup _strdup +#define Q_stricmp _stricmp +#define Q_strnicmp _strnicmp +#define Q_strstr A_strstr +#define Q_strchr strchr +#define Q_strrchr A_strrchr +#define Q_strlwr A_strtolower +#define Q_sprintf sprintf +#define Q_snprintf _snprintf +#define Q_atoi atoi +#define Q_atof atof +#define Q_toupper toupper +#define Q_vsnprintf _vsnprintf +#define Q_vsnwprintf _vsnwprintf +#define Q_abs abs +#define Q_fabs fabs +#define Q_tan tan +#define Q_atan atan +#define Q_atan2 atan2 +#define Q_acos acos +#define Q_cos cos +#define Q_sin sin +#define Q_pow pow +#define Q_fmod fmod +#define Q_fopen fopen +#define Q_fwrite fwrite +#define Q_fprintf fprintf +#define Q_fclose fclose +#else +#define Q_sqrt sqrt #define Q_min min #define Q_max max #define Q_clamp clamp @@ -49,8 +100,9 @@ #define Q_write _write #define Q_memset memset #define Q_memcpy memcpy -#define Q_strlen strlen #define Q_memcmp memcmp +#define Q_memmove memmove +#define Q_strlen strlen #define Q_strcpy strcpy #define Q_strncpy strncpy #define Q_strrchr strrchr @@ -71,7 +123,6 @@ #define Q_atoi atoi #define Q_atof atof #define Q_toupper toupper -#define Q_memmove memmove #define Q_vsnprintf _vsnprintf #define Q_vsnwprintf _vsnwprintf #define Q_abs abs @@ -88,9 +139,4 @@ #define Q_fwrite fwrite #define Q_fprintf fprintf #define Q_fclose fclose - -#ifdef REGAMEDLL_FIXES -#define Q_sqrt M_sqrt -#else -#define Q_sqrt sqrt #endif diff --git a/regamedll/regamedll/precompiled.h b/regamedll/regamedll/precompiled.h index d106c055..55c04781 100644 --- a/regamedll/regamedll/precompiled.h +++ b/regamedll/regamedll/precompiled.h @@ -6,6 +6,7 @@ #include "basetypes.h" #include "archtypes.h" #include "sse_mathfun.h" +#include "asmlib.h" #include "MemPool.h" #include "engine.h"