1184610Salfred/* PR opt/13862 */ 2184610Salfred/* { dg-do compile } */ 3184610Salfred/* { dg-require-effective-target ilp32 } */ 4184610Salfred/* { dg-options "-O" } */ 5184610Salfred 6187494Semaxtypedef struct _fame_syntax_t_ { 7184610Salfred} fame_syntax_t; 8184610Salfred 9184610Salfredtypedef struct _fame_bitbuffer_t_ 10184610Salfred{ 11184610Salfred unsigned char * base; 12184610Salfred unsigned char * data; 13184610Salfred unsigned long shift; 14184610Salfred} fame_bitbuffer_t; 15184610Salfred 16184610Salfred#define fast_bitbuffer_write(data, shift, c, l) \ 17184610Salfred{ \ 18184610Salfred int d; \ 19184610Salfred \ 20184610Salfred asm("add %1, %%ecx\n" /* ecx = shift + length */ \ 21184610Salfred "shrd %%cl, %2, %3\n" /* adjust code to fit in */ \ 22184610Salfred "shr %%cl, %2\n" /* adjust code to fit in */ \ 23184610Salfred "mov %%ecx, %1\n" /* shift += length */ \ 24184610Salfred "bswap %2\n" /* reverse byte order of code */ \ 25184610Salfred "shr $5, %%ecx\n" /* get dword increment */ \ 26184610Salfred "or %2, (%0)\n" /* put first 32 bits */ \ 27184610Salfred "bswap %3\n" /* reverse byte order of code */ \ 28184610Salfred "lea (%0, %%ecx, 4), %0\n" /* data += (ecx>32) */ \ 29184610Salfred "andl $31, %1\n" /* mask shift */ \ 30184610Salfred "orl %3, (%0)\n" /* put last 32 bits */ \ 31184610Salfred : "=r"(data), "=r"(shift), "=a"(d), "=d"(d), "=c"(d) \ 32184610Salfred : "0"(data), "1"(shift), "2"((unsigned long) c), "3"(0), \ 33184610Salfred "c"((unsigned long) l) \ 34187494Semax : "memory"); \ 35187494Semax} 36187741Semax 37187494Semax#define bitbuffer_write(bb, c, l) \ 38187494Semax fast_bitbuffer_write((bb)->data, (bb)->shift, c, l) 39187494Semax 40187741Semaxtypedef enum { frame_type_I, frame_type_P } frame_type_t; 41187494Semax 42187741Semaxtypedef struct _fame_syntax_mpeg1_t_ { 43187741Semax fame_bitbuffer_t buffer; 44187741Semax frame_type_t frame_type; 45187494Semax} fame_syntax_mpeg1_t; 46187741Semax 47187741Semax#define FAME_SYNTAX_MPEG1(x) ((fame_syntax_mpeg1_t *) x) 48187741Semax 49187741Semaxvoid mpeg1_start_picture(fame_syntax_t *syntax) 50187494Semax{ 51187494Semax fame_syntax_mpeg1_t *syntax_mpeg1 = FAME_SYNTAX_MPEG1(syntax); 52187494Semax bitbuffer_write(&syntax_mpeg1->buffer, 0xFFFF, 16); 53187494Semax 54187741Semax switch(syntax_mpeg1->frame_type) { 55187494Semax case frame_type_I: 56187494Semax bitbuffer_write(&syntax_mpeg1->buffer, 0, 1); 57187494Semax break; 58187494Semax case frame_type_P: 59187494Semax bitbuffer_write(&syntax_mpeg1->buffer, 0, 1); 60187494Semax break; 61187494Semax } 62187741Semax} 63187741Semax