191 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef GIM_MEMORY_H_INCLUDED
 | |
| #define GIM_MEMORY_H_INCLUDED
 | |
| /*! \file gim_memory.h
 | |
| \author Francisco Leon Najera
 | |
| */
 | |
| /*
 | |
| -----------------------------------------------------------------------------
 | |
| This source file is part of GIMPACT Library.
 | |
| 
 | |
| For the latest info, see http://gimpact.sourceforge.net/
 | |
| 
 | |
| Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
 | |
| email: projectileman@yahoo.com
 | |
| 
 | |
|  This library is free software; you can redistribute it and/or
 | |
|  modify it under the terms of EITHER:
 | |
|    (1) The GNU Lesser General Public License as published by the Free
 | |
|        Software Foundation; either version 2.1 of the License, or (at
 | |
|        your option) any later version. The text of the GNU Lesser
 | |
|        General Public License is included with this library in the
 | |
|        file GIMPACT-LICENSE-LGPL.TXT.
 | |
|    (2) The BSD-style license that is included with this library in
 | |
|        the file GIMPACT-LICENSE-BSD.TXT.
 | |
|    (3) The zlib/libpng license that is included with this library in
 | |
|        the file GIMPACT-LICENSE-ZLIB.TXT.
 | |
| 
 | |
|  This library 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 files
 | |
|  GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
 | |
| 
 | |
| -----------------------------------------------------------------------------
 | |
| */
 | |
| 
 | |
| 
 | |
| #include "gim_math.h"
 | |
| #include <string.h>
 | |
| 
 | |
| #ifdef PREFETCH
 | |
| #include <xmmintrin.h>	// for prefetch
 | |
| #define pfval	64
 | |
| #define pfval2	128
 | |
| //! Prefetch 64
 | |
| #define pf(_x,_i)	_mm_prefetch((void *)(_x + _i + pfval), 0)
 | |
| //! Prefetch 128
 | |
| #define pf2(_x,_i)	_mm_prefetch((void *)(_x + _i + pfval2), 0)
 | |
| #else
 | |
| //! Prefetch 64
 | |
| #define pf(_x,_i)
 | |
| //! Prefetch 128
 | |
| #define pf2(_x,_i)
 | |
| #endif
 | |
| 
 | |
| 
 | |
| ///Functions for manip packed arrays of numbers
 | |
| #define GIM_COPY_ARRAYS(dest_array,source_array,element_count)\
 | |
| {\
 | |
|     for (GUINT _i_=0;_i_<element_count ;++_i_)\
 | |
|     {\
 | |
|     	dest_array[_i_] = source_array[_i_];\
 | |
|     }\
 | |
| }\
 | |
| 
 | |
| #define GIM_COPY_ARRAYS_1(dest_array,source_array,element_count,copy_macro)\
 | |
| {\
 | |
|     for (GUINT _i_=0;_i_<element_count ;++_i_)\
 | |
|     {\
 | |
|     	copy_macro(dest_array[_i_],source_array[_i_]);\
 | |
|     }\
 | |
| }\
 | |
| 
 | |
| 
 | |
| #define GIM_ZERO_ARRAY(array,element_count)\
 | |
| {\
 | |
|     for (GUINT _i_=0;_i_<element_count ;++_i_)\
 | |
|     {\
 | |
|     	array[_i_] = 0;\
 | |
|     }\
 | |
| }\
 | |
| 
 | |
| #define GIM_CONSTANT_ARRAY(array,element_count,constant)\
 | |
| {\
 | |
|     for (GUINT _i_=0;_i_<element_count ;++_i_)\
 | |
|     {\
 | |
|     	array[_i_] = constant;\
 | |
|     }\
 | |
| }\
 | |
| 
 | |
| 
 | |
| ///Function prototypes to allocate and free memory.
 | |
| typedef void * gim_alloc_function (size_t size);
 | |
| typedef void * gim_alloca_function (size_t size);//Allocs on the heap
 | |
| typedef void * gim_realloc_function (void *ptr, size_t oldsize, size_t newsize);
 | |
| typedef void gim_free_function (void *ptr);
 | |
| 
 | |
| 
 | |
| ///Memory Function Handlers
 | |
| ///set new memory management functions. if fn is 0, the default handlers are used.
 | |
