brw: Add support for GOTO/JOIN in the assembler

Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33522>
This commit is contained in:
Caio Oliveira
2025-02-11 20:40:36 -08:00
parent 9df254731e
commit 7b45d31df0
8 changed files with 41 additions and 3 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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) },

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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; }