/* APPLE LOCAL file 4182984 */
/* { dg-do run { target i?86-*-darwin* } } */
/* { dg-skip-if "" { i?86-*-darwin* } { "-m64" } { "" } } */
/* { dg-options "-O3" } */
typedef unsigned int UINT;
typedef unsigned long UINT32;
typedef unsigned long BOOL32;
typedef signed int SINT;
typedef int INT;
typedef unsigned char UINT8;
typedef unsigned long UInt32;
typedef unsigned int uint32_t;
typedef unsigned long BitParse_T;
struct XX
{
 UINT8* dataEndPtr;
 UINT32* bufferCurrentPtr;
 UINT8 currentBitOffset;
 UINT32 currentBits;
};
typedef struct XX XX;
UINT32 ZZZ(UINT32 x) __attribute__((noinline));
UINT32 ZZZ(UINT32 x) { return x; }
void FlushUserData(XX* thiss) __attribute__((noinline));
void FlushUserData(XX* thiss)
{
 UINT ix;
 BOOL32 fNextBitsLookLikeStartCode;

 UINT32 currentBits;
 SINT currentBitOffset;
 UINT32* bufferCurrentPtr;

 while(1){
  { INT zNumBytesInBuffer; {;}; zNumBytesInBuffer=( ( ( (UINT8*)(thiss->dataEndPtr) ) - ( (UINT8*)(thiss->bufferCurrentPtr) ) ) -( (thiss->currentBitOffset+7)>>3 ) ); {;}; if(zNumBytesInBuffer<(1000)+4){ ; } };
  { currentBits =thiss->currentBits; currentBitOffset=thiss->currentBitOffset; bufferCurrentPtr=thiss->bufferCurrentPtr; };
  for(ix=0; ix<8; ix++){
   { UINT32 zData; { UINT zTmpOffset; zTmpOffset=(currentBitOffset)+(24); {;}; if(zTmpOffset<=32){ zData=(currentBits)>>(32 -(24)); }else{ UINT32 zTmpBits; zTmpBits=( (bufferCurrentPtr)[1] ); zTmpBits=((UInt32)(UInt32) (__builtin_constant_p(zTmpBits) ? ((((uint32_t)(zTmpBits) & 0xff000000) >> 24) | (((uint32_t)(zTmpBits) & 0x00ff0000) >> 8) | (((uint32_t)(zTmpBits) & 0x0000ff00) << 8) | (((uint32_t)(zTmpBits) & 0x000000ff) << 24)) : (__builtin_constant_p(zTmpBits) ? ((((uint32_t)(zTmpBits) & 0xff000000) >> 24) | (((uint32_t)(zTmpBits) & 0x00ff0000) >> 8) | (((uint32_t)(zTmpBits) & 0x0000ff00) << 8) | (((uint32_t)(zTmpBits) & 0x000000ff) << 24)) : ZZZ(zTmpBits)))); zData=((currentBits)>>(32 -(24))) |( zTmpBits >>(2*32 -zTmpOffset) ); } }; fNextBitsLookLikeStartCode=(zData==0x000001); };
   if(fNextBitsLookLikeStartCode){
    { thiss->currentBits =currentBits; thiss->currentBitOffset=currentBitOffset; thiss->bufferCurrentPtr=( (UINT32*)(bufferCurrentPtr) ); }; return;
   }
   { {;}; if( (currentBitOffset)<(32 -8) ){ (currentBitOffset) +=8; (currentBits )<<=8; }else{ BitParse_T zTmpBits; (currentBitOffset)-=(32 -8); zTmpBits=( *++(bufferCurrentPtr) ); zTmpBits=((UInt32)(UInt32) (__builtin_constant_p(zTmpBits) ? ((((uint32_t)(zTmpBits) & 0xff000000) >> 24) | (((uint32_t)(zTmpBits) & 0x00ff0000) >> 8) | (((uint32_t)(zTmpBits) & 0x0000ff00) << 8) | (((uint32_t)(zTmpBits) & 0x000000ff) << 24)) : (__builtin_constant_p(zTmpBits) ? ((((uint32_t)(zTmpBits) & 0xff000000) >> 24) | (((uint32_t)(zTmpBits) & 0x00ff0000) >> 8) | (((uint32_t)(zTmpBits) & 0x0000ff00) << 8) | (((uint32_t)(zTmpBits) & 0x000000ff) << 24)) : (zTmpBits)))); (currentBits) =zTmpBits<<(currentBitOffset); } };
  }
  { thiss->currentBits =currentBits; thiss->currentBitOffset=currentBitOffset; thiss->bufferCurrentPtr=( (UINT32*)(bufferCurrentPtr) ); };
 }
}

main() {
  UINT8 s[] = "abcd";
  UINT32 y;
  UINT32* q = &y;
  volatile struct XX p = { &s[0], q, 0, 0x100 };
  /* This is the normal calling sequence, with 0 placed into EAX after
     the stack is set up, so callee will crash if it uses EAX too soon. */
  asm("movl %0, (%%esp)\n\t movl $0, %%eax\n\tcall _FlushUserData"
	: : "r" (&p));
  return 0;
}
