From 5628a01523c4e3e58d75bb30636bc1403f8c695f Mon Sep 17 00:00:00 2001 From: Amber Date: Wed, 14 Feb 2024 12:10:18 +0100 Subject: [PATCH] ir3: add encoding support for 64-bit atomics introduced in a7xx. Signed-off-by: Amber Harmonia Part-of: --- src/freedreno/ir3/instr-a3xx.h | 1 + src/freedreno/ir3/ir3_lexer.l | 4 ++-- src/freedreno/ir3/ir3_parser.y | 5 +++++ src/freedreno/ir3/tests/disasm.c | 2 ++ src/freedreno/isa/ir3-cat6.xml | 32 +++++++++++++++++++++----------- src/freedreno/isa/ir3-common.xml | 11 +++++++++++ 6 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/freedreno/ir3/instr-a3xx.h b/src/freedreno/ir3/instr-a3xx.h index b8a6186b148..e9a7e54a330 100644 --- a/src/freedreno/ir3/instr-a3xx.h +++ b/src/freedreno/ir3/instr-a3xx.h @@ -410,6 +410,7 @@ typedef enum { TYPE_U32 = 3, TYPE_S16 = 4, TYPE_S32 = 5, + TYPE_ATOMIC_U64 = 6, /* Only valid for a7xx atomics */ TYPE_U8 = 6, TYPE_U8_32 = 7, } type_t; diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index 77bada5920a..936dabb063b 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -180,8 +180,7 @@ static int parse_reg(const char *str) "gat" return TOKEN(T_OP_GAT); "sct" return TOKEN(T_OP_SCT); -("f16"|"f32"|"u16"|"u32"|"s16"|"s32"|"u8"|"u8_32"){2} ir3_yylval.str = yytext; return T_CAT1_TYPE_TYPE; - +("f16"|"f32"|"u16"|"u32"|"s16"|"s32"|"u8"|"u8_32"|"u64"){2} ir3_yylval.str = yytext; return T_CAT1_TYPE_TYPE; /* category 2: */ "add.f" return TOKEN(T_OP_ADD_F); "min.f" return TOKEN(T_OP_MIN_F); @@ -409,6 +408,7 @@ static int parse_reg(const char *str) "s32" return TOKEN(T_TYPE_S32); "u8" return TOKEN(T_TYPE_U8); "u8_32" return TOKEN(T_TYPE_U8_32); +"u64" return TOKEN(T_TYPE_U64); "untyped" return TOKEN(T_UNTYPED); "typed" return TOKEN(T_TYPED); diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index c186cb11853..390e8c88d2e 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -148,6 +148,9 @@ static type_t parse_type(const char **type) } else if (!strncmp("u8_32", *type, 5)) { *type += 5; return TYPE_U8_32; + } else if (!strncmp("u64", *type, 3)) { + *type += 3; + return TYPE_ATOMIC_U64; } else { assert(0); /* shouldn't get here */ return ~0; @@ -673,6 +676,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_TYPE_S32 %token T_TYPE_U8 %token T_TYPE_U8_32 +%token T_TYPE_U64 %token T_UNTYPED %token T_TYPED @@ -1615,3 +1619,4 @@ type: T_TYPE_F16 { $$ = TYPE_F16; } | T_TYPE_S32 { $$ = TYPE_S32; } | T_TYPE_U8 { $$ = TYPE_U8; } | T_TYPE_U8_32 { $$ = TYPE_U8_32; } +| T_TYPE_U64 { $$ = TYPE_ATOMIC_U64; } diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index 959e6aa1e7d..2d7f75be4ff 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -468,6 +468,8 @@ static const struct test { INSTR_6XX(c6e62005_3f800008, "shfl.xor.u32 r1.y, r1.x, 63"), /* dEQP-VK.subgroups.shuffle.graphics.subgroupshuffle_bvec4 */ INSTR_6XX(c6e4c012_c0000020, "shfl.rup.u16 hr4.z, hr4.x, r48.x"), + /* dEQP-VK.glsl.atomic_operations.exchange_unsigned64bit_compute */ + INSTR_7XX(c03c0009_05648142, "atomic.b.xchg.untyped.1d.u64.1.uniform.base1 r2.y, r1.y, r0.x"), /* Custom test since we've never seen the blob emit these. */ INSTR_6XX(c0260004_00490000, "getspid.u32 r1.x"), diff --git a/src/freedreno/isa/ir3-cat6.xml b/src/freedreno/isa/ir3-cat6.xml index 5ce35003c21..e399ae7dc0f 100644 --- a/src/freedreno/isa/ir3-cat6.xml +++ b/src/freedreno/isa/ir3-cat6.xml @@ -679,7 +679,7 @@ SOFTWARE. 11101 - + Base for atomic instructions (I think mostly a4xx+, as a3xx didn't have real image/ssbo.. it was all just global). @@ -724,6 +724,7 @@ SOFTWARE. 1 00000000 00000000 + 0 0 @@ -795,6 +796,7 @@ SOFTWARE. + 1 @@ -938,6 +940,7 @@ SOFTWARE. 1 00000000 00000000 + 1 0 @@ -1206,7 +1209,6 @@ SOFTWARE. - src src->cat6.d - 1 @@ -1225,6 +1227,7 @@ SOFTWARE. + @@ -1245,6 +1248,13 @@ SOFTWARE. + + + + {SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE}.{MODE}{BASE} {SRC1}, {SRC2}, {SSBO} + + + STore IBo @@ -1266,19 +1276,19 @@ SOFTWARE. - + x 010000 11 - + x 010001 11 - + x 010010 11 @@ -1286,37 +1296,37 @@ SOFTWARE. - + x 010101 11 - + x 010110 11 - + x 010111 11 - + x 011000 11 - + x 011001 11 - + x 011010 11 diff --git a/src/freedreno/isa/ir3-common.xml b/src/freedreno/isa/ir3-common.xml index 05b5ff4fc28..38777526012 100644 --- a/src/freedreno/isa/ir3-common.xml +++ b/src/freedreno/isa/ir3-common.xml @@ -320,6 +320,17 @@ SOFTWARE. ({TYPE} == 6) /* u8 */ + + + + + + + + + + +