diff --git a/src/intel/compiler/brw_asm.c b/src/intel/compiler/brw_asm.c index 2bbac833eb2..4a5e3e76516 100644 --- a/src/intel/compiler/brw_asm.c +++ b/src/intel/compiler/brw_asm.c @@ -44,6 +44,8 @@ i965_postprocess_labels() case BRW_OPCODE_ELSE: case BRW_OPCODE_ENDIF: case BRW_OPCODE_WHILE: + case BRW_OPCODE_GOTO: + case BRW_OPCODE_JOIN: brw_eu_inst_set_jip(p->devinfo, inst, relative_offset); break; case BRW_OPCODE_BREAK: @@ -59,6 +61,7 @@ i965_postprocess_labels() switch (opcode) { case BRW_OPCODE_IF: case BRW_OPCODE_ELSE: + case BRW_OPCODE_GOTO: brw_eu_inst_set_uip(p->devinfo, inst, relative_offset); break; case BRW_OPCODE_WHILE: diff --git a/src/intel/compiler/brw_disasm.c b/src/intel/compiler/brw_disasm.c index 9d123d93c1c..63d006fb48e 100644 --- a/src/intel/compiler/brw_disasm.c +++ b/src/intel/compiler/brw_disasm.c @@ -45,7 +45,9 @@ brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode) opcode == BRW_OPCODE_WHILE || opcode == BRW_OPCODE_BREAK || opcode == BRW_OPCODE_CONTINUE || - opcode == BRW_OPCODE_HALT; + opcode == BRW_OPCODE_HALT || + opcode == BRW_OPCODE_GOTO || + opcode == BRW_OPCODE_JOIN; } bool @@ -55,7 +57,8 @@ brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode) opcode == BRW_OPCODE_ELSE || opcode == BRW_OPCODE_BREAK || opcode == BRW_OPCODE_CONTINUE || - opcode == BRW_OPCODE_HALT; + opcode == BRW_OPCODE_HALT || + opcode == BRW_OPCODE_GOTO; } bool diff --git a/src/intel/compiler/brw_eu.c b/src/intel/compiler/brw_eu.c index b8300d3a4c0..6fbd4efd3c3 100644 --- a/src/intel/compiler/brw_eu.c +++ b/src/intel/compiler/brw_eu.c @@ -617,6 +617,7 @@ static const struct opcode_desc opcode_descs[] = { { BRW_OPCODE_CALL, 44, "call", 0, 0, GFX_ALL }, { BRW_OPCODE_RET, 45, "ret", 0, 0, GFX_ALL }, { BRW_OPCODE_GOTO, 46, "goto", 0, 0, GFX_ALL }, + { BRW_OPCODE_JOIN, 47, "join", 0, 0, GFX_ALL }, { BRW_OPCODE_WAIT, 48, "wait", 0, 1, GFX_LT(GFX12) }, { BRW_OPCODE_SEND, 49, "send", 1, 1, GFX_LT(GFX12) }, { BRW_OPCODE_SENDC, 50, "sendc", 1, 1, GFX_LT(GFX12) }, diff --git a/src/intel/compiler/brw_eu_compact.c b/src/intel/compiler/brw_eu_compact.c index ac1dfadd102..332f2e2b12b 100644 --- a/src/intel/compiler/brw_eu_compact.c +++ b/src/intel/compiler/brw_eu_compact.c @@ -2250,7 +2250,8 @@ update_uip_jip(const struct brw_isa_info *isa, brw_eu_inst *insn, brw_eu_inst_set_jip(devinfo, insn, (uint32_t)jip_compacted << shift); if (brw_eu_inst_opcode(isa, insn) == BRW_OPCODE_ENDIF || - brw_eu_inst_opcode(isa, insn) == BRW_OPCODE_WHILE) + brw_eu_inst_opcode(isa, insn) == BRW_OPCODE_WHILE || + brw_eu_inst_opcode(isa, insn) == BRW_OPCODE_JOIN) return; int32_t uip_compacted = brw_eu_inst_uip(devinfo, insn) >> shift; @@ -2417,6 +2418,8 @@ brw_compact_instructions(struct brw_codegen *p, int start_offset, case BRW_OPCODE_ELSE: case BRW_OPCODE_ENDIF: case BRW_OPCODE_WHILE: + case BRW_OPCODE_GOTO: + case BRW_OPCODE_JOIN: if (brw_eu_inst_cmpt_control(devinfo, insn)) { brw_eu_inst uncompacted; uncompact_instruction(&c, &uncompacted, diff --git a/src/intel/compiler/brw_eu_defines.h b/src/intel/compiler/brw_eu_defines.h index 7149f75497d..f1f2bc92a0b 100644 --- a/src/intel/compiler/brw_eu_defines.h +++ b/src/intel/compiler/brw_eu_defines.h @@ -193,6 +193,7 @@ enum opcode { BRW_OPCODE_CALL, BRW_OPCODE_RET, BRW_OPCODE_GOTO, + BRW_OPCODE_JOIN, BRW_OPCODE_WAIT, BRW_OPCODE_SEND, BRW_OPCODE_SENDC, diff --git a/src/intel/compiler/brw_eu_validate.c b/src/intel/compiler/brw_eu_validate.c index 2f4385d7468..6a3f48928b1 100644 --- a/src/intel/compiler/brw_eu_validate.c +++ b/src/intel/compiler/brw_eu_validate.c @@ -2500,6 +2500,7 @@ brw_hw_decode_inst(const struct brw_isa_info *isa, case BRW_OPCODE_CALLA: case BRW_OPCODE_CALL: case BRW_OPCODE_GOTO: + case BRW_OPCODE_JOIN: inst->format = FORMAT_BRANCH; break; diff --git a/src/intel/compiler/brw_gram.y b/src/intel/compiler/brw_gram.y index bfa30c58310..5ced965dffa 100644 --- a/src/intel/compiler/brw_gram.y +++ b/src/intel/compiler/brw_gram.y @@ -664,6 +664,7 @@ relocatableinstruction: | branchinstruction | breakinstruction | loopinstruction + | joininstruction ; illegalinstruction: @@ -1138,6 +1139,30 @@ branchinstruction: brw_pop_insn_state(p); } + | predicate GOTO execsize JIP JUMP_LABEL UIP JUMP_LABEL instoptions + { + add_label(p, $5, INSTR_LABEL_JIP); + add_label(p, $7, INSTR_LABEL_UIP); + + brw_next_insn(p, $2); + i965_asm_set_instruction_options(p, $8); + brw_eu_inst_set_exec_size(p->devinfo, brw_last_inst, $3); + + brw_pop_insn_state(p); + } + ; + +joininstruction: + predicate JOIN execsize JIP JUMP_LABEL instoptions + { + add_label(p, $5, INSTR_LABEL_JIP); + + brw_next_insn(p, $2); + i965_asm_set_instruction_options(p, $6); + brw_eu_inst_set_exec_size(p->devinfo, brw_last_inst, $3); + + brw_pop_insn_state(p); + } ; /* break instruction */ diff --git a/src/intel/compiler/brw_lex.l b/src/intel/compiler/brw_lex.l index b521f16b165..80ffd2b0f80 100644 --- a/src/intel/compiler/brw_lex.l +++ b/src/intel/compiler/brw_lex.l @@ -86,6 +86,7 @@ goto { yylval.integer = BRW_OPCODE_GOTO; return GOTO; } halt { yylval.integer = BRW_OPCODE_HALT; return HALT; } if { yylval.integer = BRW_OPCODE_IF; return IF; } illegal { yylval.integer = BRW_OPCODE_ILLEGAL; return ILLEGAL; } +join { yylval.integer = BRW_OPCODE_JOIN; return JOIN; } jmpi { yylval.integer = BRW_OPCODE_JMPI; return JMPI; } line { yylval.integer = BRW_OPCODE_LINE; return LINE; } lrp { yylval.integer = BRW_OPCODE_LRP; return LRP; }