r600g: optimize away CF ALU instructions even if type doesn't match

This commit is contained in:
Christian König
2010-12-18 00:45:59 +01:00
parent 370ae0bd61
commit 236e99fe05
+16 -3
View File
@@ -539,16 +539,29 @@ int r600_bc_add_alu_type(struct r600_bc *bc, const struct r600_bc_alu *alu, int
memcpy(nalu, alu, sizeof(struct r600_bc_alu));
nalu->nliteral = 0;
if (bc->cf_last != NULL && bc->cf_last->inst != (type << 3)) {
/* check if we could add it anyway */
if (bc->cf_last->inst == (V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU << 3) &&
type == V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE) {
LIST_FOR_EACH_ENTRY(lalu, &bc->cf_last->alu, list) {
if (lalu->predicate) {
bc->force_add_cf = 1;
break;
}
}
} else
bc->force_add_cf = 1;
}
/* cf can contains only alu or only vtx or only tex */
if (bc->cf_last == NULL || bc->cf_last->inst != (type << 3) ||
bc->force_add_cf) {
if (bc->cf_last == NULL || bc->force_add_cf) {
r = r600_bc_add_cf(bc);
if (r) {
free(nalu);
return r;
}
bc->cf_last->inst = (type << 3);
}
bc->cf_last->inst = (type << 3);
/* Setup the kcache for this ALU instruction. This will start a new
* ALU clause if needed. */