From 5e2cee57c5177f52d3620abb60c05b438acca1eb Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 11 Jan 2021 18:27:12 +0200 Subject: [PATCH] freedreno/ir3/parser: add cat7 support Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/ir3/ir3_lexer.l | 5 +++++ src/freedreno/ir3/ir3_parser.y | 18 ++++++++++++++++++ src/freedreno/ir3/tests/disasm.c | 7 +++++++ 3 files changed, 30 insertions(+) diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index edabf5c9814..8bad625a549 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -335,6 +335,10 @@ static int parse_w(const char *str) "getspid" return TOKEN(T_OP_GETSPID); "getwid" return TOKEN(T_OP_GETWID); + /* category 7: */ +"bar" return TOKEN(T_OP_BAR); +"fence" return TOKEN(T_OP_FENCE); + "f16" return TOKEN(T_TYPE_F16); "f32" return TOKEN(T_TYPE_F32); "u16" return TOKEN(T_TYPE_U16); @@ -386,6 +390,7 @@ static int parse_w(const char *str) "hc" return TOKEN(T_HC); "hr" return TOKEN(T_HR); "g" return 'g'; +"w" return 'w'; "l" return 'l'; "<" return '<'; ">" return '>'; diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 5676cd229b6..1ad4d140e5d 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -515,6 +515,10 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_OP_GETSPID %token T_OP_GETWID +/* category 7: */ +%token T_OP_BAR +%token T_OP_FENCE + /* type qualifiers: */ %token T_TYPE_F16 %token T_TYPE_F32 @@ -666,6 +670,7 @@ instr: iflags cat0_instr | iflags cat4_instr | iflags cat5_instr { fixup_cat5_s2en(); } | iflags cat6_instr +| iflags cat7_instr cat0_src1: '!' T_P0 { instr->cat0.inv1 = true; instr->cat0.comp1 = $2 >> 1; } | T_P0 { instr->cat0.comp1 = $1 >> 1; } @@ -1037,6 +1042,19 @@ cat6_instr: cat6_load | cat6_bindless_ibo | cat6_todo +cat7_scope: '.' 'w' { instr->cat7.w = true; } +| '.' 'r' { instr->cat7.r = true; } +| '.' 'l' { instr->cat7.l = true; } +| '.' 'g' { instr->cat7.g = true; } + +cat7_scopes: +| cat7_scope cat7_scopes + +cat7_barrier: T_OP_BAR { new_instr(OPC_BAR); } cat7_scopes +| T_OP_FENCE { new_instr(OPC_FENCE); } cat7_scopes + +cat7_instr: cat7_barrier + reg: T_REGISTER { $$ = new_reg($1, 0); } | T_A0 { $$ = new_reg((61 << 3), IR3_REG_HALF); } | T_A1 { $$ = new_reg((61 << 3) + 1, IR3_REG_HALF); } diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index 6deb47e3f7c..c03484c3522 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -308,6 +308,13 @@ static const struct test { /* Custom test since we've never seen the blob emit these. */ INSTR_6XX(c0260004_00490000, "getspid.u32 r1.x"), INSTR_6XX(c0260005_00494000, "getwid.u32 r1.y"), + + /* cat7 */ + + /* dEQP-VK.compute.basic.ssbo_local_barrier_single_invocation */ + INSTR_6XX(e0fa0000_00000000, "fence.g.l.r.w"), + INSTR_6XX(e09a0000_00000000, "fence.r.w"), + INSTR_6XX(f0420000_00000000, "(sy)bar.g"), }; static void