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