forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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
							 |