diff options
author | Rob Clark <robdclark@chromium.org> | 2020-12-19 15:14:26 -0800 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-01-06 16:46:52 +0000 |
commit | 68be24dd6cfd2ca0f75170bbed9310d53ca9fe0f (patch) | |
tree | 94b4a69ca8e83664cf877d626d5f962f60d37c5c | |
parent | 647d7fc36d3ba74a6d4ed7369d4514130ab5b264 (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.l | 17 | ||||
-rw-r--r-- | src/freedreno/ir3/ir3_parser.y | 41 |
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); } |