From 2ba0b1b76bbbd027d81016c27e0cd1b1dd90e007 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 17 Aug 2014 21:03:43 +1000 Subject: [PATCH] Use posix_memalign and _aligned_malloc for alignment. Remove unused code. --- common/build/Utilities/utilities.vcxproj | 3 +- .../build/Utilities/utilities.vcxproj.filters | 5 +- .../build/Utilities/utilities_vs2012.vcxproj | 3 +- .../utilities_vs2012.vcxproj.filters | 5 +- .../build/Utilities/utilities_vs2013.vcxproj | 3 +- .../utilities_vs2013.vcxproj.filters | 5 +- common/include/Utilities/General.h | 2 +- common/include/Utilities/HashMap.h | 2 - common/include/Utilities/MemcpyFast.h | 3 - common/include/Utilities/RedtapeWindows.h | 2 +- common/include/Utilities/ScopedAlloc.h | 31 ++++-- common/include/Utilities/StringHelpers.h | 3 - common/include/Utilities/lnx_memzero.h | 15 +-- common/include/Utilities/win_memzero.h | 95 ---------------- common/src/Utilities/AlignedMalloc.cpp | 101 ------------------ common/src/Utilities/CMakeLists.txt | 5 +- common/src/Utilities/vssprintf.cpp | 19 ---- plugins/GSdx/stdafx.cpp | 25 ----- plugins/GSdx/stdafx.h | 19 ++-- plugins/zerogs/opengl/GS.h | 31 ++---- plugins/zerospu2/misc.h | 25 ++--- 21 files changed, 57 insertions(+), 345 deletions(-) delete mode 100644 common/src/Utilities/AlignedMalloc.cpp diff --git a/common/build/Utilities/utilities.vcxproj b/common/build/Utilities/utilities.vcxproj index f621e3db21..69bd5b5e98 100644 --- a/common/build/Utilities/utilities.vcxproj +++ b/common/build/Utilities/utilities.vcxproj @@ -95,7 +95,6 @@ - @@ -196,4 +195,4 @@ - \ No newline at end of file + diff --git a/common/build/Utilities/utilities.vcxproj.filters b/common/build/Utilities/utilities.vcxproj.filters index d27c7ccf93..d37d0f1308 100644 --- a/common/build/Utilities/utilities.vcxproj.filters +++ b/common/build/Utilities/utilities.vcxproj.filters @@ -23,9 +23,6 @@ - - Source Files - Source Files @@ -228,4 +225,4 @@ Source Files\Linux - \ No newline at end of file + diff --git a/common/build/Utilities/utilities_vs2012.vcxproj b/common/build/Utilities/utilities_vs2012.vcxproj index 5ce5bdca18..b991aac030 100644 --- a/common/build/Utilities/utilities_vs2012.vcxproj +++ b/common/build/Utilities/utilities_vs2012.vcxproj @@ -99,7 +99,6 @@ - @@ -200,4 +199,4 @@ - \ No newline at end of file + diff --git a/common/build/Utilities/utilities_vs2012.vcxproj.filters b/common/build/Utilities/utilities_vs2012.vcxproj.filters index d27c7ccf93..d37d0f1308 100644 --- a/common/build/Utilities/utilities_vs2012.vcxproj.filters +++ b/common/build/Utilities/utilities_vs2012.vcxproj.filters @@ -23,9 +23,6 @@ - - Source Files - Source Files @@ -228,4 +225,4 @@ Source Files\Linux - \ No newline at end of file + diff --git a/common/build/Utilities/utilities_vs2013.vcxproj b/common/build/Utilities/utilities_vs2013.vcxproj index 74d5a82243..621c47c779 100644 --- a/common/build/Utilities/utilities_vs2013.vcxproj +++ b/common/build/Utilities/utilities_vs2013.vcxproj @@ -99,7 +99,6 @@ - @@ -200,4 +199,4 @@ - \ No newline at end of file + diff --git a/common/build/Utilities/utilities_vs2013.vcxproj.filters b/common/build/Utilities/utilities_vs2013.vcxproj.filters index 7d2d5e84a3..1bc92b68ab 100644 --- a/common/build/Utilities/utilities_vs2013.vcxproj.filters +++ b/common/build/Utilities/utilities_vs2013.vcxproj.filters @@ -23,9 +23,6 @@ - - Source Files - Source Files @@ -228,4 +225,4 @@ Source Files\Linux - \ No newline at end of file + diff --git a/common/include/Utilities/General.h b/common/include/Utilities/General.h index 54e0afd373..a1a37997f8 100644 --- a/common/include/Utilities/General.h +++ b/common/include/Utilities/General.h @@ -235,7 +235,7 @@ namespace HostSys extern void MemProtect( void* baseaddr, size_t size, const PageProtectionMode& mode ); - extern void Munmap( void* base, size_t size ); + extern void Munmap( void* base, size_t size ) { Munmap( (uptr)base, size); } template< uint size > void MemProtectStatic( u8 (&arr)[size], const PageProtectionMode& mode ) diff --git a/common/include/Utilities/HashMap.h b/common/include/Utilities/HashMap.h index 808138e4c7..cf28157252 100644 --- a/common/include/Utilities/HashMap.h +++ b/common/include/Utilities/HashMap.h @@ -15,8 +15,6 @@ #pragma once -#include - namespace HashTools { /// diff --git a/common/include/Utilities/MemcpyFast.h b/common/include/Utilities/MemcpyFast.h index 837554953d..c81572311a 100644 --- a/common/include/Utilities/MemcpyFast.h +++ b/common/include/Utilities/MemcpyFast.h @@ -35,9 +35,6 @@ #endif -// Only used in the Windows version of memzero.h. But it's in Misc.cpp for some reason. -void _memset16_unaligned( void* dest, u16 data, size_t size ); - // MemcpyVibes.cpp functions extern void memcpy_vibes(void * dest, const void * src, int size); extern void gen_memcpy_vibes(); diff --git a/common/include/Utilities/RedtapeWindows.h b/common/include/Utilities/RedtapeWindows.h index 6b07c66d2d..4a686052ba 100644 --- a/common/include/Utilities/RedtapeWindows.h +++ b/common/include/Utilities/RedtapeWindows.h @@ -31,7 +31,7 @@ #ifdef _WIN32 -// Force availability of to WinNT APIs (change to 0x600 to enable XP-specific APIs) +// Force availability of to WinNT APIs (change to 0x600 to disable XP-specific APIs) #ifndef WINVER #define WINVER 0x0501 #define _WIN32_WINNT 0x0501 diff --git a/common/include/Utilities/ScopedAlloc.h b/common/include/Utilities/ScopedAlloc.h index 9437495e19..98d01459a5 100644 --- a/common/include/Utilities/ScopedAlloc.h +++ b/common/include/Utilities/ScopedAlloc.h @@ -48,16 +48,31 @@ #define safe_aligned_free( ptr ) \ ((void) ( _aligned_free( ptr ), (ptr) = NULL )) +#if !defined(_MSC_VER) +// declare linux equivalents (alignment must be power of 2 (1,2,4...2^15) +static __forceinline void* _aligned_malloc(size_t size, size_t alignment) { + void *result=0; + posix_memalign(&result, alignment, size); + return result; +} -extern void* __fastcall pcsx2_aligned_malloc(size_t size, size_t align); -extern void* __fastcall pcsx2_aligned_realloc(void* handle, size_t size, size_t align); -extern void pcsx2_aligned_free(void* pmem); +void* __fastcall _aligned_realloc(void* handle, size_t size, size_t align) +{ + pxAssert( align < 0x10000 ); -// aligned_malloc: Implement/declare linux equivalents here! -#if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) -# define _aligned_malloc pcsx2_aligned_malloc -# define _aligned_free pcsx2_aligned_free -# define _aligned_realloc pcsx2_aligned_realloc + void* newbuf = _aligned_malloc( size, align ); + + if( handle != NULL ) + { + memcpy_fast( newbuf, handle, size ); + free( handle ); + } + return newbuf; +} + +static __forceinline void _aligned_free(void* p) { + free(p); +} #endif // -------------------------------------------------------------------------------------- diff --git a/common/include/Utilities/StringHelpers.h b/common/include/Utilities/StringHelpers.h index f3e19fb2d4..c2c82a9277 100644 --- a/common/include/Utilities/StringHelpers.h +++ b/common/include/Utilities/StringHelpers.h @@ -250,6 +250,3 @@ extern void ssprintf(std::string& dest, const char* fmt, ...); extern void ssappendf(std::string& dest, const char* format, ...); extern void vssprintf(std::string& dest, const char* format, va_list args); extern void vssappendf(std::string& dest, const char* format, va_list args); - -extern std::string fmt_string( const char* fmt, ... ); -extern std::string vfmt_string( const char* fmt, va_list args ); diff --git a/common/include/Utilities/lnx_memzero.h b/common/include/Utilities/lnx_memzero.h index c7dba5a76b..1366379165 100644 --- a/common/include/Utilities/lnx_memzero.h +++ b/common/include/Utilities/lnx_memzero.h @@ -16,8 +16,7 @@ #ifndef _LNX_MEMZERO_H_ #define _LNX_MEMZERO_H_ -// This header contains non-optimized implementation of memzero_ptr and memset8, -// memset16, etc. +// This header contains non-optimized implementation of memzero_ptr and memset8, etc template< u32 data, typename T > static __fi void memset32( T& obj ) @@ -57,18 +56,6 @@ static __fi void memset8( T& obj ) } } -template< u16 data, typename T > -static __fi void memset16( T& obj ) -{ - if( (sizeof(T) & 0x3) != 0 ) - _memset16_unaligned( &obj, data, sizeof( T ) ); - else { - const u32 data32 = data + (data<<16); - memset32( obj ); - } -} - - // An optimized memset for 8 bit destination data. template< u8 data, size_t bytes > static __fi void memset_8( void *dest ) diff --git a/common/include/Utilities/win_memzero.h b/common/include/Utilities/win_memzero.h index a941032a3c..d9e8d12188 100644 --- a/common/include/Utilities/win_memzero.h +++ b/common/include/Utilities/win_memzero.h @@ -373,94 +373,6 @@ static __fi void memset_8( void *dest ) } } -template< u16 data, size_t _bytes > -static __fi void memset_16( void *dest ) -{ - if( MZFbytes == 0 ) return; - - // Assertion: data length must be a multiple of 16 or 32 bits - pxAssume( (MZFbytes & 0x1) == 0 ); - - if( (MZFbytes & 0x3) != 0 ) - { - // Unaligned data length. No point in doing an optimized inline version (too complicated with - // remainders and such). - - _memset16_unaligned( dest, data, MZFbytes ); - return; - } - - //u64 _xmm_backup[2]; - - // This function only works on 32-bit alignments of data copied. - pxAssume( (MZFbytes & 0x3) == 0 ); - - enum - { - remdat = MZFbytes >> 2, - data32 = data + (data<<16) - }; - - // macro to execute the x86/32 "stosd" copies. - switch( remdat ) - { - case 1: - *(u32*)dest = data32; - return; - - case 2: - ((u32*)dest)[0] = data32; - ((u32*)dest)[1] = data32; - return; - - case 3: - __asm - { - mov edi, dest; - mov eax, data32; - stosd; - stosd; - stosd; - } - return; - - case 4: - __asm - { - mov edi, dest; - mov eax, data32; - stosd; - stosd; - stosd; - stosd; - } - return; - - case 5: - __asm - { - mov edi, dest; - mov eax, data32; - stosd; - stosd; - stosd; - stosd; - stosd; - } - return; - - default: - __asm - { - mov ecx, remdat; - mov edi, dest; - mov eax, data32; - rep stosd; - } - return - } -} - template< u32 data, size_t MZFbytes > static __fi void memset_32( void *dest ) { @@ -559,13 +471,6 @@ static __fi void memset8( T& object ) memset_8( &object ); } -// This method clears an object with the given 16 bit value. -template< u16 data, typename T > -static __fi void memset16( T& object ) -{ - memset_16( &object ); -} - // This method clears an object with the given 32 bit value. template< u32 data, typename T > static __fi void memset32( T& object ) diff --git a/common/src/Utilities/AlignedMalloc.cpp b/common/src/Utilities/AlignedMalloc.cpp deleted file mode 100644 index 285317b2e0..0000000000 --- a/common/src/Utilities/AlignedMalloc.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -// This module contains implementations of _aligned_malloc for platforms that don't have -// it built into their CRT/libc. - -#include "PrecompiledHeader.h" - -struct AlignedMallocHeader -{ - u32 size; // size of the allocated buffer (minus alignment and header) - void* baseptr; // offset of the original allocated pointer -}; - -static const uint headsize = sizeof(AlignedMallocHeader); - -void* __fastcall pcsx2_aligned_malloc(size_t size, size_t align) -{ - pxAssert( align < 0x10000 ); - -#if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9 - return aligned_alloc(align, size); -#else - u8* p = (u8*)malloc(size+align+headsize); - - // start alignment calculations from past the header. - uptr pasthead = (uptr)(p+headsize); - uptr aligned = (pasthead + align-1) & ~(align-1); - - AlignedMallocHeader* header = (AlignedMallocHeader*)(aligned-headsize); - pxAssert( (uptr)header >= (uptr)p ); - - header->baseptr = p; - header->size = size; - - return (void*)aligned; -#endif -} - -void* __fastcall pcsx2_aligned_realloc(void* handle, size_t size, size_t align) -{ - pxAssert( align < 0x10000 ); - - void* newbuf = pcsx2_aligned_malloc( size, align ); - - if( handle != NULL ) - { -#if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9 - memcpy_fast( newbuf, handle, size ); - free( handle ); -#else - AlignedMallocHeader* header = (AlignedMallocHeader*)((uptr)handle - headsize); - memcpy_fast( newbuf, handle, std::min( size, header->size ) ); - free( header->baseptr ); -#endif - } - return newbuf; -} - -__fi void pcsx2_aligned_free(void* pmem) -{ -#if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9 - free(pmem); -#else - if( pmem == NULL ) return; - AlignedMallocHeader* header = (AlignedMallocHeader*)((uptr)pmem - headsize); - free( header->baseptr ); -#endif -} - -// ---------------------------------------------------------------------------- -// And for lack of a better home ... - - -// Special unaligned memset used when all other optimized memsets fail (it's called from -// memzero_obj and stuff). -__fi void _memset16_unaligned( void* dest, u16 data, size_t size ) -{ - pxAssume( (size & 0x1) == 0 ); - - u16* dst = (u16*)dest; - for(int i=size; i; --i, ++dst ) - *dst = data; -} - -__fi void HostSys::Munmap( void* base, size_t size ) -{ - Munmap( (uptr)base, size ); -} diff --git a/common/src/Utilities/CMakeLists.txt b/common/src/Utilities/CMakeLists.txt index 4bc3b7d0b4..f1f7202216 100644 --- a/common/src/Utilities/CMakeLists.txt +++ b/common/src/Utilities/CMakeLists.txt @@ -85,9 +85,8 @@ endif(CMAKE_BUILD_TYPE STREQUAL Release) set(UtilitiesSources ../../include/Utilities/FixedPointTypes.inl ../../include/Utilities/EventSource.inl - ../../include/Utilities/SafeArray.inl - ../../include/Utilities/TlsVariable.inl - AlignedMalloc.cpp + ../../include/Utilities/SafeArray.inl + ../../include/Utilities/TlsVariable.inl CheckedStaticBox.cpp Console.cpp EventSource.cpp diff --git a/common/src/Utilities/vssprintf.cpp b/common/src/Utilities/vssprintf.cpp index 79452c8b01..31b18b580d 100644 --- a/common/src/Utilities/vssprintf.cpp +++ b/common/src/Utilities/vssprintf.cpp @@ -815,22 +815,3 @@ void ssprintf(std::string& str, const char* fmt, ...) vssprintf(str, fmt, args); va_end(args); } - -// See ssprintf for usage details and differences from sprintf formatting. -std::string fmt_string( const char* fmt, ... ) -{ - std::string retval; - va_list args; - va_start( args, fmt ); - vssprintf( retval, fmt, args ); - va_end( args ); - - return retval; -} - -std::string vfmt_string( const char* fmt, va_list args ) -{ - std::string retval; - vssprintf( retval, fmt, args ); - return retval; -} diff --git a/plugins/GSdx/stdafx.cpp b/plugins/GSdx/stdafx.cpp index 6cc39e5e57..c27feab72f 100644 --- a/plugins/GSdx/stdafx.cpp +++ b/plugins/GSdx/stdafx.cpp @@ -103,28 +103,3 @@ void vmfree(void* ptr, size_t size) #endif -#if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) - -// declare linux equivalents (alignment must be power of 2 (1,2,4...2^15) - -#if !defined(__USE_ISOC11) || defined(ASAN_WORKAROUND) - -void* _aligned_malloc(size_t size, size_t alignment) -{ - ASSERT(alignment <= 0x8000); - size_t r = (size_t)malloc(size + --alignment + 2); - size_t o = (r + 2 + alignment) & ~(size_t)alignment; - if(!r) return NULL; - ((uint16*)o)[-1] = (uint16)(o-r); - return (void*)o; -} - -void _aligned_free(void* p) -{ - if(!p) return; - free((void*)((size_t)p-((uint16*)p)[-1])); -} - -#endif - -#endif diff --git a/plugins/GSdx/stdafx.h b/plugins/GSdx/stdafx.h index 78c7dfd49a..eefc65d296 100644 --- a/plugins/GSdx/stdafx.h +++ b/plugins/GSdx/stdafx.h @@ -357,18 +357,15 @@ struct aligned_free_second {template void operator()(T& p) {_aligned_fr #undef abs #if !defined(_MSC_VER) + static inline void _aligned_malloc(size, a) { + void* ret; + posix_memalign(&return, a, size); + return ret; + } - #if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9 - - #define _aligned_malloc(size, a) aligned_alloc(a, size) - static inline void _aligned_free(void* p) { free(p); } - - #elif !defined(HAVE_ALIGNED_MALLOC) - - extern void* _aligned_malloc(size_t size, size_t alignment); - extern void _aligned_free(void* p); - - #endif + static inline void _aligned_free(void* p) { + free(p); + } // http://svn.reactos.org/svn/reactos/trunk/reactos/include/crt/mingw32/intrin_x86.h?view=markup diff --git a/plugins/zerogs/opengl/GS.h b/plugins/zerogs/opengl/GS.h index 86b350619b..d52da0f81c 100644 --- a/plugins/zerogs/opengl/GS.h +++ b/plugins/zerogs/opengl/GS.h @@ -69,32 +69,17 @@ extern std::string s_strIniPath; extern u32 THR_KeyEvent; // value for passing out key events beetwen threads extern bool THR_bShift; -#if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) - -// declare linux equivalents -static __forceinline void* pcsx2_aligned_malloc(size_t size, size_t align) -{ - assert( align < 0x10000 ); - char* p = (char*)malloc(size+align); - int off = 2+align - ((int)(uptr)(p+2) % align); - - p += off; - *(u16*)(p-2) = off; - - return p; +#if !defined(_MSC_VER) +// declare linux equivalents (alignment must be power of 2 (1,2,4...2^15) +static __forceinline void* _aligned_malloc(size_t size, size_t alignment) { + void *result=0; + posix_memalign(&result, alignment, size); + return result; } -static __forceinline void pcsx2_aligned_free(void* pmem) -{ - if( pmem != NULL ) { - char* p = (char*)pmem; - free(p - (int)*(u16*)(p-2)); - } +static __forceinline void _aligned_free(void* p) { + free(p); } - -#define _aligned_malloc pcsx2_aligned_malloc -#define _aligned_free pcsx2_aligned_free - #endif #include // ftime(), struct timeb diff --git a/plugins/zerospu2/misc.h b/plugins/zerospu2/misc.h index 0241ec1a0f..89f1d8aeee 100644 --- a/plugins/zerospu2/misc.h +++ b/plugins/zerospu2/misc.h @@ -63,26 +63,15 @@ inline u64 GetMicroTime() #endif } -#if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) - -#include - +#if !defined(_MSC_VER) // declare linux equivalents (alignment must be power of 2 (1,2,4...2^15) -static __forceinline void* pcsx2_aligned_malloc(size_t size, size_t alignment) { - assert(alignment <= 0x8000); - uptr r = (uptr)malloc(size + --alignment + 2); - uptr o = (r + 2 + alignment) & ~(uptr)alignment; - if (!r) return NULL; - ((u16*)o)[-1] = (u16)(o-r); - return (void*)o; +static __forceinline void* _aligned_malloc(size_t size, size_t alignment) { + void *result=0; + posix_memalign(&result, alignment, size); + return result; } -static __forceinline void pcsx2_aligned_free(void* p) { - if (!p) return; - free((void*)((uptr)p-((u16*)p)[-1])); +static __forceinline void _aligned_free(void* p) { + free(p); } - - -#define _aligned_malloc pcsx2_aligned_malloc -#define _aligned_free pcsx2_aligned_free #endif