| void gim_set_alloc_handler (gim_alloc_function *fn);
 | |
| void gim_set_alloca_handler (gim_alloca_function *fn);
 | |
| void gim_set_realloc_handler (gim_realloc_function *fn);
 | |
| void gim_set_free_handler (gim_free_function *fn);
 | |
| 
 | |
| 
 | |
| ///get current memory management functions.
 | |
| gim_alloc_function *gim_get_alloc_handler (void);
 | |
| gim_alloca_function *gim_get_alloca_handler(void);
 | |
| gim_realloc_function *gim_get_realloc_handler (void);
 | |
| gim_free_function  *gim_get_free_handler (void);
 | |
| 
 | |
| 
 | |
| ///Standar Memory functions
 | |
| void * gim_alloc(size_t size);
 | |
| void * gim_alloca(size_t size);
 | |
| void * gim_realloc(void *ptr, size_t oldsize, size_t newsize);
 | |
| void gim_free(void *ptr);
 | |
| 
 | |
| 
 | |
| 
 | |
| #if defined (_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
 | |
|     #define GIM_SIMD_MEMORY 1
 | |
| #endif
 | |
| 
 | |
| //! SIMD POINTER INTEGER
 | |
| #define SIMD_T GUINT64
 | |
| //! SIMD INTEGER SIZE
 | |
| #define SIMD_T_SIZE sizeof(SIMD_T)
 | |
| 
 | |
| 
 | |
| inline void gim_simd_memcpy(void * dst, const void * src, size_t copysize)
 | |
| {
 | |
| #ifdef GIM_SIMD_MEMORY
 | |
| /*
 | |
| //'long long int' is incompatible with visual studio 6...
 | |
|     //copy words
 | |
|     SIMD_T * ui_src_ptr = (SIMD_T *)src;
 | |
|     SIMD_T * ui_dst_ptr = (SIMD_T *)dst;
 | |
|     while(copysize>=SIMD_T_SIZE)
 | |
|     {
 | |
|         *(ui_dst_ptr++) = *(ui_src_ptr++);
 | |
|         copysize-=SIMD_T_SIZE;
 | |
|     }
 | |
|     if(copysize==0) return;
 | |
| */
 | |
| 
 | |
|     char * c_src_ptr = (char *)src;
 | |
|     char * c_dst_ptr = (char *)dst;
 | |
|     while(copysize>0)
 | |
|     {
 | |
|         *(c_dst_ptr++) = *(c_src_ptr++);
 | |
|         copysize--;
 | |
|     }
 | |
|     return;
 | |
| #else
 | |
|     memcpy(dst,src,copysize);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| template<class T>
 | |
| inline void gim_swap_elements(T* _array,size_t _i,size_t _j)
 | |
| {
 | |
| 	T _e_tmp_ = _array[_i];
 | |
| 	_array[_i] = _array[_j];
 | |
| 	_array[_j] = _e_tmp_;
 | |
| }
 | |
| 
 | |
| 
 | |
| template<class T>
 | |
| inline void gim_swap_elements_memcpy(T* _array,size_t _i,size_t _j)
 | |
| {
 | |
| 	char _e_tmp_[sizeof(T)];
 | |
| 	gim_simd_memcpy(_e_tmp_,&_array[_i],sizeof(T));
 | |
| 	gim_simd_memcpy(&_array[_i],&_array[_j],sizeof(T));
 | |
| 	gim_simd_memcpy(&_array[_j],_e_tmp_,sizeof(T));
 | |
| }
 | |
| 
 | |
| template <int SIZE>
 | |
| inline void gim_swap_elements_ptr(char * _array,size_t _i,size_t _j)
 | |
| {
 | |
| 	char _e_tmp_[SIZE];
 | |
| 	_i*=SIZE;
 | |
| 	_j*=SIZE;
 | |
| 	gim_simd_memcpy(_e_tmp_,_array+_i,SIZE);
 | |
| 	gim_simd_memcpy(_array+_i,_array+_j,SIZE);
 | |
| 	gim_simd_memcpy(_array+_j,_e_tmp_,SIZE);
 | |
| }
 | |
| 
 | |
| #endif // GIM_MEMORY_H_INCLUDED
 |