mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 22:00:11 +01:00
freedreno/ir3/parser: cat1 updates (mova1, movmsk)
Signed-off-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8175>
This commit is contained in:
parent
647d7fc36d
commit
68be24dd6c
2 changed files with 49 additions and 9 deletions
|
|
@ -69,6 +69,17 @@ static int parse_reg(const char *str)
|
|||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
static int parse_w(const char *str)
|
||||
{
|
||||
str++;
|
||||
unsigned num = strtol(str, NULL, 10);
|
||||
if ((num % 32) != 0)
|
||||
yy_fatal_error("w# must be multiple of 32");
|
||||
if (num < 32)
|
||||
yy_fatal_error("w# must be at least 32");
|
||||
return num / 32;
|
||||
}
|
||||
%}
|
||||
|
||||
%option noyywrap
|
||||
|
|
@ -107,8 +118,10 @@ static int parse_reg(const char *str)
|
|||
|
||||
[h]?"r"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_REGISTER;
|
||||
[h]?"c"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_CONSTANT;
|
||||
"a0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_A0;
|
||||
"a0.x" return T_A0;
|
||||
"a1.x" return T_A1;
|
||||
"p0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_P0;
|
||||
"w"[0-9]+ ir3_yylval.num = parse_w(yytext); return T_W;
|
||||
"s#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_SAMP;
|
||||
"t#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_TEX;
|
||||
|
||||
|
|
@ -145,6 +158,8 @@ static int parse_reg(const char *str)
|
|||
"prede" return TOKEN(T_OP_PREDE);
|
||||
|
||||
/* category 1: */
|
||||
"movmsk" return TOKEN(T_OP_MOVMSK);
|
||||
"mova1" return TOKEN(T_OP_MOVA1);
|
||||
"mova" return TOKEN(T_OP_MOVA);
|
||||
"mov" return TOKEN(T_OP_MOV);
|
||||
"cov" return TOKEN(T_OP_COV);
|
||||
|
|
|
|||
|
|
@ -314,6 +314,8 @@ static void print_token(FILE *file, int type, YYSTYPE value)
|
|||
%token <tok> T_OP_PREDE
|
||||
|
||||
/* category 1: */
|
||||
%token <tok> T_OP_MOVMSK
|
||||
%token <tok> T_OP_MOVA1
|
||||
%token <tok> T_OP_MOVA
|
||||
%token <tok> T_OP_MOV
|
||||
%token <tok> T_OP_COV
|
||||
|
|
@ -494,7 +496,9 @@ static void print_token(FILE *file, int type, YYSTYPE value)
|
|||
%token <tok> T_NAN
|
||||
%token <tok> T_INF
|
||||
%token <num> T_A0
|
||||
%token <num> T_A1
|
||||
%token <num> T_P0
|
||||
%token <num> T_W
|
||||
%token <str> T_CAT1_TYPE_TYPE
|
||||
|
||||
%type <num> integer offset
|
||||
|
|
@ -643,20 +647,40 @@ cat0_instr: T_OP_NOP { new_instr(OPC_NOP); }
|
|||
| T_OP_PREDF { new_instr(OPC_PREDF); } cat0_src1
|
||||
| T_OP_PREDE { new_instr(OPC_PREDE); }
|
||||
|
||||
cat1_opc: T_OP_MOVA {
|
||||
new_instr(OPC_MOV);
|
||||
instr->cat1.src_type = TYPE_S16;
|
||||
instr->cat1.dst_type = TYPE_S16;
|
||||
}
|
||||
| T_OP_MOV '.' T_CAT1_TYPE_TYPE {
|
||||
cat1_opc: T_OP_MOV '.' T_CAT1_TYPE_TYPE {
|
||||
parse_type_type(new_instr(OPC_MOV), $3);
|
||||
}
|
||||
| T_OP_COV '.' T_CAT1_TYPE_TYPE {
|
||||
parse_type_type(new_instr(OPC_MOV), $3);
|
||||
}
|
||||
|
||||
cat1_movmsk: T_OP_MOVMSK '.' T_W {
|
||||
new_instr(OPC_MOVMSK);
|
||||
instr->cat1.src_type = TYPE_U32;
|
||||
instr->cat1.dst_type = TYPE_U32;
|
||||
} dst_reg {
|
||||
instr->regs[0]->wrmask = (1 << $3) - 1;
|
||||
}
|
||||
|
||||
cat1_mova1: T_OP_MOVA1 T_A1 ',' {
|
||||
new_instr(OPC_MOV);
|
||||
instr->cat1.src_type = TYPE_U16;
|
||||
instr->cat1.dst_type = TYPE_U16;
|
||||
new_reg((61 << 3) + 2, IR3_REG_HALF);
|
||||
} src_reg_or_const_or_rel_or_imm
|
||||
|
||||
cat1_mova: T_OP_MOVA T_A0 ',' {
|
||||
new_instr(OPC_MOV);
|
||||
instr->cat1.src_type = TYPE_S16;
|
||||
instr->cat1.dst_type = TYPE_S16;
|
||||
new_reg((61 << 3), IR3_REG_HALF);
|
||||
} src_reg_or_const_or_rel_or_imm
|
||||
|
||||
/* NOTE: cat1 can also *write* to relative gpr */
|
||||
cat1_instr: cat1_opc dst_reg ',' src_reg_or_const_or_rel_or_imm
|
||||
cat1_instr: cat1_movmsk
|
||||
| cat1_mova1
|
||||
| cat1_mova
|
||||
| cat1_opc dst_reg ',' src_reg_or_const_or_rel_or_imm
|
||||
| cat1_opc relative_gpr ',' src_reg_or_const_or_rel_or_imm
|
||||
|
||||
cat2_opc_1src: T_OP_ABSNEG_F { new_instr(OPC_ABSNEG_F); }
|
||||
|
|
@ -877,7 +901,8 @@ cat6_instr: cat6_load
|
|||
| cat6_todo
|
||||
|
||||
reg: T_REGISTER { $$ = new_reg($1, 0); }
|
||||
| T_A0 { $$ = new_reg((61 << 3) + $1, IR3_REG_HALF); }
|
||||
| T_A0 { $$ = new_reg((61 << 3), IR3_REG_HALF); }
|
||||
| T_A1 { $$ = new_reg((61 << 3) + 1, IR3_REG_HALF); }
|
||||
| T_P0 { $$ = new_reg((62 << 3) + $1, 0); }
|
||||
|
||||
const: T_CONSTANT { $$ = new_reg($1, IR3_REG_CONST); }
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue