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)) && ({REPEAT} == 0) 347ec681f3Smrg</expr> 357ec681f3Smrg 367ec681f3Smrg<expr name="#cat2-cat3-nop-value"> 377ec681f3Smrg {SRC1_R} | ({SRC2_R} << 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 & 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 & 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<a0.x> 977ec681f3Smrg </display> 987ec681f3Smrg </override> 997ec681f3Smrg <display> 1007ec681f3Smrg r<a0.x + {OFFSET}> 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<a0.x> 1127ec681f3Smrg </display> 1137ec681f3Smrg </override> 1147ec681f3Smrg <display> 1157ec681f3Smrg c<a0.x + {OFFSET}> 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}) && ({DST} <= 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