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){