blob: 65d0dd5fc797154223d6b75f1471ebb8c0de0c95 [file] [log] [blame]
/* APPLE LOCAL file 4115609 */
/* { dg-do compile { target i?86-*-darwin* } } */
/* { dg-require-effective-target ilp32 } */
/* { 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;
}