void piglit_init(int argc, char **argv) { bool pass = true; if (!piglit_is_extension_supported("GL_EXT_framebuffer_sRGB")) piglit_require_extension("GL_ARB_framebuffer_sRGB"); pass = pushpop(GL_ENABLE_BIT, "GL_ENABLE_BIT") && pass; pass = pushpop(GL_COLOR_BUFFER_BIT, "GL_COLOR_BUFFER_BIT") && pass; pass = pushpop(GL_FOG_BIT, "GL_FOG_BIT") && pass; piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }
static void xfol(Prog *p, Prog **last) { Prog *q; int i; enum as a; loop: if(p == P) return; if(p->as == AJMP) if((q = p->pcond) != P && q->as != ATEXT) { /* mark instruction as done and continue layout at target of jump */ p->mark = 1; p = q; if(p->mark == 0) goto loop; } if(p->mark) { /* * p goes here, but already used it elsewhere. * copy up to 4 instructions or else branch to other copy. */ for(i=0,q=p; i<4; i++,q=q->link) { if(q == P) break; if(q == *last) break; a = q->as; if(a == ANOP) { i--; continue; } if(nofollow(a) || pushpop(a)) break; // NOTE(rsc): arm does goto copy if(q->pcond == P || q->pcond->mark) continue; if(a == ACALL || a == ALOOP) continue; for(;;) { if(p->as == ANOP) { p = p->link; continue; } q = copyp(p); p = p->link; q->mark = 1; (*last)->link = q; *last = q; if(q->as != a || q->pcond == P || q->pcond->mark) continue; q->as = relinv(q->as); p = q->pcond; q->pcond = q->link; q->link = p; xfol(q->link, last); p = q->link; if(p->mark) return; goto loop; } } /* */ q = prg(); q->as = AJMP; q->line = p->line; q->to.type = D_BRANCH; q->to.offset = p->pc; q->pcond = p; p = q; } /* emit p */ p->mark = 1; (*last)->link = p; *last = p; a = p->as; /* continue loop with what comes after p */ if(nofollow(a)) return; if(p->pcond != P && a != ACALL) { /* * some kind of conditional branch. * recurse to follow one path. * continue loop on the other. */ q = brchain(p->link); if(q != P && q->mark) if(a != ALOOP) { p->as = relinv(a); p->link = p->pcond; p->pcond = q; } xfol(p->link, last); q = brchain(p->pcond); if(q->mark) { p->pcond = q; return; } p = q; goto loop; } p = p->link; goto loop; }