diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 65734ea1d13..28596825b34 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -435,6 +435,7 @@ struct ir3_instruction { unsigned g : 1; /* global */ ir3_alias_scope alias_scope; + unsigned alias_table_size_minus_one; bool alias_type_float; } cat7; /* for meta-instructions, just used to hold extra data diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index d457d0de6dc..ca823f9ea64 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -1459,6 +1459,8 @@ cat7_alias_float_type: T_TYPE_F16 cat7_alias_type: cat7_alias_int_type | cat7_alias_float_type { instr->cat7.alias_type_float = true; } +cat7_alias_table_size_minus_one: T_INT { instr->cat7.alias_table_size_minus_one = $1; } + cat7_instr: cat7_barrier | cat7_data_cache | T_OP_SLEEP { new_instr(OPC_SLEEP); } @@ -1468,9 +1470,7 @@ cat7_instr: cat7_barrier | T_OP_UNLOCK { new_instr(OPC_UNLOCK); } | T_OP_ALIAS { new_instr(OPC_ALIAS); - } '.' cat7_alias_scope '.' cat7_alias_type '.' integer dst_reg ',' cat7_alias_src { - new_src(0, IR3_REG_IMMED)->uim_val = $8; - } + } '.' cat7_alias_scope '.' cat7_alias_type '.' cat7_alias_table_size_minus_one dst_reg ',' cat7_alias_src raw_instr: T_RAW {new_instr(OPC_META_RAW)->raw.value = $1;} diff --git a/src/freedreno/isa/ir3-cat7.xml b/src/freedreno/isa/ir3-cat7.xml index 368e09cb218..75be2f92cbd 100644 --- a/src/freedreno/isa/ir3-cat7.xml +++ b/src/freedreno/isa/ir3-cat7.xml @@ -306,10 +306,14 @@ SOFTWARE. Notice the lack of nops between alias and the instruction that uses it. + + In this case, the size of the table is bounded (max 16 entries) + and the number of entries in the table is indicated by + the first alias instruction in the TABLE_SIZE_MINUS_ONE field. - {SY}{SS}{JP}{NAME}.{SCOPE}.{TYPE}{TYPE_SIZE}.{UNK} {DST_HALF}{DST}, {SRC} + {SY}{SS}{JP}{NAME}.{SCOPE}.{TYPE}{TYPE_SIZE}.{TABLE_SIZE_MINUS_ONE} {DST_HALF}{DST}, {SRC} @@ -332,7 +336,7 @@ SOFTWARE. - + xx @@ -354,7 +358,7 @@ SOFTWARE. src->srcs[0] (src->srcs[0]->flags & IR3_REG_CONST) ? 1 : ((src->srcs[0]->flags & IR3_REG_IMMED) ? 2 : 0) - extract_reg_uim(src->srcs[1]) + src->cat7.alias_table_size_minus_one (src->srcs[0]->flags & IR3_REG_HALF) ? 0 : 1 src->cat7.alias_scope & 0x1 src->cat7.alias_scope >> 1