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

Comparing libecb/ecb.h (file contents):
Revision 1.149 by root, Fri Oct 24 04:54:11 2014 UTC vs.
Revision 1.160 by sf-exg, Thu Mar 19 15:43:51 2015 UTC

1/* 1/*
2 * libecb - http://software.schmorp.de/pkg/libecb 2 * libecb - http://software.schmorp.de/pkg/libecb
3 * 3 *
4 * Copyright (©) 2009-2014 Marc Alexander Lehmann <libecb@schmorp.de> 4 * Copyright (©) 2009-2015 Marc Alexander Lehmann <libecb@schmorp.de>
5 * Copyright (©) 2011 Emanuele Giaquinta 5 * Copyright (©) 2011 Emanuele Giaquinta
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without modifica- 8 * Redistribution and use in source and binary forms, with or without modifica-
9 * tion, are permitted provided that the following conditions are met: 9 * tion, are permitted provided that the following conditions are met:
74 #else 74 #else
75 #define ECB_PTRSIZE 4 75 #define ECB_PTRSIZE 4
76 #endif 76 #endif
77#endif 77#endif
78 78
79#define ECB_GCC_AMD64 (__amd64 || __amd64__ || __x86_64 || __x86_64__)
80#define ECB_MSVC_AMD64 (_M_AMD64 || _M_X64)
81
79/* work around x32 idiocy by defining proper macros */ 82/* work around x32 idiocy by defining proper macros */
80#if __amd64 || __x86_64 || _M_AMD64 || _M_X64 83#if ECB_GCC_AMD64 || ECB_MSVC_AMD64
81 #if _ILP32 84 #if _ILP32
82 #define ECB_AMD64_X32 1 85 #define ECB_AMD64_X32 1
83 #else 86 #else
84 #define ECB_AMD64 1 87 #define ECB_AMD64 1
85 #endif 88 #endif
153 #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 156 #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110
154 #if __i386 || __i386__ 157 #if __i386 || __i386__
155 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") 158 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory")
156 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") 159 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory")
157 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("") 160 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("")
158 #elif __amd64 || __amd64__ || __x86_64 || __x86_64__ 161 #elif ECB_GCC_AMD64
159 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") 162 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory")
160 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") 163 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory")
161 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("") 164 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("")
162 #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ 165 #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__
163 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") 166 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory")
302 305
303#define ECB_CONCAT_(a, b) a ## b 306#define ECB_CONCAT_(a, b) a ## b
304#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b) 307#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b)
305#define ECB_STRINGIFY_(a) # a 308#define ECB_STRINGIFY_(a) # a
306#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a) 309#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a)
310#define ECB_STRINGIFY_EXPR(expr) ((expr), ECB_STRINGIFY_ (expr))
307 311
308#define ecb_function_ ecb_inline 312#define ecb_function_ ecb_inline
309 313
310#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) 314#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8)
311 #define ecb_attribute(attrlist) __attribute__ (attrlist) 315 #define ecb_attribute(attrlist) __attribute__ (attrlist)
348 #define ecb_deprecated __declspec (deprecated) 352 #define ecb_deprecated __declspec (deprecated)
349#else 353#else
350 #define ecb_deprecated ecb_attribute ((__deprecated__)) 354 #define ecb_deprecated ecb_attribute ((__deprecated__))
351#endif 355#endif
352 356
357#if __MSC_VER >= 1500
358 #define ecb_deprecated_message(msg) __declspec (deprecated (msg))
359#elif ECB_GCC_VERSION(4,5)
360 #define ecb_deprecated_message(msg) ecb_attribute ((__deprecated__ (msg))
361#else
362 #define ecb_deprecated_message(msg) ecb_deprecated
363#endif
364
365#if _MSC_VER >= 1400
366 #define ecb_noinline __declspec (noinline)
367#else
353#define ecb_noinline ecb_attribute ((__noinline__)) 368 #define ecb_noinline ecb_attribute ((__noinline__))
369#endif
370
354#define ecb_unused ecb_attribute ((__unused__)) 371#define ecb_unused ecb_attribute ((__unused__))
355#define ecb_const ecb_attribute ((__const__)) 372#define ecb_const ecb_attribute ((__const__))
356#define ecb_pure ecb_attribute ((__pure__)) 373#define ecb_pure ecb_attribute ((__pure__))
357 374
358/* TODO http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx __declspec(noreturn) */
359#if ECB_C11 || __IBMC_NORETURN 375#if ECB_C11 || __IBMC_NORETURN
360 /* http://pic.dhe.ibm.com/infocenter/compbg/v121v141/topic/com.ibm.xlcpp121.bg.doc/language_ref/noreturn.html */ 376 /* http://pic.dhe.ibm.com/infocenter/compbg/v121v141/topic/com.ibm.xlcpp121.bg.doc/language_ref/noreturn.html */
361 #define ecb_noreturn _Noreturn 377 #define ecb_noreturn _Noreturn
378#elif ECB_CPP11
379 #define ecb_noreturn [[noreturn]]
380#elif _MSC_VER >= 1200
381 /* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx */
382 #define ecb_noreturn __declspec (noreturn)
362#else 383#else
363 #define ecb_noreturn ecb_attribute ((__noreturn__)) 384 #define ecb_noreturn ecb_attribute ((__noreturn__))
364#endif 385#endif
365 386
366#if ECB_GCC_VERSION(4,3) 387#if ECB_GCC_VERSION(4,3)
393 #define ecb_ctz32(x) __builtin_ctz (x) 414 #define ecb_ctz32(x) __builtin_ctz (x)
394 #define ecb_ctz64(x) __builtin_ctzll (x) 415 #define ecb_ctz64(x) __builtin_ctzll (x)
395 #define ecb_popcount32(x) __builtin_popcount (x) 416 #define ecb_popcount32(x) __builtin_popcount (x)
396 /* no popcountll */ 417 /* no popcountll */
397#else 418#else
398 ecb_function_ int ecb_ctz32 (uint32_t x) ecb_const; 419 ecb_function_ ecb_const int ecb_ctz32 (uint32_t x);
399 ecb_function_ int 420 ecb_function_ ecb_const int
400 ecb_ctz32 (uint32_t x) 421 ecb_ctz32 (uint32_t x)
401 { 422 {
402 int r = 0; 423 int r = 0;
403 424
404 x &= ~x + 1; /* this isolates the lowest bit */ 425 x &= ~x + 1; /* this isolates the lowest bit */
418#endif 439#endif
419 440
420 return r; 441 return r;
421 } 442 }
422 443
423 ecb_function_ int ecb_ctz64 (uint64_t x) ecb_const; 444 ecb_function_ ecb_const int ecb_ctz64 (uint64_t x);
424 ecb_function_ int 445 ecb_function_ ecb_const int
425 ecb_ctz64 (uint64_t x) 446 ecb_ctz64 (uint64_t x)
426 { 447 {
427 int shift = x & 0xffffffffU ? 0 : 32; 448 int shift = x & 0xffffffffU ? 0 : 32;
428 return ecb_ctz32 (x >> shift) + shift; 449 return ecb_ctz32 (x >> shift) + shift;
429 } 450 }
430 451
431 ecb_function_ int ecb_popcount32 (uint32_t x) ecb_const; 452 ecb_function_ ecb_const int ecb_popcount32 (uint32_t x);
432 ecb_function_ int 453 ecb_function_ ecb_const int
433 ecb_popcount32 (uint32_t x) 454 ecb_popcount32 (uint32_t x)
434 { 455 {
435 x -= (x >> 1) & 0x55555555; 456 x -= (x >> 1) & 0x55555555;
436 x = ((x >> 2) & 0x33333333) + (x & 0x33333333); 457 x = ((x >> 2) & 0x33333333) + (x & 0x33333333);
437 x = ((x >> 4) + x) & 0x0f0f0f0f; 458 x = ((x >> 4) + x) & 0x0f0f0f0f;
438 x *= 0x01010101; 459 x *= 0x01010101;
439 460
440 return x >> 24; 461 return x >> 24;
441 } 462 }
442 463
443 ecb_function_ int ecb_ld32 (uint32_t x) ecb_const; 464 ecb_function_ ecb_const int ecb_ld32 (uint32_t x);
444 ecb_function_ int ecb_ld32 (uint32_t x) 465 ecb_function_ ecb_const int ecb_ld32 (uint32_t x)
445 { 466 {
446 int r = 0; 467 int r = 0;
447 468
448 if (x >> 16) { x >>= 16; r += 16; } 469 if (x >> 16) { x >>= 16; r += 16; }
449 if (x >> 8) { x >>= 8; r += 8; } 470 if (x >> 8) { x >>= 8; r += 8; }
452 if (x >> 1) { r += 1; } 473 if (x >> 1) { r += 1; }
453 474
454 return r; 475 return r;
455 } 476 }
456 477
457 ecb_function_ int ecb_ld64 (uint64_t x) ecb_const; 478 ecb_function_ ecb_const int ecb_ld64 (uint64_t x);
458 ecb_function_ int ecb_ld64 (uint64_t x) 479 ecb_function_ ecb_const int ecb_ld64 (uint64_t x)
459 { 480 {
460 int r = 0; 481 int r = 0;
461 482
462 if (x >> 32) { x >>= 32; r += 32; } 483 if (x >> 32) { x >>= 32; r += 32; }
463 484
464 return r + ecb_ld32 (x); 485 return r + ecb_ld32 (x);
465 } 486 }
466#endif 487#endif
467 488
468ecb_function_ ecb_bool ecb_is_pot32 (uint32_t x) ecb_const; 489ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x);
469ecb_function_ ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); } 490ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); }
470ecb_function_ ecb_bool ecb_is_pot64 (uint64_t x) ecb_const; 491ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x);
471ecb_function_ ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); } 492ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); }
472 493
473ecb_function_ uint8_t ecb_bitrev8 (uint8_t x) ecb_const; 494ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x);
474ecb_function_ uint8_t ecb_bitrev8 (uint8_t x) 495ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x)
475{ 496{
476 return ( (x * 0x0802U & 0x22110U) 497 return ( (x * 0x0802U & 0x22110U)
477 | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16; 498 | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16;
478} 499}
479 500
480ecb_function_ uint16_t ecb_bitrev16 (uint16_t x) ecb_const; 501ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x);
481ecb_function_ uint16_t ecb_bitrev16 (uint16_t x) 502ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x)
482{ 503{
483 x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1); 504 x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1);
484 x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2); 505 x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2);
485 x = ((x >> 4) & 0x0f0f) | ((x & 0x0f0f) << 4); 506 x = ((x >> 4) & 0x0f0f) | ((x & 0x0f0f) << 4);
486 x = ( x >> 8 ) | ( x << 8); 507 x = ( x >> 8 ) | ( x << 8);
487 508
488 return x; 509 return x;
489} 510}
490 511
491ecb_function_ uint32_t ecb_bitrev32 (uint32_t x) ecb_const; 512ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x);
492ecb_function_ uint32_t ecb_bitrev32 (uint32_t x) 513ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x)
493{ 514{
494 x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); 515 x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);
495 x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); 516 x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);
496 x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); 517 x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);
497 x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); 518 x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);
500 return x; 521 return x;
501} 522}
502 523
503/* popcount64 is only available on 64 bit cpus as gcc builtin */ 524/* popcount64 is only available on 64 bit cpus as gcc builtin */
504/* so for this version we are lazy */ 525/* so for this version we are lazy */
505ecb_function_ int ecb_popcount64 (uint64_t x) ecb_const; 526ecb_function_ ecb_const int ecb_popcount64 (uint64_t x);
506ecb_function_ int 527ecb_function_ ecb_const int
507ecb_popcount64 (uint64_t x) 528ecb_popcount64 (uint64_t x)
508{ 529{
509 return ecb_popcount32 (x) + ecb_popcount32 (x >> 32); 530 return ecb_popcount32 (x) + ecb_popcount32 (x >> 32);
510} 531}
511 532
512ecb_inline uint8_t ecb_rotl8 (uint8_t x, unsigned int count) ecb_const; 533ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count);
513ecb_inline uint8_t ecb_rotr8 (uint8_t x, unsigned int count) ecb_const; 534ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count);
514ecb_inline uint16_t ecb_rotl16 (uint16_t x, unsigned int count) ecb_const; 535ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count);
515ecb_inline uint16_t ecb_rotr16 (uint16_t x, unsigned int count) ecb_const; 536ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count);
516ecb_inline uint32_t ecb_rotl32 (uint32_t x, unsigned int count) ecb_const; 537ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count);
517ecb_inline uint32_t ecb_rotr32 (uint32_t x, unsigned int count) ecb_const; 538ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count);
518ecb_inline uint64_t ecb_rotl64 (uint64_t x, unsigned int count) ecb_const; 539ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count);
519ecb_inline uint64_t ecb_rotr64 (uint64_t x, unsigned int count) ecb_const; 540ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count);
520 541
521ecb_inline uint8_t ecb_rotl8 (uint8_t x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); } 542ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); }
522ecb_inline uint8_t ecb_rotr8 (uint8_t x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); } 543ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); }
523ecb_inline uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); } 544ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); }
524ecb_inline uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); } 545ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); }
525ecb_inline uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); } 546ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); }
526ecb_inline uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); } 547ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); }
527ecb_inline uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); } 548ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); }
528ecb_inline uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); } 549ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); }
529 550
530#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64)) 551#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64))
531 #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16) 552 #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16)
532 #define ecb_bswap32(x) __builtin_bswap32 (x) 553 #define ecb_bswap32(x) __builtin_bswap32 (x)
533 #define ecb_bswap64(x) __builtin_bswap64 (x) 554 #define ecb_bswap64(x) __builtin_bswap64 (x)
534#else 555#else
535 ecb_function_ uint16_t ecb_bswap16 (uint16_t x) ecb_const; 556 ecb_function_ ecb_const uint16_t ecb_bswap16 (uint16_t x);
536 ecb_function_ uint16_t 557 ecb_function_ ecb_const uint16_t
537 ecb_bswap16 (uint16_t x) 558 ecb_bswap16 (uint16_t x)
538 { 559 {
539 return ecb_rotl16 (x, 8); 560 return ecb_rotl16 (x, 8);
540 } 561 }
541 562
542 ecb_function_ uint32_t ecb_bswap32 (uint32_t x) ecb_const; 563 ecb_function_ ecb_const uint32_t ecb_bswap32 (uint32_t x);
543 ecb_function_ uint32_t 564 ecb_function_ ecb_const uint32_t
544 ecb_bswap32 (uint32_t x) 565 ecb_bswap32 (uint32_t x)
545 { 566 {
546 return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16); 567 return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16);
547 } 568 }
548 569
549 ecb_function_ uint64_t ecb_bswap64 (uint64_t x) ecb_const; 570 ecb_function_ ecb_const uint64_t ecb_bswap64 (uint64_t x);
550 ecb_function_ uint64_t 571 ecb_function_ ecb_const uint64_t
551 ecb_bswap64 (uint64_t x) 572 ecb_bswap64 (uint64_t x)
552 { 573 {
553 return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32); 574 return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32);
554 } 575 }
555#endif 576#endif
556 577
557#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable) 578#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable)
558 #define ecb_unreachable() __builtin_unreachable () 579 #define ecb_unreachable() __builtin_unreachable ()
559#else 580#else
560 /* this seems to work fine, but gcc always emits a warning for it :/ */ 581 /* this seems to work fine, but gcc always emits a warning for it :/ */
561 ecb_inline void ecb_unreachable (void) ecb_noreturn; 582 ecb_inline ecb_noreturn void ecb_unreachable (void);
562 ecb_inline void ecb_unreachable (void) { } 583 ecb_inline ecb_noreturn void ecb_unreachable (void) { }
563#endif 584#endif
564 585
565/* try to tell the compiler that some condition is definitely true */ 586/* try to tell the compiler that some condition is definitely true */
566#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0 587#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0
567 588
568ecb_inline unsigned char ecb_byteorder_helper (void) ecb_const; 589ecb_inline ecb_const unsigned char ecb_byteorder_helper (void);
569ecb_inline unsigned char 590ecb_inline ecb_const unsigned char
570ecb_byteorder_helper (void) 591ecb_byteorder_helper (void)
571{ 592{
572 /* the union code still generates code under pressure in gcc, */ 593 /* the union code still generates code under pressure in gcc, */
573 /* but less than using pointers, and always seems to */ 594 /* but less than using pointers, and always seems to */
574 /* successfully return a constant. */ 595 /* successfully return a constant. */
575 /* the reason why we have this horrible preprocessor mess */ 596 /* the reason why we have this horrible preprocessor mess */
576 /* is to avoid it in all cases, at least on common architectures */ 597 /* is to avoid it in all cases, at least on common architectures */
577 /* or when using a recent enough gcc version (>= 4.6) */ 598 /* or when using a recent enough gcc version (>= 4.6) */
578#if __i386 || __i386__ || _M_X86 || __amd64 || __amd64__ || _M_X64 599#if ((__i386 || __i386__) && !__VOS__) || _M_IX86 || ECB_GCC_AMD64 || ECB_MSVC_AMD64
579 return 0x44; 600 return 0x44;
580#elif __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 601#elif __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
581 return 0x44; 602 return 0x44;
582#elif __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 603#elif __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
583 return 0x11; 604 return 0x11;
589 } u = { 0x11223344 }; 610 } u = { 0x11223344 };
590 return u.c; 611 return u.c;
591#endif 612#endif
592} 613}
593 614
594ecb_inline ecb_bool ecb_big_endian (void) ecb_const; 615ecb_inline ecb_const ecb_bool ecb_big_endian (void);
595ecb_inline ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; } 616ecb_inline ecb_const ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; }
596ecb_inline ecb_bool ecb_little_endian (void) ecb_const; 617ecb_inline ecb_const ecb_bool ecb_little_endian (void);
597ecb_inline ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; } 618ecb_inline ecb_const ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; }
598 619
599#if ECB_GCC_VERSION(3,0) || ECB_C99 620#if ECB_GCC_VERSION(3,0) || ECB_C99
600 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) 621 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0))
601#else 622#else
602 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) 623 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n)))
634 655
635/* basically, everything uses "ieee pure-endian" floating point numbers */ 656/* basically, everything uses "ieee pure-endian" floating point numbers */
636/* the only noteworthy exception is ancient armle, which uses order 43218765 */ 657/* the only noteworthy exception is ancient armle, which uses order 43218765 */
637#if 0 \ 658#if 0 \
638 || __i386 || __i386__ \ 659 || __i386 || __i386__ \
639 || __amd64 || __amd64__ || __x86_64 || __x86_64__ \ 660 || ECB_GCC_AMD64 \
640 || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \ 661 || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \
641 || defined __s390__ || defined __s390x__ \ 662 || defined __s390__ || defined __s390x__ \
642 || defined __mips__ \ 663 || defined __mips__ \
643 || defined __alpha__ \ 664 || defined __alpha__ \
644 || defined __hppa__ \ 665 || defined __hppa__ \
645 || defined __ia64__ \ 666 || defined __ia64__ \
646 || defined __m68k__ \ 667 || defined __m68k__ \
647 || defined __m88k__ \ 668 || defined __m88k__ \
648 || defined __sh__ \ 669 || defined __sh__ \
649 || defined _M_IX86 || defined _M_AMD64 || defined _M_IA64 \ 670 || defined _M_IX86 || defined ECB_MSVC_AMD64 || defined _M_IA64 \
650 || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \ 671 || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \
651 || defined __aarch64__ 672 || defined __aarch64__
652 #define ECB_STDFP 1 673 #define ECB_STDFP 1
653 #include <string.h> /* for memcpy */ 674 #include <string.h> /* for memcpy */
654#else 675#else
671 #else 692 #else
672 #define ECB_NAN ECB_INFINITY 693 #define ECB_NAN ECB_INFINITY
673 #endif 694 #endif
674 695
675 #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L 696 #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L
676 #define ecb_ldexpf(x,e) ldexpf (x, e) 697 #define ecb_ldexpf(x,e) ldexpf ((x), (e))
677 #else 698 #else
678 #define ecb_ldexpf(x,e) (float) ldexp ((double)(x), e) 699 #define ecb_ldexpf(x,e) (float) ldexp ((float) (x), (e))
679 #endif 700 #endif
680 701
681 /* converts an ieee half/binary16 to a float */ 702 /* converts an ieee half/binary16 to a float */
682 ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const; 703 ecb_function_ ecb_const float ecb_binary16_to_float (uint16_t x);
683 ecb_function_ float 704 ecb_function_ ecb_const float
684 ecb_binary16_to_float (uint16_t x) 705 ecb_binary16_to_float (uint16_t x)
685 { 706 {
686 int e = (x >> 10) & 0x1f; 707 int e = (x >> 10) & 0x1f;
687 int m = x & 0x3ff; 708 int m = x & 0x3ff;
688 float r; 709 float r;
694 715
695 return x & 0x8000 ? -r : r; 716 return x & 0x8000 ? -r : r;
696 } 717 }
697 718
698 /* convert a float to ieee single/binary32 */ 719 /* convert a float to ieee single/binary32 */
699 ecb_function_ uint32_t ecb_float_to_binary32 (float x) ecb_const; 720 ecb_function_ ecb_const uint32_t ecb_float_to_binary32 (float x);
700 ecb_function_ uint32_t 721 ecb_function_ ecb_const uint32_t
701 ecb_float_to_binary32 (float x) 722 ecb_float_to_binary32 (float x)
702 { 723 {
703 uint32_t r; 724 uint32_t r;
704 725
705 #if ECB_STDFP 726 #if ECB_STDFP
734 755
735 return r; 756 return r;
736 } 757 }
737 758
738 /* converts an ieee single/binary32 to a float */ 759 /* converts an ieee single/binary32 to a float */
739 ecb_function_ float ecb_binary32_to_float (uint32_t x) ecb_const; 760 ecb_function_ ecb_const float ecb_binary32_to_float (uint32_t x);
740 ecb_function_ float 761 ecb_function_ ecb_const float
741 ecb_binary32_to_float (uint32_t x) 762 ecb_binary32_to_float (uint32_t x)
742 { 763 {
743 float r; 764 float r;
744 765
745 #if ECB_STDFP 766 #if ECB_STDFP
764 785
765 return r; 786 return r;
766 } 787 }
767 788
768 /* convert a double to ieee double/binary64 */ 789 /* convert a double to ieee double/binary64 */
769 ecb_function_ uint64_t ecb_double_to_binary64 (double x) ecb_const; 790 ecb_function_ ecb_const uint64_t ecb_double_to_binary64 (double x);
770 ecb_function_ uint64_t 791 ecb_function_ ecb_const uint64_t
771 ecb_double_to_binary64 (double x) 792 ecb_double_to_binary64 (double x)
772 { 793 {
773 uint64_t r; 794 uint64_t r;
774 795
775 #if ECB_STDFP 796 #if ECB_STDFP
804 825
805 return r; 826 return r;
806 } 827 }
807 828
808 /* converts an ieee double/binary64 to a double */ 829 /* converts an ieee double/binary64 to a double */
809 ecb_function_ double ecb_binary64_to_double (uint64_t x) ecb_const; 830 ecb_function_ ecb_const double ecb_binary64_to_double (uint64_t x);
810 ecb_function_ double 831 ecb_function_ ecb_const double
811 ecb_binary64_to_double (uint64_t x) 832 ecb_binary64_to_double (uint64_t x)
812 { 833 {
813 double r; 834 double r;
814 835
815 #if ECB_STDFP 836 #if ECB_STDFP

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines