ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.h
(Generate patch)

Comparing libecb/ecb.h (file contents):
Revision 1.138 by sf-exg, Tue Oct 14 14:38:13 2014 UTC vs.
Revision 1.149 by root, Fri Oct 24 04:54:11 2014 UTC

40 40
41#ifndef ECB_H 41#ifndef ECB_H
42#define ECB_H 42#define ECB_H
43 43
44/* 16 bits major, 16 bits minor */ 44/* 16 bits major, 16 bits minor */
45#define ECB_VERSION 0x00010003 45#define ECB_VERSION 0x00010004
46 46
47#ifdef _WIN32 47#ifdef _WIN32
48 typedef signed char int8_t; 48 typedef signed char int8_t;
49 typedef unsigned char uint8_t; 49 typedef unsigned char uint8_t;
50 typedef signed short int16_t; 50 typedef signed short int16_t;
98 #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) 98 #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
99#endif 99#endif
100 100
101#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor))) 101#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor)))
102 102
103#if __clang__ && defined(__has_builtin) 103#if __clang__ && defined __has_builtin
104 #define ECB_CLANG_BUILTIN(x) __has_builtin(x) 104 #define ECB_CLANG_BUILTIN(x) __has_builtin (x)
105#else 105#else
106 #define ECB_CLANG_BUILTIN(x) 0 106 #define ECB_CLANG_BUILTIN(x) 0
107#endif
108
109#if __clang__ && defined __has_extension
110 #define ECB_CLANG_EXTENSION(x) __has_extension (x)
111#else
112 #define ECB_CLANG_EXTENSION(x) 0
107#endif 113#endif
108 114
109#define ECB_CPP (__cplusplus+0) 115#define ECB_CPP (__cplusplus+0)
110#define ECB_CPP11 (__cplusplus >= 201103L) 116#define ECB_CPP11 (__cplusplus >= 201103L)
111 117
195 /* see comment below (stdatomic.h) about the C11 memory model. */ 201 /* see comment below (stdatomic.h) about the C11 memory model. */
196 #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) 202 #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST)
197 #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) 203 #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE)
198 #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) 204 #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE)
199 205
200 /* The __has_feature syntax from clang is so misdesigned that we cannot use it 206 #elif ECB_CLANG_EXTENSION(c_atomic)
201 * without risking compile time errors with other compilers. We *could*
202 * define our own ecb_clang_has_feature, but I just can't be bothered to work
203 * around this shit time and again.
204 * #elif defined __clang && __has_feature (cxx_atomic)
205 * // see comment below (stdatomic.h) about the C11 memory model. 207 /* see comment below (stdatomic.h) about the C11 memory model. */
206 * #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) 208 #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST)
207 * #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) 209 #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE)
208 * #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) 210 #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE)
209 */
210 211
211 #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ 212 #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__
212 #define ECB_MEMORY_FENCE __sync_synchronize () 213 #define ECB_MEMORY_FENCE __sync_synchronize ()
213 #elif _MSC_VER >= 1500 /* VC++ 2008 */ 214 #elif _MSC_VER >= 1500 /* VC++ 2008 */
214 /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ 215 /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */
277 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE 278 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
278#endif 279#endif
279 280
280/*****************************************************************************/ 281/*****************************************************************************/
281 282
282#if __cplusplus 283#if ECB_CPP
283 #define ecb_inline static inline 284 #define ecb_inline static inline
284#elif ECB_GCC_VERSION(2,5) 285#elif ECB_GCC_VERSION(2,5)
285 #define ecb_inline static __inline__ 286 #define ecb_inline static __inline__
286#elif ECB_C99 287#elif ECB_C99
287 #define ecb_inline static inline 288 #define ecb_inline static inline
305#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a) 306#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a)
306 307
307#define ecb_function_ ecb_inline 308#define ecb_function_ ecb_inline
308 309
309#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) 310#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8)
310 #define ecb_attribute(attrlist) __attribute__(attrlist) 311 #define ecb_attribute(attrlist) __attribute__ (attrlist)
311#else 312#else
312 #define ecb_attribute(attrlist) 313 #define ecb_attribute(attrlist)
313#endif 314#endif
314 315
315#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p) 316#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p)
333#else 334#else
334 #define ecb_prefetch(addr,rw,locality) 335 #define ecb_prefetch(addr,rw,locality)
335#endif 336#endif
336 337
337/* no emulation for ecb_decltype */ 338/* no emulation for ecb_decltype */
338#if ECB_GCC_VERSION(4,5) 339#if ECB_CPP11
340 // older implementations might have problems with decltype(x)::type, work around it
341 template<class T> struct ecb_decltype_t { typedef T type; };
339 #define ecb_decltype(x) __decltype(x) 342 #define ecb_decltype(x) ecb_decltype_t<decltype (x)>::type
340#elif ECB_GCC_VERSION(3,0) 343#elif ECB_GCC_VERSION(3,0) || ECB_CLANG_VERSION(2,8)
341 #define ecb_decltype(x) __typeof(x) 344 #define ecb_decltype(x) __typeof__ (x)
342#endif 345#endif
343 346
344#if _MSC_VER >= 1300 347#if _MSC_VER >= 1300
345 #define ecb_deprecated __declspec(deprecated) 348 #define ecb_deprecated __declspec (deprecated)
346#else 349#else
347 #define ecb_deprecated ecb_attribute ((__deprecated__)) 350 #define ecb_deprecated ecb_attribute ((__deprecated__))
348#endif 351#endif
349 352
350#define ecb_noinline ecb_attribute ((__noinline__)) 353#define ecb_noinline ecb_attribute ((__noinline__))
351#define ecb_unused ecb_attribute ((__unused__)) 354#define ecb_unused ecb_attribute ((__unused__))
352#define ecb_const ecb_attribute ((__const__)) 355#define ecb_const ecb_attribute ((__const__))
353#define ecb_pure ecb_attribute ((__pure__)) 356#define ecb_pure ecb_attribute ((__pure__))
354 357
355/* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx __declspec(noreturn) */ 358/* TODO http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx __declspec(noreturn) */
356#if ECB_C11 359#if ECB_C11 || __IBMC_NORETURN
360 /* http://pic.dhe.ibm.com/infocenter/compbg/v121v141/topic/com.ibm.xlcpp121.bg.doc/language_ref/noreturn.html */
357 #define ecb_noreturn _Noreturn 361 #define ecb_noreturn _Noreturn
358#else 362#else
359 #define ecb_noreturn ecb_attribute ((__noreturn__)) 363 #define ecb_noreturn ecb_attribute ((__noreturn__))
360#endif 364#endif
361 365
377/* for compatibility to the rest of the world */ 381/* for compatibility to the rest of the world */
378#define ecb_likely(expr) ecb_expect_true (expr) 382#define ecb_likely(expr) ecb_expect_true (expr)
379#define ecb_unlikely(expr) ecb_expect_false (expr) 383#define ecb_unlikely(expr) ecb_expect_false (expr)
380 384
381/* count trailing zero bits and count # of one bits */ 385/* count trailing zero bits and count # of one bits */
386#if ECB_GCC_VERSION(3,4) \
382#if ECB_GCC_VERSION(3,4) || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \ 387 || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \
383 && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \ 388 && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \
384 && ECB_CLANG_BUILTIN(__builtin_popcount)) 389 && ECB_CLANG_BUILTIN(__builtin_popcount))
385 /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */ 390 /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */
386 #define ecb_ld32(x) (__builtin_clz (x) ^ 31) 391 #define ecb_ld32(x) (__builtin_clz (x) ^ 31)
387 #define ecb_ld64(x) (__builtin_clzll (x) ^ 63) 392 #define ecb_ld64(x) (__builtin_clzll (x) ^ 63)
388 #define ecb_ctz32(x) __builtin_ctz (x) 393 #define ecb_ctz32(x) __builtin_ctz (x)
389 #define ecb_ctz64(x) __builtin_ctzll (x) 394 #define ecb_ctz64(x) __builtin_ctzll (x)
595 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) 600 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0))
596#else 601#else
597 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) 602 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n)))
598#endif 603#endif
599 604
600#if __cplusplus 605#if ECB_CPP
601 template<typename T> 606 template<typename T>
602 static inline T ecb_div_rd (T val, T div) 607 static inline T ecb_div_rd (T val, T div)
603 { 608 {
604 return val < 0 ? - ((-val + div - 1) / div) : (val ) / div; 609 return val < 0 ? - ((-val + div - 1) / div) : (val ) / div;
605 } 610 }
665 #define ECB_NAN NAN 670 #define ECB_NAN NAN
666 #else 671 #else
667 #define ECB_NAN ECB_INFINITY 672 #define ECB_NAN ECB_INFINITY
668 #endif 673 #endif
669 674
675 #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L
676 #define ecb_ldexpf(x,e) ldexpf (x, e)
677 #else
678 #define ecb_ldexpf(x,e) (float) ldexp ((double)(x), e)
679 #endif
680
670 /* converts an ieee half/binary16 to a float */ 681 /* converts an ieee half/binary16 to a float */
671 ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const; 682 ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const;
672 ecb_function_ float 683 ecb_function_ float
673 ecb_binary16_to_float (uint16_t x) 684 ecb_binary16_to_float (uint16_t x)
674 { 685 {
675 int e = (x >> 10) & 0x1f; 686 int e = (x >> 10) & 0x1f;
676 int m = x & 0x3ff; 687 int m = x & 0x3ff;
677 float r; 688 float r;
678 689
679 if (!e ) r = ldexpf (m , -24); 690 if (!e ) r = ecb_ldexpf (m , -24);
680 else if (e != 31) r = ldexpf (m + 0x400, e - 25); 691 else if (e != 31) r = ecb_ldexpf (m + 0x400, e - 25);
681 else if (m ) r = ECB_NAN; 692 else if (m ) r = ECB_NAN;
682 else r = ECB_INFINITY; 693 else r = ECB_INFINITY;
683 694
684 return x & 0x8000 ? -r : r; 695 return x & 0x8000 ? -r : r;
685 } 696 }
744 x |= 0x800000U; 755 x |= 0x800000U;
745 else 756 else
746 e = 1; 757 e = 1;
747 758
748 /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */ 759 /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */
749 r = ldexpf (x * (0.5f / 0x800000U), e - 126); 760 r = ecb_ldexpf (x * (0.5f / 0x800000U), e - 126);
750 761
751 r = neg ? -r : r; 762 r = neg ? -r : r;
752 #endif 763 #endif
753 764
754 return r; 765 return r;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines