/* dst register flags */
%token <tok> T_EVEN
%token <tok> T_POS_INFINITY
+%token <tok> T_NEG_INFINITY
%token <tok> T_EI
%token <num> T_WRMASK
const: T_CONSTANT { $$ = new_reg($1, IR3_REG_CONST); }
-dst_reg_flag: T_EVEN { rflags.flags |= IR3_REG_EVEN; }
-| T_POS_INFINITY { rflags.flags |= IR3_REG_POS_INF; }
+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_EI { rflags.flags |= IR3_REG_EI; }
| T_WRMASK { rflags.wrmask = $1; }
</encode>
</bitset>
+<enum name="#round">
+ <value val="0" display=""/>
+ <value val="1" display="(even)"/>
+ <value val="2" display="(pos_infinity)"/>
+ <value val="3" display="(neg_infinity)"/>
+</enum>
+
<bitset name="#instruction-cat1" extends="#instruction">
<field name="DST" low="32" high="39" type="#cat1-dst">
<param name="DST_REL"/>
</field>
- <field name="REPEAT" low="40" high="42" type="#rptN"/>
+ <field name="REPEAT" low="40" high="41" type="#rptN"/>
+ <pattern pos="42">0</pattern>
<field name="SS" pos="44" type="bool" display="(ss)"/>
<field name="UL" pos="45" type="bool" display="(ul)"/>
<field name="DST_REL" pos="49" type="bool"/>
- <field name="EVEN" pos="55" type="bool" display="(even)"/>
- <field name="POS_INF" pos="56" type="bool" display="(pos_infinity)"/>
+ <field name="ROUND" low="55" high="56" type="#round"/>
<field name="JP" pos="59" type="bool" display="(jp)"/>
<field name="SY" pos="60" type="bool" display="(sy)"/>
<pattern low="61" high="63">001</pattern> <!-- cat1 -->
<map name="DST_TYPE">src->cat1.dst_type</map>
<map name="DST_REL">!!(src->regs[0]->flags & IR3_REG_RELATIV)</map>
<map name="SRC_TYPE">src->cat1.src_type</map>
- <map name="EVEN">!!(src->regs[0]->flags & IR3_REG_EVEN)</map>
- <map name="POS_INF">!!(src->regs[0]->flags & IR3_REG_POS_INF)</map>
+ <map name="ROUND">src->cat1.round</map>
</encode>
</bitset>
({DST} == 0xf4 /* a0.x */) && ({SRC_TYPE} == 4 /* s16 */) && ({DST_TYPE} == 4)
</expr>
<display>
- {SY}{SS}{JP}{REPEAT}{UL}mova {EVEN}{POS_INF}a0.x, {SRC}
+ {SY}{SS}{JP}{REPEAT}{UL}mova {ROUND}a0.x, {SRC}
</display>
<assert low="32" high="39">11110100</assert> <!-- DST==a0.x -->
<assert low="46" high="48">100</assert> <!-- DST_TYPE==s16 -->
({DST} == 0xf5 /* a0.y */) && ({SRC_TYPE} == 2 /* u16 */) && ({DST_TYPE} == 2)
</expr>
<display>
- {SY}{SS}{JP}{REPEAT}{UL}mova1 {EVEN}{POS_INF}a1.x, {SRC}
+ {SY}{SS}{JP}{REPEAT}{UL}mova1 {ROUND}a1.x, {SRC}
</display>
<assert low="32" high="39">11110101</assert> <!-- DST==a0.y -->
<assert low="46" high="48">010</assert> <!-- DST_TYPE==u16 -->
{SRC_TYPE} != {DST_TYPE}
</expr>
<display>
- {SY}{SS}{JP}{REPEAT}{UL}cov.{SRC_TYPE}{DST_TYPE} {EVEN}{POS_INF}{DST_HALF}{DST}, {SRC}
+ {SY}{SS}{JP}{REPEAT}{UL}cov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}
</display>
</override>
<display>
- {SY}{SS}{JP}{REPEAT}{UL}mov.{SRC_TYPE}{DST_TYPE} {EVEN}{POS_INF}{DST_HALF}{DST}, {SRC}
+ {SY}{SS}{JP}{REPEAT}{UL}mov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC}
</display>
<pattern low="57" high="58">00</pattern> <!-- OPC -->
<derived name="HALF" type="bool" display="h">