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
 |