From 99908c8d6d64299b6eed4b01b9601eb2f618255a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 21 Dec 2020 10:59:15 -0800 Subject: [PATCH] freedreno/ir3/parser: Add initial cat6 IBO instructions Well, really just resinfo.. dealing with the different ldib/stib syntax for a6xx+ vs earlier seems a bit too painful to deal with. But resinfo at least gives us some encoding test coverage of this group of instrs. Signed-off-by: Rob Clark Part-of: --- src/freedreno/ir3/ir3_lexer.l | 6 +++++- src/freedreno/ir3/ir3_parser.y | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index 0cc55287567..7955dcd79a4 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -301,7 +301,7 @@ static int parse_w(const char *str) "ldlw" return TOKEN(T_OP_LDLW); "stlw" return TOKEN(T_OP_STLW); "resfmt" return TOKEN(T_OP_RESFMT); -"resinf" return TOKEN(T_OP_RESINF); +"resinfo" return TOKEN(T_OP_RESINFO); "atomic.add" return TOKEN(T_OP_ATOMIC_ADD); "atomic.sub" return TOKEN(T_OP_ATOMIC_SUB); "atomic.xchg" return TOKEN(T_OP_ATOMIC_XCHG); @@ -351,6 +351,10 @@ static int parse_w(const char *str) "s2en" return TOKEN(T_S2EN); "s" return 's'; "base"[0-9]+ ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_BASE; +"offset"[0-9]+ ir3_yylval.num = strtol(yytext+6, NULL, 10); return T_OFFSET; +"uniform" return T_UNIFORM; +"nonuniform" return T_NONUNIFORM; +"imm" return T_IMM; "h(" return TOKEN(T_HP); "=" return '='; diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index a4abe177451..4c7bac5a614 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -478,7 +478,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_OP_LDLW %token T_OP_STLW %token T_OP_RESFMT -%token T_OP_RESINF +%token T_OP_RESINFO %token T_OP_ATOMIC_ADD %token T_OP_ATOMIC_SUB %token T_OP_ATOMIC_XCHG @@ -528,6 +528,10 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_SAMP %token T_TEX %token T_BASE +%token T_OFFSET +%token T_UNIFORM +%token T_NONUNIFORM +%token T_IMM %token T_NAN %token T_INF @@ -932,10 +936,27 @@ cat6_id_opc: cat6_id: cat6_id_opc cat6_type dst_reg +/* TODO adding support for both pre and post a6xx versions of ldib/stib/etc + * is going to be tricky. Maybe we end up needing to cpp preprocess the + * parser and generate multiple versions? For now, punt. + */ +cat6_bindless_ibo_opc: T_OP_RESINFO { new_instr(OPC_RESINFO); } + +cat6_bindless_base: +| '.' T_BASE { instr->flags |= IR3_INSTR_B; instr->cat6.base = $2; } + +cat6_bindless_mode: T_IMM cat6_bindless_base +| T_UNIFORM cat6_bindless_base +| T_NONUNIFORM cat6_bindless_base + +cat6_reg_or_immed: reg +| integer { new_reg(0, IR3_REG_IMMED)->iim_val = $1; } + +cat6_bindless_ibo: cat6_bindless_ibo_opc cat6_typed cat6_dim cat6_type '.' cat6_immed '.' cat6_bindless_mode dst_reg ',' cat6_reg_or_immed + cat6_todo: T_OP_G2L { new_instr(OPC_G2L); } | T_OP_L2G { new_instr(OPC_L2G); } | T_OP_RESFMT { new_instr(OPC_RESFMT); } -| T_OP_RESINF { new_instr(OPC_RESINFO); } | T_OP_LDGB { new_instr(OPC_LDGB); } | T_OP_STGB { new_instr(OPC_STGB); } | T_OP_LDC { new_instr(OPC_LDC); } @@ -946,6 +967,7 @@ cat6_instr: cat6_load | cat6_prefetch | cat6_atomic | cat6_id +| cat6_bindless_ibo | cat6_todo reg: T_REGISTER { $$ = new_reg($1, 0); }