summaryrefslogtreecommitdiff
path: root/src/intel/compiler/brw_eu_emit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel/compiler/brw_eu_emit.c')
-rw-r--r--src/intel/compiler/brw_eu_emit.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c
index 60761e83c62..fe0ccf2e1f5 100644
--- a/src/intel/compiler/brw_eu_emit.c
+++ b/src/intel/compiler/brw_eu_emit.c
@@ -1671,7 +1671,7 @@ brw_CONT(struct brw_codegen *p)
}
brw_inst *
-gen6_HALT(struct brw_codegen *p)
+brw_HALT(struct brw_codegen *p)
{
const struct gen_device_info *devinfo = p->devinfo;
brw_inst *insn;
@@ -1680,9 +1680,13 @@ gen6_HALT(struct brw_codegen *p)
brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
if (devinfo->gen >= 8) {
brw_set_src0(p, insn, brw_imm_d(0x0));
- } else {
+ } else if (devinfo->gen >= 6) {
brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
brw_set_src1(p, insn, brw_imm_d(0x0)); /* UIP and JIP, updated later. */
+ } else {
+ brw_set_dest(p, insn, brw_ip_reg());
+ brw_set_src0(p, insn, brw_ip_reg());
+ brw_set_src1(p, insn, brw_imm_d(0x0));
}
brw_inst_set_qtr_control(devinfo, insn, BRW_COMPRESSION_NONE);
@@ -1690,6 +1694,24 @@ gen6_HALT(struct brw_codegen *p)
return insn;
}
+brw_inst *
+gen7_BRC(struct brw_codegen *p)
+{
+ const struct gen_device_info *devinfo = p->devinfo;
+ brw_inst *insn = next_insn(p, BRW_OPCODE_BRC);
+
+ if (devinfo->gen >= 8) {
+ brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
+ brw_set_src0(p, insn, brw_imm_d(0x0));
+ } else {
+ assert(devinfo->gen >= 7);
+ brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
+ brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));
+ brw_set_src1(p, insn, brw_imm_d(0x0));
+ }
+ return insn;
+}
+
/* DO/WHILE loop:
*
* The DO/WHILE is just an unterminated loop -- break or continue are
@@ -2710,6 +2732,9 @@ brw_find_next_block_end(struct brw_codegen *p, int start_offset)
offset = next_offset(devinfo, store, offset)) {
brw_inst *insn = store + offset;
+ if (offset == p->exit_insn_offset)
+ return offset;
+
switch (brw_inst_opcode(devinfo, insn)) {
case BRW_OPCODE_IF:
depth++;
@@ -2727,7 +2752,6 @@ brw_find_next_block_end(struct brw_codegen *p, int start_offset)
continue;
/* fallthrough */
case BRW_OPCODE_ELSE:
- case BRW_OPCODE_HALT:
if (depth == 0)
return offset;
}
@@ -2835,6 +2859,12 @@ brw_set_uip_jip(struct brw_codegen *p, int start_offset)
assert(brw_inst_uip(devinfo, insn) != 0);
assert(brw_inst_jip(devinfo, insn) != 0);
break;
+
+ case BRW_OPCODE_BRC:
+ brw_inst_set_jip(devinfo, insn,
+ block_end_offset == 0 ? brw_inst_uip(devinfo, insn) :
+ (block_end_offset - offset) / scale);
+ break;
}
}
}