From 68be24dd6cfd2ca0f75170bbed9310d53ca9fe0f Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 19 Dec 2020 15:14:26 -0800 Subject: freedreno/ir3/parser: cat1 updates (mova1, movmsk) Signed-off-by: Rob Clark Part-of: --- src/freedreno/ir3/ir3_lexer.l | 17 ++++++++++++++++- 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 T_OP_PREDE /* category 1: */ +%token T_OP_MOVMSK +%token T_OP_MOVA1 %token T_OP_MOVA %token T_OP_MOV %token T_OP_COV @@ -494,7 +496,9 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_NAN %token T_INF %token T_A0 +%token T_A1 %token T_P0 +%token T_W %token T_CAT1_TYPE_TYPE %type 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); } -- cgit v1.2.3