From 6aabdb7a576a4a769069546366dbca1700a76034 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 31 Jul 2023 19:21:33 +0200 Subject: [PATCH] ir3: Parse (eq) flag Part-of: --- src/freedreno/ir3/ir3.h | 26 ++++++++++++++------------ src/freedreno/ir3/ir3_lexer.l | 1 + src/freedreno/ir3/ir3_parser.y | 2 ++ src/freedreno/ir3/tests/disasm.c | 1 + src/freedreno/isa/ir3-cat0.xml | 3 ++- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 9cf28f6b06a..b4b437125ad 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -313,24 +313,26 @@ typedef enum ir3_instruction_flags { /* (jp) flag is set on jump targets: */ IR3_INSTR_JP = BIT(2), - IR3_INSTR_UL = BIT(3), - IR3_INSTR_3D = BIT(4), - IR3_INSTR_A = BIT(5), - IR3_INSTR_O = BIT(6), - IR3_INSTR_P = BIT(7), - IR3_INSTR_S = BIT(8), - IR3_INSTR_S2EN = BIT(9), - IR3_INSTR_SAT = BIT(10), + /* (eq) flag kills helper invocations when they are no longer needed */ + IR3_INSTR_EQ = BIT(3), + IR3_INSTR_UL = BIT(4), + IR3_INSTR_3D = BIT(5), + IR3_INSTR_A = BIT(6), + IR3_INSTR_O = BIT(7), + IR3_INSTR_P = BIT(8), + IR3_INSTR_S = BIT(9), + IR3_INSTR_S2EN = BIT(10), + IR3_INSTR_SAT = BIT(11), /* (cat5/cat6) Bindless */ - IR3_INSTR_B = BIT(11), + IR3_INSTR_B = BIT(12), /* (cat5/cat6) nonuniform */ - IR3_INSTR_NONUNIF = BIT(12), + IR3_INSTR_NONUNIF = BIT(13), /* (cat5-only) Get some parts of the encoding from a1.x */ - IR3_INSTR_A1EN = BIT(13), + IR3_INSTR_A1EN = BIT(14), /* meta-flags, for intermediate stages of IR, ie. * before register assignment is done: */ - IR3_INSTR_MARK = BIT(14), + IR3_INSTR_MARK = BIT(15), IR3_INSTR_UNUSED = BIT(16), } ir3_instruction_flags; diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index ff8ee7b96f9..da6a11b96a9 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -122,6 +122,7 @@ static int parse_reg(const char *str) "(neg_infinity)" return TOKEN(T_NEG_INFINITY); "(ei)" return TOKEN(T_EI); "(jp)" return TOKEN(T_JP); +"(eq)" return TOKEN(T_EQ_FLAG); "(sat)" return TOKEN(T_SAT); "(rpt"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_RPT; "(nop"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_NOP; diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 82677125887..9d0616f14a7 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -373,6 +373,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_SY %token T_SS %token T_JP +%token T_EQ_FLAG %token T_SAT %token T_RPT %token T_UL @@ -805,6 +806,7 @@ tex_header: T_A_TEX '(' T_REGISTER ')' iflag: T_SY { iflags.flags |= IR3_INSTR_SY; } | T_SS { iflags.flags |= IR3_INSTR_SS; } | T_JP { iflags.flags |= IR3_INSTR_JP; } +| T_EQ_FLAG { iflags.flags |= IR3_INSTR_EQ; } | T_SAT { iflags.flags |= IR3_INSTR_SAT; } | T_RPT { iflags.repeat = $1; } | T_UL { iflags.flags |= IR3_INSTR_UL; } diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index 9b809f70966..46e811f0135 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -64,6 +64,7 @@ static const struct test { /* cat0 */ INSTR_6XX(00000000_00000000, "nop"), INSTR_6XX(00000200_00000000, "(rpt2)nop"), + INSTR_6XX(00010000_00000000, "(eq)nop"), INSTR_6XX(03000000_00000000, "end"), INSTR_6XX(00800000_00000004, "br p0.x, #4"), INSTR_6XX(00800000_fffffffc, "br p0.x, #-4"), diff --git a/src/freedreno/isa/ir3-cat0.xml b/src/freedreno/isa/ir3-cat0.xml index 3a66a3e96ec..c54ff076a5e 100644 --- a/src/freedreno/isa/ir3-cat0.xml +++ b/src/freedreno/isa/ir3-cat0.xml @@ -49,6 +49,7 @@ SOFTWARE. src->cat0.comp2 src->cat0.inv1 src->cat0.inv2 + !!(src->flags & IR3_INSTR_EQ) @@ -296,4 +297,4 @@ SOFTWARE. - \ No newline at end of file +