return 1;
}
+bool
+fs_inst::overwrites_reg(const fs_reg ®)
+{
+ return (reg.file == dst.file &&
+ reg.reg == dst.reg &&
+ reg.reg_offset >= dst.reg_offset &&
+ reg.reg_offset < dst.reg_offset + regs_written());
+}
+
bool
fs_inst::is_tex()
{
}
if (scan_inst->dst.file == GRF &&
- scan_inst->dst.reg == inst->dst.reg &&
- (scan_inst->dst.reg_offset == inst->dst.reg_offset ||
- scan_inst->regs_written() > 1)) {
+ scan_inst->overwrites_reg(inst->dst)) {
break;
}
}
!scan_inst->is_tail_sentinel();
scan_inst = (fs_inst *)scan_inst->next) {
if (scan_inst->dst.file == GRF) {
- if (scan_inst->dst.reg == inst->dst.reg &&
- (scan_inst->dst.reg_offset == inst->dst.reg_offset ||
- scan_inst->regs_written() > 1)) {
- interfered = true;
- break;
- }
- if (inst->src[0].file == GRF &&
- scan_inst->dst.reg == inst->src[0].reg &&
- (scan_inst->dst.reg_offset == inst->src[0].reg_offset ||
- scan_inst->regs_written() > 1)) {
+ if (scan_inst->overwrites_reg(inst->dst) ||
+ scan_inst->overwrites_reg(inst->src[0])) {
interfered = true;
break;
}
bool equals(fs_inst *inst);
int regs_written();
+ bool overwrites_reg(const fs_reg ®);
bool is_tex();
bool is_math();
/* kill the destination from the ACP */
if (inst->dst.file == GRF) {
- int start_offset = inst->dst.reg_offset;
- int end_offset = start_offset + inst->regs_written();
-
foreach_list_safe(entry_node, acp) {
acp_entry *entry = (acp_entry *)entry_node;
- if (entry->dst.file == GRF &&
- entry->dst.reg == inst->dst.reg &&
- entry->dst.reg_offset >= start_offset &&
- entry->dst.reg_offset < end_offset) {
- entry->remove();
- continue;
- }
- if (entry->src.file == GRF &&
- entry->src.reg == inst->dst.reg &&
- entry->src.reg_offset >= start_offset &&
- entry->src.reg_offset < end_offset) {
+ if (inst->overwrites_reg(entry->dst) ||
+ inst->overwrites_reg(entry->src)) {
entry->remove();
}
}
}
/* Kill all AEB entries that use the destination. */
- int start_offset = inst->dst.reg_offset;
- int end_offset = start_offset + inst->regs_written();
-
foreach_list_safe(entry_node, aeb) {
aeb_entry *entry = (aeb_entry *)entry_node;
for (int i = 0; i < 3; i++) {
- if (entry->generator->src[i].file == inst->dst.file &&
- entry->generator->src[i].reg == inst->dst.reg &&
- entry->generator->src[i].reg_offset >= start_offset &&
- entry->generator->src[i].reg_offset < end_offset) {
+ if (inst->overwrites_reg(entry->generator->src[i])) {
entry->remove();
ralloc_free(entry);
break;