diff options
Diffstat (limited to 'src/intel/compiler/brw_eu_emit.c')
-rw-r--r-- | src/intel/compiler/brw_eu_emit.c | 36 |
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; } } } |