Mercurial > libavcodec.hg
comparison common.h @ 525:985187bc2fa3 libavcodec
c std doesnt like negative shifts -> use asm
| author | michaelni |
|---|---|
| date | Tue, 09 Jul 2002 19:22:50 +0000 |
| parents | cf7d120ed51a |
| children | f1f4d3d755f8 |
comparison
equal
deleted
inserted
replaced
| 524:3e579fbef701 | 525:985187bc2fa3 |
|---|---|
| 163 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) | 163 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) |
| 164 #define ABS(a) ((a) >= 0 ? (a) : (-(a))) | 164 #define ABS(a) ((a) >= 0 ? (a) : (-(a))) |
| 165 #define MAX(a,b) ((a) > (b) ? (a) : (b)) | 165 #define MAX(a,b) ((a) > (b) ? (a) : (b)) |
| 166 #define MIN(a,b) ((a) > (b) ? (b) : (a)) | 166 #define MIN(a,b) ((a) > (b) ? (b) : (a)) |
| 167 | 167 |
| 168 #if defined ARCH_X86 && (__GNUC__ != 3 || __GNUC_MINOR__ > 1) | 168 #ifdef ARCH_X86 |
| 169 // inverse for shift optimization (gcc should do that ...) | 169 // avoid +32 for shift optimization (gcc should do that ...) |
| 170 #define INV32(a) (-a) | 170 static inline int32_t NEG_SSR32( int32_t a, int8_t s){ |
| 171 #else | 171 asm ("sarl %1, %0\n\t" |
| 172 #define INV32(a) (32-a) | 172 : "+r" (a) |
| 173 : "ic" ((uint8_t)(-s)) | |
| 174 ); | |
| 175 return a; | |
| 176 } | |
| 177 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ | |
| 178 asm ("shrl %1, %0\n\t" | |
| 179 : "+r" (a) | |
| 180 : "ic" ((uint8_t)(-s)) | |
| 181 ); | |
| 182 return a; | |
| 183 } | |
| 184 #else | |
| 185 #define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) | |
| 186 #define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) | |
| 173 #endif | 187 #endif |
| 174 | 188 |
| 175 /* bit output */ | 189 /* bit output */ |
| 176 | 190 |
| 177 struct PutBitContext; | 191 struct PutBitContext; |
| 528 | 542 |
| 529 # define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | 543 # define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) |
| 530 # define LAST_SKIP_CACHE(name, gb, num) ; | 544 # define LAST_SKIP_CACHE(name, gb, num) ; |
| 531 | 545 |
| 532 # define SHOW_UBITS(name, gb, num)\ | 546 # define SHOW_UBITS(name, gb, num)\ |
| 533 (((uint32_t)name##_cache)>>INV32(num)) | 547 NEG_USR32(name##_cache, num) |
| 534 | 548 |
| 535 # define SHOW_SBITS(name, gb, num)\ | 549 # define SHOW_SBITS(name, gb, num)\ |
| 536 (((int32_t)name##_cache)>>INV32(num)) | 550 NEG_SSR32(name##_cache, num) |
| 537 | 551 |
| 538 # define GET_CACHE(name, gb)\ | 552 # define GET_CACHE(name, gb)\ |
| 539 ((uint32_t)name##_cache) | 553 ((uint32_t)name##_cache) |
| 540 | 554 |
| 541 static inline int get_bits_count(GetBitContext *s){ | 555 static inline int get_bits_count(GetBitContext *s){ |
| 577 | 591 |
| 578 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) | 592 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) |
| 579 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) | 593 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) |
| 580 | 594 |
| 581 # define SHOW_UBITS(name, gb, num)\ | 595 # define SHOW_UBITS(name, gb, num)\ |
| 582 (((uint32_t)name##_cache)>>INV32(num)) | 596 NEG_USR32(name##_cache, num) |
| 583 | 597 |
| 584 # define SHOW_SBITS(name, gb, num)\ | 598 # define SHOW_SBITS(name, gb, num)\ |
| 585 (((int32_t)name##_cache)>>INV32(num)) | 599 NEG_SSR32(name##_cache, num) |
| 586 | 600 |
| 587 # define GET_CACHE(name, gb)\ | 601 # define GET_CACHE(name, gb)\ |
| 588 ((uint32_t)name##_cache) | 602 ((uint32_t)name##_cache) |
| 589 | 603 |
| 590 static inline int get_bits_count(GetBitContext *s){ | 604 static inline int get_bits_count(GetBitContext *s){ |
| 608 (gb)->buffer_ptr= name##_buffer_ptr;\ | 622 (gb)->buffer_ptr= name##_buffer_ptr;\ |
| 609 | 623 |
| 610 # define UPDATE_CACHE(name, gb)\ | 624 # define UPDATE_CACHE(name, gb)\ |
| 611 if(name##_bit_count > 0){\ | 625 if(name##_bit_count > 0){\ |
| 612 const uint32_t next= be2me_32( *name##_buffer_ptr );\ | 626 const uint32_t next= be2me_32( *name##_buffer_ptr );\ |
| 613 name##_cache0 |= next>>INV32(name##_bit_count);\ | 627 name##_cache0 |= NEG_USR32(next,name##_bit_count);\ |
| 614 name##_cache1 |= next<<name##_bit_count;\ | 628 name##_cache1 |= next<<name##_bit_count;\ |
| 615 name##_buffer_ptr++;\ | 629 name##_buffer_ptr++;\ |
| 616 name##_bit_count-= 32;\ | 630 name##_bit_count-= 32;\ |
| 617 }\ | 631 }\ |
| 618 | 632 |
| 625 : "Ic" ((uint8_t)num)\ | 639 : "Ic" ((uint8_t)num)\ |
| 626 ); | 640 ); |
| 627 #else | 641 #else |
| 628 # define SKIP_CACHE(name, gb, num)\ | 642 # define SKIP_CACHE(name, gb, num)\ |
| 629 name##_cache0 <<= (num);\ | 643 name##_cache0 <<= (num);\ |
| 630 name##_cache0 |= name##_cache1 >>INV32(num);\ | 644 name##_cache0 |= NEG_USR32(name##_cache1,num);\ |
| 631 name##_cache1 <<= (num); | 645 name##_cache1 <<= (num); |
| 632 #endif | 646 #endif |
| 633 | 647 |
| 634 # define SKIP_COUNTER(name, gb, num)\ | 648 # define SKIP_COUNTER(name, gb, num)\ |
| 635 name##_bit_count += (num);\ | 649 name##_bit_count += (num);\ |
| 642 | 656 |
| 643 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) | 657 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) |
| 644 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) | 658 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) |
| 645 | 659 |
| 646 # define SHOW_UBITS(name, gb, num)\ | 660 # define SHOW_UBITS(name, gb, num)\ |
| 647 (((uint32_t)name##_cache0)>>INV32(num)) | 661 NEG_USR32(name##_cache0, num) |
| 648 | 662 |
| 649 # define SHOW_SBITS(name, gb, num)\ | 663 # define SHOW_SBITS(name, gb, num)\ |
| 650 (((int32_t)name##_cache0)>>INV32(num)) | 664 NEG_SSR32(name##_cache0, num) |
| 651 | 665 |
| 652 # define GET_CACHE(name, gb)\ | 666 # define GET_CACHE(name, gb)\ |
| 653 (name##_cache0) | 667 (name##_cache0) |
| 654 | 668 |
| 655 static inline int get_bits_count(GetBitContext *s){ | 669 static inline int get_bits_count(GetBitContext *s){ |
