| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #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: [email protected]
- 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
|