summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-12-19 15:14:26 -0800
committerMarge Bot <eric+marge@anholt.net>2021-01-06 16:46:52 +0000
commit68be24dd6cfd2ca0f75170bbed9310d53ca9fe0f (patch)
tree94b4a69ca8e83664cf877d626d5f962f60d37c5c
parent647d7fc36d3ba74a6d4ed7369d4514130ab5b264 (diff)
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>
-rw-r--r--src/freedreno/ir3/ir3_lexer.l17
-rw-r--r--src/freedreno/ir3/ir3_parser.y41
2 files changed, 49 insertions, 9 deletions
diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l
index fbf06e54de1..2924d788abf 100644
--- a/src/freedreno/ir3/ir3_lexer.l
+++ b/src/freedreno/ir3/ir3_lexer.l
@@ -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);
diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y
index ac6c23cfca7..582b593a575 100644
--- a/src/freedreno/ir3/ir3_parser.y
+++ b/src/freedreno/ir3/ir3_parser.y
@@ -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); }