ir3: Add cat1 (sat) bit

Appears to be present at least as far back as gen7.

Signed-off-by: Rob Clark <rob.clark@oss.qualcomm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38450>
This commit is contained in:
Rob Clark
2025-10-24 13:43:28 -07:00
committed by Marge Bot
parent 69e0536203
commit 1c7c4b4807
5 changed files with 16 additions and 10 deletions
+1
View File
@@ -446,6 +446,7 @@ struct ir3_instruction {
type_t src_type, dst_type;
round_t round;
reduce_op_t reduce_op;
bool sat;
} cat1;
struct {
enum {
+1
View File
@@ -1304,6 +1304,7 @@ const: T_CONSTANT { $$ = new_src($1, IR3_REG_CONST); }
dst_reg_flag: T_EVEN { instr->cat1.round = ROUND_EVEN; }
| T_POS_INFINITY { instr->cat1.round = ROUND_POS_INF; }
| T_NEG_INFINITY { instr->cat1.round = ROUND_NEG_INF; }
| T_SAT { instr->cat1.sat = true; }
| T_EI { rflags.flags |= IR3_REG_EI; }
| T_WRMASK { rflags.wrmask = $1; }
+2
View File
@@ -441,6 +441,8 @@ print_instr(struct log_stream *stream, struct ir3_instruction *instr, int lvl)
}
if (opc_cat(instr->opc) == 1) {
if (instr->cat1.sat)
mesa_log_stream_printf(stream, "(sat)");
switch (instr->cat1.round) {
case ROUND_ZERO:
break;
+1
View File
@@ -100,6 +100,7 @@ static const struct test {
INSTR_7XX(200440c0_ae800004, "movs.f32f32 r48.x, r1.x, 93"),
INSTR_7XX(201100c0_c000040b, "movs.s16s16 hr48.x, (last)hr2.w, a0.x"),
INSTR_7XX(201504c0_000000c0, "cov.s32s16 (sat)hr48.x, r48.x"),
/* cat2 */
INSTR_6XX(40104002_0c210001, "add.f hr0.z, r0.y, c<a0.x + 33>"),
+11 -10
View File
@@ -68,7 +68,7 @@ SOFTWARE.
</enum>
<bitset name="#instruction-cat1" extends="#instruction">
<pattern pos="42">0</pattern>
<field name="DM" pos="42" type="bool" display="(sat)"/>
<field name="SS" pos="44" type="bool" display="(ss)"/>
<field name="UL" pos="45" type="bool" display="(ul)"/>
<field name="ROUND" low="55" high="56" type="#round"/>
@@ -81,6 +81,7 @@ SOFTWARE.
<map name="UL">!!(src->flags &amp; IR3_INSTR_UL)</map>
<map name="DST_REL">!!(src->dsts[0]->flags &amp; IR3_REG_RELATIV)</map>
<map name="ROUND">src->cat1.round</map>
<map name="DM">src->cat1.sat</map>
</encode>
</bitset>
@@ -118,7 +119,7 @@ SOFTWARE.
({DST} == 0xf4 /* a0.x */) &amp;&amp; ({SRC_TYPE} == 4 /* s16 */) &amp;&amp; ({DST_TYPE} == 4)
</expr>
<display>
{SY}{SS}{JP}{REPEAT}{UL}mova {ROUND}a0.x, {SRC_R}{SRC}
{SY}{SS}{JP}{REPEAT}{UL}mova {ROUND}{DM}a0.x, {SRC_R}{SRC}
</display>
<assert low="32" high="39">11110100</assert> <!-- DST==a0.x -->
<assert low="46" high="48">100</assert> <!-- DST_TYPE==s16 -->
@@ -129,7 +130,7 @@ SOFTWARE.
({DST} == 0xf5 /* a0.y */) &amp;&amp; ({SRC_TYPE} == 2 /* u16 */) &amp;&amp; ({DST_TYPE} == 2)
</expr>
<display>
{SY}{SS}{JP}{REPEAT}{UL}mova1 {ROUND}a1.x, {SRC_R}{SRC}
{SY}{SS}{JP}{REPEAT}{UL}mova1 {ROUND}{DM}a1.x, {SRC_R}{SRC}
</display>
<assert low="32" high="39">11110101</assert> <!-- DST==a0.y -->
<assert low="46" high="48">010</assert> <!-- DST_TYPE==u16 -->
@@ -140,11 +141,11 @@ SOFTWARE.
{SRC_TYPE} != {DST_TYPE}
</expr>
<display>
{SY}{SS}{JP}{REPEAT}{UL}cov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}
{SY}{SS}{JP}{REPEAT}{UL}cov.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST_HALF}{DST}, {SRC}
</display>
</override>
<display>
{SY}{SS}{JP}{REPEAT}{UL}mov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}
{SY}{SS}{JP}{REPEAT}{UL}mov.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST_HALF}{DST}, {SRC}
</display>
<field name="DST" low="32" high="39" type="#cat1-dst">
<param name="DST_REL"/>
@@ -316,7 +317,7 @@ SOFTWARE.
<bitset name="movs-immed" extends="#instruction-cat1-movs">
<display>
{SY}{SS}{JP}{REPEAT}{UL}movs.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}, {INVOCATION}
{SY}{SS}{JP}{REPEAT}{UL}movs.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST_HALF}{DST}, {SRC}, {INVOCATION}
</display>
<field name="INVOCATION" low="23" high="29" type="uint"/>
@@ -329,7 +330,7 @@ SOFTWARE.
<bitset name="movs-a0" extends="#instruction-cat1-movs">
<display>
{SY}{SS}{JP}{REPEAT}{UL}movs.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}, a0.x
{SY}{SS}{JP}{REPEAT}{UL}movs.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST_HALF}{DST}, {SRC}, a0.x
</display>
<pattern low="23" high="29">0000000</pattern>
@@ -419,7 +420,7 @@ SOFTWARE.
particular this can be used to swap two registers.
</doc>
<display>
{SY}{SS}{JP}{UL}swz.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {DST1}, {SRC0}, {SRC1}
{SY}{SS}{JP}{UL}swz.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST0}, {DST1}, {SRC0}, {SRC1}
</display>
<field name="SRC1" low="8" high="15" type="#cat1-multi-src">
<param name="HALF"/>
@@ -443,7 +444,7 @@ SOFTWARE.
GATher. Move SRC0 to DST0, SRC1 to DST0 + 1, SRC2 to DST0 + 2, and SRC3 to DST0 + 3.
</doc>
<display>
{SY}{SS}{JP}{UL}gat.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {SRC0}, {SRC1}, {SRC2}, {SRC3}
{SY}{SS}{JP}{UL}gat.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST0}, {SRC0}, {SRC1}, {SRC2}, {SRC3}
</display>
<field name="SRC1" low="8" high="15" type="#cat1-multi-src">
<param name="HALF"/>
@@ -469,7 +470,7 @@ SOFTWARE.
SCaTter. Move SRC0 to DST0, SRC0 + 1 to DST1, SRC0 + 2 to DST2 + 3, and SRC0 + 3 to DST3.
</doc>
<display>
{SY}{SS}{JP}{UL}sct.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {DST1}, {DST2}, {DST3}, {SRC0}
{SY}{SS}{JP}{UL}sct.{SRC_TYPE}{DST_TYPE} {ROUND}{DM}{DST0}, {DST1}, {DST2}, {DST3}, {SRC0}
</display>
<field name="DST1" low="8" high="15" type="#cat1-multi-dst">
<param name="DST_HALF"/>