mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 17:20:21 +01:00
intel/tools/i965_asm: Implement gfx12 and gfx12.5 send/sendc
Signed-off-by: Sviatoslav Peleshko <sviatoslav.peleshko@globallogic.com> Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25657>
This commit is contained in:
parent
bc46cc7807
commit
88fcd305be
3 changed files with 150 additions and 62 deletions
|
|
@ -94,6 +94,11 @@ struct options {
|
|||
struct tgl_swsb depinfo;
|
||||
};
|
||||
|
||||
struct msgdesc {
|
||||
unsigned ex_bso:1;
|
||||
unsigned src1_len:5;
|
||||
};
|
||||
|
||||
enum instr_label_type {
|
||||
INSTR_LABEL_JIP,
|
||||
INSTR_LABEL_UIP,
|
||||
|
|
|
|||
|
|
@ -359,6 +359,7 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
struct condition condition;
|
||||
struct options options;
|
||||
struct instoption instoption;
|
||||
struct msgdesc msgdesc;
|
||||
struct tgl_swsb depinfo;
|
||||
brw_inst *instruction;
|
||||
}
|
||||
|
|
@ -373,6 +374,7 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
%token LSQUARE RSQUARE
|
||||
%token PLUS MINUS
|
||||
%token SEMICOLON
|
||||
%token ASSIGN
|
||||
|
||||
/* datatypes */
|
||||
%token <integer> TYPE_B TYPE_UB
|
||||
|
|
@ -404,7 +406,8 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
%token <integer> OR
|
||||
%token <integer> PLN POP PUSH
|
||||
%token <integer> RET RNDD RNDE RNDU RNDZ ROL ROR
|
||||
%token <integer> SAD2 SADA2 SEL SEND SENDC SENDS SENDSC SHL SHR SMOV SUBB SYNC
|
||||
%token <integer> SAD2 SADA2 SEL SENDS SENDSC SHL SHR SMOV SUBB SYNC
|
||||
%token <integer> SEND_GFX4 SENDC_GFX4 SEND_GFX12 SENDC_GFX12
|
||||
%token <integer> WAIT WHILE
|
||||
%token <integer> XOR
|
||||
|
||||
|
|
@ -419,7 +422,11 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
|
||||
/* shared functions for send */
|
||||
%token CONST CRE DATA DP_DATA_1 GATEWAY MATH PIXEL_INTERP READ RENDER SAMPLER
|
||||
%token THREAD_SPAWNER URB VME WRITE DP_SAMPLER
|
||||
%token THREAD_SPAWNER URB VME WRITE DP_SAMPLER RT_ACCEL SLM TGM UGM
|
||||
|
||||
/* message details for send */
|
||||
%token MSGDESC_BEGIN SRC1_LEN EX_BSO MSGDESC_END
|
||||
%type <msgdesc> msgdesc msgdesc_parts;
|
||||
|
||||
/* Conditional modifiers */
|
||||
%token <integer> EQUAL GREATER GREATER_EQUAL LESS LESS_EQUAL NOT_EQUAL
|
||||
|
|
@ -525,6 +532,7 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
%type <reg> indirectgenreg indirectregion
|
||||
%type <reg> immreg src reg32 payload directgenreg_list addrparam region
|
||||
%type <reg> region_wh directgenreg directmsgreg indirectmsgreg
|
||||
%type <reg> desc ex_desc reg32a
|
||||
%type <integer> swizzle
|
||||
|
||||
/* registers */
|
||||
|
|
@ -540,8 +548,8 @@ add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type t
|
|||
|
||||
/* instruction opcodes */
|
||||
%type <integer> unaryopcodes binaryopcodes binaryaccopcodes ternaryopcodes
|
||||
%type <integer> sendop
|
||||
%type <instruction> sendopcode
|
||||
%type <integer> sendop sendsop
|
||||
%type <instruction> sendopcode sendsopcode
|
||||
|
||||
%type <integer> negate abs chansel math_function sharedfunction
|
||||
|
||||
|
|
@ -972,9 +980,9 @@ waitinstruction:
|
|||
|
||||
/* Send instruction */
|
||||
sendinstruction:
|
||||
predicate sendopcode execsize dst payload exp2 sharedfunction instoptions
|
||||
predicate sendopcode execsize dst payload exp2 sharedfunction msgdesc instoptions
|
||||
{
|
||||
i965_asm_set_instruction_options(p, $8);
|
||||
i965_asm_set_instruction_options(p, $9);
|
||||
brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
|
||||
brw_set_dest(p, brw_last_inst, $4);
|
||||
brw_set_src0(p, brw_last_inst, $5);
|
||||
|
|
@ -983,20 +991,22 @@ sendinstruction:
|
|||
BRW_IMMEDIATE_VALUE,
|
||||
BRW_REGISTER_TYPE_UD);
|
||||
brw_inst_set_sfid(p->devinfo, brw_last_inst, $7);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $8.end_of_thread);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $9.end_of_thread);
|
||||
// TODO: set instruction group instead of qtr and nib ctrl
|
||||
brw_inst_set_qtr_control(p->devinfo, brw_last_inst,
|
||||
$8.qtr_ctrl);
|
||||
$9.qtr_ctrl);
|
||||
|
||||
if (p->devinfo->ver >= 7)
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$8.nib_ctrl);
|
||||
$9.nib_ctrl);
|
||||
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
| predicate sendopcode execsize exp dst payload exp2 sharedfunction instoptions
|
||||
| predicate sendopcode execsize exp dst payload exp2 sharedfunction msgdesc instoptions
|
||||
{
|
||||
i965_asm_set_instruction_options(p, $9);
|
||||
assert(p->devinfo->ver < 6);
|
||||
|
||||
i965_asm_set_instruction_options(p, $10);
|
||||
brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
|
||||
brw_inst_set_base_mrf(p->devinfo, brw_last_inst, $4);
|
||||
brw_set_dest(p, brw_last_inst, $5);
|
||||
|
|
@ -1006,99 +1016,98 @@ sendinstruction:
|
|||
BRW_IMMEDIATE_VALUE,
|
||||
BRW_REGISTER_TYPE_UD);
|
||||
brw_inst_set_sfid(p->devinfo, brw_last_inst, $8);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $9.end_of_thread);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $10.end_of_thread);
|
||||
// TODO: set instruction group instead of qtr and nib ctrl
|
||||
brw_inst_set_qtr_control(p->devinfo, brw_last_inst,
|
||||
$9.qtr_ctrl);
|
||||
|
||||
if (p->devinfo->ver >= 7)
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$9.nib_ctrl);
|
||||
$10.qtr_ctrl);
|
||||
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
| predicate sendopcode execsize dst payload payload exp2 sharedfunction instoptions
|
||||
| predicate sendopcode execsize dst payload payload exp2 sharedfunction msgdesc instoptions
|
||||
{
|
||||
i965_asm_set_instruction_options(p, $9);
|
||||
assert(p->devinfo->ver >= 6 && p->devinfo->ver < 12);
|
||||
|
||||
i965_asm_set_instruction_options(p, $10);
|
||||
brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
|
||||
brw_set_dest(p, brw_last_inst, $4);
|
||||
brw_set_src0(p, brw_last_inst, $5);
|
||||
brw_inst_set_bits(brw_last_inst, 127, 96, $7);
|
||||
brw_inst_set_sfid(p->devinfo, brw_last_inst, $8);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $9.end_of_thread);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $10.end_of_thread);
|
||||
// TODO: set instruction group instead of qtr and nib ctrl
|
||||
brw_inst_set_qtr_control(p->devinfo, brw_last_inst,
|
||||
$9.qtr_ctrl);
|
||||
$10.qtr_ctrl);
|
||||
|
||||
if (p->devinfo->ver >= 7)
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$9.nib_ctrl);
|
||||
$10.nib_ctrl);
|
||||
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
| predicate SENDS execsize dst payload payload exp2 exp2 sharedfunction instoptions
|
||||
| predicate sendsopcode execsize dst payload payload desc ex_desc sharedfunction msgdesc instoptions
|
||||
{
|
||||
brw_next_insn(p, $2);
|
||||
i965_asm_set_instruction_options(p, $10);
|
||||
assert(p->devinfo->ver >= 9);
|
||||
|
||||
i965_asm_set_instruction_options(p, $11);
|
||||
brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
|
||||
brw_set_dest(p, brw_last_inst, $4);
|
||||
brw_set_src0(p, brw_last_inst, $5);
|
||||
brw_set_src1(p, brw_last_inst, $6);
|
||||
|
||||
if (brw_inst_send_sel_reg32_ex_desc(p->devinfo, brw_last_inst)) {
|
||||
brw_inst_set_send_ex_desc_ia_subreg_nr(p->devinfo, brw_last_inst, $5.subnr);
|
||||
if ($7.file == BRW_IMMEDIATE_VALUE) {
|
||||
brw_inst_set_send_sel_reg32_desc(p->devinfo, brw_last_inst, 0);
|
||||
brw_inst_set_send_desc(p->devinfo, brw_last_inst, $7.ud);
|
||||
} else {
|
||||
brw_inst_set_sends_ex_desc(p->devinfo, brw_last_inst, $8);
|
||||
brw_inst_set_send_sel_reg32_desc(p->devinfo, brw_last_inst, 1);
|
||||
}
|
||||
|
||||
brw_inst_set_bits(brw_last_inst, 127, 96, $7);
|
||||
brw_inst_set_sfid(p->devinfo, brw_last_inst, $9);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $10.end_of_thread);
|
||||
// TODO: set instruction group instead of qtr and nib ctrl
|
||||
brw_inst_set_qtr_control(p->devinfo, brw_last_inst,
|
||||
$10.qtr_ctrl);
|
||||
|
||||
if (p->devinfo->ver >= 7)
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$10.nib_ctrl);
|
||||
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
| predicate SENDS execsize dst payload payload src exp2 sharedfunction instoptions
|
||||
{
|
||||
brw_next_insn(p, $2);
|
||||
i965_asm_set_instruction_options(p, $10);
|
||||
brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
|
||||
brw_set_dest(p, brw_last_inst, $4);
|
||||
brw_set_src0(p, brw_last_inst, $5);
|
||||
brw_set_src1(p, brw_last_inst, $6);
|
||||
|
||||
brw_inst_set_send_sel_reg32_desc(p->devinfo, brw_last_inst, 1);
|
||||
brw_inst_set_sends_ex_desc(p->devinfo, brw_last_inst, $8);
|
||||
if ($8.file == BRW_IMMEDIATE_VALUE) {
|
||||
brw_inst_set_send_sel_reg32_ex_desc(p->devinfo, brw_last_inst, 0);
|
||||
brw_inst_set_sends_ex_desc(p->devinfo, brw_last_inst, $8.ud);
|
||||
} else {
|
||||
brw_inst_set_send_sel_reg32_ex_desc(p->devinfo, brw_last_inst, 1);
|
||||
brw_inst_set_send_ex_desc_ia_subreg_nr(p->devinfo, brw_last_inst, $8.subnr >> 2);
|
||||
}
|
||||
|
||||
brw_inst_set_sfid(p->devinfo, brw_last_inst, $9);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $10.end_of_thread);
|
||||
brw_inst_set_eot(p->devinfo, brw_last_inst, $11.end_of_thread);
|
||||
// TODO: set instruction group instead of qtr and nib ctrl
|
||||
brw_inst_set_qtr_control(p->devinfo, brw_last_inst,
|
||||
$10.qtr_ctrl);
|
||||
$11.qtr_ctrl);
|
||||
|
||||
if (p->devinfo->ver >= 7)
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$10.nib_ctrl);
|
||||
brw_inst_set_nib_control(p->devinfo, brw_last_inst,
|
||||
$11.nib_ctrl);
|
||||
|
||||
if (p->devinfo->verx10 >= 125 && $10.ex_bso) {
|
||||
brw_inst_set_send_ex_bso(p->devinfo, brw_last_inst, 1);
|
||||
brw_inst_set_send_src1_len(p->devinfo, brw_last_inst,
|
||||
$10.src1_len);
|
||||
}
|
||||
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
;
|
||||
|
||||
sendop:
|
||||
SEND
|
||||
| SENDC
|
||||
SEND_GFX4
|
||||
| SENDC_GFX4
|
||||
;
|
||||
|
||||
sendsop:
|
||||
SEND_GFX12
|
||||
| SENDC_GFX12
|
||||
| SENDS
|
||||
| SENDSC
|
||||
;
|
||||
|
||||
sendopcode:
|
||||
sendop { $$ = brw_next_insn(p, $1); }
|
||||
;
|
||||
|
||||
sendsopcode:
|
||||
sendsop { $$ = brw_next_insn(p, $1); }
|
||||
;
|
||||
|
||||
sharedfunction:
|
||||
NULL_TOKEN { $$ = BRW_SFID_NULL; }
|
||||
| MATH { $$ = BRW_SFID_MATH; }
|
||||
|
|
@ -1116,6 +1125,10 @@ sharedfunction:
|
|||
| CRE { $$ = HSW_SFID_CRE; }
|
||||
| SAMPLER { $$ = BRW_SFID_SAMPLER; }
|
||||
| DP_SAMPLER { $$ = GFX6_SFID_DATAPORT_SAMPLER_CACHE; }
|
||||
| RT_ACCEL { $$ = GEN_RT_SFID_RAY_TRACE_ACCELERATOR; }
|
||||
| SLM { $$ = GFX12_SFID_SLM; }
|
||||
| TGM { $$ = GFX12_SFID_TGM; }
|
||||
| UGM { $$ = GFX12_SFID_UGM; }
|
||||
;
|
||||
|
||||
exp2:
|
||||
|
|
@ -1123,6 +1136,31 @@ exp2:
|
|||
| MINUS LONG { $$ = -$2; }
|
||||
;
|
||||
|
||||
desc:
|
||||
reg32a
|
||||
| exp2
|
||||
{
|
||||
$$ = brw_imm_ud($1);
|
||||
}
|
||||
;
|
||||
|
||||
ex_desc:
|
||||
reg32a
|
||||
| exp2
|
||||
{
|
||||
$$ = brw_imm_ud($1);
|
||||
}
|
||||
;
|
||||
|
||||
reg32a:
|
||||
addrreg region reg_type
|
||||
{
|
||||
$$ = set_direct_src_operand(&$1, $3);
|
||||
$$ = stride($$, $2.vstride, $2.width, $2.hstride);
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
/* Jump instruction */
|
||||
jumpinstruction:
|
||||
predicate JMPI execsize relativelocation2 instoptions
|
||||
|
|
@ -2345,6 +2383,30 @@ condModifiers:
|
|||
| UNORDERED
|
||||
;
|
||||
|
||||
/* message details for send */
|
||||
msgdesc:
|
||||
MSGDESC_BEGIN msgdesc_parts MSGDESC_END { $$ = $2; }
|
||||
;
|
||||
|
||||
msgdesc_parts:
|
||||
SRC1_LEN ASSIGN INTEGER msgdesc_parts
|
||||
{
|
||||
$$ = $4;
|
||||
$$.src1_len = $3;
|
||||
}
|
||||
| EX_BSO msgdesc_parts
|
||||
{
|
||||
$$ = $2;
|
||||
$$.ex_bso = 1;
|
||||
}
|
||||
| INTEGER msgdesc_parts { $$ = $2; }
|
||||
| ASSIGN msgdesc_parts { $$ = $2; }
|
||||
| /* empty */
|
||||
{
|
||||
memset(&$$, 0, sizeof($$));
|
||||
}
|
||||
;
|
||||
|
||||
saturate:
|
||||
/* empty */ { $$ = BRW_INSTRUCTION_NORMAL; }
|
||||
| SATURATE { $$ = BRW_INSTRUCTION_SATURATE; }
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ extern char *input_filename;
|
|||
%x REG
|
||||
%x DOTSEL
|
||||
%x LABEL
|
||||
%x MSGDESC
|
||||
%%
|
||||
|
||||
/* eat up single line comment */
|
||||
|
|
@ -119,8 +120,14 @@ ror { yylval.integer = BRW_OPCODE_ROR; return ROR; }
|
|||
sad2 { yylval.integer = BRW_OPCODE_SAD2; return SAD2; }
|
||||
sada2 { yylval.integer = BRW_OPCODE_SADA2; return SADA2; }
|
||||
sel { yylval.integer = BRW_OPCODE_SEL; return SEL; }
|
||||
send { yylval.integer = BRW_OPCODE_SEND; return SEND; }
|
||||
sendc { yylval.integer = BRW_OPCODE_SENDC; return SENDC; }
|
||||
send {
|
||||
yylval.integer = BRW_OPCODE_SEND;
|
||||
return p->devinfo->ver < 12 ? SEND_GFX4 : SEND_GFX12;
|
||||
}
|
||||
sendc {
|
||||
yylval.integer = BRW_OPCODE_SENDC;
|
||||
return p->devinfo->ver < 12 ? SENDC_GFX4 : SENDC_GFX12;
|
||||
}
|
||||
sends { yylval.integer = BRW_OPCODE_SENDS; return SENDS; }
|
||||
sendsc { yylval.integer = BRW_OPCODE_SENDSC; return SENDSC; }
|
||||
shl { yylval.integer = BRW_OPCODE_SHL; return SHL; }
|
||||
|
|
@ -182,6 +189,10 @@ write { return WRITE; }
|
|||
vme { return VME; }
|
||||
"pixel interp" { return PIXEL_INTERP; }
|
||||
"dp data 1" { return DP_DATA_1; }
|
||||
"rt accel" { return RT_ACCEL; }
|
||||
slm { return SLM; }
|
||||
tgm { return TGM; }
|
||||
ugm { return UGM; }
|
||||
|
||||
";" { return SEMICOLON; }
|
||||
":" { return COLON; }
|
||||
|
|
@ -382,7 +393,17 @@ sr[0-9]+ { yylval.integer = atoi(yytext + 2); return STATEREG; }
|
|||
"Jump: " { }
|
||||
"Pop: " { }
|
||||
[ \t]+ { }
|
||||
"MsgDesc:"[^{]* { }
|
||||
|
||||
"MsgDesc: " { BEGIN(MSGDESC); return MSGDESC_BEGIN; }
|
||||
<MSGDESC>ex_bso { return EX_BSO; }
|
||||
<MSGDESC>src1_len { return SRC1_LEN; }
|
||||
<MSGDESC>"=" { return ASSIGN; }
|
||||
<MSGDESC>[0-9][0-9]* {
|
||||
yylval.integer = strtoul(yytext, NULL, 10);
|
||||
return INTEGER;
|
||||
}
|
||||
<MSGDESC>"{" { yyless(0); BEGIN(INITIAL); return MSGDESC_END; }
|
||||
<MSGDESC>. { }
|
||||
|
||||
"0x"[0-9a-f][0-9a-f]* {
|
||||
yylval.llint = strtoull(yytext + 2, NULL, 16);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue