/* { dg-do compile { target i?86*-*-darwin* } } */
/* { dg-options { -fasm-blocks -O2 } } */
/* Radar 5315594 */

typedef unsigned char unsigned8;
typedef long long int64;
typedef long int32;
typedef short int16;
typedef char int8;
typedef unsigned long uint32;
typedef uint32 DWORD;
typedef struct MMARRAY
{
 DWORD RESULT1[ 2 ];
 DWORD RESULT2[ 2 ];
 DWORD Fst4DSTPIX[ 2 ];
 DWORD Snd4DSTPIX[ 2 ];
 DWORD _scr[ 2 ];
} MMARRAY;

void X_ScreenBlend ( const unsigned8 *sPtr, unsigned8 *dPtr, const unsigned8 *mPtr,
      int32 rows, int32 cols, int32 sRowBytes, int32 dRowBytes,
      int32 mRowBytes)
{
 int32 sRowB, dRowB, mRowB, Loop8Extras, NumCols;
 int64 RNDVAL = 0x007F007F007F007FLL;
 int64 LoByteMask = 0x00FF00FF00FF00FFLL;
 int64 val254 = 0x00fe00fe00fe00feLL;
 int64 ZEROMASK = 0x0;
 int64 ONESMASK = 0x0001000100010001LL;
 int64 SIGNMASK = 0x8000800080008000LL;

 MMARRAY *pqArray;
 MMARRAY qArray;

 if ( rows <= 0 || cols <= 0 )
   return;

 asm {
   xor eax, eax
   xor edx, edx
   mov ax, WORD PTR sRowBytes
   xor ecx, ecx
   mov dx, WORD PTR dRowBytes
   mov sRowB, eax
   mov cx, WORD PTR mRowBytes
   xor eax, eax
   mov ax, WORD PTR cols
   mov mRowB, ecx
   mov dRowB, edx
   lea ecx, qArray
   mov ebx, eax
   add ecx, 7
   shr eax, 3
   and ecx, 0fffffff8h
   mov pqArray, ecx
   and ebx, 7
   mov NumCols, eax
   mov Loop8Extras, ebx
  Row:
   mov esi, sPtr
   mov edi, dPtr
   mov edx, mPtr
   mov ebx, sRowB
   mov ecx, dRowB
   add ebx, esi
   mov eax, mRowB
   mov sPtr, ebx
   add ecx, edi
   add eax, edx
   mov dPtr, ecx
   mov mPtr, eax
   mov ecx, NumCols
   mov ebx, 4
 }
}
