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:
@@ -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:
|
||||
|
@@ -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
|
||||
|
@@ -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) },
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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 */
|
||||
|
@@ -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; }
|
||||
|
Reference in New Issue
Block a user