17ec681f3Smrg<?xml version="1.0" encoding="UTF-8"?>
27ec681f3Smrg<!--
37ec681f3SmrgCopyright © 2020 Google, Inc.
47ec681f3Smrg
57ec681f3SmrgPermission is hereby granted, free of charge, to any person obtaining a
67ec681f3Smrgcopy of this software and associated documentation files (the "Software"),
77ec681f3Smrgto deal in the Software without restriction, including without limitation
87ec681f3Smrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
97ec681f3Smrgand/or sell copies of the Software, and to permit persons to whom the
107ec681f3SmrgSoftware is furnished to do so, subject to the following conditions:
117ec681f3Smrg
127ec681f3SmrgThe above copyright notice and this permission notice (including the next
137ec681f3Smrgparagraph) shall be included in all copies or substantial portions of the
147ec681f3SmrgSoftware.
157ec681f3Smrg
167ec681f3SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177ec681f3SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
187ec681f3SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
197ec681f3SmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
207ec681f3SmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
217ec681f3SmrgOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
227ec681f3SmrgSOFTWARE.
237ec681f3Smrg -->
247ec681f3Smrg
257ec681f3Smrg<isa>
267ec681f3Smrg
277ec681f3Smrg<!--
287ec681f3Smrg	Helpers for cat2/cat3 nop encoding, which re-uses the SRC1_R/SRC2_R
297ec681f3Smrg	fields to encode a # of nop delay slots following the instruction.
307ec681f3Smrg -->
317ec681f3Smrg
327ec681f3Smrg<expr name="#cat2-cat3-nop-encoding">
337ec681f3Smrg	(({SRC1_R} != 0) || ({SRC2_R} != 0)) &amp;&amp; ({REPEAT} == 0)
347ec681f3Smrg</expr>
357ec681f3Smrg
367ec681f3Smrg<expr name="#cat2-cat3-nop-value">
377ec681f3Smrg	{SRC1_R} | ({SRC2_R} &lt;&lt; 1)
387ec681f3Smrg</expr>
397ec681f3Smrg
407ec681f3Smrg<!--
417ec681f3Smrg	Source/Dest gpr encoding.  In the gpr case, this handles the special
427ec681f3Smrg	cases (p0.x/a0.x)
437ec681f3Smrg -->
447ec681f3Smrg
457ec681f3Smrg<expr name="#reg-gpr-a0">
467ec681f3Smrg	{GPR} == 61 /* a0.* */
477ec681f3Smrg</expr>
487ec681f3Smrg
497ec681f3Smrg<expr name="#reg-gpr-p0">
507ec681f3Smrg	{GPR} == 62 /* p0.x */
517ec681f3Smrg</expr>
527ec681f3Smrg
537ec681f3Smrg<bitset name="#reg-gpr" size="8">
547ec681f3Smrg	<override expr="#reg-gpr-a0">
557ec681f3Smrg		<display>
567ec681f3Smrg			a0.{SWIZ}
577ec681f3Smrg		</display>
587ec681f3Smrg		<assert low="2" high="7">111101</assert>
597ec681f3Smrg	</override>
607ec681f3Smrg	<override expr="#reg-gpr-p0">
617ec681f3Smrg		<display>
627ec681f3Smrg			p0.{SWIZ}
637ec681f3Smrg		</display>
647ec681f3Smrg		<assert low="2" high="7">111110</assert>
657ec681f3Smrg	</override>
667ec681f3Smrg	<display>
677ec681f3Smrg		r{GPR}.{SWIZ}
687ec681f3Smrg	</display>
697ec681f3Smrg	<field name="SWIZ" low="0" high="1" type="#swiz"/>
707ec681f3Smrg	<field name="GPR" low="2"  high="7" type="uint"/>
717ec681f3Smrg	<encode type="struct ir3_register *">
727ec681f3Smrg		<map name="GPR">src->num >> 2</map>
737ec681f3Smrg		<map name="SWIZ">src->num &amp; 0x3</map>
747ec681f3Smrg	</encode>
757ec681f3Smrg</bitset>
767ec681f3Smrg
777ec681f3Smrg<bitset name="#reg-const" size="11">
787ec681f3Smrg	<display>
797ec681f3Smrg		c{CONST}.{SWIZ}
807ec681f3Smrg	</display>
817ec681f3Smrg	<field name="SWIZ" low="0" high="1" type="#swiz"/>
827ec681f3Smrg	<field name="CONST" low="2" high="10" type="uint"/>
837ec681f3Smrg	<encode type="struct ir3_register *">
847ec681f3Smrg		<map name="CONST">src->num >> 2</map>
857ec681f3Smrg		<map name="SWIZ">src->num &amp; 0x3</map>
867ec681f3Smrg	</encode>
877ec681f3Smrg</bitset>
887ec681f3Smrg
897ec681f3Smrg<expr name="#offset-zero">
907ec681f3Smrg	{OFFSET} == 0
917ec681f3Smrg</expr>
927ec681f3Smrg
937ec681f3Smrg<bitset name="#reg-relative-gpr" size="10">
947ec681f3Smrg	<override expr="#offset-zero">
957ec681f3Smrg		<display>
967ec681f3Smrg			r&lt;a0.x&gt;
977ec681f3Smrg		</display>
987ec681f3Smrg	</override>
997ec681f3Smrg	<display>
1007ec681f3Smrg		r&lt;a0.x + {OFFSET}&gt;
1017ec681f3Smrg	</display>
1027ec681f3Smrg	<field name="OFFSET" low="0" high="9" type="int"/>
1037ec681f3Smrg	<encode type="struct ir3_register *">
1047ec681f3Smrg		<map name="OFFSET">src->array.offset</map>
1057ec681f3Smrg	</encode>
1067ec681f3Smrg</bitset>
1077ec681f3Smrg
1087ec681f3Smrg<bitset name="#reg-relative-const" size="10">
1097ec681f3Smrg	<override expr="#offset-zero">
1107ec681f3Smrg		<display>
1117ec681f3Smrg			c&lt;a0.x&gt;
1127ec681f3Smrg		</display>
1137ec681f3Smrg	</override>
1147ec681f3Smrg	<display>
1157ec681f3Smrg		c&lt;a0.x + {OFFSET}&gt;
1167ec681f3Smrg	</display>
1177ec681f3Smrg	<field name="OFFSET" low="0" high="9" type="int"/>
1187ec681f3Smrg	<encode type="struct ir3_register *">
1197ec681f3Smrg		<map name="OFFSET">src->array.offset</map>
1207ec681f3Smrg	</encode>
1217ec681f3Smrg</bitset>
1227ec681f3Smrg
1237ec681f3Smrg<!--
1247ec681f3Smrg	Source Register encoding, used in cat2 and cat4 where a src can be
1257ec681f3Smrg	either gpr/const/relative
1267ec681f3Smrg -->
1277ec681f3Smrg
1287ec681f3Smrg<bitset name="#multisrc" size="16">
1297ec681f3Smrg	<doc>
1307ec681f3Smrg		Encoding for instruction source which can be GPR/CONST/IMMED
1317ec681f3Smrg		or relative GPR/CONST.
1327ec681f3Smrg	</doc>
1337ec681f3Smrg	<encode type="struct ir3_register *" case-prefix="REG_">
1347ec681f3Smrg		<map name="ABSNEG">extract_ABSNEG(src)</map>
1357ec681f3Smrg		<map name="SRC">src</map>
1367ec681f3Smrg	</encode>
1377ec681f3Smrg</bitset>
1387ec681f3Smrg
1397ec681f3Smrg<bitset name="#mulitsrc-immed" extends="#multisrc">
1407ec681f3Smrg	<override expr="#multisrc-half">
1417ec681f3Smrg		<display>
1427ec681f3Smrg			{ABSNEG}{SRC_R}h({IMMED})
1437ec681f3Smrg		</display>
1447ec681f3Smrg	</override>
1457ec681f3Smrg	<display>
1467ec681f3Smrg		{ABSNEG}{SRC_R}{IMMED}
1477ec681f3Smrg	</display>
1487ec681f3Smrg	<field name="IMMED" low="0"  high="10" type="int"/>
1497ec681f3Smrg	<pattern low="11" high="13">100</pattern>
1507ec681f3Smrg	<field name="ABSNEG" low="14" high="15" type="#absneg"/>
1517ec681f3Smrg	<encode>
1527ec681f3Smrg		<map name="IMMED">src->uim_val</map>
1537ec681f3Smrg	</encode>
1547ec681f3Smrg</bitset>
1557ec681f3Smrg
1567ec681f3Smrg<bitset name="#mulitsrc-immed-flut" extends="#multisrc">
1577ec681f3Smrg	<doc>
1587ec681f3Smrg		Immediate with int->float lookup table:
1597ec681f3Smrg
1607ec681f3Smrg			0  -> 0.0
1617ec681f3Smrg			1  -> 0.5
1627ec681f3Smrg			2  -> 1.0
1637ec681f3Smrg			3  -> 2.0
1647ec681f3Smrg			4  -> e
1657ec681f3Smrg			5  -> pi
1667ec681f3Smrg			6  -> 1/pi
1677ec681f3Smrg			7  -> 1/log2(e)
1687ec681f3Smrg			8  -> log2(e)
1697ec681f3Smrg			9  -> 1/log2(10)
1707ec681f3Smrg			10 -> log2(10)
1717ec681f3Smrg			11 -> 4.0
1727ec681f3Smrg
1737ec681f3Smrg	</doc>
1747ec681f3Smrg	<field name="IMMED" low="0"  high="9" type="#flut"/>
1757ec681f3Smrg	<pattern low="11" high="13">101</pattern>
1767ec681f3Smrg	<field name="ABSNEG" low="14" high="15" type="#absneg"/>
1777ec681f3Smrg	<encode>
1787ec681f3Smrg		<map name="IMMED">src->uim_val</map>
1797ec681f3Smrg	</encode>
1807ec681f3Smrg</bitset>
1817ec681f3Smrg
1827ec681f3Smrg<bitset name="#multisrc-immed-flut-full" extends="#mulitsrc-immed-flut">
1837ec681f3Smrg	<display>
1847ec681f3Smrg		{ABSNEG}{SRC_R}{IMMED}
1857ec681f3Smrg	</display>
1867ec681f3Smrg	<pattern pos="10">0</pattern>
1877ec681f3Smrg</bitset>
1887ec681f3Smrg
1897ec681f3Smrg<bitset name="#multisrc-immed-flut-half" extends="#mulitsrc-immed-flut">
1907ec681f3Smrg	<display>
1917ec681f3Smrg		{ABSNEG}{SRC_R}h{IMMED}
1927ec681f3Smrg	</display>
1937ec681f3Smrg	<pattern pos="10">1</pattern>
1947ec681f3Smrg</bitset>
1957ec681f3Smrg
1967ec681f3Smrg<expr name="#multisrc-half">
1977ec681f3Smrg	!{FULL}
1987ec681f3Smrg</expr>
1997ec681f3Smrg
2007ec681f3Smrg<bitset name="#multisrc-gpr" extends="#multisrc">
2017ec681f3Smrg	<display>
2027ec681f3Smrg		{ABSNEG}{SRC_R}{HALF}{SRC}
2037ec681f3Smrg	</display>
2047ec681f3Smrg	<derived name="HALF" expr="#multisrc-half" type="bool" display="h"/>
2057ec681f3Smrg	<field name="SRC" low="0" high="7" type="#reg-gpr"/>
2067ec681f3Smrg	<pattern low="8" high="13">000000</pattern>
2077ec681f3Smrg	<field name="ABSNEG" low="14" high="15" type="#absneg"/>
2087ec681f3Smrg</bitset>
2097ec681f3Smrg
2107ec681f3Smrg<bitset name="#multisrc-const" extends="#multisrc">
2117ec681f3Smrg	<display>
2127ec681f3Smrg		{ABSNEG}{SRC_R}{HALF}{SRC}
2137ec681f3Smrg	</display>
2147ec681f3Smrg	<derived name="HALF" expr="#multisrc-half" type="bool" display="h"/>
2157ec681f3Smrg	<field name="SRC" low="0" high="10" type="#reg-const"/>
2167ec681f3Smrg	<pattern low="11" high="13">x10</pattern>
2177ec681f3Smrg	<field name="ABSNEG" low="14" high="15" type="#absneg"/>
2187ec681f3Smrg</bitset>
2197ec681f3Smrg
2207ec681f3Smrg<bitset name="#multisrc-relative" extends="#multisrc">
2217ec681f3Smrg	<pattern low="11" high="13">001</pattern>
2227ec681f3Smrg	<field name="ABSNEG" low="14" high="15" type="#absneg"/>
2237ec681f3Smrg</bitset>
2247ec681f3Smrg
2257ec681f3Smrg<bitset name="#multisrc-relative-gpr" extends="#multisrc-relative">
2267ec681f3Smrg	<display>
2277ec681f3Smrg		{ABSNEG}{SRC_R}{HALF}{SRC}
2287ec681f3Smrg	</display>
2297ec681f3Smrg	<derived name="HALF" expr="#multisrc-half" type="bool" display="h"/>
2307ec681f3Smrg	<field name="SRC" low="0" high="9" type="#reg-relative-gpr"/>
2317ec681f3Smrg	<pattern pos="10">0</pattern>
2327ec681f3Smrg</bitset>
2337ec681f3Smrg
2347ec681f3Smrg<bitset name="#multisrc-relative-const" extends="#multisrc-relative">
2357ec681f3Smrg	<display>
2367ec681f3Smrg		{ABSNEG}{SRC_R}{HALF}{SRC}
2377ec681f3Smrg	</display>
2387ec681f3Smrg	<derived name="HALF" expr="#multisrc-half" type="bool" display="h"/>
2397ec681f3Smrg	<field name="SRC" low="0" high="9" type="#reg-relative-const"/>
2407ec681f3Smrg	<pattern pos="10">1</pattern>
2417ec681f3Smrg</bitset>
2427ec681f3Smrg
2437ec681f3Smrg<!--
2447ec681f3Smrg	For cat2/cat4, the dst reg is full precision if {FULL} == {DEST_CONV}
2457ec681f3Smrg	In addition, for cat2 instructions that can write p0.x (cmps.*, and.b,
2467ec681f3Smrg	xor.b, etc), p0.x is never half (DEST_CONV is ignored)
2477ec681f3Smrg -->
2487ec681f3Smrg<expr name="#dest-half">
2497ec681f3Smrg	({FULL} == {DST_CONV}) &amp;&amp; ({DST} &lt;= 0xf7 /* p0.x */)
2507ec681f3Smrg</expr>
2517ec681f3Smrg
2527ec681f3Smrg<expr name="#true">
2537ec681f3Smrg	1
2547ec681f3Smrg</expr>
2557ec681f3Smrg
2567ec681f3Smrg<expr name="#false">
2577ec681f3Smrg	0
2587ec681f3Smrg</expr>
2597ec681f3Smrg
2607ec681f3Smrg<!-- These make #true/#false a bit redundant, but I guess keep them for clarity -->
2617ec681f3Smrg<expr name="#zero">
2627ec681f3Smrg	0
2637ec681f3Smrg</expr>
2647ec681f3Smrg<expr name="#one">
2657ec681f3Smrg	1
2667ec681f3Smrg</expr>
2677ec681f3Smrg<expr name="#two">
2687ec681f3Smrg	2
2697ec681f3Smrg</expr>
2707ec681f3Smrg
2717ec681f3Smrg<!--
2727ec681f3Smrg	Enums used in various places:
2737ec681f3Smrg -->
2747ec681f3Smrg
2757ec681f3Smrg<enum name="#rptN">
2767ec681f3Smrg	<value val="0" display=""/>
2777ec681f3Smrg	<value val="1" display="(rpt1)"/>
2787ec681f3Smrg	<value val="2" display="(rpt2)"/>
2797ec681f3Smrg	<value val="3" display="(rpt3)"/>
2807ec681f3Smrg	<value val="4" display="(rpt4)"/>
2817ec681f3Smrg	<value val="5" display="(rpt5)"/>
2827ec681f3Smrg</enum>
2837ec681f3Smrg
2847ec681f3Smrg<enum name="#cond">
2857ec681f3Smrg	<value val="0" display="lt"/>
2867ec681f3Smrg	<value val="1" display="le"/>
2877ec681f3Smrg	<value val="2" display="gt"/>
2887ec681f3Smrg	<value val="3" display="ge"/>
2897ec681f3Smrg	<value val="4" display="eq"/>
2907ec681f3Smrg	<value val="5" display="ne"/>
2917ec681f3Smrg</enum>
2927ec681f3Smrg
2937ec681f3Smrg<enum name="#swiz">
2947ec681f3Smrg	<value val="0" display="x"/>
2957ec681f3Smrg	<value val="1" display="y"/>
2967ec681f3Smrg	<value val="2" display="z"/>
2977ec681f3Smrg	<value val="3" display="w"/>
2987ec681f3Smrg</enum>
2997ec681f3Smrg
3007ec681f3Smrg<enum name="#type">
3017ec681f3Smrg	<value val="0" display="f16"/>
3027ec681f3Smrg	<value val="1" display="f32"/>
3037ec681f3Smrg	<value val="2" display="u16"/>
3047ec681f3Smrg	<value val="3" display="u32"/>
3057ec681f3Smrg	<value val="4" display="s16"/>
3067ec681f3Smrg	<value val="5" display="s32"/>
3077ec681f3Smrg	<value val="6" display="u8"/>
3087ec681f3Smrg	<value val="7" display="s8"/>
3097ec681f3Smrg</enum>
3107ec681f3Smrg
3117ec681f3Smrg<enum name="#absneg">
3127ec681f3Smrg	<value val="0" display=""/>
3137ec681f3Smrg	<value val="1" display="(neg)"/>
3147ec681f3Smrg	<value val="2" display="(abs)"/>
3157ec681f3Smrg	<value val="3" display="(absneg)"/>
3167ec681f3Smrg</enum>
3177ec681f3Smrg
3187ec681f3Smrg<enum name="#flut">
3197ec681f3Smrg	<doc>int to float lookup table</doc>
3207ec681f3Smrg	<value val="0"  display="(0.0)"/>
3217ec681f3Smrg	<value val="1"  display="(0.5)"/>
3227ec681f3Smrg	<value val="2"  display="(1.0)"/>
3237ec681f3Smrg	<value val="3"  display="(2.0)"/>
3247ec681f3Smrg	<value val="4"  display="(e)"/>
3257ec681f3Smrg	<value val="5"  display="(pi)"/>
3267ec681f3Smrg	<value val="6"  display="(1/pi)"/>
3277ec681f3Smrg	<value val="7"  display="(1/log2(e))"/>
3287ec681f3Smrg	<value val="8"  display="(log2(e))"/>
3297ec681f3Smrg	<value val="9"  display="(1/log2(10))"/>
3307ec681f3Smrg	<value val="10" display="(log2(10))"/>
3317ec681f3Smrg	<value val="11" display="(4.0)"/>
3327ec681f3Smrg</enum>
3337ec681f3Smrg
3347ec681f3Smrg<enum name="#wrmask">
3357ec681f3Smrg	<value val="0"  display=""/>
3367ec681f3Smrg	<value val="1"  display="x"/>
3377ec681f3Smrg	<value val="2"  display="y"/>
3387ec681f3Smrg	<value val="3"  display="xy"/>
3397ec681f3Smrg	<value val="4"  display="z"/>
3407ec681f3Smrg	<value val="5"  display="zx"/>
3417ec681f3Smrg	<value val="6"  display="zy"/>
3427ec681f3Smrg	<value val="7"  display="xyz"/>
3437ec681f3Smrg	<value val="8"  display="w"/>
3447ec681f3Smrg	<value val="9"  display="xw"/>
3457ec681f3Smrg	<value val="10" display="yw"/>
3467ec681f3Smrg	<value val="11" display="xyw"/>
3477ec681f3Smrg	<value val="12" display="zw"/>
3487ec681f3Smrg	<value val="13" display="xzw"/>
3497ec681f3Smrg	<value val="14" display="yzw"/>
3507ec681f3Smrg	<value val="15" display="xyzw"/>
3517ec681f3Smrg</enum>
3527ec681f3Smrg
3537ec681f3Smrg</isa>
354