/* APPLE LOCAL file 4115609 */
/* { dg-do compile { target i?86-*-darwin* } } */
/* { dg-skip-if "" { i?86-*-darwin* } { "-m64" } { "" } } */
/* { dg-options "-O3 -mdynamic-no-pic -fomit-frame-pointer" } */
/* { dg-final { scan-assembler-times "movl\t*" 55} } */
/* { dg-final { scan-assembler-not "sall" } } */
#define px(a, b) (((((unsigned int)(a)) * (unsigned int)(b) * 0x10101) \
        + 0x800000) >> 24)
typedef struct {
  int t, l, h, w;
} rect;

typedef struct {
  unsigned char r, g, b, al;
} pl;

typedef struct {
  pl  *ba;
  int  rc;
} cv;

typedef struct {
  rect ar;
  cv   s1;
  cv   s2;
  cv   ds;
  unsigned char op;
} rec;

int foo (rec *da) {
  int r1, r1t, dr, bm, rt, r2t, h, v, result = 0; 
  pl *b1, *b2, *db, *s1, *s2, *dl; 
  unsigned char al, r, g, b, ia, op = da->op;
  b1 = da->s1.ba;
  b2 = da->s2.ba;
  db = da->ds.ba;
  r1 = da->s1.rc;
  r2t = da->s2.rc;
  dr = da->ds.rc;
  bm = da->ar.t + da->ar.h; 
  rt = da->ar.l + da->ar.w; 
  for (v = da->ar.t; !result && (v < bm); v++) { 
    s1 = b1 + v * r1 + da->ar.l; 
    s2 = b2 + v * r2t + da->ar.l; 
    dl = db + v * dr + da->ar.l; 
      for (h=da->ar.l; h<rt; h++, s1++, s2++, dl++) {
        r  = s2->r;
        g = s2->g;
        b = s2->b;
        al = px (s2->al, op);
        ia = 255-al;
        dl->al = s1->al + px (255-s1->al, px (s2->al,op));
        dl->r = px (ia, s1->r) + px (al, s1->r > r ? r : s1->r);
  	dl->g = px (ia, s1->g) + px (al, s1->g > g ? g : s1->g );
        dl->b = px (ia, s1->b) + px (al, s1->b > b ? b : s1->b );
      } 
    }	
  return result;
}
