| /* PR opt/13862 */ |
| /* { dg-do compile { target i?86-*-* } } */ |
| /* { dg-options "-O" } */ |
| |
| typedef struct _fame_syntax_t_ { |
| } fame_syntax_t; |
| |
| typedef struct _fame_bitbuffer_t_ |
| { |
| unsigned char * base; |
| unsigned char * data; |
| unsigned long shift; |
| } fame_bitbuffer_t; |
| |
| #define fast_bitbuffer_write(data, shift, c, l) \ |
| { \ |
| int d; \ |
| \ |
| asm("add %1, %%ecx\n" /* ecx = shift + length */ \ |
| "shrd %%cl, %2, %3\n" /* adjust code to fit in */ \ |
| "shr %%cl, %2\n" /* adjust code to fit in */ \ |
| "mov %%ecx, %1\n" /* shift += length */ \ |
| "bswap %2\n" /* reverse byte order of code */ \ |
| "shr $5, %%ecx\n" /* get dword increment */ \ |
| "or %2, (%0)\n" /* put first 32 bits */ \ |
| "bswap %3\n" /* reverse byte order of code */ \ |
| "lea (%0, %%ecx, 4), %0\n" /* data += (ecx>32) */ \ |
| "andl $31, %1\n" /* mask shift */ \ |
| "orl %3, (%0)\n" /* put last 32 bits */ \ |
| : "=r"(data), "=r"(shift), "=a"(d), "=d"(d), "=c"(d) \ |
| : "0"(data), "1"(shift), "2"((unsigned long) c), "3"(0), \ |
| "c"((unsigned long) l) \ |
| : "memory"); \ |
| } |
| |
| #define bitbuffer_write(bb, c, l) \ |
| fast_bitbuffer_write((bb)->data, (bb)->shift, c, l) |
| |
| typedef enum { frame_type_I, frame_type_P } frame_type_t; |
| |
| typedef struct _fame_syntax_mpeg1_t_ { |
| fame_bitbuffer_t buffer; |
| frame_type_t frame_type; |
| } fame_syntax_mpeg1_t; |
| |
| #define FAME_SYNTAX_MPEG1(x) ((fame_syntax_mpeg1_t *) x) |
| |
| void mpeg1_start_picture(fame_syntax_t *syntax) |
| { |
| fame_syntax_mpeg1_t *syntax_mpeg1 = FAME_SYNTAX_MPEG1(syntax); |
| bitbuffer_write(&syntax_mpeg1->buffer, 0xFFFF, 16); |
| |
| switch(syntax_mpeg1->frame_type) { |
| case frame_type_I: |
| bitbuffer_write(&syntax_mpeg1->buffer, 0, 1); |
| break; |
| case frame_type_P: |
| bitbuffer_write(&syntax_mpeg1->buffer, 0, 1); |
| break; |
| } |
| } |