… | |
… | |
71 | #if ECB_NO_THREADS || ECB_NO_SMP |
71 | #if ECB_NO_THREADS || ECB_NO_SMP |
72 | #define ECB_MEMORY_FENCE do { } while (0) |
72 | #define ECB_MEMORY_FENCE do { } while (0) |
73 | #endif |
73 | #endif |
74 | |
74 | |
75 | #ifndef ECB_MEMORY_FENCE |
75 | #ifndef ECB_MEMORY_FENCE |
76 | #if ECB_GCC_VERSION(2,5) |
76 | #if ECB_GCC_VERSION(2,5) || defined(__INTEL_COMPILER) || defined(__clang__) |
77 | #if __i386__ |
77 | #if __i386__ |
78 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
78 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
79 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */ |
79 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */ |
80 | #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ |
80 | #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ |
81 | #elif __amd64 |
81 | #elif __amd64 |
… | |
… | |
93 | #endif |
93 | #endif |
94 | #endif |
94 | #endif |
95 | #endif |
95 | #endif |
96 | |
96 | |
97 | #ifndef ECB_MEMORY_FENCE |
97 | #ifndef ECB_MEMORY_FENCE |
98 | #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) |
98 | #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) || defined(__clang__) |
99 | #define ECB_MEMORY_FENCE __sync_synchronize () |
99 | #define ECB_MEMORY_FENCE __sync_synchronize () |
100 | /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ |
100 | /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ |
101 | /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ |
101 | /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ |
102 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
102 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
103 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
103 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
… | |
… | |
373 | #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) |
373 | #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) |
374 | #else |
374 | #else |
375 | #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) |
375 | #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) |
376 | #endif |
376 | #endif |
377 | |
377 | |
|
|
378 | #if __cplusplus |
|
|
379 | template<typename T> |
|
|
380 | static inline T ecb_div_rd (T val, T div) |
|
|
381 | { |
|
|
382 | return val < 0 ? - ((-val + div - 1) / div) : (val ) / div; |
|
|
383 | } |
|
|
384 | template<typename T> |
|
|
385 | static inline T ecb_div_ru (T val, T div) |
|
|
386 | { |
|
|
387 | return val < 0 ? - ((-val ) / div) : (val + div - 1) / div; |
|
|
388 | } |
|
|
389 | #else |
|
|
390 | #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val) ) / (div)) |
|
|
391 | #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val) ) / (div)) : ((val) + (div) - 1) / (div)) |
|
|
392 | #endif |
|
|
393 | |
378 | #if ecb_cplusplus_does_not_suck |
394 | #if ecb_cplusplus_does_not_suck |
379 | /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ |
395 | /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ |
380 | template<typename T, int N> |
396 | template<typename T, int N> |
381 | static inline int ecb_array_length (const T (&arr)[N]) |
397 | static inline int ecb_array_length (const T (&arr)[N]) |
382 | { |
398 | { |