diff --git a/src/freedreno/ir3/disasm-a3xx.c b/src/freedreno/ir3/disasm-a3xx.c index 89424b2b650..3044fe145de 100644 --- a/src/freedreno/ir3/disasm-a3xx.c +++ b/src/freedreno/ir3/disasm-a3xx.c @@ -146,9 +146,6 @@ print_stats(struct disasm_ctx *ctx) ctx->stats->sy); } -/* size of largest OPC field of all the instruction categories: */ -#define NOPC_BITS 6 - static const struct opc_info { const char *name; } opcs[1 << (3 + NOPC_BITS)] = { diff --git a/src/freedreno/ir3/instr-a3xx.h b/src/freedreno/ir3/instr-a3xx.h index fca65c41df3..9e708694076 100644 --- a/src/freedreno/ir3/instr-a3xx.h +++ b/src/freedreno/ir3/instr-a3xx.h @@ -51,7 +51,7 @@ void ir3_assert_handler(const char *expr, const char *file, int line, } \ } while (0) /* size of largest OPC field of all the instruction categories: */ -#define NOPC_BITS 6 +#define NOPC_BITS 7 #define _OPC(cat, opc) (((cat) << NOPC_BITS) | opc) @@ -178,6 +178,7 @@ typedef enum { OPC_CBITS_B = _OPC(2, 61), OPC_SHB = _OPC(2, 62), OPC_MSAD = _OPC(2, 63), + OPC_FLAT_B = _OPC(2, 64), /* category 3: */ OPC_MAD_U16 = _OPC(3, 0), diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index 2d5582e5bda..6b9ecab8f5a 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -228,6 +228,7 @@ static int parse_w(const char *str) "shr.b" return TOKEN(T_OP_SHR_B); "ashr.b" return TOKEN(T_OP_ASHR_B); "bary.f" return TOKEN(T_OP_BARY_F); +"flat.b" return TOKEN(T_OP_FLAT_B); "mgen.b" return TOKEN(T_OP_MGEN_B); "getbit.b" return TOKEN(T_OP_GETBIT_B); "setrm" return TOKEN(T_OP_SETRM); diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 63f1cccd946..450e7b267d6 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -458,6 +458,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_OP_SHR_B %token T_OP_ASHR_B %token T_OP_BARY_F +%token T_OP_FLAT_B %token T_OP_MGEN_B %token T_OP_GETBIT_B %token T_OP_SETRM @@ -893,6 +894,7 @@ cat2_opc_2src: T_OP_ADD_F { new_instr(OPC_ADD_F); } | T_OP_SHR_B { new_instr(OPC_SHR_B); } | T_OP_ASHR_B { new_instr(OPC_ASHR_B); } | T_OP_BARY_F { new_instr(OPC_BARY_F); } +| T_OP_FLAT_B { new_instr(OPC_FLAT_B); } | T_OP_MGEN_B { new_instr(OPC_MGEN_B); } | T_OP_GETBIT_B { new_instr(OPC_GETBIT_B); } | T_OP_SHB { new_instr(OPC_SHB); } diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index 320cd618095..0be470cf80d 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -103,6 +103,7 @@ static const struct test { INSTR_6XX(40104002_0c210001, "add.f hr0.z, r0.y, c"), INSTR_6XX(40b80804_10408004, "(nop3) cmps.f.lt r1.x, (abs)r1.x, c16.x"), INSTR_6XX(47308a02_00002000, "(rpt2)bary.f (ei)r0.z, (r)0, r0.x"), + INSTR_6XX(47348000_00002000, "flat.b (ei)r0.x, 0, r0.x"), INSTR_6XX(43480801_00008001, "(nop3) absneg.s hr0.y, (abs)hr0.y"), INSTR_6XX(50600004_2c010004, "(sy)mul.f hr1.x, hr1.x, h(0.5)"), INSTR_6XX(42280807_27ff0000, "(nop3) add.s hr1.w, hr0.x, h(-1)"), diff --git a/src/freedreno/isa/ir3-cat2.xml b/src/freedreno/isa/ir3-cat2.xml index 204d641cbc3..ed7ac69d5ca 100644 --- a/src/freedreno/isa/ir3-cat2.xml +++ b/src/freedreno/isa/ir3-cat2.xml @@ -157,6 +157,32 @@ SOFTWARE. + + + {SY}{SS}{JP}{SAT}{REPEAT}{UL}{NAME} {EI}{DST_HALF}{DST}, {SRC1}, {SRC2} + + + + + + + + + + + xx + 111001 + + + + 0 + + + + 1 + + + 000000 @@ -313,10 +339,6 @@ SOFTWARE. 111000 - - 111001 - - 111010